From 32eb14ad1332984194e599b2a68799ac57458b7b Mon Sep 17 00:00:00 2001 From: Michael Ramos Date: Tue, 7 Jul 2026 09:47:45 -0700 Subject: [PATCH 01/10] refactor(review-editor): migrate tour QA checkbox to Base UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit First component of the Radix→Base UI migration (internal package). @base-ui/react added alongside Radix; Radix deps removed in the final commit. Root typecheck, bun test (1955 pass), build:review all green. Note: bun.lock also absorbs pre-existing manifest drift (the committed lock was stale relative to several package.jsons at HEAD — any install regenerates it identically). --- packages/review-editor/.migration/checkbox.md | 28 +++++++++++++++++++ .../components/tour/QAChecklist.tsx | 4 +-- packages/review-editor/package.json | 1 + 3 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 packages/review-editor/.migration/checkbox.md diff --git a/packages/review-editor/.migration/checkbox.md b/packages/review-editor/.migration/checkbox.md new file mode 100644 index 000000000..5c2a104a8 --- /dev/null +++ b/packages/review-editor/.migration/checkbox.md @@ -0,0 +1,28 @@ +# checkbox + +2026-07-07, transformation engine (hand-rolled Radix, no shadcn wrapper), clean 1:1 migration. + +## Changed + +- `components/tour/QAChecklist.tsx:3` — `import * as Checkbox from '@radix-ui/react-checkbox'` → `import { Checkbox } from '@base-ui/react/checkbox'`. +- `components/tour/QAChecklist.tsx:42` — class rewrites: `data-[state=checked]:bg-primary data-[state=checked]:border-primary data-[state=checked]:shadow-none` → `data-checked:*` (Base UI presence attributes). +- Props: `checked` (boolean) and `onCheckedChange={() => onToggle(i)}` are signature-compatible (Base UI adds an `eventDetails` second arg; the handler ignores args). No `asChild` in this file. +- Leftover scan: `grep -n "radix-ui|@radix-ui" components/tour/QAChecklist.tsx` → clean. + +## Left alone + +- `.tour-checkbox` CSS (index.css:1433, :1454) — element-agnostic (color transitions + reduced-motion), works unchanged. +- `@radix-ui/react-checkbox` stays in package.json until the final cleanup commit (both engines coexist during migration). + +## Behavior changes + +- Root element changes from ` - { - e.preventDefault(); - searchRef.current?.focus(); - }} - > + + searchRef.current ?? undefined} + >
= ({
)} -
+ +
); diff --git a/packages/review-editor/components/DiffOptionsPopover.tsx b/packages/review-editor/components/DiffOptionsPopover.tsx index 26b6c71a0..8fb0ca43a 100644 --- a/packages/review-editor/components/DiffOptionsPopover.tsx +++ b/packages/review-editor/components/DiffOptionsPopover.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import * as Popover from '@radix-ui/react-popover'; +import { Popover } from '@base-ui/react/popover'; import { configStore, useConfigValue } from '@plannotator/ui/config'; import { DIFF_STYLE_OPTIONS, @@ -101,23 +101,22 @@ export const DiffOptionsPopover: React.FC = () => { return ( - - - + +
@@ -163,7 +162,8 @@ export const DiffOptionsPopover: React.FC = () => { />
- + + ); diff --git a/packages/review-editor/components/EvoLogPicker.tsx b/packages/review-editor/components/EvoLogPicker.tsx index 610b92ae8..e4d591680 100644 --- a/packages/review-editor/components/EvoLogPicker.tsx +++ b/packages/review-editor/components/EvoLogPicker.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import * as Popover from '@radix-ui/react-popover'; +import { Popover } from '@base-ui/react/popover'; import type { JjEvoLogEntry } from '@plannotator/shared/types'; interface EvoLogPickerProps { @@ -43,17 +43,20 @@ export const EvoLogPicker: React.FC = ({ return ( - - - + +

Evolution history — pick a previous state to compare against @@ -155,7 +153,8 @@ export const EvoLogPicker: React.FC = ({

)} -
+ +
); diff --git a/packages/review-editor/components/PRCommentsTab.tsx b/packages/review-editor/components/PRCommentsTab.tsx index 162de5e43..fa0560add 100644 --- a/packages/review-editor/components/PRCommentsTab.tsx +++ b/packages/review-editor/components/PRCommentsTab.tsx @@ -5,7 +5,7 @@ import { CopyButton } from './CopyButton'; import { DiffHunkPreview } from './DiffHunkPreview'; import { OverlayScrollArea } from '@plannotator/ui/components/OverlayScrollArea'; import { getItem, setItem } from '@plannotator/ui/utils/storage'; -import * as Popover from '@radix-ui/react-popover'; +import { Popover } from '@base-ui/react/popover'; import { CommentPopover } from '@plannotator/ui/components/CommentPopover'; import { useReviewState } from '../dock/ReviewStateContext'; import { Avatar } from './Avatar'; @@ -352,12 +352,15 @@ export const PRCommentsTab: React.FC = React.memo(({ context {/* Filters popover — show/hide categories + per-author toggles */} - - - + +
Show
{hasBots && ( @@ -426,7 +425,8 @@ export const PRCommentsTab: React.FC = React.memo(({ context )}
-
+ +
diff --git a/packages/review-editor/components/SemanticFileBadge.tsx b/packages/review-editor/components/SemanticFileBadge.tsx index 6d3a1caad..0d36c3940 100644 --- a/packages/review-editor/components/SemanticFileBadge.tsx +++ b/packages/review-editor/components/SemanticFileBadge.tsx @@ -1,5 +1,5 @@ import React, { useRef, useState } from 'react'; -import * as Popover from '@radix-ui/react-popover'; +import { Popover } from '@base-ui/react/popover'; import type { SemanticDiffBinaryChange, SemanticDiffChange, @@ -69,44 +69,46 @@ export const SemanticFileBadge: React.FC<{ filePath: string }> = ({ filePath }) return ( - - + { + cancelClose(); + setOpen(true); + }} + onMouseLeave={scheduleClose} + title={`${count} semantic change${count === 1 ? '' : 's'} in this file`} + aria-label={`Semantic changes for ${filePath}`} + /> + } + > + sem + {count} - e.preventDefault()} - onMouseEnter={cancelClose} - onMouseLeave={scheduleClose} - > -
- sem - {filePath} -
-
- -
-
+ + +
+ sem + {filePath} +
+
+ +
+
+
); diff --git a/packages/review-editor/components/StackedPRLabel.tsx b/packages/review-editor/components/StackedPRLabel.tsx index a40caf10e..cca1197a2 100644 --- a/packages/review-editor/components/StackedPRLabel.tsx +++ b/packages/review-editor/components/StackedPRLabel.tsx @@ -1,5 +1,5 @@ import React, { useState } from 'react'; -import * as Popover from '@radix-ui/react-popover'; +import { Popover } from '@base-ui/react/popover'; import { getPlatformLabel } from '@plannotator/shared/pr-types'; import { buildMinimalStackTree } from '@plannotator/shared/pr-stack'; import { getItem, setItem } from '@plannotator/ui/utils/storage'; @@ -146,13 +146,16 @@ export function StackedPRLabel({ return ( - - - + + {/* Section 1: Stack Tree */}
@@ -342,7 +340,8 @@ export function StackedPRLabel({
- + + ); diff --git a/packages/review-editor/components/WorktreePicker.tsx b/packages/review-editor/components/WorktreePicker.tsx index 5c589d5b4..c0fbe0e37 100644 --- a/packages/review-editor/components/WorktreePicker.tsx +++ b/packages/review-editor/components/WorktreePicker.tsx @@ -1,5 +1,5 @@ import React, { useMemo, useRef, useState } from 'react'; -import * as Popover from '@radix-ui/react-popover'; +import { Popover } from '@base-ui/react/popover'; import type { WorktreeInfo } from '@plannotator/shared/types'; interface WorktreePickerProps { @@ -59,17 +59,20 @@ export const WorktreePicker: React.FC = ({ if (!v) setQuery(''); }} > - - - { - // Only override Radix's default focus when the search input is - // actually rendered — otherwise the preventDefault() would leave - // focus on the trigger, and arrow keys would bubble out to the - // file-tree nav. For short worktree lists we let Radix focus the - // first picker button itself. - if (searchRef.current) { - e.preventDefault(); - searchRef.current.focus(); - } - }} - > + + { + // Only override the default focus when the search input is + // actually rendered — otherwise arrow keys would bubble out to + // the file-tree nav. For short worktree lists Base UI focuses + // the popup's first tabbable itself (returning undefined keeps + // the default behavior). + return searchRef.current ?? undefined; + }} + > {worktrees.length > 3 && (
= ({
)}
-
+ +
); diff --git a/packages/review-editor/index.css b/packages/review-editor/index.css index b5469c7f0..799a3bad8 100644 --- a/packages/review-editor/index.css +++ b/packages/review-editor/index.css @@ -477,7 +477,7 @@ diffs-container { } .semantic-file-badge:hover, -.semantic-file-badge[data-state="open"] { +.semantic-file-badge[data-popup-open] { color: var(--foreground); background: var(--muted); } From d0fb28928d9a3f934486d6c6315b1a7a58d5fe36 Mon Sep 17 00:00:00 2001 From: Michael Ramos Date: Tue, 7 Jul 2026 10:01:50 -0700 Subject: [PATCH 04/10] refactor(review-editor): migrate DiffTypePicker to Base UI Menu Radix DropdownMenu is renamed Menu in Base UI; same restructure as the popovers (Positioner/Popup split, render triggers, --anchor-width for trigger-width matching). Item onSelect becomes onClick. Flagged: focus loop now wraps by default (Base UI default). See .migration/dropdown-menu.md. --- .../review-editor/.migration/dropdown-menu.md | 28 ++++++++++++ .../components/DiffTypePicker.tsx | 45 +++++++++---------- 2 files changed, 50 insertions(+), 23 deletions(-) create mode 100644 packages/review-editor/.migration/dropdown-menu.md diff --git a/packages/review-editor/.migration/dropdown-menu.md b/packages/review-editor/.migration/dropdown-menu.md new file mode 100644 index 000000000..7dbf54d66 --- /dev/null +++ b/packages/review-editor/.migration/dropdown-menu.md @@ -0,0 +1,28 @@ +# dropdown-menu + +2026-07-07, transformation engine. Radix DropdownMenu → Base UI Menu (renamed primitive). One file; typecheck clean. + +## Changed + +- `components/DiffTypePicker.tsx:2` — `import * as DropdownMenu from '@radix-ui/react-dropdown-menu'` → `import { Menu } from '@base-ui/react/menu'`; all parts renamed `DropdownMenu.*` → `Menu.*`. +- Trigger `asChild` → `render={ - - - + + + + {options.map((opt) => { const hint = OPTION_HINTS[opt.id]; const isActive = opt.id === activeDiffType; return ( - onSelect(opt.id)} + onClick={() => onSelect(opt.id)} className={`flex items-center gap-2 mx-1 px-2 py-1.5 text-xs rounded cursor-pointer outline-none data-[highlighted]:bg-muted ${ isActive ? 'text-foreground font-medium' : 'text-foreground/80' }`} @@ -119,11 +117,12 @@ export const DiffTypePicker: React.FC = ({ )} - + ); })} - - - + + + + ); }; From a416c4abf6d7a305b8bf27f12297be1c9a4f92e8 Mon Sep 17 00:00:00 2001 From: Michael Ramos Date: Tue, 7 Jul 2026 10:03:33 -0700 Subject: [PATCH 05/10] refactor(review-editor): migrate FileTreeNode context menu to Base UI MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Same menu anatomy via @base-ui/react/context-menu (which re-exports Menu's Positioner/Popup/Item parts). Row button keeps left-click select / double-click open; items switch onSelect→onClick. See .migration/context-menu.md for the hand-verify checklist — this is the file tree's core interaction. --- .../review-editor/.migration/context-menu.md | 29 +++++++++++++++++ .../review-editor/components/FileTreeNode.tsx | 32 +++++++++++-------- 2 files changed, 47 insertions(+), 14 deletions(-) create mode 100644 packages/review-editor/.migration/context-menu.md diff --git a/packages/review-editor/.migration/context-menu.md b/packages/review-editor/.migration/context-menu.md new file mode 100644 index 000000000..129c0db93 --- /dev/null +++ b/packages/review-editor/.migration/context-menu.md @@ -0,0 +1,29 @@ +# context-menu + +2026-07-07, transformation engine. Core product interaction (file-tree right-click). Typecheck/tests/build green. + +## Changed + +- `components/FileTreeNode.tsx:2` — `import * as ContextMenu from '@radix-ui/react-context-menu'` → `import { ContextMenu } from '@base-ui/react/context-menu'` (part names verified against `context-menu/index.parts.d.ts`: Base UI re-exports Menu's Positioner/Popup/Item under ContextMenu). +- Trigger `asChild` → `render={
- - + + navigator.clipboard.writeText(node.path)} + onClick={() => navigator.clipboard.writeText(node.path)} className="flex items-center gap-2 mx-1 px-2 py-1.5 text-xs rounded cursor-pointer outline-none text-foreground/80 data-[highlighted]:bg-muted data-[highlighted]:text-foreground" > Copy path navigator.clipboard.writeText(node.name)} + onClick={() => navigator.clipboard.writeText(node.name)} className="flex items-center gap-2 mx-1 px-2 py-1.5 text-xs rounded cursor-pointer outline-none text-foreground/80 data-[highlighted]:bg-muted data-[highlighted]:text-foreground" > Copy filename {repoRoot && ( navigator.clipboard.writeText(`${repoRoot.replace(/\/$/, '')}/${node.path}`)} + onClick={() => navigator.clipboard.writeText(`${repoRoot.replace(/\/$/, '')}/${node.path}`)} className="flex items-center gap-2 mx-1 px-2 py-1.5 text-xs rounded cursor-pointer outline-none text-foreground/80 data-[highlighted]:bg-muted data-[highlighted]:text-foreground" > Copy full path )} - + + ); From 7508c8be519d4d0a7f4cb9e9748170a6f03408b9 Mon Sep 17 00:00:00 2001 From: Michael Ramos Date: Tue, 7 Jul 2026 10:06:08 -0700 Subject: [PATCH 06/10] refactor(review-editor): drop all Radix deps, finish Base UI migration MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Removes the 7 @radix-ui/* dependencies — three of them (collapsible, dialog, tooltip) were never imported anywhere and go without a code change. Also fixes two keyboard-nav guards in FileTree/SectionsPanel that matched Radix's [data-radix-popper-content-wrapper] portal attribute (Base UI popups carry ARIA roles directly, so the role selectors already cover every floating surface — verified against the shipped popup implementations). Zero radix references remain in the package (deps, imports, class strings, CSS vars, DOM selectors). Root typecheck, 1955 tests, and build:review all green. packages/ui untouched. Full summary in .migration/project.md. --- packages/review-editor/.migration/project.md | 42 +++++++++++++++++++ .../review-editor/components/FileTree.tsx | 14 +++---- .../components/SectionsPanel.tsx | 4 +- packages/review-editor/package.json | 7 ---- 4 files changed, 52 insertions(+), 15 deletions(-) create mode 100644 packages/review-editor/.migration/project.md diff --git a/packages/review-editor/.migration/project.md b/packages/review-editor/.migration/project.md new file mode 100644 index 000000000..32506b005 --- /dev/null +++ b/packages/review-editor/.migration/project.md @@ -0,0 +1,42 @@ +# project — packages/review-editor Radix → Base UI + +2026-07-07, whole-package migration (internal package, no npm consumers). Complete: zero `@radix-ui/*` deps or references remain. + +## Dependency swap + +- Added: `@base-ui/react ^1.6.0` (dependency), `@types/react` / `@types/react-dom` `^19.2.0` (devDependencies, new — see gates note). +- Removed (7): `@radix-ui/react-checkbox`, `-collapsible`, `-context-menu`, `-dialog`, `-dropdown-menu`, `-popover`, `-tooltip`. + - **Never imported anywhere: `-collapsible`, `-dialog`, `-tooltip`** — dead dependencies removed without a code change. (The package's dialogs/tooltips come from `@plannotator/ui` or hand-rolled CSS, not from these deps.) +- `bun.lock` regenerated. Note: the committed lock was already stale vs several package.jsons at HEAD (any install rewrites it); the first migration commit absorbed that pre-existing drift. + +## Components migrated + +| Component | Files | Report | +|---|---|---| +| checkbox | tour/QAChecklist.tsx | checkbox.md | +| popover | SemanticFileBadge, EvoLogPicker, DiffOptionsPopover, WorktreePicker, StackedPRLabel, BaseBranchPicker, PRCommentsTab (+ index.css trigger selector) | popover.md | +| dropdown-menu → Menu | DiffTypePicker.tsx | dropdown-menu.md | +| context-menu | FileTreeNode.tsx | context-menu.md | + +## App-code sweep (beyond imports) + +- `FileTree.tsx` and `SectionsPanel.tsx`: keyboard-nav guards used `closest('[data-radix-popper-content-wrapper]')` — a Radix portal attribute Base UI never renders. Dead post-migration; removed. Role selectors (`[role="menu"], [role="dialog"], [role="listbox"]`) cover all Base UI popups (Menu.Popup role="menu" — verified; Popover.Popup role="dialog" — verified in PopoverPopup.js:102). +- `--radix-*` CSS vars: all rewritten (`--transform-origin`, `--anchor-width`). +- `data-[state=*]` classes: all rewritten to presence attributes (`data-checked:`, `data-popup-open:`); one plain-CSS selector updated (index.css `.semantic-file-badge[data-state="open"]` → `[data-popup-open]`). + +## Gates (all green at final commit) + +- Root `bun run typecheck` (includes packages/ui strict-consumer — untouched by this migration and still green). +- `bun test`: 1955 tests, 0 fail. +- `bun run build:review`: green. +- New package-local `tsc -p packages/review-editor/tsconfig.json` (gate added by this migration; the package previously had NO typecheck coverage — it's absent from the root chain and `tsc -p apps/review` is pre-broken for unrelated reasons). 53 pre-existing errors recorded (import.meta.env typing, response-type mismatches) — untouched; zero errors in every migrated file. + +## Boundary + +`packages/ui` is being migrated in parallel by another agent: not touched (verified via git status), and imports of `@plannotator/ui` from this package (Tooltip in DiffTypePicker, others in DiffOptionsPopover/StackedPRLabel/PRCommentsTab) were left exactly as-is — that seam is the other migration's contract. + +## Deliberately left for a human to eyeball + +Everything compiles and tests pass, but the four hand-verify checklists (per-component reports) cover feel-level behavior no test asserts: hover-popover timing on the sem badge, focus landing in picker search inputs, file-tree right-click + j/k nav interplay, edge-of-viewport flip behavior under Base UI's different collision defaults, and the new ~150ms exit fades. + +Derived status: 0 wrappers/files remain on Radix in packages/review-editor. diff --git a/packages/review-editor/components/FileTree.tsx b/packages/review-editor/components/FileTree.tsx index 95bf62b84..e4c729595 100644 --- a/packages/review-editor/components/FileTree.tsx +++ b/packages/review-editor/components/FileTree.tsx @@ -175,16 +175,16 @@ export const FileTree: React.FC = ({ return; } - // Yield keyboard nav when a floating overlay owns the focus — Radix - // DropdownMenu / Popover / Dialog handle arrow keys themselves, and the - // old native used to absorb these natively. Base UI popups carry + // ARIA roles directly (Menu.Popup role="menu", Popover.Popup + // role="dialog"), so the role selectors catch the base picker and + // worktree picker as well as dialogs/menus. const active = document.activeElement; if ( active instanceof HTMLElement && - active.closest('[role="menu"], [role="dialog"], [role="listbox"], [data-radix-popper-content-wrapper]') + active.closest('[role="menu"], [role="dialog"], [role="listbox"]') ) { return; } diff --git a/packages/review-editor/components/SectionsPanel.tsx b/packages/review-editor/components/SectionsPanel.tsx index d9461985f..511084dc2 100644 --- a/packages/review-editor/components/SectionsPanel.tsx +++ b/packages/review-editor/components/SectionsPanel.tsx @@ -335,7 +335,9 @@ export const SectionsPanel: React.FC = ({ const active = document.activeElement; if ( active instanceof HTMLElement && - active.closest('[role="menu"], [role="dialog"], [role="listbox"], [data-radix-popper-content-wrapper]') + // Base UI popups carry ARIA roles directly (Menu.Popup role="menu", + // Popover.Popup role="dialog") — no wrapper attribute needed. + active.closest('[role="menu"], [role="dialog"], [role="listbox"]') ) return; if (visualOrder.length === 0) return; const navKey = ['j', 'k', 'ArrowDown', 'ArrowUp', 'Home', 'End'].includes(e.key); diff --git a/packages/review-editor/package.json b/packages/review-editor/package.json index 841214474..cadc55f2c 100644 --- a/packages/review-editor/package.json +++ b/packages/review-editor/package.json @@ -15,13 +15,6 @@ "@pierre/diffs": "1.2.8", "@plannotator/shared": "workspace:*", "@plannotator/ui": "workspace:*", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-context-menu": "^2.2.15", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.15", - "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-tooltip": "^1.2.8", "highlight.js": "^11.11.1", "lucide-react": "^1.14.0", "motion": "^12.38.0", From 112d040cc2049f0db7db7e3a5bf3315b2b23c6d3 Mon Sep 17 00:00:00 2001 From: Michael Ramos Date: Tue, 7 Jul 2026 10:32:19 -0700 Subject: [PATCH 07/10] fix(review-editor): initialFocus fallback semantics in pickers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Self-review catch: Base UI's initialFocus function form treats a returned undefined as 'do nothing' (focus stays on the trigger) while null falls back to the default focus. The '?? undefined' I introduced would strand focus on the trigger for short worktree lists — the exact arrow-keys-leak-to-file-tree bug the original Radix code's comment warned about. Returning searchRef.current directly (element or null) matches the original semantics. Also corrects the popover report and adds a Tooltip-prop coordination note for the parallel ui migration. --- packages/review-editor/.migration/popover.md | 4 ++-- packages/review-editor/.migration/project.md | 2 ++ packages/review-editor/components/BaseBranchPicker.tsx | 2 +- packages/review-editor/components/WorktreePicker.tsx | 9 +++++---- 4 files changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/review-editor/.migration/popover.md b/packages/review-editor/.migration/popover.md index cc0a13ece..7081bc9d2 100644 --- a/packages/review-editor/.migration/popover.md +++ b/packages/review-editor/.migration/popover.md @@ -9,9 +9,9 @@ All files: `import * as Popover from '@radix-ui/react-popover'` → `import { Po - `components/SemanticFileBadge.tsx` — also: `onOpenAutoFocus={(e) => e.preventDefault()}` → `initialFocus={false}` on Popup; hover open/close timers unchanged (kept manual timers rather than Base UI's `openOnHover` to preserve exact behavior); `index.css:480` trigger selector `.semantic-file-badge[data-state="open"]` → `[data-popup-open]`. - `components/EvoLogPicker.tsx` — plain transform, no focus handling. - `components/DiffOptionsPopover.tsx` — trigger classes `data-[state=open]:*` → `data-popup-open:*` (Base UI trigger presence attribute). -- `components/WorktreePicker.tsx` — conditional `onOpenAutoFocus` (focus search input only when rendered) → `initialFocus={() => searchRef.current ?? undefined}` (function form verified against PopoverPopup.d.ts:47; returning undefined keeps default focus). +- `components/WorktreePicker.tsx` — conditional `onOpenAutoFocus` (focus search input only when rendered) → `initialFocus={() => searchRef.current}` (function form: returning an element focuses it; returning null falls back to Base UI's default focus. NOT `?? undefined` — undefined means "do nothing", which would strand focus on the trigger for short lists. Semantics per PopoverPopup.d.ts:44-47 JSDoc, caught in self-review). - `components/StackedPRLabel.tsx` — plain transform; trigger chevron rotation driven by controlled `open` state, untouched. -- `components/BaseBranchPicker.tsx` — unconditional `onOpenAutoFocus` + manual focus → `initialFocus={() => searchRef.current ?? undefined}`. +- `components/BaseBranchPicker.tsx` — unconditional `onOpenAutoFocus` + manual focus → `initialFocus={() => searchRef.current}` (same null-fallback semantics as WorktreePicker). - `components/PRCommentsTab.tsx` — trigger `data-[state=open]:*` → `data-popup-open:*`; popup transform as above. Leftover scan: `grep -rn "radix-ui|@radix-ui" ` → clean. `--radix-*` CSS vars: none remain in these files. diff --git a/packages/review-editor/.migration/project.md b/packages/review-editor/.migration/project.md index 32506b005..cd9725ca1 100644 --- a/packages/review-editor/.migration/project.md +++ b/packages/review-editor/.migration/project.md @@ -35,6 +35,8 @@ `packages/ui` is being migrated in parallel by another agent: not touched (verified via git status), and imports of `@plannotator/ui` from this package (Tooltip in DiffTypePicker, others in DiffOptionsPopover/StackedPRLabel/PRCommentsTab) were left exactly as-is — that seam is the other migration's contract. +**Coordination note for the ui migration**: three call sites here pass Radix-vocabulary props through @plannotator/ui's Tooltip wrapper API — `delayDuration` (FileRowBits.tsx:21, DiffTypePicker.tsx:106) and `delayDuration`/`skipDelayDuration` on TooltipProvider (App.tsx:2651). If the ui package's migration renames its wrapper props (Base UI uses `delay`), these call sites need a one-line consumer sweep; if the wrapper keeps its prop names and maps internally, nothing to do. Check against the ui package's 0.23.0 HANDOFF notes. + ## Deliberately left for a human to eyeball Everything compiles and tests pass, but the four hand-verify checklists (per-component reports) cover feel-level behavior no test asserts: hover-popover timing on the sem badge, focus landing in picker search inputs, file-tree right-click + j/k nav interplay, edge-of-viewport flip behavior under Base UI's different collision defaults, and the new ~150ms exit fades. diff --git a/packages/review-editor/components/BaseBranchPicker.tsx b/packages/review-editor/components/BaseBranchPicker.tsx index f5c1f0b96..ea80cf589 100644 --- a/packages/review-editor/components/BaseBranchPicker.tsx +++ b/packages/review-editor/components/BaseBranchPicker.tsx @@ -184,7 +184,7 @@ export const BaseBranchPicker: React.FC = ({ searchRef.current ?? undefined} + initialFocus={() => searchRef.current} >
= ({ initialFocus={() => { // Only override the default focus when the search input is // actually rendered — otherwise arrow keys would bubble out to - // the file-tree nav. For short worktree lists Base UI focuses - // the popup's first tabbable itself (returning undefined keeps - // the default behavior). - return searchRef.current ?? undefined; + // the file-tree nav. For short worktree lists, returning null + // falls back to Base UI's default focus (the popup's first + // tabbable); undefined would mean "do nothing" and leave focus + // on the trigger. + return searchRef.current; }} > {worktrees.length > 3 && ( From 282789cd470e6f813ff82018ef3d8e7680aa072a Mon Sep 17 00:00:00 2001 From: Michael Ramos Date: Tue, 7 Jul 2026 11:14:25 -0700 Subject: [PATCH 08/10] docs(review-editor): record automated QA results in migration reports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Playwright pass against the demo review session: context menu (full flow incl. real clipboard), tour checkboxes (all three toggle paths, incl. the span+hidden-input label association), diff-options popover, and DOM invariants (roles, data-popup-open, no data-state on migrated primitives) all pass. Demo mode never populates gitContext, so the diff-type dropdown and worktree/base pickers don't mount there — their checks remain on the manual list against a real session. --- packages/review-editor/.migration/checkbox.md | 8 ++++---- packages/review-editor/.migration/context-menu.md | 8 ++++---- packages/review-editor/.migration/popover.md | 2 +- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/review-editor/.migration/checkbox.md b/packages/review-editor/.migration/checkbox.md index 5c2a104a8..cbed0dcdc 100644 --- a/packages/review-editor/.migration/checkbox.md +++ b/packages/review-editor/.migration/checkbox.md @@ -21,8 +21,8 @@ ## Verify by hand In the review tour's QA checklist (guided review → QA step): -1. Click a checkbox directly — it checks, primary background appears. -2. Click the row's label text — the checkbox should also toggle (label→hidden-input association). -3. Tab to a checkbox — focus visible; Space toggles. -4. Check an item — text gets line-through; animation still smooth. +1. Click a checkbox directly — it checks, primary background appears. ✓ (automated QA 2026-07-07: `.tour-checkbox`'s `data-unchecked` attribute cleared to `data-checked` after a direct click.) +2. Click the row's label text — the checkbox should also toggle (label→hidden-input association). ✓ (automated QA 2026-07-07: clicking the label's text span toggled a different row's checkbox state.) +3. Tab to a checkbox — focus visible; Space toggles. ✓ (automated QA 2026-07-07: programmatically focused a checkbox then pressed Space — state toggled. Did not exercise literal Tab-key traversal or verify the focus-ring renders — feel-level.) +4. Check an item — text gets line-through; animation still smooth. ✓ (automated QA 2026-07-07: line-through class present on the row text after checking. Animation smoothness not evaluated — feel-level.) 5. "Stop N" links inside a row still navigate without toggling the checkbox. diff --git a/packages/review-editor/.migration/context-menu.md b/packages/review-editor/.migration/context-menu.md index 129c0db93..7a8e74026 100644 --- a/packages/review-editor/.migration/context-menu.md +++ b/packages/review-editor/.migration/context-menu.md @@ -21,9 +21,9 @@ ## Verify by hand -1. Right-click a file row → menu opens at the pointer. -2. "Copy path" / "Copy filename" / (with a local repo) "Copy full path" put the right strings on the clipboard and close the menu. -3. Left-click still selects the file; double-click still opens it; right-click does NOT select the file. -4. Arrow keys navigate the menu; Enter activates; Escape closes and the file tree keeps keyboard focus. +1. Right-click a file row → menu opens at the pointer. ✓ (automated QA 2026-07-07: right-click opened `[role="menu"]`; trigger row carries `data-popup-open` while open.) +2. "Copy path" / "Copy filename" / (with a local repo) "Copy full path" put the right strings on the clipboard and close the menu. ✓ (automated QA 2026-07-07: "Copy path" → clipboard read back `src/components/Button.tsx`, menu closed; "Copy filename" → clipboard read back `Button.tsx`. "Copy full path" doesn't render in the demo session — no repoRoot without a local worktree — not exercised.) +3. Left-click still selects the file; double-click still opens it; right-click does NOT select the file. ✓ (automated QA 2026-07-07: left-click on a second row made it `.active` with no menu open; right-click left the previously-active file unchanged. Double-click not exercised by automation.) +4. Arrow keys navigate the menu; Enter activates; Escape closes and the file tree keeps keyboard focus. ✓ (automated QA 2026-07-07: Escape closed the menu — confirmed. Arrow-key navigation / Enter-to-activate inside this menu not exercised by automation.) 5. Right-click near the window bottom — menu flips above the pointer. 6. Open menu, left-click elsewhere — menu closes without selecting that row. diff --git a/packages/review-editor/.migration/popover.md b/packages/review-editor/.migration/popover.md index 7081bc9d2..5a89bc11b 100644 --- a/packages/review-editor/.migration/popover.md +++ b/packages/review-editor/.migration/popover.md @@ -33,7 +33,7 @@ Leftover scan: `grep -rn "radix-ui|@radix-ui" ` → clean. `--radix 1. File header "sem · N" badge: hover opens the semantic popover, moving into the popover keeps it open, leaving both closes after ~140ms; clicking a row navigates and closes; badge highlights while open. 2. Worktree picker (review header): open with >3 worktrees → search input is focused; with ≤3 → first row focused; arrow keys don't leak to the file tree; Escape closes and returns focus to the trigger. 3. Base branch picker: open → search focused immediately; type a SHA → Enter selects; Escape closes. -4. Diff options gear: opens aligned right, no layout jump; trigger stays highlighted while open. +4. Diff options gear: opens aligned right, no layout jump; trigger stays highlighted while open. ✓ (automated QA 2026-07-07: click opens `[role="dialog"]`; trigger carries `data-popup-open` while open; clicking outside closes it. "no layout jump" not measured — feel-level.) 5. Stacked-PR label: popover opens under the label; chevron rotates; switching scope closes it. 6. PR comments Filters button: opens; toggling switches doesn't close the popover; button shows active state while open. 7. All of the above near the bottom/right edge of the window — verify flip/shift feels right (collision defaults changed). From e46de01f46823ec0eff0416ebdd80e602abb72c8 Mon Sep 17 00:00:00 2001 From: Michael Ramos Date: Tue, 7 Jul 2026 12:33:33 -0700 Subject: [PATCH 09/10] docs(review-editor): annotate QA checklist items untestable from the standalone entrypoint --- packages/review-editor/.migration/context-menu.md | 2 +- packages/review-editor/.migration/dropdown-menu.md | 10 +++++----- packages/review-editor/.migration/popover.md | 6 +++--- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/review-editor/.migration/context-menu.md b/packages/review-editor/.migration/context-menu.md index 7a8e74026..fac452c43 100644 --- a/packages/review-editor/.migration/context-menu.md +++ b/packages/review-editor/.migration/context-menu.md @@ -22,7 +22,7 @@ ## Verify by hand 1. Right-click a file row → menu opens at the pointer. ✓ (automated QA 2026-07-07: right-click opened `[role="menu"]`; trigger row carries `data-popup-open` while open.) -2. "Copy path" / "Copy filename" / (with a local repo) "Copy full path" put the right strings on the clipboard and close the menu. ✓ (automated QA 2026-07-07: "Copy path" → clipboard read back `src/components/Button.tsx`, menu closed; "Copy filename" → clipboard read back `Button.tsx`. "Copy full path" doesn't render in the demo session — no repoRoot without a local worktree — not exercised.) +2. "Copy path" / "Copy filename" / (with a local repo) "Copy full path" put the right strings on the clipboard and close the menu. ✓ (automated QA 2026-07-07: "Copy path" → clipboard read back `src/components/Button.tsx`, menu closed; "Copy filename" → clipboard read back `Button.tsx`. "Copy full path" doesn't render in the demo session — no repoRoot without a local worktree — not exercised.) Re-checked against a real `bun apps/review/server/index.ts main` session in this worktree (2026-07-07): "Copy full path" still does NOT render — right-click menu items were exactly `["Copy path", "Copy filename"]`. Root cause is the same class of gap as dropdown-menu.md/popover.md's not-testable items: `App.tsx`'s `repoRoot` prop (~L3229: `activeWorktreePath ?? agentCwd ?? gitContext?.cwd ?? null`) resolves to `null` because `apps/review/server/index.ts` never passes `gitContext` or `agentCwd` into `startReviewServer` — this is true even in a real, non-demo repo with a real worktree on disk, so "with a local repo" isn't sufficient by itself; the entrypoint has to actually wire local access through. Not exercised (item doesn't exist in this session either). 3. Left-click still selects the file; double-click still opens it; right-click does NOT select the file. ✓ (automated QA 2026-07-07: left-click on a second row made it `.active` with no menu open; right-click left the previously-active file unchanged. Double-click not exercised by automation.) 4. Arrow keys navigate the menu; Enter activates; Escape closes and the file tree keeps keyboard focus. ✓ (automated QA 2026-07-07: Escape closed the menu — confirmed. Arrow-key navigation / Enter-to-activate inside this menu not exercised by automation.) 5. Right-click near the window bottom — menu flips above the pointer. diff --git a/packages/review-editor/.migration/dropdown-menu.md b/packages/review-editor/.migration/dropdown-menu.md index 7dbf54d66..e93b19530 100644 --- a/packages/review-editor/.migration/dropdown-menu.md +++ b/packages/review-editor/.migration/dropdown-menu.md @@ -21,8 +21,8 @@ ## Verify by hand -1. Open the diff-type dropdown (review header). Arrow keys walk options; past-the-end wraps (new). -2. Type the first letters of an option — typeahead highlights it. -3. Enter/click selects, menu closes, diff reloads. -4. Hover the ⓘ icon — tooltip shows without closing the menu; clicking ⓘ does not select the item. -5. Escape closes and returns focus to the trigger; menu min-width still matches the trigger width. +1. Open the diff-type dropdown (review header). Arrow keys walk options; past-the-end wraps (new). Not testable via automated QA in either the demo (2026-07-07) or a real `bun apps/review/server/index.ts main` session (2026-07-07): `apps/review/server/index.ts` never constructs or passes a `gitContext`/`agentCwd` to `startReviewServer` (packages/server/review.ts:211 `hasLocalAccess = !!gitContext` stays `false` for that entrypoint), so `App.tsx`'s `gitContext` state is never populated and `FileTree.tsx:409-410`'s render guard `(worktrees?.length>0)||(diffOptions?.length>0)` is false — the whole DiffTypePicker/WorktreePicker/BaseBranchPicker row never mounts. Confirmed empirically against a real session with 88 real worktrees on disk: no matching trigger in the DOM. (`apps/hook/server/index.ts` does wire `gitContext` via `prepareLocalReviewDiff` — a different entrypoint from the one this QA pass was asked to exercise.) +2. Type the first letters of an option — typeahead highlights it. Not testable, same reason as #1. +3. Enter/click selects, menu closes, diff reloads. Not testable, same reason as #1. +4. Hover the ⓘ icon — tooltip shows without closing the menu; clicking ⓘ does not select the item. Not testable, same reason as #1. +5. Escape closes and returns focus to the trigger; menu min-width still matches the trigger width. Not testable, same reason as #1. diff --git a/packages/review-editor/.migration/popover.md b/packages/review-editor/.migration/popover.md index 5a89bc11b..7bc0344ac 100644 --- a/packages/review-editor/.migration/popover.md +++ b/packages/review-editor/.migration/popover.md @@ -30,9 +30,9 @@ Leftover scan: `grep -rn "radix-ui|@radix-ui" ` → clean. `--radix ## Verify by hand -1. File header "sem · N" badge: hover opens the semantic popover, moving into the popover keeps it open, leaving both closes after ~140ms; clicking a row navigates and closes; badge highlights while open. -2. Worktree picker (review header): open with >3 worktrees → search input is focused; with ≤3 → first row focused; arrow keys don't leak to the file tree; Escape closes and returns focus to the trigger. -3. Base branch picker: open → search focused immediately; type a SHA → Enter selects; Escape closes. +1. File header "sem · N" badge: hover opens the semantic popover, moving into the popover keeps it open, leaving both closes after ~140ms; clicking a row navigates and closes; badge highlights while open. ✓ (automated QA vs real session 2026-07-07: hovered `.semantic-file-badge` → `[role="dialog"]` opened and trigger gained `data-popup-open`; moving the pointer into the open dialog kept it visible; moving out closed it in ~157ms and `data-popup-open` was removed from the trigger. Clicking a row to navigate not exercised.) +2. Worktree picker (review header): open with >3 worktrees → search input is focused; with ≤3 → first row focused; arrow keys don't leak to the file tree; Escape closes and returns focus to the trigger. Not testable via automated QA in either the demo (2026-07-07) or a real `bun apps/review/server/index.ts main` session (2026-07-07) — despite this worktree (`feat-review-editor-base-ui`) sitting in a repo with 88 real git worktrees on disk, the trigger never mounts: `apps/review/server/index.ts` never passes `gitContext` to `startReviewServer` (packages/server/review.ts:211), so `App.tsx` never receives `worktrees`/`availableBranches` and `FileTree.tsx:409-410`'s render guard is false. The `>3` vs `≤3` split from the prior QA pass was never reached; the actual blocker is upstream of that split (this entrypoint never sets gitContext at all, not a matter of worktree count). Confirmed empirically: no title-matching trigger in the real session's DOM. +3. Base branch picker: open → search focused immediately; type a SHA → Enter selects; Escape closes. Not testable, same root cause as #2 (`availableBranches` also comes from the unset `gitContext`) — confirmed empirically, no matching trigger in the real session's DOM. 4. Diff options gear: opens aligned right, no layout jump; trigger stays highlighted while open. ✓ (automated QA 2026-07-07: click opens `[role="dialog"]`; trigger carries `data-popup-open` while open; clicking outside closes it. "no layout jump" not measured — feel-level.) 5. Stacked-PR label: popover opens under the label; chevron rotates; switching scope closes it. 6. PR comments Filters button: opens; toggling switches doesn't close the popover; button shows active state while open. From d8ce92aa8b42101aa95c6081c50f59a0f6e4837a Mon Sep 17 00:00:00 2001 From: Michael Ramos Date: Tue, 7 Jul 2026 12:34:26 -0700 Subject: [PATCH 10/10] chore: regenerate bun.lock after rebase onto Base UI ui migration --- bun.lock | 96 +++----------------------------------------------------- 1 file changed, 5 insertions(+), 91 deletions(-) diff --git a/bun.lock b/bun.lock index 28233471e..acc7699f5 100644 --- a/bun.lock +++ b/bun.lock @@ -202,18 +202,12 @@ "name": "@plannotator/review-editor", "version": "0.0.1", "dependencies": { + "@base-ui/react": "^1.6.0", "@fontsource-variable/geist-mono": "5.2.7", "@fontsource-variable/inter": "^5.2.8", "@pierre/diffs": "1.2.8", "@plannotator/shared": "workspace:*", "@plannotator/ui": "workspace:*", - "@radix-ui/react-checkbox": "^1.3.3", - "@radix-ui/react-collapsible": "^1.1.12", - "@radix-ui/react-context-menu": "^2.2.15", - "@radix-ui/react-dialog": "^1.1.15", - "@radix-ui/react-dropdown-menu": "^2.1.15", - "@radix-ui/react-popover": "^1.1.15", - "@radix-ui/react-tooltip": "^1.2.8", "highlight.js": "^11.11.1", "lucide-react": "^1.14.0", "motion": "^12.38.0", @@ -222,6 +216,10 @@ "tailwindcss": "^4.1.18", "tailwindcss-animate": "^1.0.7", }, + "devDependencies": { + "@types/react": "^19.2.0", + "@types/react-dom": "^19.2.0", + }, }, "packages/server": { "name": "@plannotator/server", @@ -852,74 +850,6 @@ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.1", "", {}, "sha512-oOAWABowe8EAbMyWKM0tYDKi8Yaox52D+HWZhAIJqQXbqe0xI/GV7FhLWqlEKreMkfDjshR5FKgi3mnle0h6Eg=="], - "@radix-ui/primitive": ["@radix-ui/primitive@1.1.4", "", {}, "sha512-7AdCK9PQyiljKoBDbN8OuctCbd/esdwZPQ8RtOE3SsyQtUpiPb+ND75q0jEhC1m1ecBI0MFNeLJvwIh9iKHRcQ=="], - - "@radix-ui/react-arrow": ["@radix-ui/react-arrow@1.1.9", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.5" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-yqHW5WQ/cTpU/un7dqqIKNy2iRU8BC0JB78PEzTfCCYvZu1U6W9KwObAniMk9nhSfyotKPQTYaUD/HB0f5muig=="], - - "@radix-ui/react-checkbox": ["@radix-ui/react-checkbox@1.3.4", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-previous": "1.1.2", "@radix-ui/react-use-size": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-m3JmIOAX5ZzZ6VPjxEU2dbTOhoHi0nT5riwcDwe8idocsWf4a5DXJLDtZ6LfJwMBx7W+A2b7kp2TgPEKtaiF6A=="], - - "@radix-ui/react-collapsible": ["@radix-ui/react-collapsible@1.1.13", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-F0s8+p2XNpfc3k02zBfB0jPWbkHVG162+p7BdUMyJ2308QMqZ+oaclX+FAzKFovgL5OqRU+Rvy6f/vbdlJVaqA=="], - - "@radix-ui/react-collection": ["@radix-ui/react-collection@1.1.9", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-slot": "1.2.5" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zuSVi7ziP7uQRqc+yGxsKJfNkdyHv3ZKDaHe0gzg4dRgws96TPKWIiz84tVHP4GEcEl8bC0mdt17NkcxaJHmaQ=="], - - "@radix-ui/react-compose-refs": ["@radix-ui/react-compose-refs@1.1.3", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-rYOP8OMnuuPMQF1uhPVlGNcCDlkokKqGFE3JcxFViIkAXP7EvFWUliJAstrapypaBLJNHbZL6jGhbVDGTwmVhA=="], - - "@radix-ui/react-context": ["@radix-ui/react-context@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-QwH4PO5urrbO+FaGd5Aglg+YJgWTyyuZ3g/6mKvsqraLkglDdckw9JafgL5McL5VEJ6EPNduPaT3ZE9BttDAqg=="], - - "@radix-ui/react-context-menu": ["@radix-ui/react-context-menu@2.3.0", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-menu": "2.1.17", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-d7CouXhAW+CGmFOqmB+IEvd3E9GcaqfgvfjCc3hfulp2pkaUCEVEGa0SN5nNWYA+IvQ6g1Pt+S5dpNn1AoY9hg=="], - - "@radix-ui/react-dialog": ["@radix-ui/react-dialog@1.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.12", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.9", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-portal": "1.1.11", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-slot": "1.2.5", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-l9ok83YBclEZhbjgzt76Hw733e6cvRKPNgO6GJ/IETlufXG9p+fRu2wlvpImQvR6xdJ8h7J8J2DBvsPEiEsKMw=="], - - "@radix-ui/react-direction": ["@radix-ui/react-direction@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-C3vFhbyi4SW3PmbAi6Awpu4OzJtd0MxGurvSsYtr7p7nM8RNB3VAF3CUmnp2j50knpkrRcB7+ycVXzgLgF6yNA=="], - - "@radix-ui/react-dismissable-layer": ["@radix-ui/react-dismissable-layer@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-escape-keydown": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-MhoruH6xEzsbvOmo4TNgMfmtvRGyDZw4MDSdf4ybMHfezjqwzv6hyd4lsMzBp8K9Sn6sGzCF62x1I7BYUECXOg=="], - - "@radix-ui/react-dropdown-menu": ["@radix-ui/react-dropdown-menu@2.1.17", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-menu": "2.1.17", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-S6b3Jm57sY5EdDyOMLkacbB0qMnKhy1RCKZCt795ZkmtUOAvojYIZ5p7dXHIh5Cyr3jCLLI5/g64V3FKLudZmw=="], - - "@radix-ui/react-focus-guards": ["@radix-ui/react-focus-guards@1.1.4", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-cot/aB/mOm0IYVYTTmQcEEK1M48lZWi8FlYe5nDPQQ8NYZUlXEFgncJ9p2Kzer3RKSrY7cTTpEMLZKNo9QoP5Q=="], - - "@radix-ui/react-focus-scope": ["@radix-ui/react-focus-scope@1.1.9", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9Se8t+Zry+1rEOL7Y6l/4ANYU/TOtAtf8O2fKdwLltcaMcm6kOqYGbzO4tMFQ0bvzO920pRAoHpFZ4W85S3keQ=="], - - "@radix-ui/react-id": ["@radix-ui/react-id@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-orBC88futVpqCmhX1p4cvquNHsELQ+w+vBJnuj3ftETI5bJb0bZn3Tqu3SWN2IOcPycTnMGnhwoermvISt72sA=="], - - "@radix-ui/react-menu": ["@radix-ui/react-menu@2.1.17", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.9", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-dismissable-layer": "1.1.12", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.9", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.0", "@radix-ui/react-portal": "1.1.11", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-roving-focus": "1.1.12", "@radix-ui/react-slot": "1.2.5", "@radix-ui/react-use-callback-ref": "1.1.2", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-fmbNnFyf+JYCN0DhhWnEdUTDnZD1mXaPQWivdsPIb8oOSbARfD3LIQJbLCG8a8QLCwoMxiJ7GVPIFcC8Dw8v2Q=="], - - "@radix-ui/react-popover": ["@radix-ui/react-popover@1.1.16", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.12", "@radix-ui/react-focus-guards": "1.1.4", "@radix-ui/react-focus-scope": "1.1.9", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.0", "@radix-ui/react-portal": "1.1.11", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-slot": "1.2.5", "@radix-ui/react-use-controllable-state": "1.2.3", "aria-hidden": "^1.2.4", "react-remove-scroll": "^2.7.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-8brVpAU5Uq7Bh0c8EFc4ZTf2JJTYn0o+1L+CUJB3UYIOkTjKGMgoHvduylrahdmNlr3DfH0rFq2DrbNZXgaspw=="], - - "@radix-ui/react-popper": ["@radix-ui/react-popper@1.3.0", "", { "dependencies": { "@floating-ui/react-dom": "^2.0.0", "@radix-ui/react-arrow": "1.1.9", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-layout-effect": "1.1.2", "@radix-ui/react-use-rect": "1.1.2", "@radix-ui/react-use-size": "1.1.2", "@radix-ui/rect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-9PB589e1aWZbrlFUHdz6WiPCL+xLZHQFX7oibqG/6Q0SwOkxDyQX9W/cyPa+sAPPKuC8cpLCpRczE5a/1DiwVQ=="], - - "@radix-ui/react-portal": ["@radix-ui/react-portal@1.1.11", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-UEytdjgEh2tJGgD/gZK4FUx6t1rNIlM3U0DENhSrG7I75FGm1DnaDuVUWF1pWAWUwGmn1sCJ1VGHn8LhN1aTOw=="], - - "@radix-ui/react-presence": ["@radix-ui/react-presence@1.1.6", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zdTk4PlUO0E18HnZ3wYbW0KkJJxWCdiNYp6g6X1PtONFhxVkg01vliTJAmwIszU6mHiyBOoW9P0rAugl5/hULQ=="], - - "@radix-ui/react-primitive": ["@radix-ui/react-primitive@2.1.5", "", { "dependencies": { "@radix-ui/react-slot": "1.2.5" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-zifXeB8Y88qCYx8PLZ5oQb32KwZub+s925mMoZsBBq9KUQqWKkREubTfs6ASjRPPBe7Jt9O8OHH89+95VG+grA=="], - - "@radix-ui/react-roving-focus": ["@radix-ui/react-roving-focus@1.1.12", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-collection": "1.1.9", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-direction": "1.1.2", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-use-callback-ref": "1.1.2", "@radix-ui/react-use-controllable-state": "1.2.3" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-FvgPt1bRmg8Xt2QpF7NUZW3dE0ZQHGm41dAdgT2J2GJPoIXz+9Em3NobAxf4fupcxhgHu03E5CRiU2MWvObXyg=="], - - "@radix-ui/react-slot": ["@radix-ui/react-slot@1.2.5", "", { "dependencies": { "@radix-ui/react-compose-refs": "1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-rCMO3QsIVKv5JTY5CVbo2MvO77SpEqqYc8AvRE7OWqRDOIqAKjsp+DrmnY9uc8NPdxB5E2z47HTYGeE2+NTptg=="], - - "@radix-ui/react-tooltip": ["@radix-ui/react-tooltip@1.2.9", "", { "dependencies": { "@radix-ui/primitive": "1.1.4", "@radix-ui/react-compose-refs": "1.1.3", "@radix-ui/react-context": "1.1.4", "@radix-ui/react-dismissable-layer": "1.1.12", "@radix-ui/react-id": "1.1.2", "@radix-ui/react-popper": "1.3.0", "@radix-ui/react-portal": "1.1.11", "@radix-ui/react-presence": "1.1.6", "@radix-ui/react-primitive": "2.1.5", "@radix-ui/react-slot": "1.2.5", "@radix-ui/react-use-controllable-state": "1.2.3", "@radix-ui/react-visually-hidden": "1.2.5" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-u6F9MmTtBSLkiXNVDrtB/yPCZarM9smNswC24YYLV/M+bth6J3Gs3vlJezEoFwKZvPvxhCpUYdUnOsNG/0XOlA=="], - - "@radix-ui/react-use-callback-ref": ["@radix-ui/react-use-callback-ref@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-xCso9j1/u8sEgP1RNHjFrXJLApL8LiqOkI1R4ywuN00rxWdYg4oQXuwKLS3i0j5NWLromUD27/4nlxj2UFVvIw=="], - - "@radix-ui/react-use-controllable-state": ["@radix-ui/react-use-controllable-state@1.2.3", "", { "dependencies": { "@radix-ui/react-use-effect-event": "0.0.3", "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-PLzC90MS+ReootmjC597dvopoelpZ8Q61HJkDXZSExitIq7PL55vHNnesAHwguHK0aPfBnpdNzQtv1uliaqQrA=="], - - "@radix-ui/react-use-effect-event": ["@radix-ui/react-use-effect-event@0.0.3", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-6c8ZqvPTWILEKnyVkP53EGRCcpnJiKTC21sS/6R1GF5xKyHJJWQEPfkqlcgUkdRQivd6tb23abUwe4ngWmY0JA=="], - - "@radix-ui/react-use-escape-keydown": ["@radix-ui/react-use-escape-keydown@1.1.2", "", { "dependencies": { "@radix-ui/react-use-callback-ref": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-2uVLvLjgO7NZCWw01/FdqRwmA42J0BcjPMUCA+koFEOAb+zjqIP7SiFz/7zWPrKnVmSqr76Omq2ALyCuX4dhLw=="], - - "@radix-ui/react-use-layout-effect": ["@radix-ui/react-use-layout-effect@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jrBWOxZITuGcnjRCM2t2U5ZPkCLxD+Ym6DjfssS5haTj2iiak/DOb64JeN6OdLfLgptb6/e2kKR+ZuTrGoZTPA=="], - - "@radix-ui/react-use-previous": ["@radix-ui/react-use-previous@1.1.2", "", { "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-IGBQPtRFdhN6MQ8dbegVmBq1LVZluya3F1jWY+puIcQC3MHctRwTDSBWCkL/3ZcnMJLTMJ++Z+ktmvg0F89iCw=="], - - "@radix-ui/react-use-rect": ["@radix-ui/react-use-rect@1.1.2", "", { "dependencies": { "@radix-ui/rect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-d8a+bBY/FxikNPlgJJoaBHZX+zKVbWHYJGTLnLvveQgFSTntkGdEKv3JDtHrMS0DNYpllz2nRsTLGLKYttbpmw=="], - - "@radix-ui/react-use-size": ["@radix-ui/react-use-size@1.1.2", "", { "dependencies": { "@radix-ui/react-use-layout-effect": "1.1.2" }, "peerDependencies": { "@types/react": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-giWQp+4mxjBPt4KZ0MmyuykFNWfbDxKt4x+fPkRYmgRFJSbCZFzUglvMb/Kjn38tm10YP4ufiQZDx3zna4LU6w=="], - - "@radix-ui/react-visually-hidden": ["@radix-ui/react-visually-hidden@1.2.5", "", { "dependencies": { "@radix-ui/react-primitive": "2.1.5" }, "peerDependencies": { "@types/react": "*", "@types/react-dom": "*", "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc", "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react", "@types/react-dom"] }, "sha512-tPcHNI3FajdDBFpl/Ez1m2WL0ufJqBKyHxMDBvKitopamK36WwBGOMicuMEZKkM5Wce41QxUyv6BsiqfrWBiGg=="], - - "@radix-ui/rect": ["@radix-ui/rect@1.1.2", "", {}, "sha512-xnXE7wG13PI+cxieVssYXlQJuYVRhH9NBoxt3KNwzghDIA69GMm7d4wXRouHIYjE+KvS6U/MsMO73NdS2MH9ZA=="], - "@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-rc.3", "", {}, "sha512-eybk3TjzzzV97Dlj5c+XrBFW57eTNhzod66y9HrBlzJ6NsCrWCp/2kaPS3K9wJmurBC0Tdw4yPjXKZqlznim3Q=="], "@rollup/pluginutils": ["@rollup/pluginutils@5.4.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-MfPp06CjRLfXQ3wY0R8vJDYBy/MvVcc9OulEfR0B8Iv9ko+GCNaRZ+EpJYFl27LhKsZK0o420sYCRHCjfCgeUg=="], @@ -1270,8 +1200,6 @@ "argparse": ["argparse@2.0.1", "", {}, "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="], - "aria-hidden": ["aria-hidden@1.2.6", "", { "dependencies": { "tslib": "^2.0.0" } }, "sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA=="], - "aria-query": ["aria-query@5.3.2", "", {}, "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw=="], "array-iterate": ["array-iterate@2.0.1", "", {}, "sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg=="], @@ -1534,8 +1462,6 @@ "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], - "detect-node-es": ["detect-node-es@1.1.0", "", {}, "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="], - "deterministic-object-hash": ["deterministic-object-hash@2.0.2", "", { "dependencies": { "base-64": "^1.0.0" } }, "sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ=="], "devalue": ["devalue@5.8.1", "", {}, "sha512-4CXDYRBGqN+57wVJkuXBYmpAVUSg3L6JAQa/DFqm238G73E1wuyc/JhGQJzN7vUf/CMphYau2zXbfWzDR5aTEw=="], @@ -1706,8 +1632,6 @@ "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], - "get-nonce": ["get-nonce@1.0.1", "", {}, "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q=="], - "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], "get-source": ["get-source@2.0.12", "", { "dependencies": { "data-uri-to-buffer": "^2.0.0", "source-map": "^0.6.1" } }, "sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w=="], @@ -2282,12 +2206,6 @@ "react-refresh": ["react-refresh@0.18.0", "", {}, "sha512-QgT5//D3jfjJb6Gsjxv0Slpj23ip+HtOpnNgnb2S5zU3CB26G/IDPGoy4RJB42wzFE46DRsstbW6tKHoKbhAxw=="], - "react-remove-scroll": ["react-remove-scroll@2.7.2", "", { "dependencies": { "react-remove-scroll-bar": "^2.3.7", "react-style-singleton": "^2.2.3", "tslib": "^2.1.0", "use-callback-ref": "^1.3.3", "use-sidecar": "^1.1.3" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Iqb9NjCCTt6Hf+vOdNIZGdTiH1QSqr27H/Ek9sv/a97gfueI/5h1s3yRi1nngzMUaOOToin5dI1dXKdXiF+u0Q=="], - - "react-remove-scroll-bar": ["react-remove-scroll-bar@2.3.8", "", { "dependencies": { "react-style-singleton": "^2.2.2", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" }, "optionalPeers": ["@types/react"] }, "sha512-9r+yi9+mgU33AKcj6IbT9oRCO78WriSj6t/cF8DWBZJ9aOGPOTEDvdUDz1FwKim7QXWwmHqtdHnRJfhAxEG46Q=="], - - "react-style-singleton": ["react-style-singleton@2.2.3", "", { "dependencies": { "get-nonce": "^1.0.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-b6jSvxvVnyptAiLjbkWLE/lOnR4lfTtDAl+eUC7RZy+QQWc6wRzIV2CE6xBuMmDxc2qIihtDCZD5NPOFl7fRBQ=="], - "read": ["read@1.0.7", "", { "dependencies": { "mute-stream": "~0.0.4" } }, "sha512-rSOKNYUmaxy0om1BNjMN4ezNT6VKK+2xF4GBhc81mkH7L60i6dp8qPYrkndNLT3QPphoII3maL9PVC9XmhHwVQ=="], "read-pkg": ["read-pkg@9.0.1", "", { "dependencies": { "@types/normalize-package-data": "^2.4.3", "normalize-package-data": "^6.0.0", "parse-json": "^8.0.0", "type-fest": "^4.6.0", "unicorn-magic": "^0.1.0" } }, "sha512-9viLL4/n1BJUCT1NXVTdS1jtm80yDEgR5T4yCelII49Mbj0v1rZdKqj7zCiYdbB0CuCgdrvHcNogAKTFPBocFA=="], @@ -2590,10 +2508,6 @@ "url-join": ["url-join@4.0.1", "", {}, "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="], - "use-callback-ref": ["use-callback-ref@1.3.3", "", { "dependencies": { "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg=="], - - "use-sidecar": ["use-sidecar@1.1.3", "", { "dependencies": { "detect-node-es": "^1.1.0", "tslib": "^2.0.0" }, "peerDependencies": { "@types/react": "*", "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc" }, "optionalPeers": ["@types/react"] }, "sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ=="], - "use-sync-external-store": ["use-sync-external-store@1.6.0", "", { "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w=="], "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="],