diff --git a/.ncurc.yml b/.ncurc.yml index 914db661..e970f97a 100644 --- a/.ncurc.yml +++ b/.ncurc.yml @@ -7,3 +7,6 @@ reject: - 'fifo-logger' - 'react' - 'react-dom' + # https://github.com/zakodium-oss/react-science/issues/1008 + - '@types/react' + - '@types/react-dom' diff --git a/package-lock.json b/package-lock.json index a3643542..890f3bf4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,8 +42,8 @@ "@types/babel__core": "^7.20.5", "@types/d3-scale-chromatic": "^3.1.0", "@types/node": "^24.13.1", - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", + "@types/react": "^18.3.31", + "@types/react-dom": "^18.3.7", "@types/tinycolor2": "^1.4.6", "@vitejs/plugin-react": "^6.0.2", "@vitest/coverage-v8": "^4.1.8", @@ -67,8 +67,8 @@ "netcdfjs": "^4.0.0", "postcss-styled-syntax": "^0.7.1", "prettier": "^3.8.4", - "react": "19.2.7", - "react-dom": "19.2.7", + "react": "18.3.1", + "react-dom": "18.3.1", "react-error-boundary": "^6.1.2", "react-kbs": "^3.1.0", "react-ocl": "^8.7.1", @@ -88,8 +88,8 @@ "@blueprintjs/icons": "^6.11.0", "@blueprintjs/select": "^6.3.0", "fifo-logger": "^2.0.1", - "react": "^19.2.7", - "react-dom": "^19.2.7" + "react": "^18.3.1 || ^19.2.7", + "react-dom": "^18.3.1 || ^19.2.7" } }, "node_modules/@adobe/css-tools": { @@ -490,22 +490,6 @@ } } }, - "node_modules/@blueprintjs/core/node_modules/react-popper": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", - "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "react-fast-compare": "^3.0.1", - "warning": "^4.0.2" - }, - "peerDependencies": { - "@popperjs/core": "^2.0.0", - "react": "^16.8.0 || ^17 || ^18", - "react-dom": "^16.8.0 || ^17 || ^18" - } - }, "node_modules/@blueprintjs/icons": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/@blueprintjs/icons/-/icons-6.11.0.tgz", @@ -4724,24 +4708,32 @@ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "license": "MIT" }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/@types/react": { - "version": "19.2.17", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.17.tgz", - "integrity": "sha512-MXfmqaVPEVgkBT/aY0aGCkRWWtByiYQXo3xdQ8r5RzuFrPiRn8Gar2tQdXSUQ2GKV3bkXckek89V8wQBY2Q/Aw==", + "version": "18.3.31", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", + "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", "devOptional": true, "license": "MIT", "dependencies": { + "@types/prop-types": "*", "csstype": "^3.2.2" } }, "node_modules/@types/react-dom": { - "version": "19.2.3", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.3.tgz", - "integrity": "sha512-jp2L/eY6fn+KgVVQAOqYItbF0VY/YApe5Mz2F0aykSO8gx31bYCZyvSeYxCHKvzHG5eZjc+zyaS5BrBWya2+kQ==", + "version": "18.3.7", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", + "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "dev": true, "license": "MIT", "peerDependencies": { - "@types/react": "^19.2.0" + "@types/react": "^18.0.0" } }, "node_modules/@types/resolve": { @@ -11276,10 +11268,13 @@ "license": "MIT" }, "node_modules/react": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react/-/react-19.2.7.tgz", - "integrity": "sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, "engines": { "node": ">=0.10.0" } @@ -11343,15 +11338,16 @@ } }, "node_modules/react-dom": { - "version": "19.2.7", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.7.tgz", - "integrity": "sha512-t0BRVXvbiE/o20Hfw669rLbMCDWtYZLvmJigy2f0MxsXF+71pxhR3xOkspmsO8h3ZlNzyibAmtCa3l4lYKk6gQ==", + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", "dependencies": { - "scheduler": "^0.27.0" + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" }, "peerDependencies": { - "react": "^19.2.7" + "react": "^18.3.1" } }, "node_modules/react-dropzone": { @@ -11474,6 +11470,22 @@ "react": ">=18" } }, + "node_modules/react-popper": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/react-popper/-/react-popper-2.3.0.tgz", + "integrity": "sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "react-fast-compare": "^3.0.1", + "warning": "^4.0.2" + }, + "peerDependencies": { + "@popperjs/core": "^2.0.0", + "react": "^16.8.0 || ^17 || ^18", + "react-dom": "^16.8.0 || ^17 || ^18" + } + }, "node_modules/react-refresh": { "version": "0.17.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", @@ -11935,10 +11947,13 @@ } }, "node_modules/scheduler": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", - "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", - "license": "MIT" + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } }, "node_modules/semver": { "version": "7.8.4", diff --git a/package.json b/package.json index 2e301c20..41336a0e 100644 --- a/package.json +++ b/package.json @@ -52,8 +52,8 @@ "@blueprintjs/icons": "^6.11.0", "@blueprintjs/select": "^6.3.0", "fifo-logger": "^2.0.1", - "react": "^19.2.7", - "react-dom": "^19.2.7" + "react": "^18.3.1 || ^19.2.7", + "react-dom": "^18.3.1 || ^19.2.7" }, "dependencies": { "@atlaskit/pragmatic-drag-and-drop": "^1.8.1", @@ -89,8 +89,8 @@ "@types/babel__core": "^7.20.5", "@types/d3-scale-chromatic": "^3.1.0", "@types/node": "^24.13.1", - "@types/react": "^19.2.17", - "@types/react-dom": "^19.2.3", + "@types/react": "^18.3.31", + "@types/react-dom": "^18.3.7", "@types/tinycolor2": "^1.4.6", "@vitejs/plugin-react": "^6.0.2", "@vitest/coverage-v8": "^4.1.8", @@ -114,8 +114,8 @@ "netcdfjs": "^4.0.0", "postcss-styled-syntax": "^0.7.1", "prettier": "^3.8.4", - "react": "19.2.7", - "react-dom": "19.2.7", + "react": "18.3.1", + "react-dom": "18.3.1", "react-error-boundary": "^6.1.2", "react-kbs": "^3.1.0", "react-ocl": "^8.7.1", diff --git a/src/components/fullscreen/fullscreen_context.provider.tsx b/src/components/fullscreen/fullscreen_context.provider.tsx index b41af16a..d453ad9c 100644 --- a/src/components/fullscreen/fullscreen_context.provider.tsx +++ b/src/components/fullscreen/fullscreen_context.provider.tsx @@ -1,9 +1,12 @@ -import type { ReactNode, RefObject } from 'react'; +import type { MutableRefObject, ReactNode } from 'react'; import { useMemo } from 'react'; import { useFullScreenHandle } from 'react-full-screen'; import { fullscreenContext } from './fullscreen_context.js'; +// Remove for React 19. +type RefObject = MutableRefObject; + export interface FullscreenProviderProps { /** * Callback providing the ref which should be passed to the element that can be displayed fullscreen. diff --git a/src/components/split_pane/split_pane.tsx b/src/components/split_pane/split_pane.tsx index e1f3e519..6541e4ce 100644 --- a/src/components/split_pane/split_pane.tsx +++ b/src/components/split_pane/split_pane.tsx @@ -3,9 +3,9 @@ import styled from '@emotion/styled'; import { useControllableState } from '@radix-ui/react-use-controllable-state'; import type { CSSProperties, + MutableRefObject, PointerEvent as ReactPointerEvent, ReactNode, - RefObject, } from 'react'; import { useEffect, useReducer, useRef } from 'react'; import { useResizeObserver } from 'react-d3-utils'; @@ -15,6 +15,9 @@ import type { SplitPaneSize, SplitPaneType } from './split_pane_helpers.js'; import { parseSize, serializeSize } from './split_pane_helpers.js'; import { useSplitPaneSize } from './use_split_pane_size.js'; +// Remove for React 19. +type RefObject = MutableRefObject; + export type SplitPaneDirection = 'vertical' | 'horizontal'; export type SplitPaneSide = 'start' | 'end'; diff --git a/src/components/table/reorder_rows/draggable_row_context.ts b/src/components/table/reorder_rows/draggable_row_context.ts index 1289e2ba..89b7b554 100644 --- a/src/components/table/reorder_rows/draggable_row_context.ts +++ b/src/components/table/reorder_rows/draggable_row_context.ts @@ -1,8 +1,11 @@ -import type { RefObject } from 'react'; +import type { MutableRefObject } from 'react'; import { createContext, useContext } from 'react'; import type { DraggableItemState } from './item_data.js'; +// Remove for React 19. +type RefObject = MutableRefObject; + export interface DraggableRowContext { state: DraggableItemState; dragHandleRef: RefObject; diff --git a/stories/components/accordion_story_helpers.tsx b/stories/components/accordion_story_helpers.tsx index c4b21e9b..d8e301fe 100644 --- a/stories/components/accordion_story_helpers.tsx +++ b/stories/components/accordion_story_helpers.tsx @@ -16,7 +16,7 @@ type AccordionStoryAction = function accordionStoryReducer( state: AccordionStoryState, action: AccordionStoryAction, -) { +): AccordionStoryState { return match(action) .with({ type: 'add' }, ({ id }) => { return { diff --git a/stories/components/form/form.stories.tsx b/stories/components/form/form.stories.tsx index 4eb97a44..df5197c2 100644 --- a/stories/components/form/form.stories.tsx +++ b/stories/components/form/form.stories.tsx @@ -1,11 +1,14 @@ import { Dialog, DialogBody, DialogFooter } from '@blueprintjs/core'; import { revalidateLogic } from '@tanstack/react-form'; -import type { SubmitEvent } from 'react'; +import type { FormEvent } from 'react'; import { useState } from 'react'; import { z } from 'zod'; import { Button, useForm } from '../../../src/components/index.js'; +// Remove for React 19. +type SubmitEvent = FormEvent; + export default { title: 'Forms / Form', }; diff --git a/stories/components/form/tanstack/input.stories.tsx b/stories/components/form/tanstack/input.stories.tsx index 9b0fcaf4..f13e7970 100644 --- a/stories/components/form/tanstack/input.stories.tsx +++ b/stories/components/form/tanstack/input.stories.tsx @@ -2,7 +2,7 @@ import type { OptionProps } from '@blueprintjs/core'; import { Radio } from '@blueprintjs/core'; import type { Meta } from '@storybook/react-vite'; import { revalidateLogic } from '@tanstack/react-form'; -import type { SubmitEvent } from 'react'; +import type { FormEvent } from 'react'; import { action } from 'storybook/actions'; import { z } from 'zod'; @@ -10,6 +10,9 @@ import type { Layout } from '../../../../src/components/form/components/input_gr import { Section } from '../../../../src/components/form/components/layout/Section.js'; import { useForm } from '../../../../src/components/index.js'; +// Remove for React 19. +type SubmitEvent = FormEvent; + export default { title: 'Forms / Form / Tanstack / Inputs', args: {