@ai-matrx/design-system 0.86.332 → 0.86.334
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 +28 -2
- package/dist/auth-gate-dialog.js +4 -4
- package/dist/carousel.js +18 -18
- package/dist/{chunk-MVGMI6UZ.js → chunk-3MQMVPKO.js} +5 -5
- package/dist/{chunk-2WL2SGKL.js → chunk-677JS6TX.js} +24 -10
- package/dist/chunk-677JS6TX.js.map +1 -0
- package/dist/{chunk-TBDMTCRW.js → chunk-6YZMGSQY.js} +10 -10
- package/dist/{chunk-OFJ5LGBU.js → chunk-7NEVJKDZ.js} +8 -8
- package/dist/{chunk-XTNAKJSH.js → chunk-B3LDW3IQ.js} +2 -2
- package/dist/{chunk-VTJWQPYR.js → chunk-BM2YYBUO.js} +5 -5
- package/dist/{chunk-FTZCPGTH.js → chunk-CFCWQDGC.js} +4 -4
- package/dist/{chunk-CN7C4KQB.js → chunk-CH2NWSES.js} +2 -2
- package/dist/{chunk-CJCUD62M.js → chunk-CSSD6NS4.js} +5 -5
- package/dist/{chunk-W3QSRJ3O.js → chunk-E4GS5QH7.js} +7 -7
- package/dist/{chunk-O4KANICE.js → chunk-FRJ4PPA2.js} +5 -5
- package/dist/{chunk-4PCLJAW2.js → chunk-FXT7PZAF.js} +5 -14
- package/dist/chunk-FXT7PZAF.js.map +1 -0
- package/dist/{chunk-D45XDOJS.js → chunk-GHPUO3O7.js} +2 -2
- package/dist/{chunk-RPUC5MNH.js → chunk-GLZJ7WZK.js} +3 -3
- package/dist/{chunk-VKWQTSB6.js → chunk-HEFTQUJ5.js} +6 -6
- package/dist/{chunk-KWBYKUKP.js → chunk-J6637L6D.js} +4 -4
- package/dist/chunk-KGW373MK.js +21 -0
- package/dist/chunk-KGW373MK.js.map +1 -0
- package/dist/{chunk-5LT34PFX.js → chunk-MEJVHDYJ.js} +18 -18
- package/dist/{chunk-PPB52S7F.js → chunk-MFUNGDHO.js} +7 -7
- package/dist/{chunk-LCPHFONA.js → chunk-MIJMP4WI.js} +5 -5
- package/dist/{chunk-XREKZXAL.js → chunk-SMJGESH7.js} +6 -6
- package/dist/{chunk-SNHCBHBE.js → chunk-U24MOJWK.js} +4 -4
- package/dist/{chunk-DO6G4EKJ.js → chunk-UWTODOMD.js} +2 -2
- package/dist/{chunk-BQR4N24F.js → chunk-VLLUUOYJ.js} +4 -4
- package/dist/{chunk-FD6V6JBN.js → chunk-VV6WZTH5.js} +8 -8
- package/dist/{chunk-LVM7XZRJ.js → chunk-WQ2QCMMA.js} +4 -4
- package/dist/{chunk-57OD2WTY.js → chunk-X6ZRHJQP.js} +6 -6
- package/dist/{chunk-PLFWDUJW.js → chunk-XEXSZBXV.js} +3 -3
- package/dist/{chunk-JSXNITMG.js → chunk-YC5GAO35.js} +2 -2
- package/dist/{chunk-5TF2AFDM.js → chunk-ZCRPESQX.js} +4 -4
- package/dist/{chunk-5IKQ6RU4.js → chunk-ZOQ2XKXF.js} +9 -9
- package/dist/clipboard-fallback-dialog.js +10 -10
- package/dist/controls.js +15 -15
- package/dist/data-table/data-row-inspector.js +15 -14
- package/dist/data-table/data-row-window.js +20 -19
- package/dist/data-table/index.cjs +16 -12
- package/dist/data-table/index.cjs.map +1 -1
- package/dist/data-table/index.js +37 -36
- package/dist/data-table/index.js.map +1 -1
- package/dist/data-table/layered-filter-builder.js +4 -4
- package/dist/data-table/pagination.js +8 -8
- package/dist/data-table/uuid-cell.js +8 -8
- package/dist/desktop.js +22 -22
- package/dist/email-input-dialog.js +7 -7
- package/dist/index.cjs +590 -397
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +120 -10
- package/dist/index.d.ts +120 -10
- package/dist/index.js +519 -348
- package/dist/index.js.map +1 -1
- package/dist/intro-stage.js +3 -3
- package/dist/item.cjs +33 -17
- package/dist/item.cjs.map +1 -1
- package/dist/item.d.cts +7 -1
- package/dist/item.d.ts +7 -1
- package/dist/item.js +32 -30
- package/dist/item.js.map +1 -1
- package/dist/lite-table.js +10 -10
- package/dist/menu-look.js +3 -3
- package/dist/record-list.cjs +16 -2
- package/dist/record-list.cjs.map +1 -1
- package/dist/record-list.d.cts +7 -1
- package/dist/record-list.d.ts +7 -1
- package/dist/record-list.js +13 -13
- package/dist/sandbox-gate-dialog.js +8 -8
- package/dist/scope-mismatch-dialog.js +7 -7
- package/dist/settings.cjs +16 -12
- package/dist/settings.cjs.map +1 -1
- package/dist/settings.js +20 -19
- package/dist/settings.js.map +1 -1
- package/dist/site-icon.js +2 -2
- package/dist/swipe-deck.js +1 -1
- package/dist/tap-shortcut.cjs +40 -0
- package/dist/tap-shortcut.cjs.map +1 -0
- package/dist/tap-shortcut.d.cts +13 -0
- package/dist/tap-shortcut.d.ts +13 -0
- package/dist/tap-shortcut.js +10 -0
- package/dist/tap-shortcut.js.map +1 -0
- package/dist/tap-target/ai-buttons.cjs +16 -12
- package/dist/tap-target/ai-buttons.cjs.map +1 -1
- package/dist/tap-target/ai-buttons.js +4 -3
- package/dist/tap-target/ai-buttons.js.map +1 -1
- package/dist/tap-target/buttons.cjs +16 -12
- package/dist/tap-target/buttons.cjs.map +1 -1
- package/dist/tap-target/buttons.d.cts +3 -5
- package/dist/tap-target/buttons.d.ts +3 -5
- package/dist/tap-target/buttons.js +4 -3
- package/dist/tap-target.cjs +16 -12
- package/dist/tap-target.cjs.map +1 -1
- package/dist/tap-target.d.cts +5 -7
- package/dist/tap-target.d.ts +5 -7
- package/dist/tap-target.js +6 -4
- package/dist/text-input-dialog.js +10 -10
- package/dist/thumbnail-grid.js +2 -2
- package/dist/transcript-scroll-nav.cjs +16 -12
- package/dist/transcript-scroll-nav.cjs.map +1 -1
- package/dist/transcript-scroll-nav.js +2 -1
- package/dist/transcript-scroll-nav.js.map +1 -1
- package/dist/value-prompts-dialog.js +5 -5
- package/dist/writing-field.cjs +16 -12
- package/dist/writing-field.cjs.map +1 -1
- package/dist/writing-field.js +21 -20
- package/dist/writing-field.js.map +1 -1
- package/package.json +12 -2
- package/dist/chunk-2WL2SGKL.js.map +0 -1
- package/dist/chunk-4PCLJAW2.js.map +0 -1
- /package/dist/{chunk-MVGMI6UZ.js.map → chunk-3MQMVPKO.js.map} +0 -0
- /package/dist/{chunk-TBDMTCRW.js.map → chunk-6YZMGSQY.js.map} +0 -0
- /package/dist/{chunk-OFJ5LGBU.js.map → chunk-7NEVJKDZ.js.map} +0 -0
- /package/dist/{chunk-XTNAKJSH.js.map → chunk-B3LDW3IQ.js.map} +0 -0
- /package/dist/{chunk-VTJWQPYR.js.map → chunk-BM2YYBUO.js.map} +0 -0
- /package/dist/{chunk-FTZCPGTH.js.map → chunk-CFCWQDGC.js.map} +0 -0
- /package/dist/{chunk-CN7C4KQB.js.map → chunk-CH2NWSES.js.map} +0 -0
- /package/dist/{chunk-CJCUD62M.js.map → chunk-CSSD6NS4.js.map} +0 -0
- /package/dist/{chunk-W3QSRJ3O.js.map → chunk-E4GS5QH7.js.map} +0 -0
- /package/dist/{chunk-O4KANICE.js.map → chunk-FRJ4PPA2.js.map} +0 -0
- /package/dist/{chunk-D45XDOJS.js.map → chunk-GHPUO3O7.js.map} +0 -0
- /package/dist/{chunk-RPUC5MNH.js.map → chunk-GLZJ7WZK.js.map} +0 -0
- /package/dist/{chunk-VKWQTSB6.js.map → chunk-HEFTQUJ5.js.map} +0 -0
- /package/dist/{chunk-KWBYKUKP.js.map → chunk-J6637L6D.js.map} +0 -0
- /package/dist/{chunk-5LT34PFX.js.map → chunk-MEJVHDYJ.js.map} +0 -0
- /package/dist/{chunk-PPB52S7F.js.map → chunk-MFUNGDHO.js.map} +0 -0
- /package/dist/{chunk-LCPHFONA.js.map → chunk-MIJMP4WI.js.map} +0 -0
- /package/dist/{chunk-XREKZXAL.js.map → chunk-SMJGESH7.js.map} +0 -0
- /package/dist/{chunk-SNHCBHBE.js.map → chunk-U24MOJWK.js.map} +0 -0
- /package/dist/{chunk-DO6G4EKJ.js.map → chunk-UWTODOMD.js.map} +0 -0
- /package/dist/{chunk-BQR4N24F.js.map → chunk-VLLUUOYJ.js.map} +0 -0
- /package/dist/{chunk-FD6V6JBN.js.map → chunk-VV6WZTH5.js.map} +0 -0
- /package/dist/{chunk-LVM7XZRJ.js.map → chunk-WQ2QCMMA.js.map} +0 -0
- /package/dist/{chunk-57OD2WTY.js.map → chunk-X6ZRHJQP.js.map} +0 -0
- /package/dist/{chunk-PLFWDUJW.js.map → chunk-XEXSZBXV.js.map} +0 -0
- /package/dist/{chunk-JSXNITMG.js.map → chunk-YC5GAO35.js.map} +0 -0
- /package/dist/{chunk-5TF2AFDM.js.map → chunk-ZCRPESQX.js.map} +0 -0
- /package/dist/{chunk-5IKQ6RU4.js.map → chunk-ZOQ2XKXF.js.map} +0 -0
package/dist/item.d.cts
CHANGED
|
@@ -283,6 +283,12 @@ interface ItemRowProps extends ItemMenuSurface {
|
|
|
283
283
|
* glides LEFT (translate) when the kebab is revealed. Never masked.
|
|
284
284
|
*/
|
|
285
285
|
trailing?: ReactNode;
|
|
286
|
+
/**
|
|
287
|
+
* Meta shown only while the row is hovered, keyboard-focused or its menu is open (a chat's
|
|
288
|
+
* relative time). At rest it takes no room, so `trailing` keeps the right edge. Always shown on
|
|
289
|
+
* touch, where the kebab is always shown too.
|
|
290
|
+
*/
|
|
291
|
+
trailingOnHover?: ReactNode;
|
|
286
292
|
active?: boolean | undefined;
|
|
287
293
|
disabled?: boolean | undefined;
|
|
288
294
|
/** Navigation mode — renders next/link as the row's primary element. */
|
|
@@ -328,7 +334,7 @@ declare function isLink(entry: ItemMenuEntry): entry is ItemMenuLink;
|
|
|
328
334
|
declare function isSubmenu(entry: ItemMenuEntry): entry is ItemMenuSubmenu;
|
|
329
335
|
declare function resolveItemMenuConfig(input: ItemMenuConfigInput): ItemMenuConfig;
|
|
330
336
|
|
|
331
|
-
declare function ItemRow({ label, secondaryLabel, secondaryShare, subtitle, actions, leadingControl, disclosure, reserveDisclosure, leading, trailing, active, disabled, href, onOpen, openInPlace, menu, rename, size, indent, kebabAriaLabel, disableContextMenu, sourceFeature, surfaceName, entity, className, }: ItemRowProps): react.JSX.Element;
|
|
337
|
+
declare function ItemRow({ label, secondaryLabel, secondaryShare, subtitle, actions, leadingControl, disclosure, reserveDisclosure, leading, trailing, trailingOnHover, active, disabled, href, onOpen, openInPlace, menu, rename, size, indent, kebabAriaLabel, disableContextMenu, sourceFeature, surfaceName, entity, className, }: ItemRowProps): react.JSX.Element;
|
|
332
338
|
|
|
333
339
|
declare function ItemMenu({ config, children, align, side, open: openProp, onOpenChange, onCloseAutoFocus, contentMinWidth, presentation, }: ItemMenuProps): react.JSX.Element;
|
|
334
340
|
declare namespace ItemMenu {
|
package/dist/item.d.ts
CHANGED
|
@@ -283,6 +283,12 @@ interface ItemRowProps extends ItemMenuSurface {
|
|
|
283
283
|
* glides LEFT (translate) when the kebab is revealed. Never masked.
|
|
284
284
|
*/
|
|
285
285
|
trailing?: ReactNode;
|
|
286
|
+
/**
|
|
287
|
+
* Meta shown only while the row is hovered, keyboard-focused or its menu is open (a chat's
|
|
288
|
+
* relative time). At rest it takes no room, so `trailing` keeps the right edge. Always shown on
|
|
289
|
+
* touch, where the kebab is always shown too.
|
|
290
|
+
*/
|
|
291
|
+
trailingOnHover?: ReactNode;
|
|
286
292
|
active?: boolean | undefined;
|
|
287
293
|
disabled?: boolean | undefined;
|
|
288
294
|
/** Navigation mode — renders next/link as the row's primary element. */
|
|
@@ -328,7 +334,7 @@ declare function isLink(entry: ItemMenuEntry): entry is ItemMenuLink;
|
|
|
328
334
|
declare function isSubmenu(entry: ItemMenuEntry): entry is ItemMenuSubmenu;
|
|
329
335
|
declare function resolveItemMenuConfig(input: ItemMenuConfigInput): ItemMenuConfig;
|
|
330
336
|
|
|
331
|
-
declare function ItemRow({ label, secondaryLabel, secondaryShare, subtitle, actions, leadingControl, disclosure, reserveDisclosure, leading, trailing, active, disabled, href, onOpen, openInPlace, menu, rename, size, indent, kebabAriaLabel, disableContextMenu, sourceFeature, surfaceName, entity, className, }: ItemRowProps): react.JSX.Element;
|
|
337
|
+
declare function ItemRow({ label, secondaryLabel, secondaryShare, subtitle, actions, leadingControl, disclosure, reserveDisclosure, leading, trailing, trailingOnHover, active, disabled, href, onOpen, openInPlace, menu, rename, size, indent, kebabAriaLabel, disableContextMenu, sourceFeature, surfaceName, entity, className, }: ItemRowProps): react.JSX.Element;
|
|
332
338
|
|
|
333
339
|
declare function ItemMenu({ config, children, align, side, open: openProp, onOpenChange, onCloseAutoFocus, contentMinWidth, presentation, }: ItemMenuProps): react.JSX.Element;
|
|
334
340
|
declare namespace ItemMenu {
|
package/dist/item.js
CHANGED
|
@@ -12,31 +12,31 @@ import {
|
|
|
12
12
|
runCommand,
|
|
13
13
|
runToggle,
|
|
14
14
|
useItemMenuHost
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
17
|
-
import "./chunk-
|
|
15
|
+
} from "./chunk-677JS6TX.js";
|
|
16
|
+
import "./chunk-J6637L6D.js";
|
|
17
|
+
import "./chunk-HEFTQUJ5.js";
|
|
18
18
|
import "./chunk-K4XCB576.js";
|
|
19
19
|
import {
|
|
20
20
|
InputWithPrefix
|
|
21
21
|
} from "./chunk-TDMVH77G.js";
|
|
22
22
|
import {
|
|
23
23
|
Checkbox
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-VLLUUOYJ.js";
|
|
25
25
|
import {
|
|
26
26
|
Dialog,
|
|
27
27
|
DialogContent,
|
|
28
28
|
DialogFooter,
|
|
29
29
|
DialogHeader,
|
|
30
30
|
DialogTitle
|
|
31
|
-
} from "./chunk-
|
|
32
|
-
import "./chunk-
|
|
31
|
+
} from "./chunk-UWTODOMD.js";
|
|
32
|
+
import "./chunk-U24MOJWK.js";
|
|
33
33
|
import "./chunk-NDTDBBMM.js";
|
|
34
34
|
import "./chunk-LEPD6TV7.js";
|
|
35
35
|
import "./chunk-KPZX2M2C.js";
|
|
36
36
|
import "./chunk-WFBPCMPF.js";
|
|
37
|
-
import "./chunk-
|
|
38
|
-
import "./chunk-BKCJUFD3.js";
|
|
37
|
+
import "./chunk-ZOQ2XKXF.js";
|
|
39
38
|
import "./chunk-BD77DHUO.js";
|
|
39
|
+
import "./chunk-BKCJUFD3.js";
|
|
40
40
|
import "./chunk-MOZRIHJF.js";
|
|
41
41
|
import {
|
|
42
42
|
DropdownMenu,
|
|
@@ -48,27 +48,27 @@ import {
|
|
|
48
48
|
DropdownMenuSubContent,
|
|
49
49
|
DropdownMenuSubTrigger,
|
|
50
50
|
DropdownMenuTrigger
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-X6ZRHJQP.js";
|
|
52
52
|
import "./chunk-BNXNIN2S.js";
|
|
53
53
|
import "./chunk-POJ3RR3K.js";
|
|
54
|
-
import "./chunk-
|
|
54
|
+
import "./chunk-SMJGESH7.js";
|
|
55
|
+
import "./chunk-WAT2XW7L.js";
|
|
55
56
|
import {
|
|
56
57
|
Button
|
|
57
58
|
} from "./chunk-7IOSA55D.js";
|
|
58
|
-
import "./chunk-WAT2XW7L.js";
|
|
59
59
|
import "./chunk-FXXSZNER.js";
|
|
60
60
|
import "./chunk-DGNHZBJY.js";
|
|
61
61
|
import "./chunk-XIUVUL2Y.js";
|
|
62
|
-
import "./chunk-IMOOQQOO.js";
|
|
63
|
-
import {
|
|
64
|
-
cn
|
|
65
|
-
} from "./chunk-M6KA5EHN.js";
|
|
66
62
|
import {
|
|
67
63
|
ChevronRightIcon,
|
|
68
64
|
MoreHorizontalIcon,
|
|
69
65
|
PlusIcon,
|
|
70
66
|
SearchIcon
|
|
71
67
|
} from "./chunk-YCUFQCJW.js";
|
|
68
|
+
import "./chunk-IMOOQQOO.js";
|
|
69
|
+
import {
|
|
70
|
+
cn
|
|
71
|
+
} from "./chunk-M6KA5EHN.js";
|
|
72
72
|
|
|
73
73
|
// src/item/ProductSidebarTop.tsx
|
|
74
74
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
@@ -102,20 +102,7 @@ function ProductSidebarTop({
|
|
|
102
102
|
};
|
|
103
103
|
return /* @__PURE__ */ jsxs("div", { "data-product-sidebar-top": "", className: cn("flex shrink-0 flex-col gap-1 px-2 pb-1 pt-2", className), children: [
|
|
104
104
|
status,
|
|
105
|
-
|
|
106
|
-
InputWithPrefix,
|
|
107
|
-
{
|
|
108
|
-
prefix: /* @__PURE__ */ jsx(SearchIcon, { className: "size-4" }),
|
|
109
|
-
prefixInset: "edge",
|
|
110
|
-
value: search.value,
|
|
111
|
-
onChange: (e) => search.onChange(e.target.value),
|
|
112
|
-
onKeyDown: onSearchKeyDown,
|
|
113
|
-
placeholder: search.placeholder ?? "Search",
|
|
114
|
-
"aria-label": search.ariaLabel,
|
|
115
|
-
className: "h-8"
|
|
116
|
-
}
|
|
117
|
-
) : null,
|
|
118
|
-
/* @__PURE__ */ jsxs("div", { className: cn("flex flex-col", search && "pt-1"), children: [
|
|
105
|
+
/* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
|
|
119
106
|
newItem ? /* @__PURE__ */ jsx(
|
|
120
107
|
ItemRow,
|
|
121
108
|
{
|
|
@@ -155,7 +142,22 @@ function ProductSidebarTop({
|
|
|
155
142
|
] })
|
|
156
143
|
] }) : null
|
|
157
144
|
] }),
|
|
158
|
-
children
|
|
145
|
+
children,
|
|
146
|
+
search ? /* @__PURE__ */ jsx(
|
|
147
|
+
InputWithPrefix,
|
|
148
|
+
{
|
|
149
|
+
prefix: /* @__PURE__ */ jsx(SearchIcon, { className: "size-4" }),
|
|
150
|
+
prefixInset: "edge",
|
|
151
|
+
value: search.value,
|
|
152
|
+
onChange: (e) => search.onChange(e.target.value),
|
|
153
|
+
onKeyDown: onSearchKeyDown,
|
|
154
|
+
placeholder: search.placeholder ?? "Search",
|
|
155
|
+
"aria-label": search.ariaLabel,
|
|
156
|
+
className: "h-8",
|
|
157
|
+
wrapperClassName: "mt-1",
|
|
158
|
+
"data-product-sidebar-search": ""
|
|
159
|
+
}
|
|
160
|
+
) : null
|
|
159
161
|
] });
|
|
160
162
|
}
|
|
161
163
|
function PlaceRow({
|
package/dist/item.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/item/ProductSidebarTop.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * THE TOP OF EVERY PRODUCT SIDEBAR (Arman, 2026-10-22: \"This is a very important missing thing that\n * we have to establish or our system will fail.\" — common-docs projects/app-frame/VISION.md).\n *\n * Extracted from the conversation sidebar's top (`@ai-matrx/chat` ConversationSidebar, approved\n * 2026-10-22), so every product sidebar — the web frame, desktop, the extension — has ONE shape and\n * ONE component:\n *\n * [status] optional one line (a refusal, a notice); absent = no band\n * ( Search ) only a host whose LIST has its own filter and no search door above\n * (+) New optional\n * Agents › the chosen related places, in order\n * Workflows › a place with `children` opens a flyout of them; else it opens\n * Scheduled ›\n * … More every other place, the host's extra groups, \"Edit sidebar…\"\n * [children] optional (the conversation sidebar's one row of filter buttons)\n *\n * ONE LEFT EDGE (Arman, 2026-10-23): the Search glyph, every row's icon and the host's list below\n * share one left edge, 16px in from the column (this component's 8px padding + the row's 8px); a\n * place's `›` and every other chevron sit on the RIGHT. The modes (Chat, Work…) are never here —\n * they live in the page header.\n *\n * ONE SEARCH DOOR (Arman, 2026-10-23: \"You cannot have a search icon and also a searchbar\"): a\n * sidebar whose top row carries a search icon (the web frame's Go to) passes no `search` — that icon\n * finds every place and page this field used to. The field is only a list's own filter.\n *\n * The product's own list sits below, outside this component. WHICH places sit above More is a\n * layered knob (system → organization → person) the HOST reads and writes; this component only\n * draws `chosen` and calls `onEditSidebar`. `SidebarPlacesChooser` is the \"Above More\" section of\n * the host's Edit sidebar dialog (`SidebarEditDialog` is the dialog's chrome).\n */\n\nimport type { ComponentType, KeyboardEvent, ReactNode } from \"react\";\nimport {\n ChevronRightIcon as ChevronRight,\n MoreHorizontalIcon as MoreHorizontal,\n PlusIcon as Plus,\n SearchIcon as Search,\n} from \"../icons\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport { cn } from \"../cn\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"../dropdown-menu\";\nimport { InputWithPrefix } from \"../input\";\nimport { ItemRow } from \"./ItemRow\";\n\n/** One related place a product sidebar can offer (another product, a page, a list). */\nexport interface SidebarPlace {\n /** Stable id: what the layered \"above More\" knob stores. */\n id: string;\n label: string;\n icon: ComponentType<{ className?: string }>;\n /** Its address. Set it and the row is a real link (cmd/ctrl/middle-click opens a new tab). */\n href?: string | undefined;\n /** A sub-list: the row opens a flyout of these (the place itself first) instead of navigating. */\n children?: readonly SidebarPlace[] | undefined;\n}\n\n/** An extra group at the end of More (a product's own other pages, under its name). */\nexport interface SidebarMoreGroup {\n id: string;\n label?: string | undefined;\n places: readonly SidebarPlace[];\n}\n\nexport interface ProductSidebarTopSearch {\n value: string;\n onChange: (value: string) => void;\n /** Screen-reader name (\"Search conversations\"). */\n ariaLabel: string;\n placeholder?: string | undefined;\n}\n\nexport interface ProductSidebarTopProps {\n /** Above Search: one status line (a refusal, a notice). Render it only when it has something to say. */\n status?: ReactNode;\n search?: ProductSidebarTopSearch | undefined;\n /** \"New\" row; absent = none. */\n newItem?: { label?: string | undefined; href?: string | undefined; onOpen?: (() => void) | undefined } | undefined;\n /** Every related place, in order. */\n places: readonly SidebarPlace[];\n /** Ids shown above More, in this order (unknown ids are skipped). */\n chosen: readonly string[];\n /** A place was opened (plain click). Absent + `href` = the link navigates. */\n onOpenPlace?: ((place: SidebarPlace) => void) | undefined;\n /** Extra groups at the end of More, before \"Edit sidebar…\". */\n moreGroups?: readonly SidebarMoreGroup[] | undefined;\n /** \"Edit sidebar…\" in More; absent = not offered. */\n onEditSidebar?: (() => void) | undefined;\n /** Below the rows: the conversation sidebar's bucket toggles. */\n children?: ReactNode;\n /** The right-click menu's feature tag on every row. */\n sourceFeature: string;\n className?: string | undefined;\n}\n\n/** Places above More, in `chosen` order; the rest in `places` order. */\nexport function splitSidebarPlaces(\n places: readonly SidebarPlace[],\n chosen: readonly string[],\n): { above: SidebarPlace[]; more: SidebarPlace[] } {\n const byId = new Map(places.map((p) => [p.id, p]));\n const above = chosen.map((id) => byId.get(id)).filter((p): p is SidebarPlace => p != null);\n const aboveIds = new Set(above.map((p) => p.id));\n return { above, more: places.filter((p) => !aboveIds.has(p.id)) };\n}\n\nexport function ProductSidebarTop({\n status,\n search,\n newItem,\n places,\n chosen,\n onOpenPlace,\n moreGroups,\n onEditSidebar,\n children,\n sourceFeature,\n className,\n}: ProductSidebarTopProps) {\n const { above, more } = splitSidebarPlaces(places, chosen);\n const groups = (moreGroups ?? []).filter((g) => g.places.length > 0);\n const open = (place: SidebarPlace) => onOpenPlace?.(place);\n\n const onSearchKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (search && e.key === \"Escape\" && search.value) {\n e.preventDefault();\n search.onChange(\"\");\n }\n };\n\n return (\n <div data-product-sidebar-top=\"\" className={cn(\"flex shrink-0 flex-col gap-1 px-2 pb-1 pt-2\", className)}>\n {status}\n {search ? (\n <InputWithPrefix\n prefix={<Search className=\"size-4\" />}\n prefixInset=\"edge\"\n value={search.value}\n onChange={(e) => search.onChange(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder={search.placeholder ?? \"Search\"}\n aria-label={search.ariaLabel}\n className=\"h-8\"\n />\n ) : null}\n\n <div className={cn(\"flex flex-col\", search && \"pt-1\")}>\n {newItem ? (\n <ItemRow\n size=\"sm\"\n label={newItem.label ?? \"New\"}\n leading={<Plus className=\"size-4\" />}\n href={newItem.href}\n openInPlace={newItem.href ? true : undefined}\n onOpen={newItem.onOpen}\n sourceFeature={sourceFeature}\n disableContextMenu\n />\n ) : null}\n {above.map((p) => (\n <PlaceRow key={p.id} place={p} onOpen={onOpenPlace ? open : undefined} sourceFeature={sourceFeature} chevron />\n ))}\n {more.length > 0 || groups.length > 0 || onEditSidebar ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <div data-sidebar-more-trigger=\"\">\n <ItemRow\n size=\"sm\"\n label=\"More\"\n leading={<MoreHorizontal className=\"size-4\" />}\n sourceFeature={sourceFeature}\n disableContextMenu\n />\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-56\">\n {more.map((p) => (\n <PlaceMenuItem key={p.id} place={p} onOpen={open} />\n ))}\n {groups.map((g, i) => (\n <div key={g.id} role=\"group\" aria-label={g.label}>\n {more.length > 0 || i > 0 ? <DropdownMenuSeparator /> : null}\n {g.label ? <DropdownMenuLabel>{g.label}</DropdownMenuLabel> : null}\n {g.places.map((p) => (\n <PlaceMenuItem key={p.id} place={p} onOpen={open} />\n ))}\n </div>\n ))}\n {onEditSidebar ? (\n <>\n {more.length > 0 || groups.length > 0 ? <DropdownMenuSeparator /> : null}\n <DropdownMenuItem onSelect={onEditSidebar}>Edit sidebar…</DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n\n {children}\n </div>\n );\n}\n\n/** A place above More: a link row, or a flyout of its sub-list. */\nfunction PlaceRow({\n place,\n onOpen,\n sourceFeature,\n chevron,\n}: {\n place: SidebarPlace;\n onOpen: ((place: SidebarPlace) => void) | undefined;\n sourceFeature: string;\n chevron?: boolean;\n}) {\n const Icon = place.icon;\n const trailing = chevron ? <ChevronRight className=\"size-4 text-muted-foreground\" /> : undefined;\n if (place.children && place.children.length > 0) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <div data-sidebar-place={place.id} data-sidebar-place-flyout=\"\">\n <ItemRow\n size=\"sm\"\n label={place.label}\n leading={<Icon className=\"size-4\" />}\n trailing={trailing}\n sourceFeature={sourceFeature}\n disableContextMenu\n />\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"right\" align=\"start\" className=\"w-56\">\n <FlyoutItems place={place} onOpen={(p) => (onOpen ? onOpen(p) : goTo(p))} />\n </DropdownMenuContent>\n </DropdownMenu>\n );\n }\n return (\n <div data-sidebar-place={place.id}>\n <ItemRow\n size=\"sm\"\n label={place.label}\n leading={<Icon className=\"size-4\" />}\n trailing={trailing}\n href={place.href}\n openInPlace={place.href && onOpen ? true : undefined}\n onOpen={onOpen ? () => onOpen(place) : undefined}\n sourceFeature={sourceFeature}\n disableContextMenu\n />\n </div>\n );\n}\n\n/** The place itself first, then its sub-list. */\nfunction FlyoutItems({ place, onOpen }: { place: SidebarPlace; onOpen: (place: SidebarPlace) => void }) {\n const Icon = place.icon;\n return (\n <>\n {place.href ? (\n <>\n <DropdownMenuItem onSelect={() => onOpen({ ...place, children: undefined })}>\n <Icon className=\"size-4\" />\n {place.label}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n ) : null}\n {(place.children ?? []).map((c) => {\n const CIcon = c.icon;\n return (\n <DropdownMenuItem key={c.id} onSelect={() => onOpen(c)}>\n <CIcon className=\"size-4\" />\n {c.label}\n </DropdownMenuItem>\n );\n })}\n </>\n );\n}\n\nfunction PlaceMenuItem({ place, onOpen }: { place: SidebarPlace; onOpen: (place: SidebarPlace) => void }) {\n const Icon = place.icon;\n if (place.children && place.children.length > 0) {\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Icon className=\"size-4\" />\n {place.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"w-56\">\n <FlyoutItems place={place} onOpen={onOpen} />\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n );\n }\n return (\n <DropdownMenuItem onSelect={() => onOpen(place)}>\n <Icon className=\"size-4\" />\n {place.label}\n </DropdownMenuItem>\n );\n}\n\n/** No host handler: a place with an address is a plain navigation. */\nfunction goTo(place: SidebarPlace) {\n if (place.href && typeof window !== \"undefined\") window.location.assign(place.href);\n}\n\n/** \"Above More\": which places sit above More (the host saves it on its layered knob). */\nexport function SidebarPlacesChooser({\n places,\n chosen,\n onChange,\n title = \"Above More\",\n}: {\n places: readonly SidebarPlace[];\n chosen: readonly string[];\n /** The next chosen ids, in `places` order. */\n onChange: (next: string[]) => void;\n title?: string;\n}) {\n const flip = (id: string) =>\n onChange(places.filter((p) => (p.id === id ? !chosen.includes(id) : chosen.includes(p.id))).map((p) => p.id));\n return (\n <section className=\"flex flex-col gap-1\" data-sidebar-places-chooser=\"\">\n <span className=\"text-sm font-medium text-foreground\">{title}</span>\n {places.map((p) => {\n const Icon = p.icon;\n return (\n <label key={p.id} className=\"flex h-8 cursor-pointer items-center gap-2 rounded-md px-1 text-sm hover:bg-muted\">\n <Checkbox size=\"sm\" checked={chosen.includes(p.id)} onCheckedChange={() => flip(p.id)} />\n <Icon className=\"size-4 text-muted-foreground\" />\n <span className=\"text-foreground\">{p.label}</span>\n </label>\n );\n })}\n </section>\n );\n}\n\n/** The Edit sidebar dialog's chrome: title, the host's sections, a refusal line, Cancel / Save. */\nexport function SidebarEditDialog({\n open,\n onOpenChange,\n onSave,\n refusal,\n saveLabel = \"Save as my default\",\n children,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSave: () => void;\n /** Why the last save was refused; shown in the dialog. */\n refusal?: string | null | undefined;\n saveLabel?: string;\n children: ReactNode;\n}) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent size=\"sm\" onOpenAutoFocus={(e) => e.preventDefault()}>\n <DialogHeader>\n <DialogTitle>Edit sidebar</DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-4\">\n {children}\n <div className=\"h-5 truncate text-sm text-destructive\" role=\"status\">\n {refusal ?? \"\"}\n </div>\n </div>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={onSave}>{saveLabel}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/item/ProductSidebarTop.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * THE TOP OF EVERY PRODUCT SIDEBAR (Arman, 2026-10-22: \"This is a very important missing thing that\n * we have to establish or our system will fail.\" — common-docs projects/app-frame/VISION.md).\n *\n * Extracted from the conversation sidebar's top (`@ai-matrx/chat` ConversationSidebar, approved\n * 2026-10-22), so every product sidebar — the web frame, desktop, the extension — has ONE shape and\n * ONE component:\n *\n * [status] optional one line (a refusal, a notice); absent = no band\n * (+) New optional\n * Agents › the chosen related places, in order\n * Workflows › a place with `children` opens a flyout of them; else it opens\n * Scheduled ›\n * … More every other place, the host's extra groups, \"Edit sidebar…\"\n * [children] optional (the conversation sidebar's one row of filter buttons)\n * ( Search ) the LIST's own search, last: directly above the host's list\n *\n * THE LIST'S SEARCH SITS WITH THE LIST (Arman, 2026-10-23: \"move the chat search to be above the\n * actual chats so it's not confused with the other things\"): it filters the rows below it, so it is\n * the last thing in the top, under the places and the filter row — never among the top actions.\n *\n * ONE LEFT EDGE (Arman, 2026-10-23): the Search glyph, every row's icon and the host's list below\n * share one left edge, 16px in from the column (this component's 8px padding + the row's 8px); a\n * place's `›` and every other chevron sit on the RIGHT. The modes (Chat, Work…) are never here —\n * they live in the page header.\n *\n * ONE SEARCH DOOR (Arman, 2026-10-23: \"You cannot have a search icon and also a searchbar\"): a\n * sidebar whose top row carries a search icon (the web frame's Go to) passes no `search` — that icon\n * finds every place and page this field used to. The field is only a list's own filter.\n *\n * The product's own list sits below, outside this component. WHICH places sit above More is a\n * layered knob (system → organization → person) the HOST reads and writes; this component only\n * draws `chosen` and calls `onEditSidebar`. `SidebarPlacesChooser` is the \"Above More\" section of\n * the host's Edit sidebar dialog (`SidebarEditDialog` is the dialog's chrome).\n */\n\nimport type { ComponentType, KeyboardEvent, ReactNode } from \"react\";\nimport {\n ChevronRightIcon as ChevronRight,\n MoreHorizontalIcon as MoreHorizontal,\n PlusIcon as Plus,\n SearchIcon as Search,\n} from \"../icons\";\nimport { Button } from \"../button\";\nimport { Checkbox } from \"../checkbox\";\nimport { cn } from \"../cn\";\nimport { Dialog, DialogContent, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"../dropdown-menu\";\nimport { InputWithPrefix } from \"../input\";\nimport { ItemRow } from \"./ItemRow\";\n\n/** One related place a product sidebar can offer (another product, a page, a list). */\nexport interface SidebarPlace {\n /** Stable id: what the layered \"above More\" knob stores. */\n id: string;\n label: string;\n icon: ComponentType<{ className?: string }>;\n /** Its address. Set it and the row is a real link (cmd/ctrl/middle-click opens a new tab). */\n href?: string | undefined;\n /** A sub-list: the row opens a flyout of these (the place itself first) instead of navigating. */\n children?: readonly SidebarPlace[] | undefined;\n}\n\n/** An extra group at the end of More (a product's own other pages, under its name). */\nexport interface SidebarMoreGroup {\n id: string;\n label?: string | undefined;\n places: readonly SidebarPlace[];\n}\n\nexport interface ProductSidebarTopSearch {\n value: string;\n onChange: (value: string) => void;\n /** Screen-reader name (\"Search conversations\"). */\n ariaLabel: string;\n placeholder?: string | undefined;\n}\n\nexport interface ProductSidebarTopProps {\n /** Above Search: one status line (a refusal, a notice). Render it only when it has something to say. */\n status?: ReactNode;\n search?: ProductSidebarTopSearch | undefined;\n /** \"New\" row; absent = none. */\n newItem?: { label?: string | undefined; href?: string | undefined; onOpen?: (() => void) | undefined } | undefined;\n /** Every related place, in order. */\n places: readonly SidebarPlace[];\n /** Ids shown above More, in this order (unknown ids are skipped). */\n chosen: readonly string[];\n /** A place was opened (plain click). Absent + `href` = the link navigates. */\n onOpenPlace?: ((place: SidebarPlace) => void) | undefined;\n /** Extra groups at the end of More, before \"Edit sidebar…\". */\n moreGroups?: readonly SidebarMoreGroup[] | undefined;\n /** \"Edit sidebar…\" in More; absent = not offered. */\n onEditSidebar?: (() => void) | undefined;\n /** Below the rows: the conversation sidebar's bucket toggles. */\n children?: ReactNode;\n /** The right-click menu's feature tag on every row. */\n sourceFeature: string;\n className?: string | undefined;\n}\n\n/** Places above More, in `chosen` order; the rest in `places` order. */\nexport function splitSidebarPlaces(\n places: readonly SidebarPlace[],\n chosen: readonly string[],\n): { above: SidebarPlace[]; more: SidebarPlace[] } {\n const byId = new Map(places.map((p) => [p.id, p]));\n const above = chosen.map((id) => byId.get(id)).filter((p): p is SidebarPlace => p != null);\n const aboveIds = new Set(above.map((p) => p.id));\n return { above, more: places.filter((p) => !aboveIds.has(p.id)) };\n}\n\nexport function ProductSidebarTop({\n status,\n search,\n newItem,\n places,\n chosen,\n onOpenPlace,\n moreGroups,\n onEditSidebar,\n children,\n sourceFeature,\n className,\n}: ProductSidebarTopProps) {\n const { above, more } = splitSidebarPlaces(places, chosen);\n const groups = (moreGroups ?? []).filter((g) => g.places.length > 0);\n const open = (place: SidebarPlace) => onOpenPlace?.(place);\n\n const onSearchKeyDown = (e: KeyboardEvent<HTMLInputElement>) => {\n if (search && e.key === \"Escape\" && search.value) {\n e.preventDefault();\n search.onChange(\"\");\n }\n };\n\n return (\n <div data-product-sidebar-top=\"\" className={cn(\"flex shrink-0 flex-col gap-1 px-2 pb-1 pt-2\", className)}>\n {status}\n <div className=\"flex flex-col\">\n {newItem ? (\n <ItemRow\n size=\"sm\"\n label={newItem.label ?? \"New\"}\n leading={<Plus className=\"size-4\" />}\n href={newItem.href}\n openInPlace={newItem.href ? true : undefined}\n onOpen={newItem.onOpen}\n sourceFeature={sourceFeature}\n disableContextMenu\n />\n ) : null}\n {above.map((p) => (\n <PlaceRow key={p.id} place={p} onOpen={onOpenPlace ? open : undefined} sourceFeature={sourceFeature} chevron />\n ))}\n {more.length > 0 || groups.length > 0 || onEditSidebar ? (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <div data-sidebar-more-trigger=\"\">\n <ItemRow\n size=\"sm\"\n label=\"More\"\n leading={<MoreHorizontal className=\"size-4\" />}\n sourceFeature={sourceFeature}\n disableContextMenu\n />\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"w-56\">\n {more.map((p) => (\n <PlaceMenuItem key={p.id} place={p} onOpen={open} />\n ))}\n {groups.map((g, i) => (\n <div key={g.id} role=\"group\" aria-label={g.label}>\n {more.length > 0 || i > 0 ? <DropdownMenuSeparator /> : null}\n {g.label ? <DropdownMenuLabel>{g.label}</DropdownMenuLabel> : null}\n {g.places.map((p) => (\n <PlaceMenuItem key={p.id} place={p} onOpen={open} />\n ))}\n </div>\n ))}\n {onEditSidebar ? (\n <>\n {more.length > 0 || groups.length > 0 ? <DropdownMenuSeparator /> : null}\n <DropdownMenuItem onSelect={onEditSidebar}>Edit sidebar…</DropdownMenuItem>\n </>\n ) : null}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </div>\n\n {children}\n\n {search ? (\n <InputWithPrefix\n prefix={<Search className=\"size-4\" />}\n prefixInset=\"edge\"\n value={search.value}\n onChange={(e) => search.onChange(e.target.value)}\n onKeyDown={onSearchKeyDown}\n placeholder={search.placeholder ?? \"Search\"}\n aria-label={search.ariaLabel}\n className=\"h-8\"\n wrapperClassName=\"mt-1\"\n data-product-sidebar-search=\"\"\n />\n ) : null}\n </div>\n );\n}\n\n/** A place above More: a link row, or a flyout of its sub-list. */\nfunction PlaceRow({\n place,\n onOpen,\n sourceFeature,\n chevron,\n}: {\n place: SidebarPlace;\n onOpen: ((place: SidebarPlace) => void) | undefined;\n sourceFeature: string;\n chevron?: boolean;\n}) {\n const Icon = place.icon;\n const trailing = chevron ? <ChevronRight className=\"size-4 text-muted-foreground\" /> : undefined;\n if (place.children && place.children.length > 0) {\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <div data-sidebar-place={place.id} data-sidebar-place-flyout=\"\">\n <ItemRow\n size=\"sm\"\n label={place.label}\n leading={<Icon className=\"size-4\" />}\n trailing={trailing}\n sourceFeature={sourceFeature}\n disableContextMenu\n />\n </div>\n </DropdownMenuTrigger>\n <DropdownMenuContent side=\"right\" align=\"start\" className=\"w-56\">\n <FlyoutItems place={place} onOpen={(p) => (onOpen ? onOpen(p) : goTo(p))} />\n </DropdownMenuContent>\n </DropdownMenu>\n );\n }\n return (\n <div data-sidebar-place={place.id}>\n <ItemRow\n size=\"sm\"\n label={place.label}\n leading={<Icon className=\"size-4\" />}\n trailing={trailing}\n href={place.href}\n openInPlace={place.href && onOpen ? true : undefined}\n onOpen={onOpen ? () => onOpen(place) : undefined}\n sourceFeature={sourceFeature}\n disableContextMenu\n />\n </div>\n );\n}\n\n/** The place itself first, then its sub-list. */\nfunction FlyoutItems({ place, onOpen }: { place: SidebarPlace; onOpen: (place: SidebarPlace) => void }) {\n const Icon = place.icon;\n return (\n <>\n {place.href ? (\n <>\n <DropdownMenuItem onSelect={() => onOpen({ ...place, children: undefined })}>\n <Icon className=\"size-4\" />\n {place.label}\n </DropdownMenuItem>\n <DropdownMenuSeparator />\n </>\n ) : null}\n {(place.children ?? []).map((c) => {\n const CIcon = c.icon;\n return (\n <DropdownMenuItem key={c.id} onSelect={() => onOpen(c)}>\n <CIcon className=\"size-4\" />\n {c.label}\n </DropdownMenuItem>\n );\n })}\n </>\n );\n}\n\nfunction PlaceMenuItem({ place, onOpen }: { place: SidebarPlace; onOpen: (place: SidebarPlace) => void }) {\n const Icon = place.icon;\n if (place.children && place.children.length > 0) {\n return (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n <Icon className=\"size-4\" />\n {place.label}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent className=\"w-56\">\n <FlyoutItems place={place} onOpen={onOpen} />\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n );\n }\n return (\n <DropdownMenuItem onSelect={() => onOpen(place)}>\n <Icon className=\"size-4\" />\n {place.label}\n </DropdownMenuItem>\n );\n}\n\n/** No host handler: a place with an address is a plain navigation. */\nfunction goTo(place: SidebarPlace) {\n if (place.href && typeof window !== \"undefined\") window.location.assign(place.href);\n}\n\n/** \"Above More\": which places sit above More (the host saves it on its layered knob). */\nexport function SidebarPlacesChooser({\n places,\n chosen,\n onChange,\n title = \"Above More\",\n}: {\n places: readonly SidebarPlace[];\n chosen: readonly string[];\n /** The next chosen ids, in `places` order. */\n onChange: (next: string[]) => void;\n title?: string;\n}) {\n const flip = (id: string) =>\n onChange(places.filter((p) => (p.id === id ? !chosen.includes(id) : chosen.includes(p.id))).map((p) => p.id));\n return (\n <section className=\"flex flex-col gap-1\" data-sidebar-places-chooser=\"\">\n <span className=\"text-sm font-medium text-foreground\">{title}</span>\n {places.map((p) => {\n const Icon = p.icon;\n return (\n <label key={p.id} className=\"flex h-8 cursor-pointer items-center gap-2 rounded-md px-1 text-sm hover:bg-muted\">\n <Checkbox size=\"sm\" checked={chosen.includes(p.id)} onCheckedChange={() => flip(p.id)} />\n <Icon className=\"size-4 text-muted-foreground\" />\n <span className=\"text-foreground\">{p.label}</span>\n </label>\n );\n })}\n </section>\n );\n}\n\n/** The Edit sidebar dialog's chrome: title, the host's sections, a refusal line, Cancel / Save. */\nexport function SidebarEditDialog({\n open,\n onOpenChange,\n onSave,\n refusal,\n saveLabel = \"Save as my default\",\n children,\n}: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n onSave: () => void;\n /** Why the last save was refused; shown in the dialog. */\n refusal?: string | null | undefined;\n saveLabel?: string;\n children: ReactNode;\n}) {\n return (\n <Dialog open={open} onOpenChange={onOpenChange}>\n <DialogContent size=\"sm\" onOpenAutoFocus={(e) => e.preventDefault()}>\n <DialogHeader>\n <DialogTitle>Edit sidebar</DialogTitle>\n </DialogHeader>\n <div className=\"flex flex-col gap-4\">\n {children}\n <div className=\"h-5 truncate text-sm text-destructive\" role=\"status\">\n {refusal ?? \"\"}\n </div>\n </div>\n <DialogFooter>\n <Button variant=\"ghost\" onClick={() => onOpenChange(false)}>\n Cancel\n </Button>\n <Button onClick={onSave}>{saveLabel}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4JyB,SAsCL,UAtCK,KA6BL,YA7BK;AA1ClB,SAAS,mBACd,QACA,QACiD;AACjD,QAAM,OAAO,IAAI,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;AACjD,QAAM,QAAQ,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC,EAAE,OAAO,CAAC,MAAyB,KAAK,IAAI;AACzF,QAAM,WAAW,IAAI,IAAI,MAAM,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC/C,SAAO,EAAE,OAAO,MAAM,OAAO,OAAO,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC,EAAE;AAClE;AAEO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA2B;AACzB,QAAM,EAAE,OAAO,KAAK,IAAI,mBAAmB,QAAQ,MAAM;AACzD,QAAM,UAAU,cAAc,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,OAAO,SAAS,CAAC;AACnE,QAAM,OAAO,CAAC,UAAwB,cAAc,KAAK;AAEzD,QAAM,kBAAkB,CAAC,MAAuC;AAC9D,QAAI,UAAU,EAAE,QAAQ,YAAY,OAAO,OAAO;AAChD,QAAE,eAAe;AACjB,aAAO,SAAS,EAAE;AAAA,IACpB;AAAA,EACF;AAEA,SACE,qBAAC,SAAI,4BAAyB,IAAG,WAAW,GAAG,+CAA+C,SAAS,GACpG;AAAA;AAAA,IACD,qBAAC,SAAI,WAAU,iBACR;AAAA,gBACC;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,QAAQ,SAAS;AAAA,UACxB,SAAS,oBAAC,YAAK,WAAU,UAAS;AAAA,UAClC,MAAM,QAAQ;AAAA,UACd,aAAa,QAAQ,OAAO,OAAO;AAAA,UACnC,QAAQ,QAAQ;AAAA,UAChB;AAAA,UACA,oBAAkB;AAAA;AAAA,MACpB,IACE;AAAA,MACH,MAAM,IAAI,CAAC,MACV,oBAAC,YAAoB,OAAO,GAAG,QAAQ,cAAc,OAAO,QAAW,eAA8B,SAAO,QAA7F,EAAE,EAA4F,CAC9G;AAAA,MACA,KAAK,SAAS,KAAK,OAAO,SAAS,KAAK,gBACvC,qBAAC,gBACC;AAAA,4BAAC,uBAAoB,SAAO,MAC1B,8BAAC,SAAI,6BAA0B,IAC7B;AAAA,UAAC;AAAA;AAAA,YACC,MAAK;AAAA,YACL,OAAM;AAAA,YACN,SAAS,oBAAC,sBAAe,WAAU,UAAS;AAAA,YAC5C;AAAA,YACA,oBAAkB;AAAA;AAAA,QACpB,GACF,GACF;AAAA,QACA,qBAAC,uBAAoB,OAAM,SAAQ,WAAU,QAC1C;AAAA,eAAK,IAAI,CAAC,MACT,oBAAC,iBAAyB,OAAO,GAAG,QAAQ,QAAxB,EAAE,EAA4B,CACnD;AAAA,UACA,OAAO,IAAI,CAAC,GAAG,MACd,qBAAC,SAAe,MAAK,SAAQ,cAAY,EAAE,OACxC;AAAA,iBAAK,SAAS,KAAK,IAAI,IAAI,oBAAC,yBAAsB,IAAK;AAAA,YACvD,EAAE,QAAQ,oBAAC,qBAAmB,YAAE,OAAM,IAAuB;AAAA,YAC7D,EAAE,OAAO,IAAI,CAAC,MACb,oBAAC,iBAAyB,OAAO,GAAG,QAAQ,QAAxB,EAAE,EAA4B,CACnD;AAAA,eALO,EAAE,EAMZ,CACD;AAAA,UACA,gBACC,iCACG;AAAA,iBAAK,SAAS,KAAK,OAAO,SAAS,IAAI,oBAAC,yBAAsB,IAAK;AAAA,YACpE,oBAAC,oBAAiB,UAAU,eAAe,gCAAa;AAAA,aAC1D,IACE;AAAA,WACN;AAAA,SACF,IACE;AAAA,OACV;AAAA,IAEC;AAAA,IAEA,SACC;AAAA,MAAC;AAAA;AAAA,QACC,QAAQ,oBAAC,cAAO,WAAU,UAAS;AAAA,QACnC,aAAY;AAAA,QACZ,OAAO,OAAO;AAAA,QACd,UAAU,CAAC,MAAM,OAAO,SAAS,EAAE,OAAO,KAAK;AAAA,QAC/C,WAAW;AAAA,QACX,aAAa,OAAO,eAAe;AAAA,QACnC,cAAY,OAAO;AAAA,QACnB,WAAU;AAAA,QACV,kBAAiB;AAAA,QACjB,+BAA4B;AAAA;AAAA,IAC9B,IACE;AAAA,KACN;AAEJ;AAGA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,OAAO,MAAM;AACnB,QAAM,WAAW,UAAU,oBAAC,oBAAa,WAAU,gCAA+B,IAAK;AACvF,MAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC/C,WACE,qBAAC,gBACC;AAAA,0BAAC,uBAAoB,SAAO,MAC1B,8BAAC,SAAI,sBAAoB,MAAM,IAAI,6BAA0B,IAC3D;AAAA,QAAC;AAAA;AAAA,UACC,MAAK;AAAA,UACL,OAAO,MAAM;AAAA,UACb,SAAS,oBAAC,QAAK,WAAU,UAAS;AAAA,UAClC;AAAA,UACA;AAAA,UACA,oBAAkB;AAAA;AAAA,MACpB,GACF,GACF;AAAA,MACA,oBAAC,uBAAoB,MAAK,SAAQ,OAAM,SAAQ,WAAU,QACxD,8BAAC,eAAY,OAAc,QAAQ,CAAC,MAAO,SAAS,OAAO,CAAC,IAAI,KAAK,CAAC,GAAI,GAC5E;AAAA,OACF;AAAA,EAEJ;AACA,SACE,oBAAC,SAAI,sBAAoB,MAAM,IAC7B;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,OAAO,MAAM;AAAA,MACb,SAAS,oBAAC,QAAK,WAAU,UAAS;AAAA,MAClC;AAAA,MACA,MAAM,MAAM;AAAA,MACZ,aAAa,MAAM,QAAQ,SAAS,OAAO;AAAA,MAC3C,QAAQ,SAAS,MAAM,OAAO,KAAK,IAAI;AAAA,MACvC;AAAA,MACA,oBAAkB;AAAA;AAAA,EACpB,GACF;AAEJ;AAGA,SAAS,YAAY,EAAE,OAAO,OAAO,GAAmE;AACtG,QAAM,OAAO,MAAM;AACnB,SACE,iCACG;AAAA,UAAM,OACL,iCACE;AAAA,2BAAC,oBAAiB,UAAU,MAAM,OAAO,EAAE,GAAG,OAAO,UAAU,OAAU,CAAC,GACxE;AAAA,4BAAC,QAAK,WAAU,UAAS;AAAA,QACxB,MAAM;AAAA,SACT;AAAA,MACA,oBAAC,yBAAsB;AAAA,OACzB,IACE;AAAA,KACF,MAAM,YAAY,CAAC,GAAG,IAAI,CAAC,MAAM;AACjC,YAAM,QAAQ,EAAE;AAChB,aACE,qBAAC,oBAA4B,UAAU,MAAM,OAAO,CAAC,GACnD;AAAA,4BAAC,SAAM,WAAU,UAAS;AAAA,QACzB,EAAE;AAAA,WAFkB,EAAE,EAGzB;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAEA,SAAS,cAAc,EAAE,OAAO,OAAO,GAAmE;AACxG,QAAM,OAAO,MAAM;AACnB,MAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC/C,WACE,qBAAC,mBACC;AAAA,2BAAC,0BACC;AAAA,4BAAC,QAAK,WAAU,UAAS;AAAA,QACxB,MAAM;AAAA,SACT;AAAA,MACA,oBAAC,0BAAuB,WAAU,QAChC,8BAAC,eAAY,OAAc,QAAgB,GAC7C;AAAA,OACF;AAAA,EAEJ;AACA,SACE,qBAAC,oBAAiB,UAAU,MAAM,OAAO,KAAK,GAC5C;AAAA,wBAAC,QAAK,WAAU,UAAS;AAAA,IACxB,MAAM;AAAA,KACT;AAEJ;AAGA,SAAS,KAAK,OAAqB;AACjC,MAAI,MAAM,QAAQ,OAAO,WAAW,YAAa,QAAO,SAAS,OAAO,MAAM,IAAI;AACpF;AAGO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AACV,GAMG;AACD,QAAM,OAAO,CAAC,OACZ,SAAS,OAAO,OAAO,CAAC,MAAO,EAAE,OAAO,KAAK,CAAC,OAAO,SAAS,EAAE,IAAI,OAAO,SAAS,EAAE,EAAE,CAAE,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;AAC9G,SACE,qBAAC,aAAQ,WAAU,uBAAsB,+BAA4B,IACnE;AAAA,wBAAC,UAAK,WAAU,uCAAuC,iBAAM;AAAA,IAC5D,OAAO,IAAI,CAAC,MAAM;AACjB,YAAM,OAAO,EAAE;AACf,aACE,qBAAC,WAAiB,WAAU,qFAC1B;AAAA,4BAAC,YAAS,MAAK,MAAK,SAAS,OAAO,SAAS,EAAE,EAAE,GAAG,iBAAiB,MAAM,KAAK,EAAE,EAAE,GAAG;AAAA,QACvF,oBAAC,QAAK,WAAU,gCAA+B;AAAA,QAC/C,oBAAC,UAAK,WAAU,mBAAmB,YAAE,OAAM;AAAA,WAHjC,EAAE,EAId;AAAA,IAEJ,CAAC;AAAA,KACH;AAEJ;AAGO,SAAS,kBAAkB;AAAA,EAChC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AAAA,EACZ;AACF,GAQG;AACD,SACE,oBAAC,UAAO,MAAY,cAClB,+BAAC,iBAAc,MAAK,MAAK,iBAAiB,CAAC,MAAM,EAAE,eAAe,GAChE;AAAA,wBAAC,gBACC,8BAAC,eAAY,0BAAY,GAC3B;AAAA,IACA,qBAAC,SAAI,WAAU,uBACZ;AAAA;AAAA,MACD,oBAAC,SAAI,WAAU,yCAAwC,MAAK,UACzD,qBAAW,IACd;AAAA,OACF;AAAA,IACA,qBAAC,gBACC;AAAA,0BAAC,UAAO,SAAQ,SAAQ,SAAS,MAAM,aAAa,KAAK,GAAG,oBAE5D;AAAA,MACA,oBAAC,UAAO,SAAS,QAAS,qBAAU;AAAA,OACtC;AAAA,KACF,GACF;AAEJ;","names":[]}
|
package/dist/lite-table.js
CHANGED
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
ReadEmpty,
|
|
7
7
|
ReadStaleNotice,
|
|
8
8
|
readOf
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-CFCWQDGC.js";
|
|
10
10
|
import {
|
|
11
11
|
MAC_TABLE_ATTRIBUTE,
|
|
12
12
|
MAC_TABLE_SLOTS
|
|
@@ -17,26 +17,26 @@ import {
|
|
|
17
17
|
} from "./chunk-WFBPCMPF.js";
|
|
18
18
|
import {
|
|
19
19
|
Button
|
|
20
|
-
} from "./chunk-
|
|
21
|
-
import "./chunk-BKCJUFD3.js";
|
|
20
|
+
} from "./chunk-ZOQ2XKXF.js";
|
|
22
21
|
import "./chunk-BD77DHUO.js";
|
|
23
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-BKCJUFD3.js";
|
|
23
|
+
import "./chunk-X6ZRHJQP.js";
|
|
24
24
|
import "./chunk-BNXNIN2S.js";
|
|
25
|
-
import "./chunk-
|
|
26
|
-
import "./chunk-7IOSA55D.js";
|
|
25
|
+
import "./chunk-SMJGESH7.js";
|
|
27
26
|
import "./chunk-WAT2XW7L.js";
|
|
27
|
+
import "./chunk-7IOSA55D.js";
|
|
28
28
|
import "./chunk-FXXSZNER.js";
|
|
29
29
|
import "./chunk-DGNHZBJY.js";
|
|
30
30
|
import "./chunk-XIUVUL2Y.js";
|
|
31
|
-
import "./chunk-IMOOQQOO.js";
|
|
32
|
-
import {
|
|
33
|
-
cn
|
|
34
|
-
} from "./chunk-M6KA5EHN.js";
|
|
35
31
|
import {
|
|
36
32
|
CheckIcon,
|
|
37
33
|
ChevronDownIcon,
|
|
38
34
|
CopyIcon
|
|
39
35
|
} from "./chunk-YCUFQCJW.js";
|
|
36
|
+
import "./chunk-IMOOQQOO.js";
|
|
37
|
+
import {
|
|
38
|
+
cn
|
|
39
|
+
} from "./chunk-M6KA5EHN.js";
|
|
40
40
|
|
|
41
41
|
// src/lite-table/LiteTable.tsx
|
|
42
42
|
import {
|
package/dist/menu-look.js
CHANGED
|
@@ -3,16 +3,16 @@ import {
|
|
|
3
3
|
DropdownMenuContent,
|
|
4
4
|
DropdownMenuSubContent,
|
|
5
5
|
DropdownMenuSubTrigger
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-X6ZRHJQP.js";
|
|
7
7
|
import "./chunk-BNXNIN2S.js";
|
|
8
8
|
import "./chunk-FXXSZNER.js";
|
|
9
9
|
import "./chunk-DGNHZBJY.js";
|
|
10
10
|
import "./chunk-XIUVUL2Y.js";
|
|
11
|
-
import "./chunk-IMOOQQOO.js";
|
|
12
|
-
import "./chunk-M6KA5EHN.js";
|
|
13
11
|
import {
|
|
14
12
|
RadixCheckIcon
|
|
15
13
|
} from "./chunk-YCUFQCJW.js";
|
|
14
|
+
import "./chunk-IMOOQQOO.js";
|
|
15
|
+
import "./chunk-M6KA5EHN.js";
|
|
16
16
|
|
|
17
17
|
// src/menu-look.tsx
|
|
18
18
|
import * as React from "react";
|
package/dist/record-list.cjs
CHANGED
|
@@ -2834,6 +2834,8 @@ var SIZE = {
|
|
|
2834
2834
|
lg: { row: "h-10", text: "text-sm", kebab: "h-7 w-7", icon: "h-4 w-4" }
|
|
2835
2835
|
};
|
|
2836
2836
|
var DISCLOSURE_RESERVE = { xs: 32, sm: 32, md: 36, lg: 40 };
|
|
2837
|
+
var REVEAL_OPACITY = "group-hover/item:opacity-100 group-has-[:focus-visible]/item:opacity-100 group-has-[[data-state=open]]/item:opacity-100 [@media(pointer:coarse)]:opacity-100";
|
|
2838
|
+
var REVEAL_DISPLAY = "group-hover/item:inline group-has-[:focus-visible]/item:inline group-has-[[data-state=open]]/item:inline [@media(pointer:coarse)]:inline";
|
|
2837
2839
|
function mapRenameIntent(config, requestRename) {
|
|
2838
2840
|
const mapEntry = (entry) => {
|
|
2839
2841
|
if (isSubmenu(entry)) {
|
|
@@ -2861,6 +2863,7 @@ function ItemRow({
|
|
|
2861
2863
|
reserveDisclosure = false,
|
|
2862
2864
|
leading,
|
|
2863
2865
|
trailing,
|
|
2866
|
+
trailingOnHover,
|
|
2864
2867
|
active = false,
|
|
2865
2868
|
disabled = false,
|
|
2866
2869
|
href,
|
|
@@ -2935,7 +2938,10 @@ function ItemRow({
|
|
|
2935
2938
|
children: secondaryLabel
|
|
2936
2939
|
}
|
|
2937
2940
|
),
|
|
2938
|
-
trailing != null && /* @__PURE__ */ (0, import_jsx_runtime25.
|
|
2941
|
+
(trailing != null || trailingOnHover != null) && /* @__PURE__ */ (0, import_jsx_runtime25.jsxs)("span", { className: "item-shift flex shrink-0 items-center gap-1 pr-0.5", children: [
|
|
2942
|
+
trailing,
|
|
2943
|
+
trailingOnHover != null && /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: cn("hidden", REVEAL_DISPLAY), "data-item-trailing-hover": "", children: trailingOnHover })
|
|
2944
|
+
] })
|
|
2939
2945
|
] });
|
|
2940
2946
|
const twoLine = subtitle != null && !editing;
|
|
2941
2947
|
const sideBySide = actions != null || leadingControl != null;
|
|
@@ -3028,7 +3034,15 @@ function ItemRow({
|
|
|
3028
3034
|
icon: /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(MoreHorizontalIcon, { className: sz.icon }),
|
|
3029
3035
|
"aria-haspopup": "menu",
|
|
3030
3036
|
onClick: (e) => e.stopPropagation(),
|
|
3031
|
-
|
|
3037
|
+
"data-item-kebab": "",
|
|
3038
|
+
className: cn(
|
|
3039
|
+
"shrink-0",
|
|
3040
|
+
!sideBySide && "absolute right-1 top-1/2 -translate-y-1/2",
|
|
3041
|
+
// Hidden at rest (it would sit on the trailing meta); shown on hover, keyboard focus,
|
|
3042
|
+
// while its menu is open, and always on touch.
|
|
3043
|
+
"opacity-0 transition-opacity data-[state=open]:opacity-100 focus-visible:opacity-100",
|
|
3044
|
+
REVEAL_OPACITY
|
|
3045
|
+
)
|
|
3032
3046
|
}
|
|
3033
3047
|
)
|
|
3034
3048
|
}
|