@ai-matrx/design-system 0.86.360 → 0.86.362

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/CHANGELOG.md +24 -2
  2. package/README.md +2 -0
  3. package/dist/carousel.js +5 -5
  4. package/dist/{chunk-ZU2ZODDD.js → chunk-2QFA6CK4.js} +4 -4
  5. package/dist/{chunk-UCEKAKHP.js → chunk-3YTF4MH2.js} +2 -2
  6. package/dist/{chunk-T57DLONB.js → chunk-AKSKVT2M.js} +17 -9
  7. package/dist/chunk-AKSKVT2M.js.map +1 -0
  8. package/dist/{chunk-LU75R6YX.js → chunk-KOUHF4JC.js} +2 -2
  9. package/dist/{chunk-HISATFYI.js → chunk-LS3C7IUV.js} +2 -2
  10. package/dist/{chunk-QK7GPIEA.js → chunk-QJ6SQNXD.js} +4 -4
  11. package/dist/{chunk-TSETPQWU.js → chunk-RO5CRIOL.js} +2 -2
  12. package/dist/{chunk-WHERV3VC.js → chunk-SOCDBDFS.js} +4 -4
  13. package/dist/{chunk-C5HYUXR2.js → chunk-UGUVTE77.js} +2 -2
  14. package/dist/{chunk-FF524V6P.js → chunk-VOLSYNJY.js} +3 -3
  15. package/dist/{chunk-WOA6WHV2.js → chunk-WLKHQGX5.js} +2 -2
  16. package/dist/{chunk-42GFQMLA.js → chunk-WUI5OFCH.js} +2 -2
  17. package/dist/clipboard-fallback-dialog.js +2 -2
  18. package/dist/controls.cjs +16 -8
  19. package/dist/controls.cjs.map +1 -1
  20. package/dist/controls.js +5 -5
  21. package/dist/data-table/data-row-inspector.js +5 -5
  22. package/dist/data-table/data-row-window.js +6 -6
  23. package/dist/data-table/index.cjs +858 -772
  24. package/dist/data-table/index.cjs.map +1 -1
  25. package/dist/data-table/index.js +541 -461
  26. package/dist/data-table/index.js.map +1 -1
  27. package/dist/data-table/pagination.cjs +16 -8
  28. package/dist/data-table/pagination.cjs.map +1 -1
  29. package/dist/data-table/pagination.js +3 -3
  30. package/dist/data-table/uuid-cell.js +3 -3
  31. package/dist/desktop.cjs +16 -8
  32. package/dist/desktop.cjs.map +1 -1
  33. package/dist/desktop.js +5 -5
  34. package/dist/index.cjs +20 -12
  35. package/dist/index.cjs.map +1 -1
  36. package/dist/index.d.cts +5 -0
  37. package/dist/index.d.ts +5 -0
  38. package/dist/index.js +11 -11
  39. package/dist/index.js.map +1 -1
  40. package/dist/intro-stage.cjs +24 -3
  41. package/dist/intro-stage.cjs.map +1 -1
  42. package/dist/intro-stage.d.cts +9 -3
  43. package/dist/intro-stage.d.ts +9 -3
  44. package/dist/intro-stage.js +24 -3
  45. package/dist/intro-stage.js.map +1 -1
  46. package/dist/item.cjs +16 -8
  47. package/dist/item.cjs.map +1 -1
  48. package/dist/item.js +4 -4
  49. package/dist/lite-table.js +2 -2
  50. package/dist/menu-look.cjs +16 -8
  51. package/dist/menu-look.cjs.map +1 -1
  52. package/dist/menu-look.js +2 -2
  53. package/dist/record-list.cjs +16 -8
  54. package/dist/record-list.cjs.map +1 -1
  55. package/dist/record-list.js +4 -4
  56. package/dist/settings.js +3 -3
  57. package/dist/styles.css +18 -0
  58. package/dist/thumbnail-grid.cjs +27 -1
  59. package/dist/thumbnail-grid.cjs.map +1 -1
  60. package/dist/thumbnail-grid.d.cts +16 -2
  61. package/dist/thumbnail-grid.d.ts +16 -2
  62. package/dist/thumbnail-grid.js +27 -1
  63. package/dist/thumbnail-grid.js.map +1 -1
  64. package/dist/writing-field.cjs +3 -2
  65. package/dist/writing-field.cjs.map +1 -1
  66. package/dist/writing-field.js +6 -5
  67. package/dist/writing-field.js.map +1 -1
  68. package/package.json +2 -2
  69. package/dist/chunk-T57DLONB.js.map +0 -1
  70. /package/dist/{chunk-ZU2ZODDD.js.map → chunk-2QFA6CK4.js.map} +0 -0
  71. /package/dist/{chunk-UCEKAKHP.js.map → chunk-3YTF4MH2.js.map} +0 -0
  72. /package/dist/{chunk-LU75R6YX.js.map → chunk-KOUHF4JC.js.map} +0 -0
  73. /package/dist/{chunk-HISATFYI.js.map → chunk-LS3C7IUV.js.map} +0 -0
  74. /package/dist/{chunk-QK7GPIEA.js.map → chunk-QJ6SQNXD.js.map} +0 -0
  75. /package/dist/{chunk-TSETPQWU.js.map → chunk-RO5CRIOL.js.map} +0 -0
  76. /package/dist/{chunk-WHERV3VC.js.map → chunk-SOCDBDFS.js.map} +0 -0
  77. /package/dist/{chunk-C5HYUXR2.js.map → chunk-UGUVTE77.js.map} +0 -0
  78. /package/dist/{chunk-FF524V6P.js.map → chunk-VOLSYNJY.js.map} +0 -0
  79. /package/dist/{chunk-WOA6WHV2.js.map → chunk-WLKHQGX5.js.map} +0 -0
  80. /package/dist/{chunk-42GFQMLA.js.map → chunk-WUI5OFCH.js.map} +0 -0
package/CHANGELOG.md CHANGED
@@ -1,9 +1,31 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.86.362
4
+
5
+ - `DropdownMenuContent` / `DropdownMenuSubContent`: a CLOSED menu measures nothing — the header and
6
+ bottom-chrome clearance reads moved into the child the Portal renders only while open. A list of
7
+ closed row menus (live /files after creating a folder, 2026-10-24) no longer forces one layout per
8
+ row. Consumer action: none.
9
+ - **Peek code blocks take `raw: true`.** A deliberate raw view (an AI run's exact request and response) is marked `data-kind-source="explicit"`, so the kind-leak sentinel no longer reports the `__kind` markers that ARE the data there. First user: the search-review item window. Consumer action: none (additive).
10
+ - **IntroStage `size: "launcher"` groups.** An app-launcher grid (2 columns on a phone, up to 5 on a wide screen) of the welcome stage's cards: a big gradient tile (48px, 56px from `sm`) over the name, the tone's soft corner light, a lift on hover; the pitch rides the hover title (`""` = none) and external items keep the new-tab glyph. For tool indexes and product homes (Arman, 2026-10-24: "I don't like the tiny icons"). Guard: `IntroStage.test.tsx` "launcher group". Consumer action: none (additive).
11
+
12
+ ## 0.86.361
13
+
14
+ - Document the optional `bare` contract added to `Field`, `ProInput`, and `ProTextarea`: the host surface draws the frame, fill, and focus treatment in both looks. Bare `ProTextarea` preserves its text inset and control clearance. Consumer action: none for default fields; opt into `bare` when the surrounding surface owns those treatments.
15
+ - Correct the desktop-look scope test to split only top-level selector commas, preserving functional `:is(...)` selectors and rejection of unscoped rules. Consumer action: none; production CSS is unchanged by this test correction.
16
+
3
17
  ## 0.86.360
4
18
 
5
- UNVERIFIED: this release has no Unreleased entry and the source comparison could not be made (the caller supplied no source comparison). Whether source changed is unknown; consumer action is unknown.
6
- Check the package's gitHead on npm against this version's gitHead: `git diff <previous gitHead> <this gitHead> -- apps/shared/design-system/src`.
19
+ SOURCE CHANGED WITH NO RELEASE NOTE. This release shipped source changes that nobody described in an Unreleased entry,
20
+ so they may include breaking API changes. Consumer action is UNKNOWN: read the diff before upgrading.
21
+ Diff: `git diff 9ae0103052 43bb42d862 -- apps/shared/design-system/src`
22
+
23
+ Changed shipped source files (5):
24
+ - `apps/shared/design-system/src/controls.css`
25
+ - `apps/shared/design-system/src/controls/controls.tsx`
26
+ - `apps/shared/design-system/src/look-desktop.css`
27
+ - `apps/shared/design-system/src/writing-field/pro-input.tsx`
28
+ - `apps/shared/design-system/src/writing-field/pro-textarea.tsx`
7
29
 
8
30
  ## 0.86.359
9
31
 
package/README.md CHANGED
@@ -3,6 +3,8 @@
3
3
  The small, semantic UI foundation shared by AI Matrx React applications — primitives whose behavior and variants are identical across Vite and Next.js hosts.
4
4
 
5
5
  **Controls:** Button, Badge, Label, Separator, the Input family, the Textarea family, Checkbox, Switch, RadioGroup, Slider, Toggle + ToggleGroup, Avatar, Progress.
6
+ **Frameless fields:** `Field` from `@ai-matrx/design-system/controls` and `ProInput` / `ProTextarea` from `@ai-matrx/design-system/writing-field` accept `bare`. The surrounding surface owns the border, fill, and focus treatment; the field paints none, including under the desktop look. A bare `ProTextarea` keeps its text inset and the space reserved for its microphone and menu controls. Existing default fields keep their normal styling.
7
+
6
8
  **Content transfer:** moved to `@ai-matrx/alchemy/react/workspace` (0.69.0, ALC-16); it supplies Matrx Alchemy's inlined glyph, accessible menu, projected capture workspace, optional AI capability seam, and locally scoped `SurfaceHandle` provider. Its source is captured on user action; preparation keeps an immutable original, preserves manual and alternate-source sessions, fences stale async results, and routes every copy/download through `Transport`. Import `@ai-matrx/design-system/content-transfer.css` with the package structural sheets.
7
9
 
8
10
  ```tsx
package/dist/carousel.js CHANGED
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import {
3
3
  IconButton
4
- } from "./chunk-FF524V6P.js";
4
+ } from "./chunk-VOLSYNJY.js";
5
5
  import "./chunk-6NOLVA4E.js";
6
6
  import "./chunk-5IR3BZOS.js";
7
7
  import "./chunk-AV5C4YLL.js";
8
8
  import "./chunk-XERGQT2M.js";
9
9
  import "./chunk-WQ2QCMMA.js";
10
10
  import "./chunk-YRF22M5S.js";
11
- import "./chunk-WOA6WHV2.js";
11
+ import "./chunk-WLKHQGX5.js";
12
12
  import "./chunk-K4XCB576.js";
13
13
  import "./chunk-5Z5GTXKL.js";
14
14
  import "./chunk-DRSBLHOF.js";
@@ -20,21 +20,21 @@ import {
20
20
  import "./chunk-IMQ3RX35.js";
21
21
  import "./chunk-U24MOJWK.js";
22
22
  import "./chunk-NDTDBBMM.js";
23
- import "./chunk-UCEKAKHP.js";
23
+ import "./chunk-3YTF4MH2.js";
24
24
  import "./chunk-WFBPCMPF.js";
25
25
  import {
26
26
  Popover,
27
27
  PopoverContent,
28
28
  PopoverTrigger
29
29
  } from "./chunk-OPF265PU.js";
30
- import "./chunk-LU75R6YX.js";
30
+ import "./chunk-KOUHF4JC.js";
31
31
  import "./chunk-BD77DHUO.js";
32
32
  import "./chunk-BKCJUFD3.js";
33
33
  import {
34
34
  TooltipProvider
35
35
  } from "./chunk-PIQJULQB.js";
36
36
  import "./chunk-MOZRIHJF.js";
37
- import "./chunk-T57DLONB.js";
37
+ import "./chunk-AKSKVT2M.js";
38
38
  import "./chunk-BNXNIN2S.js";
39
39
  import "./chunk-HS6GMHKZ.js";
40
40
  import "./chunk-WFITMVDB.js";
@@ -10,17 +10,17 @@ import {
10
10
  } from "./chunk-CZGZV35G.js";
11
11
  import {
12
12
  PropertyRow
13
- } from "./chunk-UCEKAKHP.js";
13
+ } from "./chunk-3YTF4MH2.js";
14
14
  import {
15
15
  completeLayeredFilterRules,
16
16
  layeredFilterMatchesValue
17
17
  } from "./chunk-7ZCD4AZS.js";
18
18
  import {
19
19
  RecordId
20
- } from "./chunk-TSETPQWU.js";
20
+ } from "./chunk-RO5CRIOL.js";
21
21
  import {
22
22
  Button
23
- } from "./chunk-LU75R6YX.js";
23
+ } from "./chunk-KOUHF4JC.js";
24
24
  import {
25
25
  useMatrxDataTableHost
26
26
  } from "./chunk-B5D3VIMC.js";
@@ -671,4 +671,4 @@ export {
671
671
  isUuidValue,
672
672
  DataRowInspector
673
673
  };
674
- //# sourceMappingURL=chunk-ZU2ZODDD.js.map
674
+ //# sourceMappingURL=chunk-2QFA6CK4.js.map
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-OPF265PU.js";
7
7
  import {
8
8
  Button
9
- } from "./chunk-LU75R6YX.js";
9
+ } from "./chunk-KOUHF4JC.js";
10
10
  import {
11
11
  AlertTriangleIcon,
12
12
  ChevronDownIcon,
@@ -605,4 +605,4 @@ export {
605
605
  ConfigurationTable,
606
606
  ConfigurationTableRow
607
607
  };
608
- //# sourceMappingURL=chunk-UCEKAKHP.js.map
608
+ //# sourceMappingURL=chunk-3YTF4MH2.js.map
@@ -56,14 +56,18 @@ var DropdownMenuSubTrigger = React.forwardRef(({ className, inset, children, ...
56
56
  }
57
57
  ));
58
58
  DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
59
- var DropdownMenuSubContent = React.forwardRef(({ className, container, surface = "default", sideOffset = 2, alignOffset = -4, collisionPadding, onFocusOutside, children, ...props }, ref) => {
59
+ var DropdownMenuSubContent = React.forwardRef(({ container, ...props }, ref) => {
60
60
  const portalContainer = usePortalContainer(container);
61
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(OpenDropdownMenuSubContent, { ref, ...props }) });
62
+ });
63
+ DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
64
+ var OpenDropdownMenuSubContent = React.forwardRef(({ className, surface = "default", sideOffset = 2, alignOffset = -4, collisionPadding, onFocusOutside, children, ...props }, ref) => {
61
65
  const [bottomClearance] = React.useState(sharedBottomClearance);
62
66
  const padding = menuCollisionPadding(collisionPadding ?? 8, 0, bottomClearance);
63
67
  const nested = useNestedSubmenuPlacement(ref, padding);
64
68
  const keep = useSubmenuSurvivesParentPanelFocus(nested.ref, onFocusOutside);
65
69
  const edges = useMenuScrollEdges(keep.ref);
66
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
70
+ return /* @__PURE__ */ jsx(
67
71
  DropdownMenuPrimitive.SubContent,
68
72
  {
69
73
  ref: edges.ref,
@@ -77,9 +81,9 @@ var DropdownMenuSubContent = React.forwardRef(({ className, container, surface =
77
81
  ...props,
78
82
  children: nested.wrap(edges.wrap(children))
79
83
  }
80
- ) });
84
+ );
81
85
  });
82
- DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
86
+ OpenDropdownMenuSubContent.displayName = "OpenDropdownMenuSubContent";
83
87
  function menuCollisionPadding(caller, top, bottom, fallback = 0) {
84
88
  const side = (key) => typeof caller === "number" ? caller : caller?.[key] ?? fallback;
85
89
  return { top: Math.max(side("top"), top), right: side("right"), bottom: Math.max(side("bottom"), bottom), left: side("left") };
@@ -108,12 +112,16 @@ function measureClearance(height) {
108
112
  probe.remove();
109
113
  return Number.isFinite(px) ? Math.ceil(px) : 0;
110
114
  }
111
- var DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, container, surface = "default", children, onCloseAutoFocus, collisionPadding, ...props }, ref) => {
115
+ var DropdownMenuContent = React.forwardRef(({ container, ...props }, ref) => {
112
116
  const portalContainer = usePortalContainer(container);
117
+ return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(OpenDropdownMenuContent, { ref, ...props }) });
118
+ });
119
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
120
+ var OpenDropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, surface = "default", children, onCloseAutoFocus, collisionPadding, ...props }, ref) => {
113
121
  const [topClearance] = React.useState(sharedTopClearance);
114
122
  const [bottomClearance] = React.useState(sharedBottomClearance);
115
123
  const edges = useMenuScrollEdges(ref);
116
- return /* @__PURE__ */ jsx(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ jsx(
124
+ return /* @__PURE__ */ jsx(
117
125
  DropdownMenuPrimitive.Content,
118
126
  {
119
127
  ref: edges.ref,
@@ -133,9 +141,9 @@ var DropdownMenuContent = React.forwardRef(({ className, sideOffset = 4, contain
133
141
  onCloseAutoFocus: keepMovedFocus(onCloseAutoFocus),
134
142
  children: edges.wrap(children)
135
143
  }
136
- ) });
144
+ );
137
145
  });
138
- DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
146
+ OpenDropdownMenuContent.displayName = "OpenDropdownMenuContent";
139
147
  var DropdownMenuItem = React.forwardRef(({ className, inset, tone, size, ...props }, ref) => /* @__PURE__ */ jsx(
140
148
  DropdownMenuPrimitive.Item,
141
149
  {
@@ -226,4 +234,4 @@ export {
226
234
  DropdownMenuSeparator,
227
235
  DropdownMenuShortcut
228
236
  };
229
- //# sourceMappingURL=chunk-T57DLONB.js.map
237
+ //# sourceMappingURL=chunk-AKSKVT2M.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/dropdown-menu.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * DropdownMenu — Radix dropdown with two behaviors the stock body lacks.\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. A wrapper in\n * matrx-frontend once deferred rendering until after hydration on a false\n * premise (Radix ids come from React's SSR-stable `useId`), which deleted\n * the always-visible trigger — buttons, `…` menus — from SSR and the first\n * client paint.\n *\n * 2. A LONG MENU SCROLLS INSTEAD OF GROWING OFF-SCREEN. Content and SubContent\n * cap at `--radix-dropdown-menu-content-available-height` — the space Radix\n * actually measured between the trigger and the viewport edge — and scroll\n * past it. Without the cap a menu longer than the viewport puts its last\n * items where no pointer can reach them, and on a short window that can be\n * the only exit from the surface.\n *\n * Portalling goes through the package's `usePortalContainer` seam, so a menu\n * opened inside a Dialog mounts INSIDE the dialog (staying in the scroll\n * shard, where its wheel events work) instead of at `document.body`. An\n * explicit `container` prop still wins.\n *\n * Icons are the package's inlined SVGs (C19) — no icon-library dependency.\n */\n\nimport * as DropdownMenuPrimitive from \"@radix-ui/react-dropdown-menu\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { SOLID_SURFACE_CLASS, type PopoverSurface } from \"./solid-surface\";\nimport { RadixCheckIcon, DotFilledIcon, RadixChevronRightIcon } from \"./icons\";\nimport { usePortalContainer } from \"./portal-container\";\nimport { useMenuScrollEdges } from \"./menu-scroll-edges\";\nimport { useSubmenuSurvivesParentPanelFocus } from \"./submenu-focus\";\nimport { useNestedSubmenuPlacement } from \"./submenu-side\";\nimport { keepMovedFocus } from \"./focus-return\";\n\nconst DropdownMenu = DropdownMenuPrimitive.Root;\nconst DropdownMenuTrigger = DropdownMenuPrimitive.Trigger;\nconst DropdownMenuGroup = DropdownMenuPrimitive.Group;\nconst DropdownMenuPortal = DropdownMenuPrimitive.Portal;\nconst DropdownMenuSub = DropdownMenuPrimitive.Sub;\nconst DropdownMenuRadioGroup = DropdownMenuPrimitive.RadioGroup;\n\n// The cap is exactly the room Radix measured. What floats at the bottom (the host publishes\n// --matrx-floating-clearance) is kept clear as COLLISION PADDING (see readBottomClearance), never subtracted\n// here: subtracting it crushed any menu opened from inside or just above that floating chrome — the attention\n// dock's snooze menu (the dock is itself bottom chrome, ~240 px) opened as a 0 px sliver.\nconst MENU_SURFACE_CLASS =\n \"z-[10001] min-w-[8rem] max-h-[var(--radix-dropdown-menu-content-available-height)] overflow-y-auto overflow-x-hidden overscroll-contain rounded-md border bg-popover p-1 text-popover-foreground\";\n\n\n// gap-2: an item's icon never touches its label (page-pass 2026-09-27, admin pass — every menu).\nconst MENU_ITEM_CLASS =\n \"relative flex select-none items-center gap-2 rounded-sm px-2 py-1.5 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:text-disabled-foreground\";\n\nconst MENU_INDICATOR_ITEM_CLASS =\n \"relative flex select-none items-center rounded-sm py-1.5 pl-8 pr-2 text-sm outline-none transition-colors focus:bg-accent focus:text-accent-foreground data-[disabled]:text-disabled-foreground\";\n\nconst DropdownMenuSubTrigger = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubTrigger>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubTrigger> & {\n inset?: boolean;\n }\n>(({ className, inset, children, ...props }, ref) => (\n <DropdownMenuPrimitive.SubTrigger\n ref={ref}\n data-slot=\"dropdown-menu-sub-trigger\"\n className={cn(\n \"flex select-none items-center rounded-sm px-2 py-1.5 text-sm outline-none focus:bg-accent data-[state=open]:bg-accent\",\n inset && \"pl-8\",\n className,\n )}\n {...props}\n >\n {children}\n <RadixChevronRightIcon className=\"ml-auto h-4 w-4\" />\n </DropdownMenuPrimitive.SubTrigger>\n));\nDropdownMenuSubTrigger.displayName =\n DropdownMenuPrimitive.SubTrigger.displayName;\n\n/**\n * A SUBMENU OPENS BESIDE ITS PARENT, NEVER ON TOP OF IT (merged-grid review 2, C1: \"nested\n * submenus overlap the parent menu\"). The submenu was drawn INSIDE the parent's surface, and that\n * surface's entry animation leaves a `transform` on it — which makes the parent the containing\n * block of the submenu's `position: fixed`. Radix measured the submenu's place in viewport\n * coordinates and the browser applied them from the parent's corner, so it landed over the parent\n * (and was clipped by the parent's scroll box). Portalled like every other surface, through the\n * same container seam, it sits beside its trigger as Radix placed it.\n */\nconst DropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> & {\n container?: HTMLElement | null;\n /** `\"solid\"` = opaque surface (see PopoverContent `surface`). */\n surface?: PopoverSurface;\n }\n>(({ container, ...props }, ref) => {\n const portalContainer = usePortalContainer(container);\n // A closed submenu measures nothing (see DropdownMenuContent): the reads live in the open child.\n return (\n <DropdownMenuPrimitive.Portal container={portalContainer}>\n <OpenDropdownMenuSubContent ref={ref} {...props} />\n </DropdownMenuPrimitive.Portal>\n );\n});\nDropdownMenuSubContent.displayName =\n DropdownMenuPrimitive.SubContent.displayName;\n\nconst OpenDropdownMenuSubContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.SubContent>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.SubContent> & {\n /** `\"solid\"` = opaque surface (see PopoverContent `surface`). */\n surface?: PopoverSurface;\n }\n>(({ className, surface = \"default\", sideOffset = 2, alignOffset = -4, collisionPadding, onFocusOutside, children, ...props }, ref) => {\n const [bottomClearance] = React.useState(sharedBottomClearance);\n const padding = menuCollisionPadding(collisionPadding ?? 8, 0, bottomClearance);\n // A nested submenu opens on its parent's side (see submenu-side.tsx).\n const nested = useNestedSubmenuPlacement(ref, padding);\n // A flipped submenu survives the pointer leaving its trigger (see submenu-focus.ts).\n const keep = useSubmenuSurvivesParentPanelFocus(nested.ref, onFocusOutside);\n const edges = useMenuScrollEdges(keep.ref);\n return (\n <DropdownMenuPrimitive.SubContent\n ref={edges.ref}\n onFocusOutside={keep.onFocusOutside}\n data-slot=\"dropdown-menu-sub-content\"\n data-surface={surface === \"solid\" ? \"solid\" : undefined}\n sideOffset={sideOffset}\n alignOffset={alignOffset}\n {...(nested.padding === undefined ? {} : { collisionPadding: nested.padding })}\n className={cn(MENU_SURFACE_CLASS, edges.surfaceClassName, \"shadow-lg\", surface === \"solid\" && SOLID_SURFACE_CLASS, MOTION_POPPER, className)}\n {...props}\n >\n {nested.wrap(edges.wrap(children))}\n </DropdownMenuPrimitive.SubContent>\n );\n});\nOpenDropdownMenuSubContent.displayName = \"OpenDropdownMenuSubContent\";\n\nexport interface DropdownMenuContentProps\n extends React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /** `\"solid\"` = opaque surface (see PopoverContent `surface`). */\n surface?: PopoverSurface;\n}\n\n/**\n * The px a menu keeps clear of the TOP edge: what the host publishes as `--matrx-floating-top-clearance`\n * (a page's sticky header row, on top of the app header) or, absent that, the app header\n * (`--shell-header-h`). Radix positions against the raw viewport, so without it a menu opened from the first\n * row under a sticky header flips up and its first items sit underneath it. Read once, when the menu opens.\n * Hosts without either variable lose nothing (0px = Radix's own default).\n */\nexport function readTopClearance(): number {\n return readClearance(TOP_CLEARANCE);\n}\n\n/**\n * The px a menu keeps clear of the BOTTOM edge: what the host publishes as `--matrx-floating-clearance`\n * (the assists pill, the attention dock, any `data-matrx-floating-bottom` chrome). As collision padding,\n * Radix FLIPS a menu upward when the room left below that chrome is too small, and its available height\n * already excludes it — so the last item never ends under the pill, and a menu opened from INSIDE that\n * chrome opens upward at full height instead of collapsing. Read once, when the menu opens.\n */\nexport function readBottomClearance(): number {\n return readClearance(BOTTOM_CLEARANCE);\n}\n\ntype MenuCollisionPadding = number | Partial<Record<\"top\" | \"right\" | \"bottom\" | \"left\", number>>;\n\n/** Pure: the caller's collision padding (or `fallback` on sides it leaves unset), with the host's top and bottom\n * clearance as a floor — a caller's own padding never puts a menu under the app header or the assists pill. */\nexport function menuCollisionPadding(\n caller: MenuCollisionPadding | undefined,\n top: number,\n bottom: number,\n fallback = 0,\n): Record<\"top\" | \"right\" | \"bottom\" | \"left\", number> {\n const side = (key: \"top\" | \"right\" | \"bottom\" | \"left\") =>\n typeof caller === \"number\" ? caller : (caller?.[key] ?? fallback);\n return { top: Math.max(side(\"top\"), top), right: side(\"right\"), bottom: Math.max(side(\"bottom\"), bottom), left: side(\"left\") };\n}\n\n/**\n * ONE MEASUREMENT PER BURST. A list mounts a menu per row, and each menu reads both clearances when it\n * mounts; every read appends a probe and forces a layout. Admin's /files/trash (432 rows) spent 1.46 s in\n * these reads before the list could draw (2026-10-24). Reads within CLEARANCE_REUSE_MS of a measurement\n * share it: the variables only change with the page's chrome (a header row, the assists pill).\n */\nconst CLEARANCE_REUSE_MS = 500;\nconst clearanceCache = new Map<string, { px: number; at: number }>();\nconst clock = (): number => (typeof performance !== \"undefined\" ? performance.now() : Date.now());\n\nfunction readClearance(height: string, shared = false): number {\n if (typeof document === \"undefined\") return 0;\n const now = clock();\n const held = shared ? clearanceCache.get(height) : undefined;\n if (held && now - held.at < CLEARANCE_REUSE_MS) return held.px;\n const px = measureClearance(height);\n clearanceCache.set(height, { px, at: now });\n return px;\n}\n\n/** The mount-time reads every menu content makes: shared across the menus that mount in one burst. */\nconst TOP_CLEARANCE = \"var(--matrx-floating-top-clearance, var(--shell-header-h, 0px))\";\nconst BOTTOM_CLEARANCE = \"var(--matrx-floating-clearance, 0px)\";\nconst sharedTopClearance = (): number => readClearance(TOP_CLEARANCE, true);\nconst sharedBottomClearance = (): number => readClearance(BOTTOM_CLEARANCE, true);\n\nfunction measureClearance(height: string): number {\n const probe = document.createElement(\"div\");\n probe.style.cssText = `position:fixed;top:0;left:0;width:0;visibility:hidden;pointer-events:none;height:${height}`;\n document.body.appendChild(probe);\n const px = probe.getBoundingClientRect().height;\n probe.remove();\n return Number.isFinite(px) ? Math.ceil(px) : 0;\n}\n\nconst DropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n DropdownMenuContentProps\n>(({ container, ...props }, ref) => {\n const portalContainer = usePortalContainer(container);\n // 🚨 A CLOSED MENU MEASURES NOTHING. The Portal renders its children only while the menu is open\n // (Radix Presence), so the clearance reads live in the child: a list of 400 rows mounts 400 closed\n // menus and no probe (live /files, 2026-10-24: a re-mount of every row's menu after creating a\n // folder stopped the page responding).\n return (\n <DropdownMenuPrimitive.Portal container={portalContainer}>\n <OpenDropdownMenuContent ref={ref} {...props} />\n </DropdownMenuPrimitive.Portal>\n );\n});\nDropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;\n\n/** The open menu's surface: mounted only while open, so its clearance reads run once per open. */\nconst OpenDropdownMenuContent = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Content>,\n Omit<DropdownMenuContentProps, \"container\">\n>(({ className, sideOffset = 4, surface = \"default\", children, onCloseAutoFocus, collisionPadding, ...props }, ref) => {\n const [topClearance] = React.useState(sharedTopClearance);\n const [bottomClearance] = React.useState(sharedBottomClearance);\n const edges = useMenuScrollEdges(ref);\n return (\n <DropdownMenuPrimitive.Content\n ref={edges.ref}\n data-slot=\"dropdown-menu-content\"\n data-surface={surface === \"solid\" ? \"solid\" : undefined}\n sideOffset={sideOffset}\n collisionPadding={menuCollisionPadding(collisionPadding, topClearance, bottomClearance)}\n className={cn(\n MENU_SURFACE_CLASS,\n edges.surfaceClassName,\n \"shadow-md\",\n surface === \"solid\" && SOLID_SURFACE_CLASS,\n MOTION_POPPER,\n className,\n )}\n {...props}\n onCloseAutoFocus={keepMovedFocus(onCloseAutoFocus)}\n >\n {edges.wrap(children)}\n </DropdownMenuPrimitive.Content>\n );\n});\nOpenDropdownMenuContent.displayName = \"OpenDropdownMenuContent\";\n\nconst DropdownMenuItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean;\n /** `danger`: a destructive item (Delete, Remove) — destructive text and icon, destructive soft\n * fill on hover / focus. Default: the ordinary item. */\n tone?: \"danger\";\n /** `sm`: 13px text on the 28px control row height, for dense frames. Default: the menu's 14px. */\n size?: \"sm\";\n }\n>(({ className, inset, tone, size, ...props }, ref) => (\n <DropdownMenuPrimitive.Item\n ref={ref}\n data-slot=\"dropdown-menu-item\"\n data-tone={tone}\n data-size={size}\n className={cn(MENU_ITEM_CLASS, size === \"sm\" && \"h-7 py-0 text-[13px]\", inset && \"pl-8\", className)}\n {...props}\n />\n));\nDropdownMenuItem.displayName = DropdownMenuPrimitive.Item.displayName;\n\nconst DropdownMenuCheckboxItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.CheckboxItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.CheckboxItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.CheckboxItem\n ref={ref}\n data-slot=\"dropdown-menu-checkbox-item\"\n className={cn(MENU_INDICATOR_ITEM_CLASS, className)}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <RadixCheckIcon className=\"h-4 w-4\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.CheckboxItem>\n));\nDropdownMenuCheckboxItem.displayName =\n DropdownMenuPrimitive.CheckboxItem.displayName;\n\nconst DropdownMenuRadioItem = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.RadioItem>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.RadioItem>\n>(({ className, children, ...props }, ref) => (\n <DropdownMenuPrimitive.RadioItem\n ref={ref}\n data-slot=\"dropdown-menu-radio-item\"\n className={cn(MENU_INDICATOR_ITEM_CLASS, className)}\n {...props}\n >\n <span className=\"absolute left-2 flex h-3.5 w-3.5 items-center justify-center\">\n <DropdownMenuPrimitive.ItemIndicator>\n <DotFilledIcon className=\"h-4 w-4 fill-current\" />\n </DropdownMenuPrimitive.ItemIndicator>\n </span>\n {children}\n </DropdownMenuPrimitive.RadioItem>\n));\nDropdownMenuRadioItem.displayName = DropdownMenuPrimitive.RadioItem.displayName;\n\nconst DropdownMenuLabel = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Label>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Label> & {\n inset?: boolean;\n }\n>(({ className, inset, ...props }, ref) => (\n <DropdownMenuPrimitive.Label\n ref={ref}\n data-slot=\"dropdown-menu-label\"\n className={cn(\"type-label px-2 pb-1 pt-2 font-medium text-foreground\", inset && \"pl-8\", className)}\n {...props}\n />\n));\nDropdownMenuLabel.displayName = DropdownMenuPrimitive.Label.displayName;\n\nconst DropdownMenuSeparator = React.forwardRef<\n React.ComponentRef<typeof DropdownMenuPrimitive.Separator>,\n React.ComponentPropsWithoutRef<typeof DropdownMenuPrimitive.Separator>\n>(({ className, ...props }, ref) => (\n <DropdownMenuPrimitive.Separator\n ref={ref}\n data-slot=\"dropdown-menu-separator\"\n className={cn(\"-mx-1 my-1 h-px bg-muted\", className)}\n {...props}\n />\n));\nDropdownMenuSeparator.displayName = DropdownMenuPrimitive.Separator.displayName;\n\nconst DropdownMenuShortcut = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLSpanElement>) => (\n <span\n data-slot=\"dropdown-menu-shortcut\"\n className={cn(\"ml-auto text-xs tracking-widest text-muted-foreground\", className)}\n {...props}\n />\n);\nDropdownMenuShortcut.displayName = \"DropdownMenuShortcut\";\n\nexport {\n DropdownMenu,\n DropdownMenuCheckboxItem,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuPortal,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuShortcut,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n};\n"],"mappings":"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","names":[]}
@@ -15,7 +15,7 @@ import {
15
15
  DropdownMenuRadioItem,
16
16
  DropdownMenuSeparator,
17
17
  DropdownMenuTrigger
18
- } from "./chunk-T57DLONB.js";
18
+ } from "./chunk-AKSKVT2M.js";
19
19
  import {
20
20
  SelectChevron
21
21
  } from "./chunk-WFITMVDB.js";
@@ -463,4 +463,4 @@ export {
463
463
  Switch,
464
464
  Textarea
465
465
  };
466
- //# sourceMappingURL=chunk-LU75R6YX.js.map
466
+ //# sourceMappingURL=chunk-KOUHF4JC.js.map
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  Button,
4
4
  Select
5
- } from "./chunk-LU75R6YX.js";
5
+ } from "./chunk-KOUHF4JC.js";
6
6
  import {
7
7
  Tooltip,
8
8
  TooltipContent,
@@ -367,4 +367,4 @@ export {
367
367
  DEFAULT_TABLE_PAGE_SIZES,
368
368
  GenericTablePagination
369
369
  };
370
- //# sourceMappingURL=chunk-HISATFYI.js.map
370
+ //# sourceMappingURL=chunk-LS3C7IUV.js.map
@@ -3,13 +3,13 @@ import {
3
3
  MENU_LOOK_CLASS,
4
4
  MenuLookPanelItem,
5
5
  MenuLookRowBody
6
- } from "./chunk-42GFQMLA.js";
6
+ } from "./chunk-WUI5OFCH.js";
7
7
  import {
8
8
  ARCHIVE_LABEL
9
9
  } from "./chunk-VQQ3O7J5.js";
10
10
  import {
11
11
  ConfirmDialog
12
- } from "./chunk-WOA6WHV2.js";
12
+ } from "./chunk-WLKHQGX5.js";
13
13
  import {
14
14
  ErrorBox
15
15
  } from "./chunk-5Z5GTXKL.js";
@@ -21,7 +21,7 @@ import {
21
21
  } from "./chunk-TDMVH77G.js";
22
22
  import {
23
23
  Button
24
- } from "./chunk-LU75R6YX.js";
24
+ } from "./chunk-KOUHF4JC.js";
25
25
  import {
26
26
  Tooltip,
27
27
  TooltipContent,
@@ -778,4 +778,4 @@ export {
778
778
  CanvasLayout,
779
779
  ModeSwitch
780
780
  };
781
- //# sourceMappingURL=chunk-QK7GPIEA.js.map
781
+ //# sourceMappingURL=chunk-QJ6SQNXD.js.map
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import {
3
3
  Button
4
- } from "./chunk-LU75R6YX.js";
4
+ } from "./chunk-KOUHF4JC.js";
5
5
  import {
6
6
  Tooltip,
7
7
  TooltipContent,
@@ -295,4 +295,4 @@ export {
295
295
  displayId,
296
296
  RecordId
297
297
  };
298
- //# sourceMappingURL=chunk-TSETPQWU.js.map
298
+ //# sourceMappingURL=chunk-RO5CRIOL.js.map
@@ -19,7 +19,7 @@ import {
19
19
  MenuLookSub,
20
20
  MenuLookSubContent,
21
21
  MenuLookSubTrigger
22
- } from "./chunk-42GFQMLA.js";
22
+ } from "./chunk-WUI5OFCH.js";
23
23
  import {
24
24
  ContextMenu,
25
25
  ContextMenuTrigger
@@ -37,11 +37,11 @@ import {
37
37
  } from "./chunk-WFBPCMPF.js";
38
38
  import {
39
39
  Button
40
- } from "./chunk-LU75R6YX.js";
40
+ } from "./chunk-KOUHF4JC.js";
41
41
  import {
42
42
  DropdownMenu,
43
43
  DropdownMenuTrigger
44
- } from "./chunk-T57DLONB.js";
44
+ } from "./chunk-AKSKVT2M.js";
45
45
  import {
46
46
  declareLazyDataProps,
47
47
  useMatrxTableRowAlchemy,
@@ -967,4 +967,4 @@ export {
967
967
  ItemContextMenu,
968
968
  ItemRow
969
969
  };
970
- //# sourceMappingURL=chunk-WHERV3VC.js.map
970
+ //# sourceMappingURL=chunk-SOCDBDFS.js.map
@@ -21,7 +21,7 @@ import {
21
21
  import {
22
22
  DataRowInspector,
23
23
  columnId
24
- } from "./chunk-ZU2ZODDD.js";
24
+ } from "./chunk-2QFA6CK4.js";
25
25
  import {
26
26
  useMatrxDataTableHost
27
27
  } from "./chunk-B5D3VIMC.js";
@@ -305,4 +305,4 @@ export {
305
305
  withMacLookDefaults,
306
306
  DataRowWindow
307
307
  };
308
- //# sourceMappingURL=chunk-C5HYUXR2.js.map
308
+ //# sourceMappingURL=chunk-UGUVTE77.js.map
@@ -49,7 +49,7 @@ import {
49
49
  import {
50
50
  Button as Button2,
51
51
  Chip
52
- } from "./chunk-LU75R6YX.js";
52
+ } from "./chunk-KOUHF4JC.js";
53
53
  import {
54
54
  Tooltip,
55
55
  TooltipContent,
@@ -66,7 +66,7 @@ import {
66
66
  DropdownMenuSubContent,
67
67
  DropdownMenuSubTrigger,
68
68
  DropdownMenuTrigger
69
- } from "./chunk-T57DLONB.js";
69
+ } from "./chunk-AKSKVT2M.js";
70
70
  import {
71
71
  Select,
72
72
  SelectChevron,
@@ -4007,4 +4007,4 @@ export {
4007
4007
  TileCard,
4008
4008
  TileCardGrid
4009
4009
  };
4010
- //# sourceMappingURL=chunk-FF524V6P.js.map
4010
+ //# sourceMappingURL=chunk-VOLSYNJY.js.map
@@ -8,7 +8,7 @@ import {
8
8
  import {
9
9
  Button,
10
10
  ControlRow
11
- } from "./chunk-LU75R6YX.js";
11
+ } from "./chunk-KOUHF4JC.js";
12
12
  import {
13
13
  buttonVariants,
14
14
  swallowClick
@@ -482,4 +482,4 @@ export {
482
482
  DangerZone,
483
483
  PromoBanner
484
484
  };
485
- //# sourceMappingURL=chunk-WOA6WHV2.js.map
485
+ //# sourceMappingURL=chunk-WLKHQGX5.js.map
@@ -9,7 +9,7 @@ import {
9
9
  import {
10
10
  DropdownMenuContent,
11
11
  DropdownMenuSubContent
12
- } from "./chunk-T57DLONB.js";
12
+ } from "./chunk-AKSKVT2M.js";
13
13
  import {
14
14
  useScrollFade
15
15
  } from "./chunk-BNXNIN2S.js";
@@ -409,4 +409,4 @@ export {
409
409
  MenuLookPanelSeparator,
410
410
  MenuLookSearch
411
411
  };
412
- //# sourceMappingURL=chunk-42GFQMLA.js.map
412
+ //# sourceMappingURL=chunk-WUI5OFCH.js.map
@@ -15,11 +15,11 @@ import "./chunk-U24MOJWK.js";
15
15
  import "./chunk-NDTDBBMM.js";
16
16
  import {
17
17
  Textarea
18
- } from "./chunk-LU75R6YX.js";
18
+ } from "./chunk-KOUHF4JC.js";
19
19
  import "./chunk-BD77DHUO.js";
20
20
  import "./chunk-BKCJUFD3.js";
21
21
  import "./chunk-MOZRIHJF.js";
22
- import "./chunk-T57DLONB.js";
22
+ import "./chunk-AKSKVT2M.js";
23
23
  import "./chunk-BNXNIN2S.js";
24
24
  import "./chunk-WFITMVDB.js";
25
25
  import "./chunk-WAT2XW7L.js";
package/dist/controls.cjs CHANGED
@@ -820,14 +820,18 @@ var DropdownMenuSubTrigger = React6.forwardRef(({ className, inset, children, ..
820
820
  }
821
821
  ));
822
822
  DropdownMenuSubTrigger.displayName = DropdownMenuPrimitive.SubTrigger.displayName;
823
- var DropdownMenuSubContent = React6.forwardRef(({ className, container, surface = "default", sideOffset = 2, alignOffset = -4, collisionPadding, onFocusOutside, children, ...props }, ref) => {
823
+ var DropdownMenuSubContent = React6.forwardRef(({ container, ...props }, ref) => {
824
824
  const portalContainer = usePortalContainer(container);
825
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(OpenDropdownMenuSubContent, { ref, ...props }) });
826
+ });
827
+ DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
828
+ var OpenDropdownMenuSubContent = React6.forwardRef(({ className, surface = "default", sideOffset = 2, alignOffset = -4, collisionPadding, onFocusOutside, children, ...props }, ref) => {
825
829
  const [bottomClearance] = React6.useState(sharedBottomClearance);
826
830
  const padding = menuCollisionPadding(collisionPadding ?? 8, 0, bottomClearance);
827
831
  const nested = useNestedSubmenuPlacement(ref, padding);
828
832
  const keep = useSubmenuSurvivesParentPanelFocus(nested.ref, onFocusOutside);
829
833
  const edges = useMenuScrollEdges(keep.ref);
830
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
834
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
831
835
  DropdownMenuPrimitive.SubContent,
832
836
  {
833
837
  ref: edges.ref,
@@ -841,9 +845,9 @@ var DropdownMenuSubContent = React6.forwardRef(({ className, container, surface
841
845
  ...props,
842
846
  children: nested.wrap(edges.wrap(children))
843
847
  }
844
- ) });
848
+ );
845
849
  });
846
- DropdownMenuSubContent.displayName = DropdownMenuPrimitive.SubContent.displayName;
850
+ OpenDropdownMenuSubContent.displayName = "OpenDropdownMenuSubContent";
847
851
  function menuCollisionPadding(caller, top, bottom, fallback = 0) {
848
852
  const side = (key) => typeof caller === "number" ? caller : caller?.[key] ?? fallback;
849
853
  return { top: Math.max(side("top"), top), right: side("right"), bottom: Math.max(side("bottom"), bottom), left: side("left") };
@@ -872,12 +876,16 @@ function measureClearance(height) {
872
876
  probe.remove();
873
877
  return Number.isFinite(px) ? Math.ceil(px) : 0;
874
878
  }
875
- var DropdownMenuContent = React6.forwardRef(({ className, sideOffset = 4, container, surface = "default", children, onCloseAutoFocus, collisionPadding, ...props }, ref) => {
879
+ var DropdownMenuContent = React6.forwardRef(({ container, ...props }, ref) => {
876
880
  const portalContainer = usePortalContainer(container);
881
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(OpenDropdownMenuContent, { ref, ...props }) });
882
+ });
883
+ DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
884
+ var OpenDropdownMenuContent = React6.forwardRef(({ className, sideOffset = 4, surface = "default", children, onCloseAutoFocus, collisionPadding, ...props }, ref) => {
877
885
  const [topClearance] = React6.useState(sharedTopClearance);
878
886
  const [bottomClearance] = React6.useState(sharedBottomClearance);
879
887
  const edges = useMenuScrollEdges(ref);
880
- return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(DropdownMenuPrimitive.Portal, { container: portalContainer, children: /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
888
+ return /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
881
889
  DropdownMenuPrimitive.Content,
882
890
  {
883
891
  ref: edges.ref,
@@ -897,9 +905,9 @@ var DropdownMenuContent = React6.forwardRef(({ className, sideOffset = 4, contai
897
905
  onCloseAutoFocus: keepMovedFocus(onCloseAutoFocus),
898
906
  children: edges.wrap(children)
899
907
  }
900
- ) });
908
+ );
901
909
  });
902
- DropdownMenuContent.displayName = DropdownMenuPrimitive.Content.displayName;
910
+ OpenDropdownMenuContent.displayName = "OpenDropdownMenuContent";
903
911
  var DropdownMenuItem = React6.forwardRef(({ className, inset, tone: tone2, size, ...props }, ref) => /* @__PURE__ */ (0, import_jsx_runtime6.jsx)(
904
912
  DropdownMenuPrimitive.Item,
905
913
  {