diff --git a/.changeset/pretty-jokes-rule.md b/.changeset/pretty-jokes-rule.md new file mode 100644 index 00000000..140c40ab --- /dev/null +++ b/.changeset/pretty-jokes-rule.md @@ -0,0 +1,5 @@ +--- +"@gouvfr-lasuite/ui-components": minor +--- + +Upgrade react-resizable-panels to v4 diff --git a/.github/workflows/front-dependencies-installation.yml b/.github/workflows/front-dependencies-installation.yml index 34111314..2dcbbe20 100644 --- a/.github/workflows/front-dependencies-installation.yml +++ b/.github/workflows/front-dependencies-installation.yml @@ -5,7 +5,7 @@ on: inputs: node_version: required: false - default: "20.x" + default: "24.x" type: string jobs: diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 4cfeaa54..b9c2ea9c 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -16,7 +16,7 @@ jobs: install-front: uses: ./.github/workflows/front-dependencies-installation.yml with: - node_version: "20.x" + node_version: "24.x" lint-git: runs-on: ubuntu-latest @@ -48,7 +48,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: "20.x" + node-version: "24.x" - name: Restore the frontend cache uses: actions/cache@v5 with: @@ -71,7 +71,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: "20.x" + node-version: "24.x" - name: Restore the frontend cache uses: actions/cache@v5 with: @@ -92,7 +92,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: "20.x" + node-version: "24.x" - name: Restore the frontend cache uses: actions/cache@v5 with: @@ -113,7 +113,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: "20.x" + node-version: "24.x" - name: Restore the frontend cache uses: actions/cache@v5 with: @@ -134,7 +134,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: "20.x" + node-version: "24.x" - name: Restore the frontend cache uses: actions/cache@v5 with: @@ -189,7 +189,7 @@ jobs: - name: Setup Node.js uses: actions/setup-node@v6 with: - node-version: "20.x" + node-version: "24.x" - name: Restore the frontend cache uses: actions/cache@v5 with: diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..60ade1ae --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24.19.0 diff --git a/Dockerfile b/Dockerfile index 09b3d6ed..f27f94de 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM node:20-alpine +FROM node:24-alpine WORKDIR /app diff --git a/README.md b/README.md index 7abd2edb..bfc26b7a 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ does not modify the target project's `package.json`, lockfile or `node_modules`. ## Development -Node 20 and Yarn 1.22.22 are required. +Node 24 (the version pinned in `.nvmrc`) and Yarn 1.22.22 are required. ```bash yarn install --frozen-lockfile diff --git a/docs/RELEASING.md b/docs/RELEASING.md index 5c24f142..7876d16e 100644 --- a/docs/RELEASING.md +++ b/docs/RELEASING.md @@ -35,7 +35,8 @@ the documented `npx @gouvfr-lasuite/ui-codemod@` commands. ## Prerequisites -- Node 20 and Yarn 1.22.22; +- Node 24 (the version pinned in `.nvmrc`) and Yarn 1.22.22 — `changeset` needs + a Node release that can `require()` an ESM module; - a clean checkout with an up-to-date `origin/main`; - an npm account allowed to publish the `@gouvfr-lasuite` scope; - npm two-factor authentication in `auth-and-writes` mode; diff --git a/package.json b/package.json index c13b8cff..927c454b 100644 --- a/package.json +++ b/package.json @@ -27,16 +27,16 @@ "scalingo-postbuild": "yarn build && yarn build-storybook" }, "devDependencies": { - "@changesets/cli": "2.29.2", + "@changesets/cli": "2.31.1", "prettier": "3.5.3", "turbo": "2.5.2" }, "engines": { - "node": ">=20.0.0" + "node": ">=24.0.0" }, "packageManager": "yarn@1.22.22", "volta": { - "node": "20.16.0", + "node": "24.19.0", "yarn": "1.22.22" } } diff --git a/packages/ui-components/package.json b/packages/ui-components/package.json index 2237e17b..3885b463 100644 --- a/packages/ui-components/package.json +++ b/packages/ui-components/package.json @@ -83,7 +83,7 @@ "react-aria": "3.47.0", "react-aria-components": "1.16.0", "react-modal": "3.16.3", - "react-resizable-panels": "2.1.7", + "react-resizable-panels": "4.12.2", "react-stately": "3.45.0", "react-virtualized": "9.22.6", "react-pdf": "10.1.0", diff --git a/packages/ui-components/src/components/layout/MainLayout.tsx b/packages/ui-components/src/components/layout/MainLayout.tsx index 6a510733..d040b819 100644 --- a/packages/ui-components/src/components/layout/MainLayout.tsx +++ b/packages/ui-components/src/components/layout/MainLayout.tsx @@ -1,18 +1,39 @@ -import { PropsWithChildren, useEffect, useRef, useState } from "react"; +import { + PropsWithChildren, + useEffect, + useMemo, + useRef, + useState, +} from "react"; import { Header } from "./header/Header"; import { LeftPanel } from "./left-panel/LeftPanel"; import clsx from "clsx"; +// Left panel constraints, in pixels: react-resizable-panels v4 reads bare +// numbers as pixels, so they can be handed to `Panel` as-is. const MIN_LEFT_PANEL_PX = 300; const MAX_LEFT_PANEL_PX = 450; -const MAX_LEFT_PANEL_PERCENT = 40; +// ...except the upper bound, which is also capped to a share of the viewport so +// the panel never dominates a narrow desktop window. This is the only +// constraint that depends on the window size, hence the only one recomputed on +// resize. +const MAX_LEFT_PANEL_VIEWPORT_RATIO = 0.4; + +const cappedMaxLeftPanelPx = () => + Math.min(MAX_LEFT_PANEL_PX, window.innerWidth * MAX_LEFT_PANEL_VIEWPORT_RATIO); + +// Panels are identified explicitly so the persisted layout survives the left +// panel being conditionally mounted (react-resizable-panels v4 keys stored +// layouts by panel id, where v2 used the `order` prop). +const LEFT_PANEL_ID = "left"; +const CENTER_PANEL_ID = "center"; import { useResponsive } from ":/hooks/useResponsive"; import { - ImperativePanelHandle, + Group, Panel, - PanelGroup, - PanelResizeHandle, + Separator, + useDefaultLayout, } from "react-resizable-panels"; import { DropdownMenuOption } from "../dropdown-menu/types"; import { RightPanel } from "./right-panel/RightPanel"; @@ -56,7 +77,6 @@ export const MainLayout = ({ const { isDesktop } = useResponsive(); - const ref = useRef(null); const [isResizing, setIsResizing] = useState(false); const resizeTimeoutRef = useRef(undefined); @@ -68,28 +88,37 @@ export const MainLayout = ({ const mountLeftPanel = isDesktop ? !hideLeftPanelOnDesktop : true; const showLeftPanel = isDesktop ? !hideLeftPanelOnDesktop : isLeftPanelOpen; - const [minPanelSize, setMinPanelSize] = useState( - calculateDefaultSize(MIN_LEFT_PANEL_PX, isDesktop) + const [maxResizablePanelSize, setMaxResizablePanelSize] = useState( + cappedMaxLeftPanelPx ); - const [maxPanelSize, setMaxPanelSize] = useState( - calculateDefaultSize(MAX_LEFT_PANEL_PX, isDesktop) + + // The left panel is collapsed to nothing on mobile, where it is displayed as + // an overlay rather than as a panel of the group. + const minPanelSize = isDesktop ? MIN_LEFT_PANEL_PX : 0; + const maxPanelSize = + isDesktop && enableResize ? maxResizablePanelSize : minPanelSize; + + const panelIds = useMemo( + () => + mountLeftPanel ? [LEFT_PANEL_ID, CENTER_PANEL_ID] : [CENTER_PANEL_ID], + [mountLeftPanel] ); + // Replaces the `autoSaveId` prop dropped in react-resizable-panels v4. + // `panelIds` keeps a separate stored layout per panel combination, so the + // width saved with the left panel mounted is not applied without it. + const { defaultLayout, onLayoutChanged } = useDefaultLayout({ + id: "persistance", + panelIds, + }); + const onTogglePanel = () => { setIsLeftPanelOpen(!isLeftPanelOpen); }; - // Combined resize listener: disable transitions during window resize + update panel sizes + // Combined resize listener: disable transitions during window resize + keep + // the viewport-capped upper bound in sync. useEffect(() => { - const updatePanelSizes = () => { - const min = Math.round(calculateDefaultSize(MIN_LEFT_PANEL_PX, isDesktop)); - const max = Math.round( - Math.min(calculateDefaultSize(MAX_LEFT_PANEL_PX, isDesktop), MAX_LEFT_PANEL_PERCENT) - ); - setMinPanelSize(isDesktop ? min : 0); - setMaxPanelSize(enableResize ? max : min); - }; - const handleResize = () => { setIsResizing(true); if (resizeTimeoutRef.current) { @@ -98,10 +127,9 @@ export const MainLayout = ({ resizeTimeoutRef.current = window.setTimeout(() => { setIsResizing(false); }, 150); - updatePanelSizes(); + setMaxResizablePanelSize(cappedMaxLeftPanelPx()); }; - updatePanelSizes(); window.addEventListener("resize", handleResize); return () => { @@ -110,7 +138,7 @@ export const MainLayout = ({ clearTimeout(resizeTimeoutRef.current); } }; - }, [isDesktop, enableResize]); + }, []); return (
@@ -124,12 +152,15 @@ export const MainLayout = ({ />
- + {mountLeftPanel && ( <> {isDesktop && ( - )} - +
{children} @@ -158,18 +189,8 @@ export const MainLayout = ({
- +
); }; - -const calculateDefaultSize = (targetWidth: number, isDesktop: boolean) => { - if (!isDesktop) { - return 0; - } - - const windowWidth = window.innerWidth; - - return (targetWidth / windowWidth) * 100; -}; diff --git a/packages/ui-components/src/components/resize-handle/resize-handle.stories.tsx b/packages/ui-components/src/components/resize-handle/resize-handle.stories.tsx index 0ab238c5..3a6fd54e 100644 --- a/packages/ui-components/src/components/resize-handle/resize-handle.stories.tsx +++ b/packages/ui-components/src/components/resize-handle/resize-handle.stories.tsx @@ -1,7 +1,7 @@ import { Meta, StoryObj } from "@storybook/react"; -import { Panel, PanelGroup, PanelResizeHandle } from "react-resizable-panels"; +import { Group, Panel, Separator } from "react-resizable-panels"; -// Reusable styling for a `react-resizable-panels` resize handle. +// Reusable styling for a `react-resizable-panels` separator. // See ResizeHandle.mdx for the full documentation. const meta: Meta = { title: "Components/ResizeHandle", @@ -27,15 +27,15 @@ const frameStyle: React.CSSProperties = { export const Interactive: StoryObj = { render: () => (
- - + +
Left
- - + +
Right
-
+
), }; @@ -44,15 +44,15 @@ export const Interactive: StoryObj = { export const InteractiveVertical: StoryObj = { render: () => (
- - + +
Top
- - + +
Bottom
-
+
), }; @@ -61,15 +61,15 @@ export const InteractiveVertical: StoryObj = { export const Static: StoryObj = { render: () => (
- - + +
Left
- +
Right
-
+
), }; diff --git a/packages/ui-tokens/package.json b/packages/ui-tokens/package.json index 456b518c..d10b7b84 100644 --- a/packages/ui-tokens/package.json +++ b/packages/ui-tokens/package.json @@ -56,7 +56,7 @@ "node": ">=18.0.0" }, "volta": { - "node": "20.16.0", + "node": "24.19.0", "yarn": "1.22.22" } } diff --git a/yarn.lock b/yarn.lock index f5d63842..7dea46aa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -846,7 +846,7 @@ resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@changesets/apply-release-plan@^7.0.12": +"@changesets/apply-release-plan@^7.1.1": version "7.1.1" resolved "https://registry.yarnpkg.com/@changesets/apply-release-plan/-/apply-release-plan-7.1.1.tgz#198c3d4dd9eafd0b3fa402a5d212eabe89db134e" integrity sha512-9qPCm/rLx/xoOFXIHGB229+4GOL76S4MC+7tyOuTsR6+1jYlfFDQORdvwR5hDA6y4FL2BPt3qpbcQIS+dW85LA== @@ -865,7 +865,7 @@ resolve-from "^5.0.0" semver "^7.5.3" -"@changesets/assemble-release-plan@^6.0.10", "@changesets/assemble-release-plan@^6.0.6": +"@changesets/assemble-release-plan@^6.0.10": version "6.0.10" resolved "https://registry.yarnpkg.com/@changesets/assemble-release-plan/-/assemble-release-plan-6.0.10.tgz#cb82efed0dc17b741bc39b6ccd551e3c86a4eb3d" integrity sha512-rSDcqdJ9KbVyjpBIuCidhvZNIiVt1XaIYp73ycVQRIA5n/j6wQaEk0ChRLMUQ1vkxZe51PTQ9OIhbg6HQMW45A== @@ -884,33 +884,31 @@ dependencies: "@changesets/types" "^6.1.0" -"@changesets/cli@2.29.2": - version "2.29.2" - resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.29.2.tgz#0d774d690ffdfa0dcc8970d3e16cb93215d3b32b" - integrity sha512-vwDemKjGYMOc0l6WUUTGqyAWH3AmueeyoJa1KmFRtCYiCoY5K3B68ErYpDB6H48T4lLI4czum4IEjh6ildxUeg== +"@changesets/cli@2.31.1": + version "2.31.1" + resolved "https://registry.yarnpkg.com/@changesets/cli/-/cli-2.31.1.tgz#aaef4fc5cc4a2aae4e952696593e48ddc7d75a74" + integrity sha512-uO05WTcRBwuVOJVSW8Cmpqw6q0WDL53ajGCMyszutvOe5toOnunbpM4jZzf+qxBOz7i0AzopZ8diBuewjmF40w== dependencies: - "@changesets/apply-release-plan" "^7.0.12" - "@changesets/assemble-release-plan" "^6.0.6" + "@changesets/apply-release-plan" "^7.1.1" + "@changesets/assemble-release-plan" "^6.0.10" "@changesets/changelog-git" "^0.2.1" - "@changesets/config" "^3.1.1" + "@changesets/config" "^3.1.4" "@changesets/errors" "^0.2.0" - "@changesets/get-dependents-graph" "^2.1.3" - "@changesets/get-release-plan" "^4.0.10" + "@changesets/get-dependents-graph" "^2.1.4" + "@changesets/get-release-plan" "^4.0.16" "@changesets/git" "^3.0.4" "@changesets/logger" "^0.1.1" "@changesets/pre" "^2.0.2" - "@changesets/read" "^0.6.5" + "@changesets/read" "^0.6.7" "@changesets/should-skip-package" "^0.1.2" "@changesets/types" "^6.1.0" "@changesets/write" "^0.4.0" + "@inquirer/external-editor" "^1.0.2" "@manypkg/get-packages" "^1.1.3" ansi-colors "^4.1.3" - ci-info "^3.7.0" enquirer "^2.4.1" - external-editor "^3.1.0" fs-extra "^7.0.1" mri "^1.2.0" - p-limit "^2.2.0" package-manager-detector "^0.2.0" picocolors "^1.1.0" resolve-from "^5.0.0" @@ -918,7 +916,7 @@ spawndamnit "^3.0.1" term-size "^2.1.0" -"@changesets/config@^3.1.1", "@changesets/config@^3.1.4": +"@changesets/config@^3.1.4": version "3.1.4" resolved "https://registry.yarnpkg.com/@changesets/config/-/config-3.1.4.tgz#e503be9d86f122e52d64ccca868870e5ea943cfd" integrity sha512-pf0bvD/v6WI2cRlZ6hzpjtZdSlXDXMAJ+Iz7xfFzV4ZxJ8OGGAON+1qYc99ZPrijnt4xp3VGG7eNvAOGS24V1Q== @@ -939,7 +937,7 @@ dependencies: extendable-error "^0.1.5" -"@changesets/get-dependents-graph@^2.1.3", "@changesets/get-dependents-graph@^2.1.4": +"@changesets/get-dependents-graph@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@changesets/get-dependents-graph/-/get-dependents-graph-2.1.4.tgz#a18e56d94b41d45888f62021accc6e17a61b5d7c" integrity sha512-ZsS00x6WvmHq3sQv8oCMwL0f/z3wbXCVuSVTJwCnnmbC/iBdNJGFx1EcbMG4PC6sXRyH69liM4A2WKXzn/kRPg== @@ -949,7 +947,7 @@ picocolors "^1.1.0" semver "^7.5.3" -"@changesets/get-release-plan@^4.0.10": +"@changesets/get-release-plan@^4.0.16": version "4.0.16" resolved "https://registry.yarnpkg.com/@changesets/get-release-plan/-/get-release-plan-4.0.16.tgz#18f01f037c4c9376acf32ab820f7bcb7e292eaa0" integrity sha512-2K5Om6CrMPm45rtvckfzWo7e9jOVCKLCnXia5eUPaURH7/LWzri7pK1TycdzAuAtehLkW7VPbWLCSExTHmiI6g== @@ -1002,7 +1000,7 @@ "@manypkg/get-packages" "^1.1.3" fs-extra "^7.0.1" -"@changesets/read@^0.6.5", "@changesets/read@^0.6.7": +"@changesets/read@^0.6.7": version "0.6.7" resolved "https://registry.yarnpkg.com/@changesets/read/-/read-0.6.7.tgz#65e144c960344b34ae8bd85144752a4b687e92d2" integrity sha512-D1G4AUYGrBEk8vj8MGwf75k9GpN6XL3wg8i42P2jZZwFLXnlr2Pn7r9yuQNbaMCarP7ZQWNJbV6XLeysAIMhTA== @@ -1552,6 +1550,14 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== +"@inquirer/external-editor@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-1.0.3.tgz#c23988291ee676290fdab3fd306e64010a6d13b8" + integrity sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA== + dependencies: + chardet "^2.1.1" + iconv-lite "^0.7.0" + "@internationalized/date@3.12.0", "@internationalized/date@^3.12.0": version "3.12.0" resolved "https://registry.yarnpkg.com/@internationalized/date/-/date-3.12.0.tgz#cdcd12adf36e1ccb05ec7b964f4857e7ec62137d" @@ -5262,10 +5268,10 @@ character-entities@^2.0.0: resolved "https://registry.yarnpkg.com/character-entities/-/character-entities-2.0.2.tgz#2d09c2e72cd9523076ccb21157dff66ad43fcc22" integrity sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ== -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +chardet@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.2.0.tgz#005d664f2cbd4961888d2e2c32c5a69e59d8eec4" + integrity sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA== check-error@^2.1.1: version "2.1.1" @@ -5299,7 +5305,7 @@ chromatic@11.29.0, chromatic@^11.15.0: resolved "https://registry.yarnpkg.com/chromatic/-/chromatic-11.29.0.tgz#da556dbd3b043e8c6a3134d1afa3bb4ad7317410" integrity sha512-yisBlntp9hHVj19lIQdpTlcYIXuU9H/DbFuu6tyWHmj6hWT2EtukCCcxYXL78XdQt1vm2GfIrtgtKpj/Rzmo4A== -ci-info@^3.2.0, ci-info@^3.7.0: +ci-info@^3.2.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -6154,15 +6160,6 @@ extendable-error@^0.1.5: resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" integrity sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg== -external-editor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -6653,12 +6650,12 @@ iconv-lite@0.6.3: dependencies: safer-buffer ">= 2.1.2 < 3.0.0" -iconv-lite@^0.4.24: - version "0.4.24" - resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" - integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== +iconv-lite@^0.7.0: + version "0.7.3" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.3.tgz#84ee12f963e7de50bc01a13e160a078b3b0f415f" + integrity sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ== dependencies: - safer-buffer ">= 2.1.2 < 3" + safer-buffer ">= 2.1.2 < 3.0.0" icss-utils@^5.0.0, icss-utils@^5.1.0: version "5.1.0" @@ -8337,11 +8334,6 @@ optionator@^0.9.3: type-check "^0.4.0" word-wrap "^1.2.5" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== - outdent@^0.5.0: version "0.5.0" resolved "https://registry.yarnpkg.com/outdent/-/outdent-0.5.0.tgz#9e10982fdc41492bb473ad13840d22f9655be2ff" @@ -9017,10 +9009,10 @@ react-remove-scroll@^2.6.3: use-callback-ref "^1.3.3" use-sidecar "^1.1.3" -react-resizable-panels@2.1.7: - version "2.1.7" - resolved "https://registry.yarnpkg.com/react-resizable-panels/-/react-resizable-panels-2.1.7.tgz#afd29d8a3d708786a9f95183a38803c89f13c2e7" - integrity sha512-JtT6gI+nURzhMYQYsx8DKkx6bSoOGFp7A3CwMrOb8y5jFHFyqwo9m68UhmXRw57fRVJksFn1TSlm3ywEQ9vMgA== +react-resizable-panels@4.12.2: + version "4.12.2" + resolved "https://registry.yarnpkg.com/react-resizable-panels/-/react-resizable-panels-4.12.2.tgz#8402870ef686757c683235496e82771f0fb7f820" + integrity sha512-NwY5LCo4WrxVvDh0xoMML6EMLPONP/8ckKcIdpnojxexoatZdjLiRqLJQjQK5CPkd4SYiB/2M5BVrjZBQtOO7Q== react-stately@3.45.0, react-stately@^3.45.0: version "3.45.0" @@ -9326,7 +9318,7 @@ safe-regex-test@^1.1.0: es-errors "^1.3.0" is-regex "^1.2.1" -"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": +"safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -9805,13 +9797,6 @@ tldts@^6.1.32: dependencies: tldts-core "^6.1.86" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tmp@^0.2.3: version "0.2.7" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.7.tgz#26f4db11d1601ce8012dcb8a798ece1c06a99059"