@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.
- package/CHANGELOG.md +24 -2
- package/README.md +2 -0
- package/dist/carousel.js +5 -5
- package/dist/{chunk-ZU2ZODDD.js → chunk-2QFA6CK4.js} +4 -4
- package/dist/{chunk-UCEKAKHP.js → chunk-3YTF4MH2.js} +2 -2
- package/dist/{chunk-T57DLONB.js → chunk-AKSKVT2M.js} +17 -9
- package/dist/chunk-AKSKVT2M.js.map +1 -0
- package/dist/{chunk-LU75R6YX.js → chunk-KOUHF4JC.js} +2 -2
- package/dist/{chunk-HISATFYI.js → chunk-LS3C7IUV.js} +2 -2
- package/dist/{chunk-QK7GPIEA.js → chunk-QJ6SQNXD.js} +4 -4
- package/dist/{chunk-TSETPQWU.js → chunk-RO5CRIOL.js} +2 -2
- package/dist/{chunk-WHERV3VC.js → chunk-SOCDBDFS.js} +4 -4
- package/dist/{chunk-C5HYUXR2.js → chunk-UGUVTE77.js} +2 -2
- package/dist/{chunk-FF524V6P.js → chunk-VOLSYNJY.js} +3 -3
- package/dist/{chunk-WOA6WHV2.js → chunk-WLKHQGX5.js} +2 -2
- package/dist/{chunk-42GFQMLA.js → chunk-WUI5OFCH.js} +2 -2
- package/dist/clipboard-fallback-dialog.js +2 -2
- package/dist/controls.cjs +16 -8
- package/dist/controls.cjs.map +1 -1
- package/dist/controls.js +5 -5
- package/dist/data-table/data-row-inspector.js +5 -5
- package/dist/data-table/data-row-window.js +6 -6
- package/dist/data-table/index.cjs +858 -772
- package/dist/data-table/index.cjs.map +1 -1
- package/dist/data-table/index.js +541 -461
- package/dist/data-table/index.js.map +1 -1
- package/dist/data-table/pagination.cjs +16 -8
- package/dist/data-table/pagination.cjs.map +1 -1
- package/dist/data-table/pagination.js +3 -3
- package/dist/data-table/uuid-cell.js +3 -3
- package/dist/desktop.cjs +16 -8
- package/dist/desktop.cjs.map +1 -1
- package/dist/desktop.js +5 -5
- package/dist/index.cjs +20 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/intro-stage.cjs +24 -3
- package/dist/intro-stage.cjs.map +1 -1
- package/dist/intro-stage.d.cts +9 -3
- package/dist/intro-stage.d.ts +9 -3
- package/dist/intro-stage.js +24 -3
- package/dist/intro-stage.js.map +1 -1
- package/dist/item.cjs +16 -8
- package/dist/item.cjs.map +1 -1
- package/dist/item.js +4 -4
- package/dist/lite-table.js +2 -2
- package/dist/menu-look.cjs +16 -8
- package/dist/menu-look.cjs.map +1 -1
- package/dist/menu-look.js +2 -2
- package/dist/record-list.cjs +16 -8
- package/dist/record-list.cjs.map +1 -1
- package/dist/record-list.js +4 -4
- package/dist/settings.js +3 -3
- package/dist/styles.css +18 -0
- package/dist/thumbnail-grid.cjs +27 -1
- package/dist/thumbnail-grid.cjs.map +1 -1
- package/dist/thumbnail-grid.d.cts +16 -2
- package/dist/thumbnail-grid.d.ts +16 -2
- package/dist/thumbnail-grid.js +27 -1
- package/dist/thumbnail-grid.js.map +1 -1
- package/dist/writing-field.cjs +3 -2
- package/dist/writing-field.cjs.map +1 -1
- package/dist/writing-field.js +6 -5
- package/dist/writing-field.js.map +1 -1
- package/package.json +2 -2
- package/dist/chunk-T57DLONB.js.map +0 -1
- /package/dist/{chunk-ZU2ZODDD.js.map → chunk-2QFA6CK4.js.map} +0 -0
- /package/dist/{chunk-UCEKAKHP.js.map → chunk-3YTF4MH2.js.map} +0 -0
- /package/dist/{chunk-LU75R6YX.js.map → chunk-KOUHF4JC.js.map} +0 -0
- /package/dist/{chunk-HISATFYI.js.map → chunk-LS3C7IUV.js.map} +0 -0
- /package/dist/{chunk-QK7GPIEA.js.map → chunk-QJ6SQNXD.js.map} +0 -0
- /package/dist/{chunk-TSETPQWU.js.map → chunk-RO5CRIOL.js.map} +0 -0
- /package/dist/{chunk-WHERV3VC.js.map → chunk-SOCDBDFS.js.map} +0 -0
- /package/dist/{chunk-C5HYUXR2.js.map → chunk-UGUVTE77.js.map} +0 -0
- /package/dist/{chunk-FF524V6P.js.map → chunk-VOLSYNJY.js.map} +0 -0
- /package/dist/{chunk-WOA6WHV2.js.map → chunk-WLKHQGX5.js.map} +0 -0
- /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
|
-
|
|
6
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
20
|
+
} from "./chunk-RO5CRIOL.js";
|
|
21
21
|
import {
|
|
22
22
|
Button
|
|
23
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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(({
|
|
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(
|
|
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
|
-
|
|
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(({
|
|
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(
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
466
|
+
//# sourceMappingURL=chunk-KOUHF4JC.js.map
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import {
|
|
3
3
|
Button,
|
|
4
4
|
Select
|
|
5
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
781
|
+
//# sourceMappingURL=chunk-QJ6SQNXD.js.map
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
Button
|
|
4
|
-
} from "./chunk-
|
|
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-
|
|
298
|
+
//# sourceMappingURL=chunk-RO5CRIOL.js.map
|
|
@@ -19,7 +19,7 @@ import {
|
|
|
19
19
|
MenuLookSub,
|
|
20
20
|
MenuLookSubContent,
|
|
21
21
|
MenuLookSubTrigger
|
|
22
|
-
} from "./chunk-
|
|
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-
|
|
40
|
+
} from "./chunk-KOUHF4JC.js";
|
|
41
41
|
import {
|
|
42
42
|
DropdownMenu,
|
|
43
43
|
DropdownMenuTrigger
|
|
44
|
-
} from "./chunk-
|
|
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-
|
|
970
|
+
//# sourceMappingURL=chunk-SOCDBDFS.js.map
|
|
@@ -21,7 +21,7 @@ import {
|
|
|
21
21
|
import {
|
|
22
22
|
DataRowInspector,
|
|
23
23
|
columnId
|
|
24
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
4010
|
+
//# sourceMappingURL=chunk-VOLSYNJY.js.map
|
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
import {
|
|
9
9
|
Button,
|
|
10
10
|
ControlRow
|
|
11
|
-
} from "./chunk-
|
|
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-
|
|
485
|
+
//# sourceMappingURL=chunk-WLKHQGX5.js.map
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
import {
|
|
10
10
|
DropdownMenuContent,
|
|
11
11
|
DropdownMenuSubContent
|
|
12
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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(({
|
|
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)(
|
|
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
|
-
|
|
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(({
|
|
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)(
|
|
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
|
-
|
|
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
|
{
|