Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
72 commits
Select commit Hold shift + click to select a range
5f193f6
feat(spool): add renderer sharing foundation
xinyao27 Jul 14, 2026
47a4676
feat(spool): implement Tailnet worktree sharing
xinyao27 Jul 14, 2026
b3f37f3
refactor(spool): close review gaps
xinyao27 Jul 14, 2026
045b26f
fix(spool): complete shared session inventories
xinyao27 Jul 15, 2026
7168677
fix(spool): hide sharing for folder workspaces
xinyao27 Jul 15, 2026
78daa34
feat(spool): support folder workspace sharing
xinyao27 Jul 15, 2026
05ae06b
fix(spool): keep xterm dimensions constructor-only
xinyao27 Jul 15, 2026
1b72842
fix(spool): drop stale sessions and unblock discovery
xinyao27 Jul 15, 2026
8d5c970
fix(spool): batch remote terminal input
xinyao27 Jul 15, 2026
4f677d9
feat(spool): streamline shared session access
xinyao27 Jul 15, 2026
f501087
fix(spool): align desktop rows with projects
xinyao27 Jul 15, 2026
428a20a
refactor(spool): reuse native workspace chrome
xinyao27 Jul 15, 2026
a0b36ef
fix(spool): close workspace sharing review gaps
xinyao27 Jul 15, 2026
d5f146d
refactor(ui): migrate Radix UI to Base UI
xinyao27 Jul 16, 2026
ed873cb
fix(ui): repair Base UI menu runtime regressions
xinyao27 Jul 16, 2026
2a1fca8
docs(ui): add Radix->Base UI migration reports
xinyao27 Jul 16, 2026
7ac86f7
refactor(workspace): make column top band 36px via tab strip height
xinyao27 Jul 16, 2026
be92078
feat(spool): complete remote worktree workspace
xinyao27 Jul 16, 2026
add6010
fix(spool): recover dropped remote terminals
xinyao27 Jul 16, 2026
8f5baa8
feat(spool): flatten shared worktrees in projects
xinyao27 Jul 16, 2026
c18dbc1
fix(spool): group remote worktrees by project
xinyao27 Jul 16, 2026
18d4780
fix(spool): ignore unrelated session invalidations
xinyao27 Jul 16, 2026
4f5d9d0
fix(spool): dedupe public session invalidations
xinyao27 Jul 16, 2026
4ddf7b9
fix(spool): dedupe repeated session observations
xinyao27 Jul 16, 2026
3429272
chore(spool): classify session catalog failures
xinyao27 Jul 16, 2026
1b31e78
chore(spool): classify session page projection failures
xinyao27 Jul 16, 2026
dd4ae03
fix(spool): preserve sessions with unsafe titles
xinyao27 Jul 16, 2026
8294d2a
fix(spool): prevent live identity from overriding session keys
xinyao27 Jul 16, 2026
e1fcddc
fix(spool): align remote worktrees and defer checks
xinyao27 Jul 16, 2026
243605b
fix(spool): group unmatched remote worktrees
xinyao27 Jul 16, 2026
6b890c1
feat(spool): collapse remote group and open first session
xinyao27 Jul 16, 2026
313fb3f
feat(spool): distinguish remote worktree icons
xinyao27 Jul 16, 2026
a70a484
fix(spool): keep terminals reconnecting after long outages
xinyao27 Jul 16, 2026
2e3eae9
feat(spool): add renderer sharing foundation
xinyao27 Jul 14, 2026
2ef82d0
Merge origin/spool/session-sharing-plan into spool/session-sharing-pl…
xinyao27 Jul 16, 2026
bbbf87e
Merge pull request #2 from paperboytm/spool/session-sharing-plan-2
xinyao27 Jul 16, 2026
b86521c
feat(spool): implement Tailnet worktree sharing
xinyao27 Jul 14, 2026
03542d3
refactor(spool): close review gaps
xinyao27 Jul 14, 2026
e18b1dd
fix(spool): complete shared session inventories
xinyao27 Jul 15, 2026
20b5d3e
fix(spool): hide sharing for folder workspaces
xinyao27 Jul 15, 2026
8181d7b
feat(spool): support folder workspace sharing
xinyao27 Jul 15, 2026
8ac6aac
fix(spool): keep xterm dimensions constructor-only
xinyao27 Jul 15, 2026
3d4818c
fix(spool): drop stale sessions and unblock discovery
xinyao27 Jul 15, 2026
3a428c8
fix(spool): batch remote terminal input
xinyao27 Jul 15, 2026
eefbd7f
feat(spool): streamline shared session access
xinyao27 Jul 15, 2026
b3e8cd4
fix(spool): align desktop rows with projects
xinyao27 Jul 15, 2026
26b191a
refactor(spool): reuse native workspace chrome
xinyao27 Jul 15, 2026
d6c7aa5
fix(spool): close workspace sharing review gaps
xinyao27 Jul 15, 2026
1efa5be
feat(spool): complete remote worktree workspace
xinyao27 Jul 16, 2026
99ffe77
fix(spool): recover dropped remote terminals
xinyao27 Jul 16, 2026
90ad2b6
feat(spool): flatten shared worktrees in projects
xinyao27 Jul 16, 2026
ede6f1e
fix(spool): group remote worktrees by project
xinyao27 Jul 16, 2026
0737bf0
fix(spool): ignore unrelated session invalidations
xinyao27 Jul 16, 2026
653c06d
fix(spool): dedupe public session invalidations
xinyao27 Jul 16, 2026
202eb36
fix(spool): dedupe repeated session observations
xinyao27 Jul 16, 2026
eca649d
chore(spool): classify session catalog failures
xinyao27 Jul 16, 2026
25a65e5
chore(spool): classify session page projection failures
xinyao27 Jul 16, 2026
24cba82
fix(spool): preserve sessions with unsafe titles
xinyao27 Jul 16, 2026
3dd2420
fix(spool): prevent live identity from overriding session keys
xinyao27 Jul 16, 2026
214504e
fix(spool): align remote worktrees and defer checks
xinyao27 Jul 16, 2026
4513dac
fix(spool): group unmatched remote worktrees
xinyao27 Jul 16, 2026
c72f1f6
feat(spool): collapse remote group and open first session
xinyao27 Jul 16, 2026
15d824d
feat(spool): distinguish remote worktree icons
xinyao27 Jul 16, 2026
d8da35a
fix(spool): keep terminals reconnecting after long outages
xinyao27 Jul 16, 2026
5ecdfcb
fix(spool): preserve main behavior after rebase
xinyao27 Jul 16, 2026
f7a3532
refactor(ui): migrate Radix UI to Base UI
xinyao27 Jul 16, 2026
0eeecd3
fix(ui): repair Base UI menu runtime regressions
xinyao27 Jul 16, 2026
9a8fc4a
docs(ui): add Radix->Base UI migration reports
xinyao27 Jul 16, 2026
e5fef09
refactor(workspace): make column top band 36px via tab strip height
xinyao27 Jul 16, 2026
6a662ba
Merge remote-tracking branch 'origin/spool/session-sharing-plan' into…
xinyao27 Jul 16, 2026
9c71673
fix(spool): follow owner active session
xinyao27 Jul 16, 2026
0807a58
fix(spool): release cancelled terminal subscriptions
xinyao27 Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
19 changes: 19 additions & 0 deletions .migration/accordion.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# accordion

2026-07-16. Transformation engine (legacy `new-york-v4`). Migrated cleanly.

## Changed
- `ui/accordion.tsx`: `radix-ui` → `@base-ui/react/accordion`; `Content` → `Panel`;
trigger `[&[data-state=open]>svg]:rotate-180` → `[&[data-panel-open]>svg]:rotate-180`.
- Call sites: removed `type="single" collapsible` (single is Base UI default and
always collapsible); per-item string `value`s unchanged.

## Left alone
- No height-animation classes existed.

## Behavior changes
- None for these uncontrolled single-mode accordions (controlled would use arrays).

## Verify by hand
- Open each accordion (PR resolved comments, GitHub item dialog, mobile pairing
guide, checks panel): toggles, chevron rotates, one section open at a time.
17 changes: 17 additions & 0 deletions .migration/badge.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# badge

2026-07-16. Transformation engine (legacy `new-york-v4`). Slot → useRender.

## Changed
- `ui/badge.tsx`: `Slot`/`asChild` → `useRender` + `mergeProps`; `data-slot` object
literal cast to `React.ComponentProps<'span'>`; `badgeVariants` kept.
- `asChild` call sites → `render`.

## Left alone
- Nothing relevant.

## Behavior changes
- `asChild` removed (use `render`).

## Verify by hand
- Badges render; `render`-composed badges look correct.
16 changes: 16 additions & 0 deletions .migration/button-group.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# button-group

2026-07-16. Transformation engine (legacy `new-york-v4`). Slot → useRender.

## Changed
- `ui/button-group.tsx`: `ButtonGroupText` (the only Slot user) → `useRender` +
`mergeProps` on a `div`. `ButtonGroup`/`ButtonGroupSeparator` unchanged.

## Left alone
- `ButtonGroupSeparator` wraps the migrated Separator (no radix).

## Behavior changes
- `ButtonGroupText` `asChild` removed (use `render`).

## Verify by hand
- Button groups lay out; separators render between items.
17 changes: 17 additions & 0 deletions .migration/button.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# button

2026-07-16. Transformation engine (legacy `new-york-v4`). Real Base UI Button primitive.

## Changed
- `ui/button.tsx`: `Slot`/`asChild` → `@base-ui/react/button` (`render` native);
cva variants/`buttonVariants` kept; `className` narrowed to `string`.
- `asChild` call sites → `render={<El/>}`; non-button targets get `nativeButton={false}`.

## Left alone
- Nothing relevant.

## Behavior changes
- `asChild` removed (use `render`); ref type `HTMLButtonElement` → `HTMLElement`.

## Verify by hand
- Buttons click normally; `<Button render={<a/>}>` link-buttons navigate.
17 changes: 17 additions & 0 deletions .migration/checkbox.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
# checkbox

2026-07-16. Transformation engine (legacy `new-york-v4`). ~1:1.

## Changed
- `ui/checkbox.tsx`: → `@base-ui/react/checkbox`; `data-[state=checked]:` →
`data-checked:`. Check icon/classes kept.
- `checked="indeterminate"` call sites → `indeterminate` boolean + boolean `checked`.

## Left alone
- Dead `disabled:*` classes on the Root `<span>` left as-is (upstream quirk).

## Behavior changes
- `checked="indeterminate"` replaced by the `indeterminate` prop.

## Verify by hand
- Checkboxes check/uncheck; tri-state shows the indeterminate mark.
15 changes: 15 additions & 0 deletions .migration/collapsible.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
# collapsible

2026-07-16. Transformation engine (legacy `new-york-v4`). Direct.

## Changed
- `ui/collapsible.tsx`: → `@base-ui/react/collapsible`; `Content` → `Panel`.

## Left alone
- Nothing relevant.

## Behavior changes
- No `data-disabled` on collapsible parts (no impact).

## Verify by hand
- Toggle a collapsible section open/closed.
21 changes: 21 additions & 0 deletions .migration/command.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# command

2026-07-16. Transformation engine (legacy `new-york-v4`). cmdk untouched; only Dialog migrated.

## Changed
- `ui/command.tsx`: `CommandDialog`'s raw Radix Dialog → `@base-ui/react/dialog`
(`Overlay`→`Backdrop`, `Content`→`Popup`). The wrapper still accepts the old
`onOpenAutoFocus`/`onCloseAutoFocus` `(e)=>void` and adapts to `initialFocus`/
`finalFocus`, so QuickOpen / WorktreeJumpPalette / MarkdownTemplatePicker are unchanged.

## Left alone
- **cmdk** (`Command as CommandPrimitive`), all `CommandPrimitive.*`, `[cmdk-*]`
selectors, wheel-scroll workaround — NOT radix, untouched. `CommandItem.onSelect`
is cmdk's and is kept.

## Behavior changes
- Command dialog now uses Base UI Dialog; bridged focus props keep prior behavior.

## Verify by hand
- Open the command palette(s): input focuses, typing filters, Enter runs an item,
Escape closes and returns focus.
24 changes: 24 additions & 0 deletions .migration/context-menu.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# context-menu

2026-07-16. Transformation engine (legacy `new-york-v4`). Same Menu anatomy.

## Changed
- `ui/context-menu.tsx`: → `@base-ui/react/context-menu`; `Content` → `Portal >
Positioner > Popup` (main content pointer-anchored); SubContent `align="start"
alignOffset={4} side="right" sideOffset={0}`. Item highlight `focus:*` →
`data-highlighted:*`.
- **ContextMenuLabel** now renders a plain `<div>` (GroupLabel throws outside a
Group). [runtime fix]
- Call sites: `ContextMenuTrigger asChild`→`render`; item `onSelect`→`onClick`,
`textValue`→`label`; outside/close handlers → Root `onOpenChange` reasons.

## Left alone
- Nothing relevant.

## Behavior changes
- `ContextMenu.Root` has no `modal`; `ContextMenu.Trigger` has no `disabled` (both
dropped; no call site relied on them). Checkbox/radio close-on-select default flips.

## Verify by hand
- Right-click targets (file rows, terminal, git history, sidebar cards): menu opens
WITHOUT crashing at the pointer, items highlight via keyboard, actions run.
22 changes: 22 additions & 0 deletions .migration/dialog.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# dialog

2026-07-16. Transformation engine (legacy `new-york-v4`). Overlay→Backdrop, Content→Popup.

## Changed
- `ui/dialog.tsx`: → `@base-ui/react/dialog`; `Overlay`→`Backdrop`, `Content`→`Popup`
(centered, no Positioner); `Close asChild`→`render`; animate-in/out → transitions
+ `data-starting-style`/`data-ending-style`.
- Call sites: `onOpenAutoFocus`/`onCloseAutoFocus`→`initialFocus`/`finalFocus`;
`onEscapeKeyDown`/`onPointerDownOutside`/`onInteractOutside`→ Root `onOpenChange`
+ reason + `cancel()`.

## Left alone
- Nothing relevant.

## Behavior changes
- Per-interaction dismiss callbacks gone; dismissal via `onOpenChange` reasons.
Base Portal renders a wrapping `<div>`.

## Verify by hand
- Open dialogs (delete-worktree, project-group name/delete, rename): focus lands
right, Escape/outside closes (or is prevented while busy), focus returns on close.
25 changes: 25 additions & 0 deletions .migration/dropdown-menu.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# dropdown-menu

2026-07-16. Transformation engine (legacy `new-york-v4`). DropdownMenu → Menu.

## Changed
- `ui/dropdown-menu.tsx`: → `@base-ui/react/menu`; `Content`/`SubContent` →
`Portal > Positioner > Popup`; `Sub`→`SubmenuRoot`, `SubTrigger`→`SubmenuTrigger`,
`ItemIndicator` split. Item highlight `focus:*` → `data-highlighted:*`.
- **DropdownMenuLabel** now renders a plain `<div>` (Base UI `Menu.GroupLabel`
throws outside a `Group`; shadcn labels float freely). [runtime fix]
- Call sites: item `onSelect` → `onClick` (+ `closeOnClick={false}` where
preventDefault); `textValue`→`label`; content `onCloseAutoFocus`→`finalFocus`;
outside handlers → Root `onOpenChange` + reason + `cancel()`.

## Left alone
- Nothing relevant.

## Behavior changes
- Checkbox/Radio items default `closeOnClick={false}` (Radix closed on select).
- `collisionPadding` not forwarded — dropped at WorkspaceKanbanSettingsMenu.

## Verify by hand
- Open dropdown menus: right-click/trigger opens WITHOUT crashing; arrow-key
highlights items (data-highlighted); menu ACTIONS fire (onClick); submenus open
right; keep-open menus don't dismiss on intended interactions.
19 changes: 19 additions & 0 deletions .migration/hover-card.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# hover-card

2026-07-16. Transformation engine (legacy `new-york-v4`). Renamed primitive (preview-card).

## Changed
- `ui/hover-card.tsx`: → `@base-ui/react/preview-card` (public names kept `HoverCard*`);
`Content` → `Portal > Positioner > Popup`; Positioner `isolate z-50`; Trigger `<a>`.
- Call sites: `openDelay`/`closeDelay` Root → `HoverCardTrigger`; `asChild`→`render`.

## Left alone
- Nothing relevant.

## Behavior changes
- `collisionPadding` not forwarded — dropped at SourceControlActionVariableChips,
WorkspaceSpaceManagerPanel. Open delay default 700→600.

## Verify by hand
- Hover preview-card triggers (worktree card meta, project rows): card appears after
delay, positioned correctly, dismisses on leave.
16 changes: 16 additions & 0 deletions .migration/label.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# label

2026-07-16. Transformation engine (legacy `new-york-v4`). No Base primitive → native.

## Changed
- `ui/label.tsx`: `LabelPrimitive.Root` → native `<label>`; type
`React.ComponentProps<'label'>`. Classes/`data-slot` kept.

## Left alone
- Nothing relevant.

## Behavior changes
- Loses Radix's double-click text-select guard, but `select-none` already covers it.

## Verify by hand
- Clicking a label focuses/toggles its control.
26 changes: 26 additions & 0 deletions .migration/popover.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# popover

2026-07-16. Transformation engine (legacy `new-york-v4`). Positioner + Anchor bridge.

## Changed
- `ui/popover.tsx`: → `@base-ui/react/popover`; `Content` → `Portal > Positioner >
Popup` (FORWARD rule); wheel-shim/no-drag preserved; animate/CSS-var idioms restated.
- **PopoverAnchor** rebuilt from inert to a real anchor bridge (context registers
the element node; PopoverContent forwards it to the Positioner `anchor` prop;
falls back to the trigger when absent). Accepts `render` and `children`.
- `ui/popover-content-ref.ts`: type repointed; `Content['ref']` → `Popup.Props['ref']`.
- Call sites: `openDelay`/`closeDelay` Root → `PopoverTrigger`; `asChild`→`render`;
`onOpenAutoFocus`/`onCloseAutoFocus`→`initialFocus`/`finalFocus`; outside/escape
handlers → Root `onOpenChange` + reason + `cancel()`.

## Left alone
- Nothing relevant.

## Behavior changes
- `collisionPadding`/`collisionBoundary`/`avoidCollisions` not forwarded — dropped
at a few sites (delta #4). Dismiss handlers rewritten to the typed path.

## Verify by hand
- Anchor popovers (WorktreeParentPickerPopover, SmartWorkspaceNameField input,
SettingsFormControls, BrowserPane) anchor to the right element; search popovers
autofocus; escape/outside dismiss (and keep-open cases) behave as before.
16 changes: 16 additions & 0 deletions .migration/progress.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# progress

2026-07-16. Transformation engine (legacy `new-york-v4`). Restructured.

## Changed
- `ui/progress.tsx`: → `@base-ui/react/progress`; `Root > Track > Indicator`;
deleted manual `translateX` (primitive computes fill from `value` on Root).

## Left alone
- Nothing relevant.

## Behavior changes
- New `Track` wrapper (`data-slot="progress-track"`, `size-full` — only added class).

## Verify by hand
- Progress bars fill to the correct percentage and animate on change.
81 changes: 81 additions & 0 deletions .migration/project.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
# Radix UI → Base UI (whole-project migration)

2026-07-16. Strategy: transformation engine on the user's own files (shadcn
style `new-york-v4` has no Base UI golden counterpart, so classes were kept
verbatim; only primitives, part names, data-attribute/CSS-var hooks, and
call-site props changed). Verdict: **complete and green** — all 24 wrappers on
`@base-ui/react@1.6.0`, `radix-ui` removed, typecheck (node+cli+web) clean, web
build passes, oxlint clean.

## Dependency swap
- Removed `radix-ui@^1.6.2`; added `@base-ui/react@1.6.0` (pnpm).
- Zero `radix-ui` / `@radix-ui` references remain in `src/`.

## Wrappers migrated (24)
accordion, collapsible, tabs, toggle, toggle-group, button, badge,
button-group, label, separator, progress, scroll-area, checkbox, slider,
tooltip, popover (+ popover-content-ref), hover-card, dialog, sheet,
dropdown-menu, context-menu, select, command (Dialog part only — cmdk left
intact). See each `.migration/<component>.md`.

Not radix, intentionally untouched: cmdk (command), sonner, input-otp,
react-day-picker, recharts, vaul.

## App-code sweep summary
- **`asChild` → `render`**: 512 call sites via a ts-morph codemod + 33 hand-migrated.
- **VisuallyHidden → `sr-only`** (no Base UI part): 5 files.
- **Semantic call-site props** fixed across 134 files: tooltip delay/timeout,
popover/hover-card openDelay→trigger, select position→alignItemWithTrigger +
value|null, accordion/toggle-group type/collapsible + value arrays, separator
decorative, slider onValueCommit→onValueCommitted, dialog/popover
onOpenAutoFocus→initialFocus + onEscapeKeyDown/onPointerDownOutside→onOpenChange
reason/cancel.

## Wrapper-level fixes beyond the primitive swap
- Menu/select item highlight `focus:*` → `data-highlighted:*` (Base UI menus
highlight via `data-highlighted`; items don't take DOM focus).
- `PopoverAnchor` bridged to the Positioner `anchor` prop via context.

## Post-migration runtime fixes (found via QA, not typecheck)
Two Radix→Base UI semantic gaps type-check cleanly but break at runtime; both fixed:
1. **Menu labels crashed on open.** Base UI `Menu.GroupLabel` /
`ContextMenu.GroupLabel` *throw* ("MenuGroupContext is missing") unless nested
in a `Group`, but shadcn labels are free-floating section headers (as Radix
allowed). Right-clicking the sidebar threw. Fix: `DropdownMenuLabel` /
`ContextMenuLabel` render a plain styled `<div>` instead of the group-bound
primitive. (`SelectLabel` kept as `GroupLabel` — unused; select labels are
idiomatically inside `SelectGroup`.)
2. **Menu item `onSelect` silently stopped firing.** Base UI `Menu.Item` activates
via `onClick`, not `onSelect` (which now maps to the native DOM handler and
type-checks), so the typecheck-driven sweep missed it. Converted **286** sites
(DropdownMenuItem/ContextMenuItem/CheckboxItem/RadioItem + the `Item` alias)
`onSelect`→`onClick`, adding `closeOnClick={false}` where the handler used
`preventDefault` (Radix keep-open) — 26 sites. cmdk `CommandItem.onSelect` and
custom components' own `onSelect` props left untouched.

## Behavior deltas (flagged, not silently patched)
1. **Tabs** default to manual activation (Base UI default; matches shadcn base registry).
2. **Menu** checkbox/radio items default to *not* closing on select.
3. **Positioner defaults**: collision/arrow padding 0→5; tooltip sideOffset 0→4;
hover delays shifted.
4. **Dropped non-forwarded positioner props** at a few call sites (the wrappers
forward only align/side/offsets): `avoidCollisions={false}` (TaskPage reviewer
popover, NativeChatExperimentalSetting select), `collisionPadding`
(WorkspaceKanbanSettingsMenu, SourceControlActionVariableChips,
WorkspaceSpaceManagerPanel, BrowserPane), `side` on some SelectContent (== Base
default). Restore by forwarding the extra Positioner props from the wrappers.
5. **Tooltip Root `delayDuration` dropped**: `ResourceUsageStatusSegment`'s 7
custom-delay tooltips now use the default hover delay (Base UI has no delay on
`Tooltip` Root).
6. **Dismiss/focus rewrites**: several `onInteractOutside`/`onOpenAutoFocus`
handlers were rewritten to the typed `onOpenChange`+reason+`cancel()` /
`initialFocus` paths — intent preserved; smoke-test.

## Final verification
- `tsc` node + cli + web: **0 errors**.
- `pnpm build:web`: **pass**. `oxlint src/renderer/src`: **0 errors**.
- Not run: full electron/native build (`build:native`) — needs platform toolchains;
the renderer (all changes) bundles clean via `build:web`.

## Derived status
0 wrappers remain on Radix.
16 changes: 16 additions & 0 deletions .migration/scroll-area.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# scroll-area

2026-07-16. Transformation engine (legacy `new-york-v4`). Renames only.

## Changed
- `ui/scroll-area.tsx`: → `@base-ui/react/scroll-area`; `ScrollAreaScrollbar` →
`Scrollbar`, `ScrollAreaThumb` → `Thumb`. Structure/classes preserved.

## Left alone
- No `type`/`scrollHideDelay` existed.

## Behavior changes
- Scrollbar visibility is CSS-driven; no visible change (wrapper never set `type`).

## Verify by hand
- Scroll a long list/panel: scrollbar appears, thumb drags.
Loading
Loading