@ai-matrx/design-system 0.86.349 → 0.86.351
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 +22 -2
- package/dist/carousel.cjs.map +1 -1
- package/dist/carousel.js +5 -5
- package/dist/chunk-4WSXAP24.js +51 -0
- package/dist/chunk-4WSXAP24.js.map +1 -0
- package/dist/{chunk-XTP6HOB6.js → chunk-6XNYYROM.js} +1 -1
- package/dist/chunk-6XNYYROM.js.map +1 -0
- package/dist/{chunk-CEA6X445.js → chunk-CFUXEGW2.js} +2 -2
- package/dist/{chunk-54UK6P7E.js → chunk-FLWSEDUW.js} +3 -3
- package/dist/{chunk-BC7LMEOD.js → chunk-GJ6UGQ4X.js} +7 -3
- package/dist/chunk-GJ6UGQ4X.js.map +1 -0
- package/dist/{chunk-6CDAHINE.js → chunk-GMNROZQJ.js} +4 -4
- package/dist/{chunk-6CDAHINE.js.map → chunk-GMNROZQJ.js.map} +1 -1
- package/dist/{chunk-6QKT52FR.js → chunk-MTE6N7XU.js} +2 -2
- package/dist/{chunk-S6F34AX5.js → chunk-QA7EHFRX.js} +2 -2
- package/dist/{chunk-CJBSBKG5.js → chunk-SOCNWQMX.js} +2 -2
- package/dist/{chunk-GLLPO66A.js → chunk-U46XUQI7.js} +2 -2
- package/dist/{chunk-KYH42WEX.js → chunk-UGQRAQTE.js} +433 -344
- package/dist/chunk-UGQRAQTE.js.map +1 -0
- package/dist/{chunk-TWRC7NP4.js → chunk-WUD23YTG.js} +4 -4
- package/dist/{chunk-MIJMP4WI.js → chunk-YRF22M5S.js} +6 -1
- package/dist/{chunk-MIJMP4WI.js.map → chunk-YRF22M5S.js.map} +1 -1
- package/dist/clipboard-fallback-dialog.cjs.map +1 -1
- package/dist/clipboard-fallback-dialog.js +1 -1
- package/dist/controls.cjs +547 -458
- package/dist/controls.cjs.map +1 -1
- package/dist/controls.css +52 -18
- package/dist/controls.d.cts +51 -3
- package/dist/controls.d.ts +51 -3
- package/dist/controls.js +13 -5
- package/dist/data-table/data-row-inspector.cjs.map +1 -1
- package/dist/data-table/data-row-inspector.js +4 -4
- package/dist/data-table/data-row-window.cjs.map +1 -1
- package/dist/data-table/data-row-window.js +5 -5
- package/dist/data-table/index.cjs +53 -43
- package/dist/data-table/index.cjs.map +1 -1
- package/dist/data-table/index.js +52 -45
- package/dist/data-table/index.js.map +1 -1
- package/dist/data-table/pagination.cjs.map +1 -1
- package/dist/data-table/pagination.js +2 -2
- package/dist/data-table/spreadsheet.cjs +6 -2
- package/dist/data-table/spreadsheet.cjs.map +1 -1
- package/dist/data-table/spreadsheet.d.cts +4 -1
- package/dist/data-table/spreadsheet.d.ts +4 -1
- package/dist/data-table/spreadsheet.js +3 -1
- package/dist/data-table/uuid-cell.cjs.map +1 -1
- package/dist/data-table/uuid-cell.js +2 -2
- package/dist/desktop.cjs +158 -16
- package/dist/desktop.cjs.map +1 -1
- package/dist/desktop.css +46 -0
- package/dist/desktop.d.cts +6 -5
- package/dist/desktop.d.ts +6 -5
- package/dist/desktop.js +127 -17
- package/dist/desktop.js.map +1 -1
- package/dist/index.cjs +19 -9
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.js +21 -14
- package/dist/index.js.map +1 -1
- package/dist/item.cjs.map +1 -1
- package/dist/item.js +2 -2
- package/dist/lite-table.cjs.map +1 -1
- package/dist/lite-table.js +1 -1
- package/dist/notice-stack.cjs +70 -0
- package/dist/notice-stack.cjs.map +1 -0
- package/dist/notice-stack.d.cts +60 -0
- package/dist/notice-stack.d.ts +60 -0
- package/dist/notice-stack.js +16 -0
- package/dist/notice-stack.js.map +1 -0
- package/dist/record-list.cjs.map +1 -1
- package/dist/record-list.js +2 -2
- package/dist/settings.cjs +2 -2
- package/dist/settings.cjs.map +1 -1
- package/dist/settings.js +3 -3
- package/dist/swipe-deck.cjs +95 -25
- package/dist/swipe-deck.cjs.map +1 -1
- package/dist/swipe-deck.css +14 -0
- package/dist/swipe-deck.d.cts +20 -0
- package/dist/swipe-deck.d.ts +20 -0
- package/dist/swipe-deck.js +87 -25
- package/dist/swipe-deck.js.map +1 -1
- package/dist/writing-field.cjs +2 -2
- package/dist/writing-field.cjs.map +1 -1
- package/dist/writing-field.js +2 -2
- package/package.json +12 -18
- package/dist/chunk-BC7LMEOD.js.map +0 -1
- package/dist/chunk-KYH42WEX.js.map +0 -1
- package/dist/chunk-XTP6HOB6.js.map +0 -1
- /package/dist/{chunk-CEA6X445.js.map → chunk-CFUXEGW2.js.map} +0 -0
- /package/dist/{chunk-54UK6P7E.js.map → chunk-FLWSEDUW.js.map} +0 -0
- /package/dist/{chunk-6QKT52FR.js.map → chunk-MTE6N7XU.js.map} +0 -0
- /package/dist/{chunk-S6F34AX5.js.map → chunk-QA7EHFRX.js.map} +0 -0
- /package/dist/{chunk-CJBSBKG5.js.map → chunk-SOCNWQMX.js.map} +0 -0
- /package/dist/{chunk-GLLPO66A.js.map → chunk-U46XUQI7.js.map} +0 -0
- /package/dist/{chunk-TWRC7NP4.js.map → chunk-WUD23YTG.js.map} +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/controls/window-controls.tsx","../src/controls/decision-control.tsx","../src/controls/date-field.tsx","../src/controls/date-parse.ts","../src/controls/number-stepper.tsx","../src/controls/stage-steps.tsx","../src/controls/clamped-number-input.tsx","../src/controls/light-switch-toggle.tsx","../src/controls/option-combobox.tsx","../src/controls/aspect-ratio-options.ts","../src/controls/aspect-ratio-select.tsx","../src/indicator-strip.tsx","../src/controls/middle-truncate.tsx","../src/controls/callout-banner.tsx","../src/controls/gated-action-button.tsx","../src/controls/search-input.tsx","../src/controls/collapsible-text.tsx","../src/controls/info-hint.tsx","../src/controls/status-badge.tsx","../src/controls/structured-section-card.tsx","../src/controls/icon-dropdown-menu.tsx","../src/controls/field.tsx","../src/controls/help-icon.tsx","../src/controls/text-array-input.tsx","../src/read-state/untrusted-count.tsx","../src/controls/kpi-tile.tsx","../src/controls/action-feedback-button.tsx","../src/controls/citation-chip.tsx","../src/controls/tool-rail.tsx","../src/controls/page-range-input.tsx","../src/controls/page-ranges.ts","../src/controls/opacity-slider.tsx","../src/controls/color-swatch-row.tsx","../src/controls/anchored-toolbar.tsx","../src/controls/icon-select.tsx","../src/controls/advanced-collapsible.tsx","../src/icon-button.tsx","../src/controls/empty-state-card.tsx","../src/controls/hue-cards.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * THE WINDOW CHROME CONTROLS (2026-10-23) — the title bar of a floating window (summon's\n * WindowPanel) drawn at macOS's own geometry, never the 28px control:\n *\n * WindowLights the traffic-light group: 12px dots 8px apart; hovering (or focusing) the\n * group reveals every light's 8px glyph, as macOS does. `inactive` greys the\n * lights of a window that is not in front until the pointer reaches them.\n * `touch` is the phone header's lights: 24px dots, 10px glyphs always shown.\n * WindowLight one light: `kind` close / minimize / maximize picks its color and glyph;\n * `restores` swaps in the restore glyph (a minimized window's yellow, a\n * maximized window's green). Disabled is a grey dot with no glyph.\n * WindowChromeButton a title-bar icon action (the sidebar toggle, pop out): a 20px square with\n * a 14px glyph, quiet until hovered.\n *\n * Geometry and color live in `controls.css` (THE WINDOW CHROME), locked in\n * `@layer matrx-tap-lock` like every control, so `className` places them and never restyles them.\n * Colors are the `--matrx-window-light-*` tokens in `tokens.css` (both themes). The contract is\n * pinned by `window-controls-geometry.test.tsx`: moving a light back onto the 28px Button fails it.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { Maximize2Icon, Minimize2Icon, MinusIcon, XIcon } from \"../icons\";\n\nexport type WindowLightKind = \"close\" | \"minimize\" | \"maximize\";\n\nexport interface WindowLightsProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The window is not the one in front: the lights are grey until the pointer reaches them. */\n inactive?: boolean;\n /** The phone header's lights: 24px dots with their glyphs always shown (no hover on touch). */\n touch?: boolean;\n}\n\n/** The traffic-light group. Its hover (or keyboard focus) reveals every light's glyph. */\nexport const WindowLights = React.forwardRef<HTMLDivElement, WindowLightsProps>(\n ({ className, inactive, touch, role = \"group\", \"aria-label\": ariaLabel = \"Window controls\", ...props }, ref) => (\n <div\n ref={ref}\n role={role}\n aria-label={ariaLabel}\n data-matrx-window-lights=\"\"\n data-inactive={inactive ? \"\" : undefined}\n data-touch={touch ? \"\" : undefined}\n className={cn(\"matrx-window-lights\", className)}\n {...props}\n />\n ),\n);\nWindowLights.displayName = \"WindowLights\";\n\nexport interface WindowLightProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n /** Which light: close (red), minimize (yellow), maximize (green). */\n kind: WindowLightKind;\n /** The light undoes its window's state (restore a minimized or maximized window): the restore glyph. */\n restores?: boolean;\n /** A light must say what it does. */\n \"aria-label\": string;\n}\n\nfunction lightGlyph(kind: WindowLightKind, restores: boolean): React.ReactNode {\n if (kind === \"close\") return <XIcon aria-hidden=\"true\" />;\n if (kind === \"minimize\") return restores ? <Maximize2Icon aria-hidden=\"true\" /> : <MinusIcon aria-hidden=\"true\" />;\n return restores ? <Minimize2Icon aria-hidden=\"true\" /> : <Maximize2Icon aria-hidden=\"true\" />;\n}\n\n/** One traffic light. Place it inside `WindowLights`. */\nexport const WindowLight = React.forwardRef<HTMLButtonElement, WindowLightProps>(\n ({ className, kind, restores = false, type, ...props }, ref) => (\n <button\n ref={ref}\n type={type ?? \"button\"}\n data-matrx-window-light={kind}\n data-restores={restores ? \"\" : undefined}\n className={cn(\"matrx-window-light\", className)}\n {...props}\n >\n {lightGlyph(kind, restores)}\n </button>\n ),\n);\nWindowLight.displayName = \"WindowLight\";\n\nexport interface WindowChromeButtonProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n /** The 14px glyph. */\n icon: React.ReactNode;\n /** A title-bar action must say what it does (also its tooltip unless `title` is given). */\n \"aria-label\": string;\n}\n\n/** A title-bar icon action (sidebar toggle, pop out): 20px, quiet until hovered. */\nexport const WindowChromeButton = React.forwardRef<HTMLButtonElement, WindowChromeButtonProps>(\n ({ className, icon, type, title, ...props }, ref) => (\n <button\n ref={ref}\n type={type ?? \"button\"}\n data-matrx-window-chrome-button=\"\"\n className={cn(\"matrx-window-chrome-button\", className)}\n title={title ?? props[\"aria-label\"]}\n {...props}\n >\n {icon}\n </button>\n ),\n);\nWindowChromeButton.displayName = \"WindowChromeButton\";\n","\"use client\";\n\n/**\n * DecisionControl — THE row decision: [Yes] [No] [Other] + the answer's value chip.\n *\n * EVERY DECISION OFFERS A WAY OUT (Arman, 2026-10-14): a row that only offers\n * \"Preferred / Alias / Not us\" forces a person to decide something they cannot,\n * and they freeze. So every decision is exactly three clear buttons in one row —\n * Yes, No, Other — the same words in the same place on every row, for a person\n * or a business and for any kind of data (the section header asks the question:\n * \"Is this yours?\", \"Is this your name?\"). Other's menu holds the smart,\n * context-specific answers first (Tagline, Former name, grouped relationships…)\n * and ALWAYS ends with the generic exit \"Skip for now\", which leaves the item\n * undecided — neither kept nor rejected.\n *\n * NO EMPTY BOX, EVER (Arman, 2026-10-14: \"There is a border remaining … no\n * professional app does that\"). Champion: Linear's issue properties (the issue\n * view sidebar and the row property chips) — a property with no value draws\n * nothing; the menu opens FROM the control that asked for it; a chosen value is\n * a compact chip, and clicking the chip reopens the same menu. So:\n * · no answer, No, or a plain Yes: nothing is drawn beside the buttons (the\n * column's width is reserved invisibly on desktop, so rows never jump);\n * · Other: its menu opens anchored to the Other button; closing it without a\n * pick is no answer again; Other pressed while answered clears (onClear);\n * · Yes with `yesKinds` (\"Main name\" / \"Also known as\", \"Primary site\" /\n * \"Also ours\"): the host sets the default kind and it shows as a chip — the\n * primary kind in the strong primary style; click the chip to change it;\n * · a way-out answer or a skip shows as a neutral chip; click to change it.\n *\n * Layout: one line on desktop; below `sm` the three buttons share the row\n * equally and the chip appears under them only once there is a value.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n DropdownMenuTrigger,\n} from \"../dropdown-menu\";\nimport { RadixCheckIcon } from \"../icons\";\nimport { Button, Chip } from \"./controls\";\n\nexport type DecisionAnswer = \"yes\" | \"no\" | \"other\";\n\nexport interface WayOutItem {\n value: string;\n label: string;\n /** 11px trailing text (a shortcut, \"We think\"). */\n meta?: string;\n /** A submenu (one level). Prefer `group` headings: a flat picker reads faster. */\n items?: WayOutItem[];\n /** A heading above this item, starting a group inside its menu. */\n group?: string;\n}\n\nexport interface DecisionControlProps {\n /** The answer: Yes, No, or Other (a way-out answer or a skip). Null = undecided. */\n value: DecisionAnswer | null;\n /** Yes or No pressed. Pressing the chosen one again is the host's to clear (EVERY BUTTON TOGGLES). */\n onChange: (value: \"yes\" | \"no\") => void;\n /** Context-specific way-out answers: Other's menu's first entries. */\n wayOut?: WayOutItem[];\n onWayOut?: (value: string) => void;\n /** The chosen way-out answer (a leaf value): the chip shows its label. */\n wayOutValue?: string | null;\n /** The kinds of yes (\"Main name\", \"Also known as\"): with Yes on, the chip shows the kind and changes it. */\n yesKinds?: WayOutItem[];\n /** The current kind of yes (one of `yesKinds`' values). */\n yesKind?: string | null;\n onYesKind?: (value: string) => void;\n /** Other pressed while on: the row goes back to no answer (EVERY BUTTON TOGGLES, Arman 2026-10-14). */\n onClear?: () => void;\n /** THE generic exit, always Other's last entry. Required: no decision without a way out. */\n onSkip: () => void;\n /** The item is skipped (undecided on purpose). */\n skipped?: boolean;\n /** Other's last entry. Default \"Skip for now\". */\n skipLabel?: string;\n /** The chip once skipped. Default \"Skipped for now\". */\n skippedLabel?: string;\n /** Button words; defaults Yes / No / Other. Keep the defaults unless a surface's question needs others. */\n labels?: Partial<Record<DecisionAnswer, string>>;\n /** Keyboard shortcuts shown as each button's muted meta (\"Y\"). */\n shortcuts?: Partial<Record<DecisionAnswer, string>>;\n /** \"We think\": the suggested answer glows (a ring) — it is never chosen for the person. */\n suggested?: DecisionAnswer | null;\n /** The chip's text when Yes is on with kinds but the host set none. Default \"Choose…\". */\n pickerPlaceholder?: string;\n disabled?: boolean;\n /**\n * \"row\" (default): the 28px everyday geometry for lists of decisions. \"stage\": a focus stage that shows ONE\n * decision at a time (Smart Add's validation page) — the buttons take the 44px inviting geometry (Button `hero`)\n * and the row keeps one line on every width. Arman's rule: flagship screens get an elevated stage.\n */\n size?: \"row\" | \"stage\";\n className?: string;\n \"aria-label\"?: string;\n}\n\nfunction find(items: WayOutItem[] | undefined, value: string | null | undefined): WayOutItem | null {\n if (!items || !value) return null;\n for (const i of items) {\n if (i.value === value) return i;\n const inner = find(i.items, value);\n if (inner) return inner;\n }\n return null;\n}\n\nfunction WayOutEntries({ items, chosen, onPick }: { items: WayOutItem[]; chosen: string | null | undefined; onPick: (value: string) => void }) {\n return (\n <>\n {items.map((item, index) => (\n <React.Fragment key={item.value}>\n {item.group ? (\n <>\n {index > 0 ? <DropdownMenuSeparator /> : null}\n {/* A heading as DropdownMenuLabel ships it (the style guide: never restyled). */}\n <DropdownMenuLabel data-way-out-group=\"\">{item.group}</DropdownMenuLabel>\n </>\n ) : null}\n {item.items?.length ? (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger data-way-out={item.value} className=\"text-foreground\">\n <span className=\"flex-1\">{item.label}</span>\n {find(item.items, chosen) ? <RadixCheckIcon className=\"mr-1 size-3.5\" aria-hidden=\"true\" /> : null}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <WayOutEntries items={item.items} chosen={chosen} onPick={onPick} />\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n ) : (\n <DropdownMenuItem data-way-out={item.value} className=\"text-foreground\" onSelect={() => onPick(item.value)}>\n <span className=\"flex-1\">{item.label}</span>\n {item.meta ? <span className=\"text-[11px] text-muted-foreground\">{item.meta}</span> : null}\n {chosen === item.value ? <RadixCheckIcon className=\"size-3.5\" aria-hidden=\"true\" /> : null}\n </DropdownMenuItem>\n )}\n </React.Fragment>\n ))}\n </>\n );\n}\n\nconst ring = \"rounded-full ring-2 ring-primary ring-offset-1 ring-offset-background\";\n\n/** [Yes] [No] [Other] + the value chip (nothing drawn without a value; Other's menu opens from Other). */\nexport function DecisionControl({\n value,\n onChange,\n wayOut,\n onWayOut,\n wayOutValue,\n yesKinds,\n yesKind,\n onYesKind,\n onClear,\n onSkip,\n skipped,\n skipLabel = \"Skip for now\",\n skippedLabel = \"Skipped for now\",\n labels,\n shortcuts,\n suggested,\n pickerPlaceholder = \"Choose…\",\n disabled,\n size = \"row\",\n className,\n \"aria-label\": ariaLabel,\n}: DecisionControlProps) {\n // Other's menu is open from the Other button (Other is on while it is open, before anything is picked).\n const [otherOpen, setOtherOpen] = React.useState(false);\n const [chipOpen, setChipOpen] = React.useState(false);\n const otherOn = value === \"other\" || otherOpen;\n const word = (a: DecisionAnswer) => labels?.[a] ?? (a === \"yes\" ? \"Yes\" : a === \"no\" ? \"No\" : \"Other\");\n const yesMode = value === \"yes\" && Boolean(yesKinds?.length);\n const otherMode = value === \"other\";\n const chosen = yesMode ? find(yesKinds, yesKind) : otherMode ? find(wayOut, wayOutValue) : null;\n // The chip exists only with something to say: a kind of yes, a way-out answer, or a skip.\n const chipLabel = yesMode ? (chosen?.label ?? pickerPlaceholder) : otherMode ? (chosen?.label ?? (skipped ? skippedLabel : null)) : null;\n const primary = yesMode && yesKinds?.[0]?.value === yesKind;\n\n const wayOutMenu = (\n <>\n {wayOut?.length ? (\n <>\n <WayOutEntries items={wayOut} chosen={wayOutValue} onPick={(v) => onWayOut?.(v)} />\n <DropdownMenuSeparator />\n </>\n ) : null}\n <DropdownMenuItem data-way-out=\"skip\" className=\"text-foreground\" onSelect={onSkip}>\n <span className=\"flex-1\">{skipLabel}</span>\n {skipped ? <RadixCheckIcon className=\"size-3.5\" aria-hidden=\"true\" /> : null}\n </DropdownMenuItem>\n </>\n );\n\n const stage = size === \"stage\";\n const button = (a: \"yes\" | \"no\") => (\n <span data-decision-slot={a} data-suggested={suggested === a ? \"\" : undefined} className={cn(\"inline-flex max-sm:flex-1\", suggested === a && ring)}>\n <Button\n variant={value === a ? (a === \"no\" ? \"danger\" : \"primary\") : \"outline\"}\n aria-pressed={value === a}\n meta={shortcuts?.[a]}\n disabled={disabled}\n hero={stage}\n data-decision-option={a}\n className=\"max-sm:w-full\"\n onClick={() => onChange(a)}\n >\n {word(a)}\n </Button>\n </span>\n );\n return (\n <div\n role=\"group\"\n aria-label={ariaLabel ?? \"Answer\"}\n data-matrx-control=\"decision\"\n data-decision={value ?? (otherOpen ? \"other\" : \"open\")}\n data-decision-size={size}\n className={cn(\"flex shrink-0 flex-wrap items-center gap-1 max-sm:w-full sm:flex-nowrap\", stage && \"gap-2\", className)}\n >\n {button(\"yes\")}\n {button(\"no\")}\n {/* Other is the menu's own trigger, so the menu opens from it. Answered, pressing it again clears. */}\n <DropdownMenu\n open={otherOpen}\n onOpenChange={(next) => {\n if (next && value === \"other\") {\n onClear?.();\n return;\n }\n setOtherOpen(next);\n }}\n >\n <span data-decision-slot=\"other\" data-suggested={suggested === \"other\" ? \"\" : undefined} className={cn(\"inline-flex max-sm:flex-1\", suggested === \"other\" && ring)}>\n <DropdownMenuTrigger asChild disabled={disabled}>\n <Button\n variant={otherOn ? \"primary\" : \"outline\"}\n aria-pressed={otherOn}\n meta={shortcuts?.other}\n disabled={disabled}\n hero={stage}\n data-decision-option=\"other\"\n className=\"max-sm:w-full\"\n >\n {word(\"other\")}\n </Button>\n </DropdownMenuTrigger>\n </span>\n <DropdownMenuContent align=\"start\" className=\"min-w-48\">\n {wayOutMenu}\n </DropdownMenuContent>\n </DropdownMenu>\n {/* The value column: its width is reserved on desktop so rows stay aligned, but nothing is drawn\n until there is a value. On mobile it takes its own line under the buttons, only with a value. */}\n <div className={cn(\"flex min-w-0 items-center sm:w-40\", chipLabel === null && \"max-sm:hidden\", \"max-sm:w-full\")} data-decision-picker-slot=\"\">\n {chipLabel === null ? null : (\n <DropdownMenu open={chipOpen} onOpenChange={setChipOpen}>\n <DropdownMenuTrigger asChild disabled={disabled}>\n <Chip\n asChild\n label={chipLabel}\n tone={yesMode ? \"primary\" : \"neutral\"}\n data-decision-picker=\"\"\n data-picker-primary={primary ? \"\" : undefined}\n aria-label={`${yesMode ? word(\"yes\") : word(\"other\")}: ${chipLabel}`}\n >\n <button type=\"button\" disabled={disabled} />\n </Chip>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"start\" className=\"min-w-48\">\n {yesMode ? <WayOutEntries items={yesKinds ?? []} chosen={yesKind} onPick={(v) => onYesKind?.(v)} /> : wayOutMenu}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * DateField / DateTimeField / TimeField — THE date control of the one-control\n * family (lane G16, 2026-10-07). The field capsule (28px, locked in\n * `controls.css`) with typed entry, a calendar (desktop popover, phone bottom\n * sheet), Clear, and full keyboard access. Bar: Linear's and Stripe's date\n * fields — type the day the way you say it, or pick it, never a browser mask.\n *\n * value / onValueChange ISO in and out: `yyyy-mm-dd`, `HH:mm`,\n * `yyyy-mm-ddTHH:mm`; `null` is empty.\n * emptyLabel the caller's empty word (\"Pick a date\",\n * \"Unchanged\") — the placeholder, never a mask.\n * locale display + typed order; the browser's by default.\n *\n * Keyboard: type and press Enter (or leave the field) to commit; Escape\n * reverts; Alt+ArrowDown / ArrowDown opens the calendar; in the calendar the\n * arrows move a day / week, Home / End the week, PageUp / PageDown a month\n * (Shift: a year), Enter picks, Escape closes. Text the field cannot read\n * stays visible and the capsule turns destructive (`aria-invalid`) — nothing\n * is silently dropped.\n */\n\nimport { parseDateOnly, toDateOnly } from \"@ai-matrx/kit/dates\";\nimport * as React from \"react\";\n\nimport { BottomSheet } from \"../bottom-sheet\";\nimport { cn } from \"../cn\";\nimport { CalendarIcon, ChevronLeftIcon, ChevronRightIcon, ClockIcon, XIcon } from \"../icons\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"../popover\";\nimport { useIsMobile } from \"../use-is-mobile\";\nimport type { ControlWidth } from \"./controls\";\nimport {\n type DateFieldMode,\n TIME_SLOTS,\n formatDay,\n formatTime,\n monthGrid,\n parseTypedDate,\n parseTypedTime,\n splitValue,\n weekStart,\n} from \"./date-parse\";\n\nexport type { DateFieldMode } from \"./date-parse\";\n\nexport interface DateFieldProps {\n /** ISO: `yyyy-mm-dd` (date), `yyyy-mm-ddTHH:mm` (datetime), `HH:mm` (time); `null`/\"\" is empty. */\n value: string | null | undefined;\n onValueChange: (value: string | null) => void;\n /** `date` (default), `datetime` (a day and a time in one capsule), `time`. */\n mode?: DateFieldMode | undefined;\n /** The empty word, shown as the placeholder: \"Pick a date\", \"Unchanged\". */\n emptyLabel?: string | undefined;\n /** BCP-47 tag for display and typed order; the browser's when omitted. */\n locale?: string | undefined;\n /** Show the clear (x) button when there is a value. Default `true`. */\n clearable?: boolean | undefined;\n disabled?: boolean | undefined;\n /** The day input's id, for a `<label htmlFor>`. */\n id?: string | undefined;\n \"aria-label\"?: string | undefined;\n /** A named width instead of filling the row. */\n width?: ControlWidth | undefined;\n /** Placement only (width, flex, grid). */\n className?: string | undefined;\n style?: React.CSSProperties | undefined;\n}\n\nconst sameDay = (a: Date, b: Date) =>\n a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();\n\nexport const DateField = React.forwardRef<HTMLDivElement, DateFieldProps>(\n (\n {\n value,\n onValueChange,\n mode = \"date\",\n emptyLabel,\n locale,\n clearable = true,\n disabled,\n id,\n \"aria-label\": ariaLabel,\n width,\n className,\n style,\n },\n ref,\n ) => {\n const isMobile = useIsMobile();\n const { day, time } = splitValue(value, mode);\n const hasDay = mode !== \"time\";\n const hasTime = mode !== \"date\";\n const empty = hasDay ? !day : !time;\n const word = emptyLabel ?? (mode === \"time\" ? \"Pick a time\" : \"Pick a date\");\n\n const dayText = day ? formatDay(day, locale) : \"\";\n const timeText = time ? formatTime(time, locale) : \"\";\n const [dayDraft, setDayDraft] = React.useState<string | null>(null);\n const [timeDraft, setTimeDraft] = React.useState<string | null>(null);\n const [dayInvalid, setDayInvalid] = React.useState(false);\n const [timeInvalid, setTimeInvalid] = React.useState(false);\n const [open, setOpen] = React.useState(false);\n const dayRef = React.useRef<HTMLInputElement>(null);\n const timeRef = React.useRef<HTMLInputElement>(null);\n\n // Escape on a draft reverts it — and only that. A dialog's Escape listener sits in the\n // document's capture phase, ahead of the input; the window's capture phase runs first, so a\n // draft is reverted there and the dialog (with the rest of the person's form) stays open.\n const hasDraft = dayDraft !== null || timeDraft !== null;\n React.useEffect(() => {\n if (!hasDraft) return;\n const onKey = (e: KeyboardEvent) => {\n if (e.key !== \"Escape\") return;\n const active = document.activeElement;\n if (active === dayRef.current && dayDraft !== null) {\n setDayDraft(null);\n setDayInvalid(false);\n } else if (active === timeRef.current && timeDraft !== null) {\n setTimeDraft(null);\n setTimeInvalid(false);\n } else {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n };\n window.addEventListener(\"keydown\", onKey, true);\n return () => window.removeEventListener(\"keydown\", onKey, true);\n }, [hasDraft, dayDraft, timeDraft]);\n\n const emit = (nextDay: string, nextTime: string) => {\n if (mode === \"time\") return onValueChange(nextTime || null);\n if (mode === \"date\") return onValueChange(nextDay || null);\n if (!nextDay && !nextTime) return onValueChange(null);\n onValueChange(`${nextDay || toDateOnly(new Date())}T${nextTime || \"00:00\"}`);\n };\n\n const commitDay = (text: string) => {\n const t = text.trim();\n if (!t) {\n setDayDraft(null);\n setDayInvalid(false);\n if (day) emit(\"\", mode === \"datetime\" ? \"\" : time);\n return true;\n }\n const parsed = parseTypedDate(t, locale);\n if (!parsed) {\n setDayInvalid(true);\n return false;\n }\n setDayDraft(null);\n setDayInvalid(false);\n if (parsed !== day) emit(parsed, time);\n return true;\n };\n\n const commitTime = (text: string) => {\n const t = text.trim();\n if (!t) {\n setTimeDraft(null);\n setTimeInvalid(false);\n if (time) emit(mode === \"time\" ? \"\" : day, \"\");\n return true;\n }\n const parsed = parseTypedTime(t);\n if (!parsed) {\n setTimeInvalid(true);\n return false;\n }\n setTimeDraft(null);\n setTimeInvalid(false);\n if (parsed !== time) emit(day, parsed);\n return true;\n };\n\n const pickDay = (iso: string) => {\n setDayDraft(null);\n setDayInvalid(false);\n setOpen(false);\n emit(iso, time);\n // Return to typing: a datetime moves on to its time.\n requestAnimationFrame(() => (mode === \"datetime\" ? timeRef : dayRef).current?.focus());\n };\n const pickTime = (hhmm: string) => {\n setTimeDraft(null);\n setTimeInvalid(false);\n setOpen(false);\n emit(day, hhmm);\n requestAnimationFrame(() => timeRef.current?.focus());\n };\n const clear = () => {\n setDayDraft(null);\n setTimeDraft(null);\n setDayInvalid(false);\n setTimeInvalid(false);\n setOpen(false);\n onValueChange(null);\n (hasDay ? dayRef : timeRef).current?.focus();\n };\n\n const inputKeys =\n (kind: \"day\" | \"time\") =>\n (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n if (kind === \"day\") commitDay(e.currentTarget.value);\n else commitTime(e.currentTarget.value);\n } else if (e.key === \"ArrowDown\" && (e.altKey || !e.currentTarget.value)) {\n e.preventDefault();\n if (kind === \"day\" ? commitDay(e.currentTarget.value) : commitTime(e.currentTarget.value)) setOpen(true);\n }\n };\n\n const panelKind: \"day\" | \"time\" = hasDay ? \"day\" : \"time\";\n const panel =\n panelKind === \"day\" ? (\n <CalendarGrid\n value={day}\n locale={locale}\n onPick={pickDay}\n onClose={() => setOpen(false)}\n footer={\n <>\n <button type=\"button\" className=\"matrx-date-panel-action\" onClick={() => pickDay(toDateOnly(new Date()))}>\n Today\n </button>\n {!empty && clearable ? (\n <button type=\"button\" className=\"matrx-date-panel-action\" onClick={clear}>\n Clear\n </button>\n ) : null}\n </>\n }\n />\n ) : (\n <TimeList value={time} locale={locale} onPick={pickTime} onClose={() => setOpen(false)} />\n );\n\n const glyph = (\n <button\n type=\"button\"\n tabIndex={-1}\n disabled={disabled}\n aria-label={hasDay ? \"Open calendar\" : \"Open times\"}\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n data-matrx-date-trigger=\"\"\n onClick={() => setOpen((o) => !o)}\n >\n {hasDay ? <CalendarIcon /> : <ClockIcon />}\n </button>\n );\n\n const capsule = (\n <div\n ref={ref}\n role=\"group\"\n aria-label={ariaLabel ?? word}\n data-matrx-control=\"date-field\"\n data-mode={mode}\n data-glyph=\"start\"\n data-width={width}\n data-empty={empty ? \"\" : undefined}\n aria-disabled={disabled || undefined}\n className={cn(\"matrx-control matrx-control-field matrx-control-date\", className)}\n style={style}\n onMouseDown={(e) => {\n // A press on the capsule's padding types into it, like a text field.\n if (e.target === e.currentTarget) {\n e.preventDefault();\n (hasDay ? dayRef : timeRef).current?.focus();\n }\n }}\n >\n {glyph}\n {hasDay ? (\n <input\n ref={dayRef}\n id={id}\n type=\"text\"\n inputMode=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n value={dayDraft ?? dayText}\n placeholder={word}\n aria-label={ariaLabel ?? (mode === \"datetime\" ? \"Date\" : word)}\n aria-invalid={dayInvalid || undefined}\n onChange={(e) => {\n setDayDraft(e.target.value);\n setDayInvalid(false);\n }}\n onFocus={(e) => e.currentTarget.select()}\n onBlur={(e) => {\n if (dayDraft !== null) commitDay(e.target.value);\n }}\n onKeyDown={inputKeys(\"day\")}\n />\n ) : null}\n {hasTime ? (\n <input\n ref={timeRef}\n id={hasDay ? (id ? `${id}-time` : undefined) : id}\n type=\"text\"\n inputMode=\"text\"\n autoComplete=\"off\"\n spellCheck={false}\n disabled={disabled}\n value={timeDraft ?? timeText}\n placeholder={hasDay ? (day ? \"Time\" : \"\") : word}\n aria-label={hasDay ? \"Time\" : (ariaLabel ?? word)}\n aria-invalid={timeInvalid || undefined}\n data-matrx-date-part={hasDay ? \"time\" : undefined}\n onChange={(e) => {\n setTimeDraft(e.target.value);\n setTimeInvalid(false);\n }}\n onFocus={(e) => e.currentTarget.select()}\n onBlur={(e) => {\n if (timeDraft !== null) commitTime(e.target.value);\n }}\n onKeyDown={inputKeys(\"time\")}\n />\n ) : null}\n {clearable && !empty && !disabled ? (\n <button type=\"button\" aria-label=\"Clear\" data-matrx-date-clear=\"\" onClick={clear}>\n <XIcon />\n </button>\n ) : null}\n </div>\n );\n\n if (isMobile) {\n return (\n <>\n {capsule}\n <BottomSheet open={open} onOpenChange={setOpen} title={hasDay ? \"Pick a date\" : \"Pick a time\"} surface=\"solid\">\n <div className=\"matrx-date-sheet\">{panel}</div>\n </BottomSheet>\n </>\n );\n }\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverAnchor asChild>{capsule}</PopoverAnchor>\n <PopoverContent\n /* sizing: content — the calendar decides its own width */\n sizing=\"content\"\n padding=\"none\"\n align=\"start\"\n className=\"matrx-date-popover\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n // The glyph toggles: a press on it is not an outside press (or it would close, then reopen).\n onInteractOutside={(e) => {\n const target = e.target as Element | null;\n if (target?.closest?.(\"[data-matrx-date-trigger]\")) e.preventDefault();\n }}\n >\n {panel}\n </PopoverContent>\n </Popover>\n );\n },\n);\nDateField.displayName = \"DateField\";\n\n/** A day and a time in one capsule: `yyyy-mm-ddTHH:mm`. */\nexport const DateTimeField = React.forwardRef<HTMLDivElement, Omit<DateFieldProps, \"mode\">>((props, ref) => (\n <DateField ref={ref} {...props} mode=\"datetime\" />\n));\nDateTimeField.displayName = \"DateTimeField\";\n\n/** A time of day: `HH:mm`. */\nexport const TimeField = React.forwardRef<HTMLDivElement, Omit<DateFieldProps, \"mode\">>((props, ref) => (\n <DateField ref={ref} {...props} mode=\"time\" />\n));\nTimeField.displayName = \"TimeField\";\n\n/* ------------------------------------------------------------------ */\n/* The calendar — a WAI-ARIA date grid with a roving focus */\n/* ------------------------------------------------------------------ */\n\nfunction CalendarGrid({\n value,\n locale,\n onPick,\n onClose,\n footer,\n}: {\n value: string;\n locale?: string | undefined;\n onPick: (iso: string) => void;\n onClose: () => void;\n footer?: React.ReactNode | undefined;\n}) {\n const selected = parseDateOnly(value);\n const today = new Date();\n const [focus, setFocus] = React.useState<Date>(() => selected ?? today);\n const gridRef = React.useRef<HTMLDivElement>(null);\n const firstDay = weekStart(locale);\n const days = monthGrid(focus.getFullYear(), focus.getMonth(), firstDay);\n const weekdayFmt = new Intl.DateTimeFormat(locale, { weekday: \"short\" });\n const weekdayLong = new Intl.DateTimeFormat(locale, { weekday: \"long\" });\n const monthFmt = new Intl.DateTimeFormat(locale, { month: \"long\", year: \"numeric\" });\n const dayLabel = new Intl.DateTimeFormat(locale, { weekday: \"long\", month: \"long\", day: \"numeric\", year: \"numeric\" });\n\n React.useEffect(() => {\n gridRef.current?.querySelector<HTMLButtonElement>('[tabindex=\"0\"]')?.focus();\n }, [focus]);\n\n const move = (days: number, months = 0) =>\n setFocus((f) => {\n if (months) {\n const target = new Date(f.getFullYear(), f.getMonth() + months, 1);\n const last = new Date(target.getFullYear(), target.getMonth() + 1, 0).getDate();\n return new Date(target.getFullYear(), target.getMonth(), Math.min(f.getDate(), last));\n }\n return new Date(f.getFullYear(), f.getMonth(), f.getDate() + days);\n });\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n const col = (focus.getDay() - firstDay + 7) % 7;\n const keys: Record<string, () => void> = {\n ArrowLeft: () => move(-1),\n ArrowRight: () => move(1),\n ArrowUp: () => move(-7),\n ArrowDown: () => move(7),\n Home: () => move(-col),\n End: () => move(6 - col),\n PageUp: () => move(0, e.shiftKey ? -12 : -1),\n PageDown: () => move(0, e.shiftKey ? 12 : 1),\n Enter: () => onPick(toDateOnly(focus)),\n \" \": () => onPick(toDateOnly(focus)),\n Escape: onClose,\n };\n const run = keys[e.key];\n if (run) {\n e.preventDefault();\n e.stopPropagation();\n run();\n }\n };\n\n const headers = days.slice(0, 7);\n return (\n <div className=\"matrx-date-panel\" data-matrx-date-panel=\"calendar\">\n <div className=\"matrx-date-panel-head\">\n <button type=\"button\" className=\"matrx-date-panel-nav\" aria-label=\"Previous month\" onClick={() => move(0, -1)}>\n <ChevronLeftIcon />\n </button>\n <span className=\"matrx-date-panel-title\" aria-live=\"polite\">\n {monthFmt.format(focus)}\n </span>\n <button type=\"button\" className=\"matrx-date-panel-nav\" aria-label=\"Next month\" onClick={() => move(0, 1)}>\n <ChevronRightIcon />\n </button>\n </div>\n <div ref={gridRef} role=\"grid\" aria-label={monthFmt.format(focus)} className=\"matrx-date-grid\" onKeyDown={onKeyDown}>\n <div role=\"row\" className=\"matrx-date-row\">\n {headers.map((d) => (\n <span key={d.getDay()} role=\"columnheader\" aria-label={weekdayLong.format(d)} className=\"matrx-date-weekday\">\n {weekdayFmt.format(d).slice(0, 2)}\n </span>\n ))}\n </div>\n {[0, 1, 2, 3, 4, 5].map((w) => (\n <div key={w} role=\"row\" className=\"matrx-date-row\">\n {days.slice(w * 7, w * 7 + 7).map((d) => {\n const isSelected = selected ? sameDay(d, selected) : false;\n const isFocus = sameDay(d, focus);\n return (\n <span key={d.toISOString()} role=\"gridcell\" aria-selected={isSelected}>\n <button\n type=\"button\"\n tabIndex={isFocus ? 0 : -1}\n className=\"matrx-date-day\"\n data-outside={d.getMonth() !== focus.getMonth() ? \"\" : undefined}\n data-today={sameDay(d, today) ? \"\" : undefined}\n data-selected={isSelected ? \"\" : undefined}\n aria-label={dayLabel.format(d)}\n aria-current={sameDay(d, today) ? \"date\" : undefined}\n onClick={() => onPick(toDateOnly(d))}\n onFocus={() => {\n if (!isFocus) setFocus(d);\n }}\n >\n {d.getDate()}\n </button>\n </span>\n );\n })}\n </div>\n ))}\n </div>\n {footer ? <div className=\"matrx-date-panel-foot\">{footer}</div> : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* The time list — half-hour slots, arrow keys, the value in view */\n/* ------------------------------------------------------------------ */\n\nfunction TimeList({\n value,\n locale,\n onPick,\n onClose,\n}: {\n value: string;\n locale?: string | undefined;\n onPick: (hhmm: string) => void;\n onClose: () => void;\n}) {\n const listRef = React.useRef<HTMLDivElement>(null);\n const start = value ? TIME_SLOTS.findIndex((s) => s >= value) : TIME_SLOTS.indexOf(\"09:00\");\n const [active, setActive] = React.useState(start < 0 ? TIME_SLOTS.length - 1 : start);\n\n React.useEffect(() => {\n const el = listRef.current?.querySelector<HTMLButtonElement>(`[data-index=\"${active}\"]`);\n el?.focus();\n el?.scrollIntoView?.({ block: \"nearest\" });\n }, [active]);\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n const keys: Record<string, () => void> = {\n ArrowDown: () => setActive((a) => Math.min(TIME_SLOTS.length - 1, a + 1)),\n ArrowUp: () => setActive((a) => Math.max(0, a - 1)),\n Home: () => setActive(0),\n End: () => setActive(TIME_SLOTS.length - 1),\n Escape: onClose,\n };\n const run = keys[e.key];\n if (run) {\n e.preventDefault();\n e.stopPropagation();\n run();\n }\n };\n\n return (\n <div ref={listRef} role=\"listbox\" aria-label=\"Times\" className=\"matrx-date-panel matrx-time-list\" onKeyDown={onKeyDown}>\n {TIME_SLOTS.map((slot, i) => (\n <button\n key={slot}\n type=\"button\"\n role=\"option\"\n aria-selected={slot === value}\n tabIndex={i === active ? 0 : -1}\n data-index={i}\n data-selected={slot === value ? \"\" : undefined}\n className=\"matrx-time-slot\"\n onClick={() => onPick(slot)}\n >\n {formatTime(slot, locale)}\n </button>\n ))}\n </div>\n );\n}\n","/**\n * The date field's words — locale-aware display and typed-entry parsing, pure.\n *\n * Values are ISO, always: a day is `yyyy-mm-dd`, a time is `HH:mm` (24h), a\n * date-and-time is `yyyy-mm-ddTHH:mm` (local, no zone — the shape\n * `<input type=\"datetime-local\">` and kit's `datetimeLocalValue` speak). What a\n * person SEES and TYPES is their locale's: `Oct 7, 2026` / `7 Oct 2026`,\n * `3:30 PM` / `15:30`. Typed entry accepts the locale's numeric order\n * (10/7/2026 in en-US, 7/10/2026 in en-GB), ISO, month names (the locale's and\n * English), digit runs (10072026), and today / tomorrow / yesterday.\n */\n\nimport { isValidDateOnly, parseDateOnly, toDateOnly } from \"@ai-matrx/kit/dates\";\n\nexport type DateFieldMode = \"date\" | \"datetime\" | \"time\";\n\nconst pad = (n: number) => String(n).padStart(2, \"0\");\n\n/** The day / month / year order the locale writes numeric dates in. */\nexport function dateOrder(locale?: string): Array<\"day\" | \"month\" | \"year\"> {\n const parts = new Intl.DateTimeFormat(locale, { year: \"numeric\", month: \"2-digit\", day: \"2-digit\" })\n .formatToParts(new Date(2026, 9, 7));\n const order = parts\n .map((p) => p.type)\n .filter((t): t is \"day\" | \"month\" | \"year\" => t === \"day\" || t === \"month\" || t === \"year\");\n return order.length === 3 ? order : [\"month\", \"day\", \"year\"];\n}\n\n/** 0 = Sunday … 6 = Saturday: the first column of the locale's week. */\nexport function weekStart(locale?: string): number {\n try {\n const loc = new Intl.Locale(locale ?? new Intl.DateTimeFormat().resolvedOptions().locale) as Intl.Locale & {\n getWeekInfo?: () => { firstDay: number };\n weekInfo?: { firstDay: number };\n };\n const first = loc.getWeekInfo?.().firstDay ?? loc.weekInfo?.firstDay;\n if (typeof first === \"number\") return first % 7; // Intl: 1 = Monday … 7 = Sunday\n } catch {\n // An unknown locale tag falls through to the region default below.\n }\n return 0;\n}\n\nfunction monthNames(locale?: string): Map<string, number> {\n const names = new Map<string, number>();\n const add = (fmtLocale: string | undefined) => {\n for (const style of [\"long\", \"short\"] as const) {\n const fmt = new Intl.DateTimeFormat(fmtLocale, { month: style });\n for (let m = 0; m < 12; m++) {\n const name = fmt.format(new Date(2026, m, 1)).toLowerCase().replace(/\\./g, \"\");\n if (name && !names.has(name)) names.set(name, m);\n }\n }\n };\n add(locale);\n add(\"en-US\");\n return names;\n}\n\nfunction expandYear(y: number, raw: string): number {\n if (raw.length > 2) return y;\n const now = new Date().getFullYear();\n const century = Math.floor(now / 100) * 100;\n const candidate = century + y;\n return candidate > now + 20 ? candidate - 100 : candidate;\n}\n\nfunction build(y: number, m: number, d: number): string | null {\n if (!Number.isFinite(y) || !Number.isFinite(m) || !Number.isFinite(d)) return null;\n const iso = `${String(y).padStart(4, \"0\")}-${pad(m)}-${pad(d)}`;\n return isValidDateOnly(iso) ? iso : null;\n}\n\n/** Typed text → `yyyy-mm-dd`, or `null` when it is not a day this field can name. */\nexport function parseTypedDate(text: string, locale?: string, now: Date = new Date()): string | null {\n const raw = text.trim().toLowerCase().replace(/,/g, \" \").replace(/\\s+/g, \" \");\n if (!raw) return null;\n\n const relative: Record<string, number> = { today: 0, tod: 0, tomorrow: 1, tom: 1, yesterday: -1 };\n if (raw in relative) {\n const d = new Date(now.getFullYear(), now.getMonth(), now.getDate() + relative[raw]!);\n return toDateOnly(d);\n }\n\n const iso = /^(\\d{4})[-/.](\\d{1,2})[-/.](\\d{1,2})$/.exec(raw);\n if (iso) return build(Number(iso[1]), Number(iso[2]), Number(iso[3]));\n\n const order = dateOrder(locale);\n\n // Month names: \"oct 7 2026\", \"7 october\", \"october 7\".\n if (/[a-zÀ-]/.test(raw)) {\n const names = monthNames(locale);\n const tokens = raw.replace(/\\./g, \"\").split(/[\\s/\\-]+/).filter(Boolean);\n let month: number | undefined;\n const nums: string[] = [];\n for (const t of tokens) {\n if (/^\\d+(st|nd|rd|th)?$/.test(t)) {\n nums.push(t.replace(/\\D/g, \"\"));\n continue;\n }\n const exact = names.get(t);\n const prefix =\n exact ?? (t.length >= 3 ? [...names].find(([name]) => name.startsWith(t))?.[1] : undefined);\n if (prefix === undefined || month !== undefined) return null;\n month = prefix;\n }\n if (month === undefined || nums.length === 0 || nums.length > 2) return null;\n const day = Number(nums[0]);\n const year = nums[1] ? expandYear(Number(nums[1]), nums[1]) : now.getFullYear();\n return build(year, month + 1, day);\n }\n\n // Numbers in the locale's order: separators, or one digit run.\n let pieces = raw.split(/[\\s/.\\-]+/).filter(Boolean);\n if (pieces.length === 1 && /^\\d+$/.test(raw)) {\n const yearFirst = order[0] === \"year\";\n if (raw.length === 8) {\n pieces = yearFirst ? [raw.slice(0, 4), raw.slice(4, 6), raw.slice(6)] : [raw.slice(0, 2), raw.slice(2, 4), raw.slice(4)];\n } else if (raw.length === 6) {\n pieces = [raw.slice(0, 2), raw.slice(2, 4), raw.slice(4)];\n } else {\n return null;\n }\n }\n if (!pieces.every((p) => /^\\d+$/.test(p))) return null;\n if (pieces.length === 2) {\n const dm = order.filter((o) => o !== \"year\");\n const v: Record<string, number> = {};\n dm.forEach((k, i) => (v[k] = Number(pieces[i])));\n return build(now.getFullYear(), v.month!, v.day!);\n }\n if (pieces.length !== 3) return null;\n // A four-digit first piece is a year whatever the locale says.\n const effective = pieces[0]!.length === 4 ? ([\"year\", \"month\", \"day\"] as const) : order;\n const v: Record<string, number> = {};\n effective.forEach((k, i) => {\n const p = pieces[i]!;\n v[k] = k === \"year\" ? expandYear(Number(p), p) : Number(p);\n });\n return build(v.year!, v.month!, v.day!);\n}\n\n/** Typed text → `HH:mm` (24h), or `null`. Accepts 3pm, 3:30 pm, 15:30, 1530, noon, midnight. */\nexport function parseTypedTime(text: string): string | null {\n const raw = text.trim().toLowerCase().replace(/\\s+/g, \"\").replace(/\\./g, \"\");\n if (!raw) return null;\n if (raw === \"noon\") return \"12:00\";\n if (raw === \"midnight\") return \"00:00\";\n const m = /^(\\d{1,2})(?::?(\\d{2}))?(am|pm|a|p)?$/.exec(raw);\n if (!m) return null;\n let h = Number(m[1]);\n const min = m[2] ? Number(m[2]) : 0;\n const mer = m[3]?.[0];\n if (min > 59) return null;\n if (mer) {\n if (h < 1 || h > 12) return null;\n if (mer === \"a\") h = h === 12 ? 0 : h;\n else h = h === 12 ? 12 : h + 12;\n } else if (h > 23) {\n return null;\n }\n return `${pad(h)}:${pad(min)}`;\n}\n\n/** `yyyy-mm-dd` → the locale's medium day (`Oct 7, 2026`). */\nexport function formatDay(iso: string, locale?: string): string {\n const d = parseDateOnly(iso);\n if (!d) return iso;\n return new Intl.DateTimeFormat(locale, { month: \"short\", day: \"numeric\", year: \"numeric\" }).format(d);\n}\n\n/** `HH:mm` → the locale's short time (`3:30 PM` / `15:30`). */\nexport function formatTime(hhmm: string, locale?: string): string {\n const m = /^(\\d{2}):(\\d{2})$/.exec(hhmm);\n if (!m) return hhmm;\n return new Intl.DateTimeFormat(locale, { hour: \"numeric\", minute: \"2-digit\" }).format(\n new Date(2026, 0, 1, Number(m[1]), Number(m[2])),\n );\n}\n\n/** Split an ISO value into its day and time halves for a mode. */\nexport function splitValue(value: string | null | undefined, mode: DateFieldMode): { day: string; time: string } {\n const v = (value ?? \"\").trim();\n if (!v) return { day: \"\", time: \"\" };\n if (mode === \"time\") {\n const t = /(\\d{2}:\\d{2})/.exec(v);\n return { day: \"\", time: t ? t[1]! : \"\" };\n }\n const day = /^(\\d{4}-\\d{2}-\\d{2})/.exec(v)?.[1] ?? \"\";\n const time = mode === \"datetime\" ? (/[T ](\\d{2}:\\d{2})/.exec(v)?.[1] ?? \"\") : \"\";\n return { day, time };\n}\n\n/** The 42 days (six weeks) a month grid shows, starting on the locale's first weekday. */\nexport function monthGrid(year: number, month: number, firstDay: number): Date[] {\n const first = new Date(year, month, 1);\n const offset = (first.getDay() - firstDay + 7) % 7;\n return Array.from({ length: 42 }, (_, i) => new Date(year, month, 1 - offset + i));\n}\n\n/** Half-hour slots for the time list, `HH:mm`. */\nexport const TIME_SLOTS: readonly string[] = Array.from({ length: 48 }, (_, i) => `${pad(Math.floor(i / 2))}:${i % 2 ? \"30\" : \"00\"}`);\n","\"use client\";\n\n/**\n * NumberStepper — moved from matrx-frontend (chat host slot; the package default now).\n *\n * A compact number input with − / + stepper buttons on either side.\n * The input auto-sizes to its content in `ch` units so it always fits\n * exactly — no fixed width needed, works for 1 digit or 10 000+.\n *\n * Features:\n * - Auto-sizing input: width tracks the current draft string length in `ch`\n * - No browser-native spinner arrows (uses type=\"text\" + inputMode=\"numeric\")\n * - Validates only on blur or Enter — never interrupts mid-type editing\n * - Clearing the field is allowed; the committed value falls back to `fallback`\n * - Arrow-key stepping (↑ / ↓) works while the input is focused\n * - Buttons use onMouseDown + preventDefault so focus stays in the input\n * - Fully theme-aware: uses bg-background / text-foreground / border-input tokens\n * - THE ONE CONTROL's height by default (`--matrx-control-size`, 28px) and\n * its 13px label, so it lines up with Button / Select / Switch beside it;\n * a dense host may still pass a smaller height; width is automatic\n *\n * Props:\n * value – controlled numeric value\n * onChange – called with the new committed value\n * min – optional minimum (clamped on commit)\n * max – optional maximum (clamped on commit)\n * fallback – value to use when the field is empty or non-numeric (default 0)\n * step – amount to increment / decrement per button click (default 1)\n * minChars – minimum visible character width of the input area (default 2)\n * className – applied to the outer wrapper\n */\n\nimport { useState, useEffect } from \"react\";\nimport { cn } from \"../cn\";\nimport { MinusIcon, PlusIcon } from \"../icons\";\n\nexport interface NumberStepperProps {\n value: number;\n onChange: (v: number) => void;\n min?: number;\n max?: number;\n fallback?: number;\n step?: number;\n minChars?: number;\n className?: string;\n}\n\nexport function NumberStepper({\n value,\n onChange,\n min,\n max,\n fallback = 0,\n step = 1,\n minChars = 2,\n className,\n}: NumberStepperProps) {\n const [draft, setDraft] = useState(String(value));\n\n useEffect(() => {\n setDraft(String(value));\n }, [value]);\n\n const commit = (override?: number) => {\n const parsed = override !== undefined ? override : parseInt(draft, 10);\n let next = isNaN(parsed) ? fallback : parsed;\n if (min !== undefined) next = Math.max(min, next);\n if (max !== undefined) next = Math.min(max, next);\n setDraft(String(next));\n if (next !== value) onChange(next);\n };\n\n const nudge = (delta: number) => {\n const current = parseInt(draft, 10);\n const base = isNaN(current) ? (fallback ?? 0) : current;\n commit(base + delta);\n };\n\n const btnCls =\n \"flex items-center justify-center border border-input bg-background \" +\n \"text-muted-foreground hover:text-foreground hover:bg-muted \" +\n \"transition-colors select-none shrink-0 \" +\n \"h-full aspect-square leading-none\";\n\n return (\n <div\n className={cn(\n \"flex h-[var(--matrx-control-size,1.75rem)] items-stretch rounded-md overflow-hidden shrink-0\",\n className,\n )}\n >\n <button\n type=\"button\"\n onMouseDown={(e) => {\n e.preventDefault();\n nudge(-step);\n }}\n className={cn(btnCls, \"rounded-l-md border-r-0\")}\n tabIndex={-1}\n aria-label=\"Decrease\"\n >\n <MinusIcon width={12} height={12} strokeWidth={2.25} />\n </button>\n\n <input\n type=\"text\"\n inputMode=\"numeric\"\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={() => commit()}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n nudge(step);\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n nudge(-step);\n }\n }}\n style={{ width: `${Math.max(minChars, draft.length) + 3}ch` }}\n className={cn(\n \"border-y border-input bg-background text-foreground\",\n \"px-1.5 font-mono text-[length:var(--matrx-control-label,0.8125rem)] text-center outline-none\",\n \"focus-visible:ring-1 focus-visible:ring-inset focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n )}\n />\n\n <button\n type=\"button\"\n onMouseDown={(e) => {\n e.preventDefault();\n nudge(step);\n }}\n className={cn(btnCls, \"rounded-r-md border-l-0\")}\n tabIndex={-1}\n aria-label=\"Increase\"\n >\n <PlusIcon width={12} height={12} strokeWidth={2.25} />\n </button>\n </div>\n );\n}\n\n","\"use client\";\n\n/**\n * StageSteps — where a person is on a short path (\"Get a result → Make it an agent → Test & improve\").\n * One quiet row at control height (28px): a numbered mark per step, its label, a hairline between.\n * Steps before `current` are done (check), `current` is the filled primary mark with foreground text\n * (`aria-current=\"step\"`), later steps are muted. It only reports where you are — never a button row,\n * so it adds no choice to a header.\n *\n * `labels=\"current\"` keeps every mark but shows only the current step's label (a narrow header);\n * every hidden label stays the step's tooltip and accessible name. `labels=\"auto\"` shows every label\n * on wide screens and only the current one on a phone. Styles: controls.css `.matrx-stage-steps`.\n * Pinned by `stage-steps.test.tsx`.\n *\n * A long path (`maxVisible`) keeps the first and last steps and a window around the current one;\n * each run of hidden steps folds into one \"+N\" mark (its tooltip names them). The row never grows\n * past its container: labels truncate before anything spills.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { RadixCheckIcon } from \"../icons\";\n\nexport interface StageStep {\n id: string;\n label: string;\n}\n\nexport type StageState = \"done\" | \"current\" | \"upcoming\";\n\nexport interface StageStepsProps extends Omit<React.HTMLAttributes<HTMLOListElement>, \"children\"> {\n steps: readonly StageStep[];\n /** Index of the step the person is on; earlier steps read as done. Clamped to the list. */\n current: number;\n \"aria-label\": string;\n /**\n * \"all\" (default) shows every label; \"current\" only the current one (narrow headers); \"auto\"\n * every label on wide screens, only the current one under 640px.\n */\n labels?: \"all\" | \"current\" | \"auto\";\n /** At most this many marks (min 5); longer paths fold hidden runs into \"+N\". Default: all. */\n maxVisible?: number;\n}\n\nexport type StageSlot = { kind: \"step\"; index: number } | { kind: \"more\"; from: number; to: number };\n\n/**\n * Which marks a path of `count` steps draws with at most `maxVisible` marks: the first and last\n * step, a window around the current one, and one \"+N\" slot per hidden run. Pure (tested).\n */\nexport function stageSlots(count: number, current: number, maxVisible?: number): StageSlot[] {\n const all: StageSlot[] = Array.from({ length: count }, (_, index) => ({ kind: \"step\", index }));\n if (!maxVisible || count <= Math.max(5, maxVisible)) return all;\n const max = Math.max(5, Math.trunc(maxVisible));\n const at = Math.max(0, Math.min(count - 1, Math.trunc(current)));\n const size = max - 4; // first + last + up to two \"+N\" slots\n const start = Math.max(1, Math.min(count - 1 - size, at - Math.floor((size - 1) / 2)));\n const end = start + size - 1;\n const out: StageSlot[] = [{ kind: \"step\", index: 0 }];\n if (start > 1) out.push({ kind: \"more\", from: 1, to: start - 1 });\n for (let index = start; index <= end; index++) out.push({ kind: \"step\", index });\n if (end < count - 2) out.push({ kind: \"more\", from: end + 1, to: count - 2 });\n out.push({ kind: \"step\", index: count - 1 });\n return out;\n}\n\n/** The state each step draws in. Pure, so the rule is tested without a DOM. */\nexport function stageStates(count: number, current: number): StageState[] {\n const at = Math.max(0, Math.min(count - 1, Math.trunc(current)));\n return Array.from({ length: count }, (_, i) => (i < at ? \"done\" : i === at ? \"current\" : \"upcoming\"));\n}\n\nexport function StageSteps({ steps, current, labels = \"all\", maxVisible, className, ...props }: StageStepsProps) {\n const states = stageStates(steps.length, current);\n const slots = stageSlots(steps.length, current, maxVisible);\n return (\n <ol data-matrx-control=\"stage-steps\" data-labels={labels} className={cn(\"matrx-stage-steps\", className)} {...props}>\n {slots.map((slot, n) => {\n if (slot.kind === \"more\") {\n const hidden = steps.slice(slot.from, slot.to + 1);\n const state = states[slot.from];\n const names = hidden.map((step) => step.label).join(\", \");\n return (\n <li\n key={`more-${slot.from}`}\n data-stage=\"more\"\n data-state={state}\n title={names}\n aria-label={`${hidden.length} more steps: ${names}`}\n className=\"matrx-stage-steps-item\"\n >\n {n > 0 ? <span className=\"matrx-stage-steps-sep\" aria-hidden=\"true\" /> : null}\n <span className=\"matrx-stage-steps-more\" aria-hidden=\"true\">+{hidden.length}</span>\n </li>\n );\n }\n const i = slot.index;\n const step = steps[i]!;\n const state = states[i];\n return (\n <li\n key={step.id}\n data-stage={step.id}\n data-state={state}\n aria-current={state === \"current\" ? \"step\" : undefined}\n title={step.label}\n className=\"matrx-stage-steps-item\"\n >\n {n > 0 ? <span className=\"matrx-stage-steps-sep\" aria-hidden=\"true\" /> : null}\n <span className=\"matrx-stage-steps-mark\" aria-hidden=\"true\">\n {state === \"done\" ? <RadixCheckIcon /> : i + 1}\n </span>\n <span className=\"matrx-stage-steps-label\">\n {step.label}\n {state === \"done\" ? <span className=\"matrx-sr-only\"> (done)</span> : null}\n </span>\n </li>\n );\n })}\n </ol>\n );\n}\n","\"use client\";\n\n// The ONE integer field (moved from matrx-frontend components/official, 2026-10-08; before that\n// features/marketing/components/shared,\n// 2026-10-01). A number field bound straight to a number state paints \"04\":\n// clearing it parses to 0, the next keystroke makes the DOM value \"04\", and\n// React leaves it because \"04\" == 4 (verify-6 #3, flashcards \"Number of\n// cards\"). This keeps a text draft while typing and clamps on blur or Enter,\n// so the field can go empty and never shows a leading zero.\n\nimport { useEffect, useState } from \"react\";\nimport { Input } from \"./doors\";\n\nexport type ClampedNumberInputProps = {\n id?: string;\n value: number;\n min: number;\n /** Omit while the ceiling is still being read. */\n max?: number | null;\n /** Fractional values (ratios, prices). Integers by default. */\n decimal?: boolean;\n /** HTML step; defaults to 1 for integers and \"any\" for decimals. */\n step?: number | \"any\";\n disabled?: boolean;\n className?: string;\n \"aria-label\"?: string;\n \"data-testid\"?: string;\n title?: string;\n onChange: (value: number) => void;\n /**\n * The number the field shows right now when it is a value it would keep as typed, else null\n * (empty, or out of range until blur clamps it). A label that repeats the count (\"Make 5\n * cards\") reads this, so it never names a number the field does not show (verify-7 #3).\n */\n onDraftChange?: (shown: number | null) => void;\n};\n\n/** The number a draft shows when it is exactly a value the field would keep, else null. */\nexport function shownDraft(raw: string, min: number, max?: number | null, decimal = false): number | null {\n const next = clampDraft(raw, min, max, decimal);\n if (next === null) return null;\n return String(next) === raw.replace(/^0+(?=\\d)/, \"\") ? next : null;\n}\n\n/** The committed value for a typed draft, or null to restore the last value. */\nexport function clampDraft(\n raw: string,\n min: number,\n max?: number | null,\n decimal = false,\n): number | null {\n const parsed = decimal ? Number.parseFloat(raw) : Number.parseInt(raw, 10);\n if (Number.isNaN(parsed)) return null;\n const floored = Math.max(min, parsed);\n return max === undefined || max === null ? floored : Math.min(max, floored);\n}\n\n/**\n * Controlled integer input that lets the field go empty while typing. An\n * in-range number commits as it is typed; clamp / restore of anything else\n * happens on blur or Enter — never mid-keystroke.\n */\nexport function ClampedNumberInput({\n id,\n value,\n min,\n max,\n decimal = false,\n step,\n disabled,\n className,\n \"aria-label\": ariaLabel,\n \"data-testid\": testId,\n title,\n onChange,\n onDraftChange,\n}: ClampedNumberInputProps) {\n const [draft, setDraftState] = useState(String(value));\n // Reported in the same event as the keystroke, so a label repeating the count is never one\n // render behind the field.\n const setDraft = (raw: string) => {\n setDraftState(raw);\n onDraftChange?.(shownDraft(raw, min, max, decimal));\n };\n\n useEffect(() => {\n setDraftState(String(value));\n onDraftChange?.(shownDraft(String(value), min, max, decimal));\n }, [value, min, max, decimal, onDraftChange]);\n\n const commit = (raw: string) => {\n const next = clampDraft(raw, min, max, decimal);\n if (next === null) {\n setDraft(String(value));\n return;\n }\n setDraft(String(next));\n if (next !== value) onChange(next);\n };\n\n return (\n <Input\n id={id}\n type=\"number\"\n inputMode={decimal ? \"decimal\" : \"numeric\"}\n step={step ?? (decimal ? \"any\" : 1)}\n min={min}\n max={max ?? undefined}\n disabled={disabled}\n aria-label={ariaLabel}\n data-testid={testId}\n title={title}\n className={className}\n value={draft}\n onChange={(event) => {\n const raw = event.target.value;\n setDraft(raw);\n // An in-range value is the value now (a \"Make 10 cards\" button must\n // not lag the field until blur); anything else waits for blur.\n const next = shownDraft(raw, min, max, decimal);\n if (next !== null && next !== value) onChange(next);\n }}\n onBlur={(event) => commit(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === \"Enter\") {\n event.currentTarget.blur();\n }\n }}\n />\n );\n}\n","\"use client\";\n// LightSwitchToggle — moved from matrx-frontend components/matrx (chat host slot; the package default now).\n\nimport { useState, forwardRef } from \"react\";\nimport { cn } from \"../cn\";\n\nconst defaultSizes = {\n width: \"w-48\",\n height: \"h-16\",\n} as const;\n\nexport interface LightSwitchToggleProps {\n variant?: \"rounded\" | \"geometric\" | string;\n defaultValue?: boolean;\n value?: boolean;\n onChange?: (value: boolean) => void;\n width?: string;\n height?: string;\n labels?: {\n on: string;\n off: string;\n };\n disabled?: boolean;\n className?: string;\n}\n\nconst LightSwitchToggle = forwardRef<HTMLDivElement, LightSwitchToggleProps>(\n (\n {\n variant,\n defaultValue = false,\n value,\n onChange,\n width,\n height,\n labels = { on: \"ON\", off: \"OFF\" },\n disabled = false,\n className,\n }: LightSwitchToggleProps,\n ref,\n ) => {\n const [internalState, setInternalState] = useState(defaultValue);\n const validVariant = variant === \"geometric\" ? \"geometric\" : \"rounded\";\n\n const isOn = value !== undefined ? value : internalState;\n\n const handleToggle = (newState: boolean) => {\n if (disabled) return;\n if (value === undefined) {\n setInternalState(newState);\n }\n onChange?.(newState);\n };\n\n const containerClasses = cn(\n \"relative flex bg-muted shadow-inner overflow-hidden\",\n width || defaultSizes.width,\n height || defaultSizes.height,\n validVariant === \"rounded\" && \"rounded-full\",\n disabled && \"opacity-50 cursor-not-allowed\",\n className,\n );\n\n const buttonBaseClasses =\n \"relative w-1/2 h-full transition-all duration-300\";\n const activeButtonClasses =\n \"bg-primary transform -translate-y-px shadow-[inset_0_1px_3px_rgba(0,0,0,0.2)]\";\n const inactiveButtonClasses = \"bg-muted/60 transform -translate-y-1.5\";\n\n const renderOption = (\n isActive: boolean,\n label: string,\n side: \"left\" | \"right\",\n onClick: () => void,\n ) => (\n <button\n type=\"button\"\n onClick={onClick}\n disabled={disabled}\n aria-pressed={isActive}\n className={cn(\n buttonBaseClasses,\n isActive ? activeButtonClasses : inactiveButtonClasses,\n )}\n >\n <div\n className={cn(\n \"absolute inset-0\",\n side === \"left\"\n ? \"border-r border-border\"\n : \"border-l border-border\",\n validVariant === \"rounded\" &&\n (side === \"left\" ? \"rounded-l-full\" : \"rounded-r-full\"),\n isActive\n ? \"bg-gradient-to-br from-primary/90 via-primary to-primary/90\"\n : \"bg-gradient-to-br from-muted/70 via-muted/50 to-muted/70 dark:from-muted/40 dark:via-muted/30 dark:to-muted/40\",\n )}\n />\n <span\n className={cn(\n \"relative z-20 font-semibold text-xs truncate px-1 transition-colors\",\n isActive ? \"text-primary-foreground\" : \"text-muted-foreground\",\n )}\n >\n {label}\n </span>\n </button>\n );\n\n return (\n <div className=\"flex items-center justify-center\">\n <div ref={ref} className={containerClasses}>\n <div className=\"absolute left-1/2 top-0 bottom-0 w-[2px] bg-border transform -translate-x-1/2 z-10\" />\n {renderOption(!isOn, labels.off, \"left\", () => handleToggle(false))}\n {renderOption(isOn, labels.on, \"right\", () => handleToggle(true))}\n </div>\n </div>\n );\n },\n);\n\nLightSwitchToggle.displayName = \"LightSwitchToggle\";\n\nexport { LightSwitchToggle };\n","\"use client\";\n\n/**\n * OptionCombobox — a single-select over a string option list, searchable.\n *\n * The house choice rule (features/agents/utils/choice-rule.ts): pills for up to\n * four short options, a plain select up to twelve, and THIS above twelve — a\n * list that long is scanned by typing, never by scrolling a pill wall. Groups\n * are optional; a group marked `collapsed` shows behind a \"More\" row until the\n * person opens it, searches, or its option is the current value.\n *\n * Two trigger looks: `field` (bordered, matches SelectTrigger) and `inline`\n * (borderless, for dense settings rows).\n */\n\nimport { useState, type ReactNode } from \"react\";\nimport { CheckIcon, ChevronRightIcon as ChevronRight } from \"../icons\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { SelectChevron } from \"../select\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"../command\";\nimport { cn } from \"../cn\";\n\nexport interface OptionComboboxGroup {\n heading?: string;\n options: string[];\n /** Hidden behind a \"More\" row until opened (or searched, or selected). */\n collapsed?: boolean;\n}\n\nexport interface OptionComboboxProps {\n value: string;\n onChange: (value: string) => void;\n /** Flat list — or pass `groups`. */\n options?: readonly string[] | undefined;\n groups?: OptionComboboxGroup[] | undefined;\n /** Display text for an option (defaults to the option itself). */\n getLabel?: ((option: string) => string) | undefined;\n /** Secondary text shown muted after the label. */\n getHint?: ((option: string) => string | null | undefined) | undefined;\n /** Leading visual for an option (e.g. a ratio shape). */\n renderIcon?: ((option: string) => ReactNode) | undefined;\n placeholder?: string | undefined;\n searchPlaceholder?: string | undefined;\n /** Hide the search box (short grouped lists). */\n searchable?: boolean | undefined;\n variant?: \"field\" | \"inline\" | undefined;\n compact?: boolean | undefined;\n disabled?: boolean | undefined;\n id?: string | undefined;\n ariaLabel?: string | undefined;\n className?: string | undefined;\n}\n\nexport function OptionCombobox({\n value,\n onChange,\n options,\n groups: groupsProp,\n getLabel = (o) => o,\n getHint,\n renderIcon,\n placeholder = \"Choose…\",\n searchPlaceholder = \"Search…\",\n searchable = true,\n variant = \"field\",\n compact = false,\n disabled = false,\n id,\n ariaLabel,\n className,\n}: OptionComboboxProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [showMore, setShowMore] = useState(false);\n\n const groups: OptionComboboxGroup[] = groupsProp ?? [\n { options: [...(options ?? [])] },\n ];\n const q = query.trim().toLowerCase();\n const matches = (o: string) =>\n !q ||\n o.toLowerCase().includes(q) ||\n getLabel(o).toLowerCase().includes(q) ||\n (getHint?.(o) ?? \"\").toLowerCase().includes(q);\n\n const hasValue = value !== \"\";\n const hint = hasValue ? getHint?.(value) : null;\n\n const pick = (o: string) => {\n onChange(o);\n setOpen(false);\n setQuery(\"\");\n };\n\n return (\n <Popover\n open={open}\n onOpenChange={(next) => {\n setOpen(next);\n if (!next) {\n setQuery(\"\");\n setShowMore(false);\n }\n }}\n >\n <PopoverTrigger asChild disabled={disabled}>\n <button\n id={id}\n type=\"button\"\n role=\"combobox\"\n aria-expanded={open}\n aria-label={ariaLabel}\n className={cn(\n \"flex w-full min-w-0 items-center gap-2 text-left transition-colors\",\n \"focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n variant === \"field\"\n ? cn(\n // The one field surface (design-system FIELD_SURFACE_CLASS) — never gray beside a Select.\n \"rounded-md border border-border bg-card px-3 shadow-xs hover:bg-accent/40\",\n compact ? \"h-8 text-xs\" : \"h-9 text-sm\",\n )\n : \"h-7 rounded px-1 text-xs font-medium text-muted-foreground hover:text-foreground\",\n className,\n )}\n >\n {hasValue && renderIcon?.(value)}\n <span\n className={cn(\n \"min-w-0 flex-1 truncate\",\n !hasValue && \"text-muted-foreground\",\n )}\n >\n {hasValue ? getLabel(value) : placeholder}\n {hint && (\n <span className=\"ml-1.5 text-muted-foreground\">{hint}</span>\n )}\n </span>\n <SelectChevron size=\"sm\" className={variant === \"inline\" ? \"h-3 w-3\" : undefined} />\n </button>\n </PopoverTrigger>\n <PopoverContent\n sizing=\"content\"\n align=\"start\"\n className=\"p-0\"\n >\n <Command shouldFilter={false}>\n {searchable && (\n <CommandInput\n placeholder={searchPlaceholder}\n value={query}\n onValueChange={setQuery}\n />\n )}\n <CommandList className=\"max-h-72\">\n <CommandEmpty>No match for “{query}”.</CommandEmpty>\n {groups.map((group, gi) => {\n const visible = group.options.filter(matches);\n if (visible.length === 0) return null;\n const folded =\n group.collapsed &&\n !showMore &&\n !q &&\n !group.options.includes(value);\n if (folded) {\n return (\n <CommandGroup key={`g-${gi}`}>\n <CommandItem\n value={`__more_${gi}`}\n onSelect={() => setShowMore(true)}\n className=\"text-muted-foreground\"\n >\n <ChevronRight className=\"h-3.5 w-3.5\" />\n {group.heading ?? \"More\"}\n <span className=\"ml-auto type-secondary tabular-nums\">\n {group.options.length}\n </span>\n </CommandItem>\n </CommandGroup>\n );\n }\n return (\n <CommandGroup key={`g-${gi}`} heading={group.heading}>\n {visible.map((o) => {\n const selected = o === value;\n const h = getHint?.(o);\n return (\n <CommandItem\n key={o}\n value={o}\n onSelect={() => pick(o)}\n className=\"gap-2\"\n >\n {renderIcon?.(o)}\n <span className=\"min-w-0 flex-1 truncate\">\n {getLabel(o)}\n {h && (\n <span className=\"ml-1.5 text-muted-foreground\">\n {h}\n </span>\n )}\n </span>\n <CheckIcon\n className={cn(\n \"h-3.5 w-3.5 shrink-0\",\n selected ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n </CommandItem>\n );\n })}\n </CommandGroup>\n );\n })}\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","import { humanizeIdentifier } from \"@ai-matrx/kit/text-case\";\n/**\n * Aspect-ratio option sets — recognizing them and ordering them for a picker.\n *\n * Model catalogs expose aspect ratio as a plain string enum (\"1:1\", \"16:9\",\n * \"9:19.5\", Runway's pixel pairs \"1280:720\", plus words like \"auto\" or\n * \"match_input_image\"). Any option list that is mostly ratios renders through\n * `AspectRatioSelect` — wherever it came from — so the rule lives on the data,\n * not on one control key.\n */\n\nexport interface ParsedRatio {\n w: number;\n h: number;\n}\n\nconst RATIO_RE = /^\\s*(\\d+(?:\\.\\d+)?)\\s*[:x×/]\\s*(\\d+(?:\\.\\d+)?)\\s*$/i;\n\nexport function parseRatio(value: string): ParsedRatio | null {\n const m = RATIO_RE.exec(value);\n if (!m) return null;\n const w = Number(m[1]);\n const h = Number(m[2]);\n if (!(w > 0 && h > 0)) return null;\n return { w, h };\n}\n\n/** True when at least two options and every option but the words is a ratio. */\nexport function isAspectRatioOptionSet(options: readonly string[]): boolean {\n const ratios = options.filter((o) => parseRatio(o) !== null).length;\n return ratios >= 2 && ratios >= options.length - 2;\n}\n\n/** The ratios people reach for, in the order they reach for them. */\nconst COMMON_ORDER = [\n \"1:1\",\n \"16:9\",\n \"9:16\",\n \"4:3\",\n \"3:4\",\n \"3:2\",\n \"2:3\",\n \"4:5\",\n \"5:4\",\n \"21:9\",\n];\n\nfunction reduced(r: ParsedRatio): string {\n const scale = 1000;\n let a = Math.round(r.w * scale);\n let b = Math.round(r.h * scale);\n const gcd = (x: number, y: number): number => (y === 0 ? x : gcd(y, x % y));\n const g = gcd(a, b);\n a /= g;\n b /= g;\n return `${a}:${b}`;\n}\n\n/** \"Square\", \"Landscape\", … — a plain word for the shape. */\nexport function ratioShapeName(value: string): string | null {\n const r = parseRatio(value);\n if (!r) return null;\n const k = r.w / r.h;\n if (Math.abs(k - 1) < 0.02) return \"Square\";\n if (k >= 2.2) return \"Ultrawide\";\n if (k <= 1 / 2.2) return \"Tall\";\n if (k > 1.6) return \"Widescreen\";\n if (k < 1 / 1.6) return \"Story\";\n return k > 1 ? \"Landscape\" : \"Portrait\";\n}\n\n/** Words that are not ratios (\"auto\", \"match_input_image\") read as words. */\nexport function humanizeRatioWord(value: string): string {\n return humanizeIdentifier(value) || value;\n}\n\nexport interface RatioGroups {\n /** Non-ratio words first (Auto, Match input image). */\n words: string[];\n common: string[];\n more: string[];\n}\n\n/** Split options into words, common ratios (fixed order) and the rest (by shape). */\nexport function groupRatioOptions(options: readonly string[]): RatioGroups {\n const words: string[] = [];\n const ratioOpts: string[] = [];\n for (const o of options) (parseRatio(o) ? ratioOpts : words).push(o);\n\n const byReduced = new Map<string, string>();\n for (const o of ratioOpts) {\n const key = reduced(parseRatio(o)!);\n if (!byReduced.has(key)) byReduced.set(key, o);\n }\n const common: string[] = [];\n for (const c of COMMON_ORDER) {\n const hit = byReduced.get(reduced(parseRatio(c)!));\n if (hit) common.push(hit);\n }\n const commonSet = new Set(common);\n const more = ratioOpts\n .filter((o) => !commonSet.has(o))\n .sort((a, b) => {\n const ra = parseRatio(a)!;\n const rb = parseRatio(b)!;\n return rb.w / rb.h - ra.w / ra.h;\n });\n // A short list has no \"More\": everything is common.\n if (ratioOpts.length <= 6) {\n return { words, common: [...common, ...more], more: [] };\n }\n return { words, common, more };\n}\n","\"use client\";\n\n/**\n * AspectRatioSelect — the aspect-ratio picker every surface uses.\n *\n * A compact select where each ratio carries a small shape preview and a plain\n * name (Square, Widescreen, Story…); common ratios first, the rest behind\n * \"More ratios\"; words such as \"auto\" read as words. Champion: the ratio menus\n * in Midjourney's web app and Figma's frame presets — a shape you can see beats\n * a number you must picture.\n */\n\nimport { OptionCombobox } from \"./option-combobox\";\nimport { cn } from \"../cn\";\nimport {\n groupRatioOptions,\n humanizeRatioWord,\n parseRatio,\n ratioShapeName,\n} from \"./aspect-ratio-options\";\n\n/** A ratio drawn as a rectangle inside a 14px box. */\nexport function AspectRatioGlyph({\n value,\n className,\n}: {\n value: string;\n className?: string;\n}) {\n const r = parseRatio(value);\n const box = 14;\n if (!r) {\n return (\n <span\n aria-hidden\n className={cn(\n \"inline-flex h-3.5 w-3.5 shrink-0 items-center justify-center\",\n className,\n )}\n >\n <span className=\"h-2.5 w-2.5 rounded-[2px] border border-dashed border-current opacity-60\" />\n </span>\n );\n }\n const k = r.w / r.h;\n const w = k >= 1 ? box : Math.max(3, box * k);\n const h = k >= 1 ? Math.max(3, box / k) : box;\n return (\n <span\n aria-hidden\n className={cn(\n \"inline-flex h-3.5 w-3.5 shrink-0 items-center justify-center\",\n className,\n )}\n >\n <span\n className=\"rounded-[2px] border-[1.5px] border-current opacity-80\"\n style={{ width: w, height: h }}\n />\n </span>\n );\n}\n\nexport interface AspectRatioSelectProps {\n value: string;\n onChange: (value: string) => void;\n options: readonly string[];\n variant?: \"field\" | \"inline\";\n compact?: boolean;\n disabled?: boolean;\n id?: string;\n ariaLabel?: string;\n placeholder?: string;\n}\n\nexport function AspectRatioSelect({\n value,\n onChange,\n options,\n variant = \"field\",\n compact,\n disabled,\n id,\n ariaLabel = \"Aspect ratio\",\n placeholder = \"Choose a ratio\",\n}: AspectRatioSelectProps) {\n const { words, common, more } = groupRatioOptions(options);\n const groups = [\n ...(words.length ? [{ options: words }] : []),\n { options: common },\n ...(more.length\n ? [{ heading: \"More ratios\", options: more, collapsed: true }]\n : []),\n ];\n return (\n <OptionCombobox\n value={value}\n onChange={onChange}\n groups={groups}\n getLabel={(o) => (parseRatio(o) ? o : humanizeRatioWord(o))}\n getHint={(o) => ratioShapeName(o)}\n renderIcon={(o) => (\n <AspectRatioGlyph value={o} className=\"text-muted-foreground\" />\n )}\n searchable={options.length > 12}\n searchPlaceholder=\"Search ratios…\"\n placeholder={placeholder}\n variant={variant}\n compact={compact}\n disabled={disabled}\n id={id}\n ariaLabel={ariaLabel}\n />\n );\n}\n","\"use client\";\n\n/**\n * IndicatorStrip — a fixed row of small yes/no icons for a table cell\n * (owner, 2026-10-08: \"create an icon for each option and have it gray if it's\n * not true and color if it is. Show them all at all times so the UI doesn't\n * shift their position in any rows. Add a tooltip that says what they are.\n * Small icons with a small amount of separation.\").\n *\n * The contract, pinned by `indicator-strip.test.tsx`:\n * - EVERY item renders in every row, in the order given — off is a muted\n * glyph, never a gap — so a column of strips lines up icon over icon;\n * - 14px glyphs, 4px apart, one line, never wraps, never shrinks;\n * - an on item takes its tone from semantic tokens (`danger` → destructive,\n * `warning`, `info`, `success`); `soft` is the same tone at reduced ink, for a\n * hint rather than a verdict;\n * - every icon names itself: `aria-label` and `title` (\"Premium model: yes —\n * Uses gpt-5\"), and every `title` is the fleet tooltip (title-tooltips.ts).\n *\n * The caller passes the glyph (any lucide-style component) so the package\n * stays icon-library free and a board keeps its domain icons.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type IndicatorTone = \"danger\" | \"warning\" | \"info\" | \"success\" | \"neutral\";\n\nexport interface IndicatorItem {\n /** Stable key, also `data-indicator`. */\n id: string;\n /** The glyph: any component that takes `className` (lucide icons do). */\n icon: React.ComponentType<{ className?: string; \"aria-hidden\"?: boolean | \"true\" | \"false\" }>;\n /** What the icon means, as a short name (\"Premium model\"). */\n label: string;\n /** True draws the tone; false draws the muted glyph. */\n on: boolean;\n /** Ink when on. Default `warning`. */\n tone?: IndicatorTone;\n /** The tone at reduced ink: a hint, not a verdict. */\n soft?: boolean;\n /** Shown after the label when on (≤ ~100 chars: the tooltip budget is 140). */\n detail?: string;\n}\n\nexport interface IndicatorStripProps extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\"> {\n items: readonly IndicatorItem[];\n}\n\nconst TONE: Record<IndicatorTone, string> = {\n danger: \"text-destructive\",\n warning: \"text-warning\",\n info: \"text-info\",\n success: \"text-success\",\n neutral: \"text-foreground\",\n};\n\nexport function indicatorText(item: IndicatorItem): string {\n if (!item.on) return `${item.label}: no`;\n return item.detail ? `${item.label}: yes — ${item.detail}` : `${item.label}: yes`;\n}\n\nexport function IndicatorStrip({ items, className, ...props }: IndicatorStripProps) {\n return (\n <span\n data-slot=\"indicator-strip\"\n role=\"list\"\n className={cn(\"inline-flex shrink-0 flex-nowrap items-center gap-1 whitespace-nowrap align-middle\", className)}\n {...props}\n >\n {items.map((item) => {\n const Icon = item.icon;\n const text = indicatorText(item);\n return (\n <span\n key={item.id}\n role=\"listitem\"\n aria-label={text}\n title={text}\n data-indicator={item.id}\n data-on={item.on ? \"true\" : \"false\"}\n className={cn(\n \"inline-flex size-3.5 shrink-0 items-center justify-center\",\n item.on ? TONE[item.tone ?? \"warning\"] : \"text-muted-foreground opacity-30\",\n item.on && item.soft && \"opacity-55\",\n )}\n >\n <Icon className=\"size-3.5\" aria-hidden />\n </span>\n );\n })}\n </span>\n );\n}\n","// MiddleTruncate (moved from matrx-frontend components/official, 2026-10-22)\n//\n// ONE-LINE TEXT THAT KEEPS BOTH ENDS. CSS ellipsis eats the END of a name, so\n// four scopes named \"LCP Test Repositories lcp-2026-…\" all read the same (the\n// phone Context sheet, page-pass /notes 2026-09-28). This keeps the tail — the\n// part that tells siblings apart — and lets only the middle give way:\n// \"LCP Test Rep…lcp-0917-b\". Pure CSS at render (no measuring, no layout\n// shift): the head truncates, the tail never shrinks. A name that fits shows\n// whole. The full text is the title and, once, the screen-reader text.\n\nimport * as React from \"react\";\nimport { cn } from \"../cn\";\n\n/** Characters kept at the end (at most half the text). */\nconst DEFAULT_TAIL = 10;\n\nexport function splitForMiddleTruncate(text: string, tail = DEFAULT_TAIL): { head: string; end: string } {\n const keep = Math.min(tail, Math.floor(text.length / 2));\n if (keep <= 0) return { head: text, end: \"\" };\n return { head: text.slice(0, text.length - keep), end: text.slice(text.length - keep) };\n}\n\nexport function MiddleTruncate({\n text,\n tail = DEFAULT_TAIL,\n className,\n}: {\n text: string;\n /** Characters kept at the end. Default 10. */\n tail?: number;\n className?: string;\n}): React.ReactElement {\n const { head, end } = splitForMiddleTruncate(text, tail);\n return (\n <span className={cn(\"flex min-w-0 items-baseline\", className)} title={text}>\n <span className=\"sr-only\">{text}</span>\n <span aria-hidden className=\"min-w-0 truncate whitespace-pre\">\n {head}\n </span>\n {end ? (\n <span aria-hidden className=\"shrink-0 whitespace-pre\">\n {end}\n </span>\n ) : null}\n </span>\n );\n}\n","/**\n * CalloutBanner — a compact, dismissible inline callout in a semantic tone.\n * Reusable across the app (first consumer: the agents-page drift banner). No\n * such primitive existed; this is the canonical one — extend it, don't fork.\n */\n\n\"use client\";\n\nimport type * as React from \"react\";\nimport { XIcon } from \"../icons\";\nimport { cn } from \"../cn\";\n\nimport { Button } from \"./controls\";\nexport type CalloutTone = \"destructive\" | \"warning\" | \"info\" | \"success\";\n\nconst TONE: Record<CalloutTone, { container: string; icon: string }> = {\n destructive: { container: \"border-destructive/30 bg-destructive/10\", icon: \"text-destructive\" },\n warning: { container: \"border-warning/30 bg-warning/10\", icon: \"text-warning\" },\n info: { container: \"border-primary/30 bg-primary/10\", icon: \"text-primary\" },\n success: { container: \"border-success/30 bg-success/10\", icon: \"text-success\" },\n};\n\ninterface CalloutBannerProps {\n tone: CalloutTone;\n icon?: React.ComponentType<{ className?: string; \"aria-hidden\"?: boolean }>;\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Action buttons / chips rendered on the trailing edge. */\n actions?: React.ReactNode;\n onDismiss?: () => void;\n dismissing?: boolean;\n className?: string;\n}\n\nexport function CalloutBanner({\n tone,\n icon: Icon,\n title,\n description,\n actions,\n onDismiss,\n dismissing,\n className,\n}: CalloutBannerProps) {\n const t = TONE[tone];\n return (\n <div\n className={cn(\n \"flex flex-col gap-2 rounded-lg border px-3 py-2.5 sm:flex-row sm:items-center\",\n t.container,\n className,\n )}\n role=\"status\"\n >\n <div className=\"flex min-w-0 flex-1 items-start gap-2\">\n {Icon && <Icon className={cn(\"mt-0.5 h-4 w-4 shrink-0\", t.icon)} aria-hidden />}\n <div className=\"min-w-0\">\n <p className=\"type-title text-foreground\">{title}</p>\n {description && (\n <p className=\"mt-0.5 type-secondary text-muted-foreground\">{description}</p>\n )}\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1.5 sm:ml-2\">\n {actions}\n {onDismiss && (\n <Button variant=\"quiet\" icon={<XIcon />} aria-label=\"Dismiss\" onClick={onDismiss} disabled={dismissing} />\n )}\n </div>\n </div>\n );\n}\n","/**\n * GatedActionButton — a primary action that is never dead.\n *\n * ## The wall this closes (2026-09-15, `teach-recent-practitioner` W2)\n *\n * A non-technical Expert reached the payoff moment of the whole product — the\n * \"Build the Masterwork\" button — and it was **silently disabled**. No red\n * text, no tooltip, no validation message, no console error. Clicking it did\n * nothing, twice, by ref and by coordinate. The reason was one empty required\n * field whose placeholder read like a real value, so the screen told the user\n * everything was filled in and then refused to move.\n *\n * That is a LAW 4 violation — *nothing fails silently; a screen is absent or\n * honest, never dead, disabled-looking, or wearing a false state.* A disabled\n * button that says nothing is a screen telling a lie.\n *\n * ## The contract\n *\n * A gated action takes a `reason`, not a boolean. When a reason is present the\n * button is disabled AND the reason is rendered beside it, in plain words a\n * non-technical person can act on (\"Name your Masterwork to build it\"), wired\n * to the button by `aria-describedby` so a screen reader gets it too. When\n * there is no reason, the button is a normal `<Button>` and renders no chrome.\n *\n * **`disabled` for a reason that is not a blocker is still allowed** — a\n * button already running its own action (`disabled={running}` with the label\n * \"Building…\") is honest about itself, so it needs no sentence. Use `reason`\n * for every state where the user must DO something first.\n *\n * ## Usage\n *\n * ```tsx\n * <GatedActionButton\n * reason={firstBlockingReason([\n * { when: !name.trim(), reason: \"Name your Masterwork to build it\" },\n * { when: approved === 0, reason: \"Approve at least one rule to build it\" },\n * ])}\n * disabled={running}\n * onClick={build}\n * >\n * Build the Masterwork\n * </GatedActionButton>\n * ```\n *\n * `firstBlockingReason` returns the FIRST unmet check, so order the list the\n * way you want the user to fix things: one sentence at a time, never a wall of\n * validation errors.\n *\n * @official-component\n */\n\n\"use client\";\n\nimport * as React from \"react\";\n\nimport { Button, type ButtonProps } from \"../button\";\nimport { cn } from \"../cn\";\n\n/** One reason an action cannot fire yet, and the condition that makes it true. */\nexport interface BlockingCheck {\n /** True when this check is currently blocking the action. */\n when: boolean;\n /**\n * What the user must do, in plain words, phrased as an instruction — not a\n * validation complaint. \"Name your Masterwork to build it\", never\n * \"name is required\".\n */\n reason: string;\n}\n\n/**\n * The first blocking reason in the list, or `null` when nothing blocks.\n *\n * Order the checks in the order you want the user to fix them. Returning ONE\n * reason is deliberate: a non-technical person acts on a single next step, not\n * on a list of everything wrong at once.\n */\nexport function firstBlockingReason(\n checks: ReadonlyArray<BlockingCheck | null | undefined | false>,\n): string | null {\n for (const check of checks) {\n if (check && check.when) return check.reason;\n }\n return null;\n}\n\nexport interface GatedActionButtonProps extends ButtonProps {\n /**\n * Why this action cannot fire yet. When set, the button is disabled and this\n * sentence is rendered next to it. `null`/`undefined` means nothing blocks.\n */\n reason?: string | null;\n /** Layout escape hatch for the wrapper that holds the reason and the button. */\n wrapperClassName?: string;\n /** Layout escape hatch for the reason text itself (e.g. `max-w-[16rem]`). */\n reasonClassName?: string;\n}\n\n/**\n * @see {@link GatedActionButtonProps} for the full prop contract.\n */\nexport function GatedActionButton({\n reason,\n wrapperClassName,\n reasonClassName,\n disabled,\n title,\n children,\n ...buttonProps\n}: GatedActionButtonProps) {\n const reactId = React.useId();\n const blocked = Boolean(reason && reason.trim());\n const reasonId = `gated-action-reason-${reactId}`;\n\n return (\n <span\n className={cn(\n \"inline-flex min-w-0 flex-wrap items-center justify-end gap-2\",\n wrapperClassName,\n )}\n >\n {blocked ? (\n <span\n id={reasonId}\n role=\"status\"\n data-slot=\"gated-action-reason\"\n // NOT `text-destructive`. This sentence is an instruction for\n // something the user has not done YET — on a form's first paint it\n // is the normal state, not a failure. Red said \"you did something\n // wrong\" to a first-timer who had not yet typed a character\n // (jobs-bar-2026-09-16, item 6). The contract above is explicit:\n // \"phrased as an instruction — not a validation complaint.\"\n className={cn(\n \"min-w-0 type-secondary font-medium text-muted-foreground\",\n reasonClassName,\n )}\n >\n {reason}\n </span>\n ) : null}\n <Button\n {...buttonProps}\n disabled={disabled || blocked}\n title={blocked ? (reason ?? undefined) : title}\n aria-describedby={blocked ? reasonId : buttonProps[\"aria-describedby\"]}\n >\n {children}\n </Button>\n </span>\n );\n}\n\nGatedActionButton.displayName = \"GatedActionButton\";\n","\"use client\";\n\nimport React, { useEffect, useRef, useState } from \"react\";\nimport { Loader2Icon, SearchIcon, XIcon } from \"../icons\";\nimport { cn } from \"../cn\";\nimport { Input } from \"./doors\";\nimport { Button } from \"./controls\";\n\nexport interface SearchInputProps {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n onSearch?: (value: string) => void;\n placeholder?: string;\n loading?: boolean;\n debounceTime?: number;\n showClearButton?: boolean;\n showSubmitButton?: boolean;\n autoFocus?: boolean;\n disabled?: boolean;\n className?: string;\n inputClassName?: string;\n buttonClassName?: string;\n \"aria-label\"?: string;\n}\n\nexport function SearchInput({\n value,\n defaultValue = \"\",\n onValueChange,\n onSearch,\n placeholder = \"Search...\",\n loading = false,\n debounceTime = 300,\n showClearButton = true,\n showSubmitButton = false,\n autoFocus = false,\n disabled = false,\n className,\n inputClassName,\n buttonClassName,\n \"aria-label\": ariaLabel = \"Search\",\n}: SearchInputProps) {\n const [internalValue, setInternalValue] = useState(defaultValue);\n const inputRef = useRef<HTMLInputElement>(null);\n const isControlled = value !== undefined;\n const currentValue = isControlled ? value : internalValue;\n const searchValue = currentValue.trim();\n const didMountRef = useRef(false);\n const onSearchRef = useRef(onSearch);\n\n useEffect(() => {\n if (!autoFocus) return;\n inputRef.current?.focus();\n }, [autoFocus]);\n\n useEffect(() => {\n onSearchRef.current = onSearch;\n }, [onSearch]);\n\n useEffect(() => {\n if (!onSearchRef.current) return undefined;\n if (!didMountRef.current) {\n didMountRef.current = true;\n return undefined;\n }\n const timer = window.setTimeout(() => {\n onSearchRef.current?.(currentValue);\n }, debounceTime);\n return () => window.clearTimeout(timer);\n }, [currentValue, debounceTime]);\n\n const setNextValue = (nextValue: string) => {\n if (!isControlled) setInternalValue(nextValue);\n onValueChange?.(nextValue);\n };\n\n const handleSubmit = (event: React.FormEvent) => {\n event.preventDefault();\n onSearch?.(currentValue);\n };\n\n const handleClear = () => {\n setNextValue(\"\");\n onSearch?.(\"\");\n inputRef.current?.focus();\n };\n\n return (\n <form\n onSubmit={handleSubmit}\n className={cn(\"flex min-w-0 items-center gap-2\", className)}\n >\n <div className=\"relative min-w-0 flex-1\">\n <SearchIcon\n className=\"pointer-events-none absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\"\n aria-hidden\n />\n <Input\n ref={inputRef}\n type=\"search\"\n value={currentValue}\n onChange={(event) => setNextValue(event.target.value)}\n placeholder={placeholder}\n disabled={disabled}\n aria-label={ariaLabel}\n className={inputClassName} adornment={showClearButton && searchValue ? \"both\" : \"start\"}\n />\n {showClearButton && searchValue ? (\n <button\n type=\"button\"\n onClick={handleClear}\n disabled={disabled}\n aria-label=\"Clear search\"\n className=\"absolute right-2 top-1/2 flex h-6 w-6 -translate-y-1/2 items-center justify-center rounded text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:pointer-events-none disabled:text-disabled-foreground\"\n >\n <XIcon className=\"h-3.5 w-3.5\" />\n </button>\n ) : null}\n </div>\n {showSubmitButton ? (\n <Button\n icon={loading ? (\n <Loader2Icon className=\"animate-spin\" />\n ) : (\n <SearchIcon />\n )}\n variant=\"primary\"\n type=\"submit\"\n disabled={disabled || loading}\n aria-label=\"Submit search\"\n className={buttonClassName}\n />\n ) : null}\n </form>\n );\n}\n\nexport default SearchInput;\n","/**\n * CollapsibleText — measured multiline text with a compact preview and fade.\n *\n * Use for user-authored text that can become long inside dense lists, timelines,\n * and cards. The caller owns expansion state so individual toggles and\n * expand-all/collapse-all controls stay in sync.\n *\n * @official-component\n */\n\n\"use client\";\n\nimport { useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport { ChevronDownIcon, ChevronUpIcon, ChevronsDownIcon, ChevronsUpIcon } from \"../icons\";\nimport { Button } from \"./controls\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipTrigger,\n} from \"../tooltip\";\nimport { cn } from \"../cn\";\n\ninterface CollapsibleTextProps {\n children: ReactNode;\n expanded: boolean;\n onExpandedChange: (expanded: boolean) => void;\n collapsedLines?: number;\n className?: string;\n expandLabel?: string;\n collapseLabel?: string;\n /**\n * Show the label as visible text on the toggle (\"Show more\" / \"Show less\"),\n * as comment threads do (Linear, Notion). Default: icon-only, labeled for\n * assistive tech.\n */\n showLabel?: boolean;\n}\n\nexport function CollapsibleText({\n children,\n expanded,\n onExpandedChange,\n collapsedLines = 4,\n className,\n expandLabel = \"Expand text\",\n collapseLabel = \"Collapse text\",\n showLabel = false,\n}: CollapsibleTextProps) {\n const contentRef = useRef<HTMLDivElement>(null);\n const [collapsedHeight, setCollapsedHeight] = useState(0);\n const [isOverflowing, setIsOverflowing] = useState(false);\n\n useLayoutEffect(() => {\n const node = contentRef.current;\n if (!node) return undefined;\n\n const measure = () => {\n const styles = window.getComputedStyle(node);\n const parsedLineHeight = Number.parseFloat(styles.lineHeight);\n const parsedFontSize = Number.parseFloat(styles.fontSize);\n const lineHeight = Number.isFinite(parsedLineHeight)\n ? parsedLineHeight\n : parsedFontSize * 1.4;\n const nextCollapsedHeight = Math.ceil(lineHeight * collapsedLines);\n setCollapsedHeight(nextCollapsedHeight);\n setIsOverflowing(node.scrollHeight > nextCollapsedHeight + 1);\n };\n\n measure();\n if (typeof ResizeObserver === \"undefined\") return undefined;\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n return () => observer.disconnect();\n }, [children, collapsedLines]);\n\n const isCollapsed = isOverflowing && !expanded;\n\n if (showLabel) {\n return (\n <div className=\"relative min-w-0\">\n <div\n ref={contentRef}\n className={cn(\n \"overflow-hidden whitespace-pre-wrap break-words\",\n isCollapsed &&\n \"[mask-image:linear-gradient(to_bottom,black_55%,transparent_100%)] [-webkit-mask-image:linear-gradient(to_bottom,black_55%,transparent_100%)]\",\n className,\n )}\n style={isCollapsed && collapsedHeight > 0 ? { maxHeight: `${collapsedHeight}px` } : undefined}\n >\n {children}\n </div>\n {isOverflowing ? (\n <button\n type=\"button\"\n aria-expanded={!isCollapsed}\n onClick={(event) => {\n event.stopPropagation();\n onExpandedChange(isCollapsed);\n }}\n className=\"mt-0.5 inline-flex min-h-6 items-center gap-0.5 rounded text-xs font-medium text-primary hover:underline focus-visible:outline focus-visible:outline-2 focus-visible:outline-ring\"\n >\n {isCollapsed ? <ChevronDownIcon className=\"h-3.5 w-3.5\" aria-hidden /> : <ChevronUpIcon className=\"h-3.5 w-3.5\" aria-hidden />}\n {isCollapsed ? expandLabel : collapseLabel}\n </button>\n ) : null}\n </div>\n );\n }\n\n return (\n <div className=\"relative min-w-0\">\n <div\n ref={contentRef}\n className={cn(\n \"overflow-hidden whitespace-pre-wrap break-words transition-[max-height] duration-300 ease-out\",\n isCollapsed &&\n \"[mask-image:linear-gradient(to_bottom,black_55%,transparent_100%)] [-webkit-mask-image:linear-gradient(to_bottom,black_55%,transparent_100%)]\",\n className,\n )}\n style={\n isCollapsed && collapsedHeight > 0\n ? { maxHeight: `${collapsedHeight}px` }\n : undefined\n }\n >\n {children}\n </div>\n\n {isCollapsed ? (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 flex justify-center\">\n <Button\n icon={<ChevronDownIcon />}\n type=\"button\"\n variant=\"outline\"\n aria-label={expandLabel}\n aria-expanded={false}\n onClick={(event) => {\n event.stopPropagation();\n onExpandedChange(true);\n }}\n className=\"pointer-events-auto\"\n />\n </div>\n ) : isOverflowing ? (\n <div className=\"flex justify-center pt-0.5\">\n <Button\n icon={<ChevronUpIcon />}\n type=\"button\"\n variant=\"quiet\"\n aria-label={collapseLabel}\n aria-expanded\n onClick={(event) => {\n event.stopPropagation();\n onExpandedChange(false);\n }}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\ninterface CollapsibleTextGroupControlsProps {\n onExpandAll: () => void;\n onCollapseAll: () => void;\n allExpanded: boolean;\n anyExpanded: boolean;\n disabled?: boolean;\n}\n\nexport function CollapsibleTextGroupControls({\n onExpandAll,\n onCollapseAll,\n allExpanded,\n anyExpanded,\n disabled = false,\n}: CollapsibleTextGroupControlsProps) {\n return (\n <div className=\"flex items-center gap-0.5\">\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n icon={<ChevronsDownIcon className=\"!size-[18px] lg:!size-3.5\" />}\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Expand all\"\n onClick={onExpandAll}\n disabled={disabled || allExpanded}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\">Expand all</TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n icon={<ChevronsUpIcon className=\"!size-[18px] lg:!size-3.5\" />}\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Collapse all\"\n onClick={onCollapseAll}\n disabled={disabled || !anyExpanded}\n />\n </TooltipTrigger>\n <TooltipContent side=\"top\">Collapse all</TooltipContent>\n </Tooltip>\n </div>\n );\n}\n","// InfoHint (moved from matrx-frontend components/official, 2026-10-22)\n//\n// THE DEFINITION HINT — a small info icon beside a label that reveals one\n// sentence defining it. Use it wherever a label needs a definition\n// (`common-docs/policies/interface-text-is-layout.md`: definitions live behind\n// an info icon, never in visible prose). Model: Stripe dashboard metric labels.\n//\n// Reachable three ways, which a native `title=` is not:\n// - mouse: hover opens the tooltip;\n// - keyboard: the icon is a real button, so Tab focus opens the tooltip and\n// Escape closes it;\n// - touch (`pointer: coarse` or a phone-width viewport): tap toggles a small\n// popover; outside tap or Escape closes it.\n//\n// Safe inside a link or clickable row (KpiTile with `href`): the trigger and\n// the portaled content both stop propagation and prevent the default, so\n// opening a definition never navigates.\n//\n// The icon's hit area is ≥ 24px (44px on a coarse pointer) via an absolutely positioned pseudo-element,\n// so the glyph sits inline without changing the surrounding line height.\n// Text budget: one sentence, ≤ 140 characters.\n\n\"use client\";\n\nimport { InfoIcon } from \"../icons\";\nimport { useState, useSyncExternalStore, type SyntheticEvent } from \"react\";\n\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../tooltip\";\nimport { useIsMobile } from \"../use-is-mobile\";\nimport { cn } from \"../cn\";\n\nconst COARSE_POINTER_QUERY = \"(pointer: coarse)\";\n\nfunction subscribeCoarse(onChange: () => void) {\n const mq = window.matchMedia(COARSE_POINTER_QUERY);\n mq.addEventListener(\"change\", onChange);\n return () => mq.removeEventListener(\"change\", onChange);\n}\n\nfunction useCoarsePointer() {\n return useSyncExternalStore(\n subscribeCoarse,\n () => window.matchMedia(COARSE_POINTER_QUERY).matches,\n () => false,\n );\n}\n\n/** Keep a hint's clicks from reaching a parent link, row, or card. */\nfunction isolate(e: SyntheticEvent) {\n e.stopPropagation();\n e.preventDefault();\n}\n\nexport interface InfoHintProps {\n /** The definition: one sentence, ≤ 140 characters. */\n text: string;\n /** Accessible name of the icon button. */\n label?: string;\n className?: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n}\n\nconst TRIGGER_CLASS =\n \"relative inline-flex h-3.5 w-3.5 shrink-0 cursor-help items-center justify-center rounded-sm align-[-0.125em] text-muted-foreground transition-colors hover:text-foreground focus-visible:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring before:absolute before:-inset-[5px] before:content-[''] [@media(pointer:coarse)]:before:-inset-[15px]\";\n\nconst CONTENT_CLASS =\n \"max-w-[16rem] text-xs font-normal normal-case leading-snug tracking-normal\";\n\nexport function InfoHint({ text, label = \"More info\", className, side = \"top\" }: InfoHintProps) {\n const coarse = useCoarsePointer();\n const isMobile = useIsMobile();\n const [open, setOpen] = useState(false);\n\n const glyph = <InfoIcon aria-hidden className=\"h-3.5 w-3.5\" strokeWidth={2} />;\n\n if (coarse || isMobile) {\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(TRIGGER_CLASS, className)}\n onClick={(e) => {\n isolate(e);\n setOpen((v) => !v);\n }}\n onPointerDown={(e) => e.stopPropagation()}\n >\n {glyph}\n </button>\n </PopoverTrigger>\n <PopoverContent /* sizing: fixed — a fixed-measure panel on purpose; its rows truncate inside the box */\n side={side}\n sideOffset={6}\n className={cn(\"w-auto px-3 py-2 text-popover-foreground\", CONTENT_CLASS)}\n onClick={isolate}\n onPointerDown={(e) => e.stopPropagation()}\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n {text}\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n // Brings its own provider: an official component works wherever it is imported (a\n // test, a portal, a page without the app shell) — 2026-09-30, final-switch tests.\n <TooltipProvider delayDuration={200}>\n <Tooltip open={open} onOpenChange={setOpen}>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label={label}\n className={cn(TRIGGER_CLASS, className)}\n // A click opens it too (hover is not the only way in).\n onClick={(e) => {\n isolate(e);\n setOpen(true);\n }}\n // Inside a table header (or any parent that has its own tooltip or drag handle), the\n // parent must not see the pointer: its tooltip would open and close this one, and a\n // press would start a column drag. Found 2026-10-11 on MatrxDataTable headers.\n onPointerMove={(e) => e.stopPropagation()}\n onPointerDown={(e) => e.stopPropagation()}\n onFocus={(e) => e.stopPropagation()}\n >\n {glyph}\n </button>\n </TooltipTrigger>\n <TooltipContent side={side} className={CONTENT_CLASS} onClick={isolate}>\n {text}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n );\n}\n\nexport default InfoHint;\n","\"use client\";\n\n// THE canonical lifecycle-status badge (moved from matrx-frontend components/official/status-badge,\n// wave 2, 2026-10-22): one tinted, icon-led pill for \"what state is this record in\" (draft / active /\n// disabled / archived and their cousins on other entities). The tone is a NAME (`success`, `warning`,\n// `danger`, `neutral`, `info`) resolved through the role tokens — the same tints the Badge and the\n// Chip use — never a color class at a call site. The icon carries the meaning for color-blind\n// readers, and the label is always a word, never a dot alone.\n//\n// Entity modules own their status VOCABULARY (which statuses exist, what each means, which tone it\n// wears); this primitive owns only the LOOK, so every entity's status reads the same everywhere.\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\n\nexport type StatusTone = \"success\" | \"warning\" | \"danger\" | \"neutral\" | \"info\";\nexport type StatusBadgeSize = \"sm\" | \"md\" | \"lg\";\n\n/** Every status tone, in a fixed order (tests, pickers, demos). */\nexport const STATUS_TONES: readonly StatusTone[] = [\"success\", \"warning\", \"danger\", \"neutral\", \"info\"] as const;\n\nconst TONE_CLASS: Record<StatusTone, string> = {\n success: \"border-success/40 bg-success/15 text-success-ink\",\n warning: \"border-warning/50 bg-warning/20 text-warning-ink\",\n danger: \"border-destructive/40 bg-destructive/15 text-destructive-ink\",\n neutral: \"border-border bg-muted text-foreground\",\n info: \"border-info/40 bg-info/15 text-info-ink\",\n};\n\nconst SIZE_CLASS: Record<StatusBadgeSize, { root: string; icon: string }> = {\n sm: { root: \"gap-1 px-1.5 py-0.5 text-[11px]\", icon: \"h-3 w-3\" },\n md: { root: \"gap-1.5 px-2 py-0.5 text-xs\", icon: \"h-3.5 w-3.5\" },\n lg: { root: \"gap-1.5 px-2.5 py-1 text-sm\", icon: \"h-4 w-4\" },\n};\n\nexport interface StatusBadgeProps {\n label: string;\n tone: StatusTone;\n /** Any glyph component (a design-system glyph, a Lucide icon); it receives `className`. */\n icon?: React.ComponentType<{ className?: string; \"aria-hidden\"?: boolean }>;\n size?: StatusBadgeSize;\n /** One sentence saying what the status means — the hover text. */\n title?: string;\n /**\n * A glyph drawn INSIDE the capsule after the label — the chevron of a status that opens a menu.\n * One capsule, never a pill wrapped in another rounded box.\n */\n trailing?: React.ReactNode;\n className?: string;\n}\n\nexport function StatusBadge({ label, tone, icon: Icon, size = \"md\", title, trailing, className }: StatusBadgeProps) {\n const s = SIZE_CLASS[size];\n return (\n <span\n role=\"status\"\n aria-label={title ? `${label}: ${title}` : label}\n title={title}\n data-status-tone={tone}\n className={cn(\n // matrx-glyph-trim: the icon's and chevron's own air is removed on both sides, so the INK\n // sits the same distance from either edge.\n \"matrx-glyph-trim inline-flex shrink-0 items-center whitespace-nowrap rounded-full border font-semibold leading-none\",\n TONE_CLASS[tone],\n s.root,\n className,\n )}\n >\n {Icon ? <Icon aria-hidden className={cn(\"shrink-0\", s.icon)} /> : null}\n {label}\n {trailing}\n </span>\n );\n}\n","\"use client\";\n\n// A titled section card: a header (title, description, actions), a body, and an optional three-column\n// footer. Moved from matrx-frontend components/official/StructuredSectionCard (wave 2, 2026-10-22).\n// The header and title used hard-coded gray / rose; they are now the role tokens, with the title's\n// ink a NAMED option (`titleTone`) instead of a pasted color: `primary` (default) or `foreground`.\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\n\nexport type StructuredSectionCardTitleTone = \"primary\" | \"foreground\";\n\nconst TITLE_TONE: Record<StructuredSectionCardTitleTone, string> = {\n primary: \"text-primary-ink\",\n foreground: \"text-foreground\",\n};\n\nexport interface StructuredSectionCardProps {\n title: string;\n description?: string;\n children: React.ReactNode;\n headerActions?: React.ReactNode[];\n footerLeft?: React.ReactNode;\n footerCenter?: React.ReactNode;\n footerRight?: React.ReactNode;\n /** The title's ink, by name. Default `primary`. */\n titleTone?: StructuredSectionCardTitleTone;\n className?: string;\n}\n\nexport function StructuredSectionCard({\n title,\n description,\n children,\n headerActions = [],\n footerLeft,\n footerCenter,\n footerRight,\n titleTone = \"primary\",\n className,\n}: StructuredSectionCardProps) {\n const hasFooter = footerLeft || footerCenter || footerRight;\n return (\n <div\n data-slot=\"structured-section-card\"\n className={cn(\"overflow-hidden rounded-xl border-border bg-textured shadow-sm\", className)}\n >\n <div className=\"flex items-center justify-between border-b border-border bg-muted px-4 py-3\">\n <div className=\"min-w-0\">\n <h3 className={cn(\"font-medium\", TITLE_TONE[titleTone])}>{title}</h3>\n {description && <p className=\"type-body text-muted-foreground\">{description}</p>}\n </div>\n {headerActions.length > 0 && (\n <div className=\"ml-4 flex shrink-0 items-center space-x-2\">\n {headerActions.map((action, index) => (\n <React.Fragment key={index}>{action}</React.Fragment>\n ))}\n </div>\n )}\n </div>\n\n <div className=\"p-4\">{children}</div>\n\n {hasFooter && (\n <div className=\"flex flex-wrap items-center border-t border-border px-4 py-3\">\n <div className=\"flex min-w-[33%] flex-1 justify-start space-x-2 sm:min-w-0\">{footerLeft}</div>\n <div className=\"mt-2 flex min-w-[33%] flex-1 justify-center space-x-2 sm:mt-0 sm:min-w-0\">{footerCenter}</div>\n <div className=\"mt-2 flex min-w-[33%] flex-1 justify-end space-x-2 sm:mt-0 sm:min-w-0\">{footerRight}</div>\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\n// An icon-led selection menu: the trigger shows the SELECTED option's glyph and a chevron; the menu\n// lists every option with its glyph, the selected one tinted and checked. For sort controls, view\n// modes, filters. Moved from matrx-frontend components/official/IconDropdownMenu (wave 2,\n// 2026-10-22); the selected state was a hard-coded blue and is now the primary role tokens.\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { CheckIcon, ChevronDownIcon } from \"../icons\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from \"../dropdown-menu\";\nimport { Button } from \"./controls\";\n\ntype GlyphComponent = React.ComponentType<{ className?: string }>;\n\nexport interface IconDropdownOption<T = string> {\n value: T;\n label: string;\n /** Any glyph component (a design-system glyph, a Lucide icon); it receives `className`. */\n icon: GlyphComponent;\n}\n\nexport interface IconDropdownMenuProps<T = string> {\n options: IconDropdownOption<T>[];\n value: T;\n onValueChange: (value: T) => void;\n /** Dropdown alignment. Default `end`. */\n align?: \"start\" | \"center\" | \"end\";\n /** Places the trigger (margin, position), never restyles it. */\n className?: string;\n /** Width class of the menu. Default `w-48`. */\n menuWidth?: string;\n}\n\nexport function IconDropdownMenu<T extends string = string>({\n options,\n value,\n onValueChange,\n align = \"end\",\n className,\n menuWidth = \"w-48\",\n}: IconDropdownMenuProps<T>) {\n const selected = options.find((opt) => opt.value === value) ?? options[0];\n const SelectedIcon = selected?.icon;\n if (!SelectedIcon) {\n console.warn(\"IconDropdownMenu: no option to show — pass at least one option.\");\n return null;\n }\n return (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n icon={<SelectedIcon />}\n iconEnd={<ChevronDownIcon />}\n variant=\"outline\"\n aria-label={selected.label}\n {...(className ? { className } : {})}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align={align} className={cn(\"rounded-2xl p-1\", menuWidth)}>\n {options.map((option) => {\n const isSelected = option.value === value;\n const OptionIcon = option.icon;\n return (\n <DropdownMenuItem\n key={String(option.value)}\n onClick={() => onValueChange(option.value)}\n data-selected={isSelected ? \"\" : undefined}\n className={cn(\n \"flex cursor-pointer items-center gap-3 rounded-lg px-3 py-2.5 transition-colors\",\n isSelected && \"bg-primary/10\",\n )}\n >\n <OptionIcon className={cn(\"h-4 w-4 shrink-0\", isSelected ? \"text-primary-ink\" : \"text-muted-foreground\")} />\n <span className={cn(\"type-body flex-1 leading-tight\", isSelected ? \"font-medium text-primary-ink\" : \"text-foreground\")}>\n {option.label}\n </span>\n {isSelected && <CheckIcon className=\"h-4 w-4 shrink-0 text-primary-ink\" />}\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","/**\n * Field — the canonical above-label wrapper for any form input.\n *\n * Wraps **any** input (ProTextarea, shadcn Input, Select, custom controls) with\n * a consistent, accessible label/description/error/counter layout. Composition\n * over prop bloat: instead of every input growing label/help/error props, the\n * input stays focused on its job and `Field` owns the surrounding chrome.\n *\n * ## Layout (fixed, by design)\n *\n * ```\n * Label *required (optional) [?] ← help icon, hover for tooltip\n * Description text. Markdown-style hints, format rules.\n * ┌────────────────────────────┐\n * │ <child input> │\n * └────────────────────────────┘\n * ⚠ error message count / max ← right-aligned, color-tiered\n * ```\n *\n * The order is fixed and not configurable. This is intentional: every Field in\n * the app should look identical so users can scan forms without re-learning.\n *\n * ## Required props\n *\n * - `label` — visible text. Always required (a Field without a label is just a div).\n * - `htmlFor` — must match the child input's `id`. This wires the label to the\n * input for screen readers and click-to-focus. Pass the same id to the input.\n *\n * ## Usage\n *\n * Simple labeled input:\n *\n * ```tsx\n * <Field label=\"Title\" htmlFor=\"title\" required>\n * <ProTextarea\n * id=\"title\"\n * value={title}\n * onChange={(e) => setTitle(e.target.value)}\n * />\n * </Field>\n * ```\n *\n * Full feature set:\n *\n * ```tsx\n * <Field\n * label=\"Bio\"\n * htmlFor=\"bio\"\n * required\n * help=\"Markdown supported. Visible on your public profile.\"\n * description=\"Tell visitors who you are.\"\n * error={errors.bio}\n * count={bio.length}\n * maxCount={500}\n * >\n * <ProTextarea id=\"bio\" value={bio} onChange={…} />\n * </Field>\n * ```\n *\n * ## When to use what\n *\n * - **Above-label form (most cases)** → `<Field>` (this component)\n * - **Dense form, label inside the input border** → `<ProTextarea floatingLabel=\"…\" />`\n * - **No label at all (search, comments, filters)** → bare `<ProTextarea>` with `placeholder`\n *\n * ## Constraints (intentional)\n *\n * - The label, description, error, and counter render in a fixed visual order.\n * - No `labelClassName` / `descriptionClassName` / `errorClassName` props.\n * These are styled to a single house standard. If you need a different look,\n * you're outside the official component's scope — build a one-off, don't fork.\n * - `required` and `optional` are mutually exclusive. If both are passed,\n * `required` wins.\n * - The character counter is always **soft** (warns and colors but doesn't\n * block typing). For hard DB-bound limits, also pass `maxLength` to the\n * input itself.\n *\n * @official-component\n */\n\n\"use client\";\n\n// Named LabeledField in the package because `Field` here is already the input capsule (controls.tsx).\n// Moved from matrx-frontend components/official/Field (wave 2, 2026-10-22).\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { CircleAlertIcon, CircleHelpIcon } from \"../icons\";\nimport { ErrorActions } from \"../error-box\";\nimport { Label } from \"../label\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"../tooltip\";\nimport { InfoHint } from \"./info-hint\";\n\nexport interface LabeledFieldProps {\n /** Visible label text. Always required. */\n label: React.ReactNode;\n /**\n * Must match the child input's `id`. Wires the label for screen readers and\n * click-to-focus. Required — there is no \"no a11y\" mode.\n */\n htmlFor: string;\n /** Marks the field as required. Renders a red asterisk. Wins over `optional`. */\n required?: boolean;\n /**\n * Marks the field as optional. Renders a small gray \"(optional)\" tag.\n * Use sparingly — it's only worth showing when most fields nearby are required.\n */\n optional?: boolean;\n /**\n * Help for the label — one sentence, ≤ 140 chars. A string renders through\n * `InfoHint` (hover, keyboard and tap); a ReactNode keeps a hover tooltip.\n */\n help?: React.ReactNode;\n /**\n * Static helper text rendered between the label and the input. Hidden when\n * an `error` is present so the error takes the spotlight.\n */\n description?: React.ReactNode;\n /**\n * Validation error. When set, the label turns destructive and the error\n * replaces the description. Pair with `aria-invalid` on the child input.\n */\n error?: React.ReactNode;\n /**\n * Current character/word count. Pass `value.length` (or your own metric).\n * Renders bottom-right of the field.\n */\n count?: number;\n /**\n * Soft limit. Counter turns warning at >90%, destructive past 100%.\n * **Does not block typing.** For hard limits, also set `maxLength` on the input.\n */\n maxCount?: number;\n /**\n * 🚨 **THE EMPTY-LOOKS-EMPTY RULE (2026-09-15).** The child input's current\n * value. Pass it on every `required` field.\n *\n * A required field that is EMPTY must LOOK empty. On 2026-09-15 a\n * non-technical Expert could not build their Masterwork because the name\n * field's placeholder (\"Headless Headhunter Resume Review Masterwork\") was\n * indistinguishable from a typed value: the screen said filled, the field\n * was empty, and the primary action sat silently disabled\n * (`teach-recent-practitioner` W2). A placeholder is a suggestion, never an\n * answer, and the screen must say which one it is showing.\n *\n * When `required` is set and this value is blank, `Field` dashes the input's\n * border, fades and italicises its placeholder, and says so underneath — so\n * no placeholder, however value-shaped, can pass for a filled field. The\n * sentence shows only while the control actually shows placeholder text\n * (`:placeholder-shown`): under a box with no example, or a select, it would\n * be false (2026-09-27, /hr/settings/employer).\n *\n * Leave it `undefined` on fields you do not track; the honesty chrome then\n * never renders (it cannot know). `\"\"` means empty and IS tracked.\n */\n value?: string | null;\n /** Outer wrapper className. The only styling escape hatch — used for layout (e.g. `flex-1`). */\n className?: string;\n /** The input. Must have `id={htmlFor}` for the label to work correctly. */\n children: React.ReactNode;\n}\n\n/**\n * @see {@link LabeledFieldProps} for the full prop contract.\n */\nexport function LabeledField({\n label,\n htmlFor,\n required,\n optional,\n help,\n description,\n error,\n count,\n maxCount,\n value,\n className,\n children,\n}: LabeledFieldProps) {\n /**\n * Tracked AND required AND blank. `undefined` is \"not tracked\" — only an\n * explicitly passed value can be judged empty.\n */\n const requiredEmpty =\n Boolean(required) && value !== undefined && !String(value ?? \"\").trim();\n const hasCounter = typeof count === \"number\";\n const overLimit = hasCounter && maxCount != null && count! > maxCount;\n const nearLimit =\n hasCounter &&\n maxCount != null &&\n count! > maxCount * 0.9 &&\n !overLimit;\n\n return (\n <div data-field-root=\"\" className={cn(\"group/field space-y-1.5\", className)}>\n <div className=\"flex items-center gap-1.5\">\n <Label\n htmlFor={htmlFor}\n className={cn(\n \"text-sm font-medium text-foreground\",\n error && \"text-destructive\",\n )}\n >\n {label}\n {required && (\n <span className=\"text-destructive ml-1\" aria-hidden>\n *\n </span>\n )}\n {!required && optional && (\n <span className=\"text-muted-foreground ml-1.5 type-secondary font-normal\">\n (optional)\n </span>\n )}\n </Label>\n {/* A text hint goes through InfoHint so it opens on tap and keyboard too; rich help keeps the hover tooltip. */}\n {typeof help === \"string\" && help && (\n <InfoHint text={help} label={typeof label === \"string\" ? `About ${label}` : \"Help\"} />\n )}\n {help && typeof help !== \"string\" && (\n <TooltipProvider delayDuration={150}>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n aria-label=\"Help\"\n className=\"inline-flex items-center justify-center h-4 w-4 rounded-full text-muted-foreground hover:text-foreground transition-colors\"\n >\n <CircleHelpIcon className=\"h-3.5 w-3.5\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-xs type-secondary\">\n {help}\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n\n {description && !error && (\n <p className=\"type-secondary text-muted-foreground\">{description}</p>\n )}\n\n {/*\n THE EMPTY-LOOKS-EMPTY RULE. Styled on a wrapper with descendant\n selectors rather than by cloning the child, so it holds for EVERY\n input a Field can wrap — shadcn Input, ProTextarea, a bespoke control —\n without the child having to opt in or even know.\n */}\n <div\n data-slot=\"field-control\"\n data-required-empty={requiredEmpty ? \"true\" : undefined}\n className={cn(\n requiredEmpty &&\n \"[&_input]:border-dashed [&_textarea]:border-dashed [&_input]:border-muted-foreground/50 [&_textarea]:border-muted-foreground/50 [&_input]:placeholder:italic [&_textarea]:placeholder:italic [&_input]:placeholder:text-disabled-foreground [&_textarea]:placeholder:text-disabled-foreground\",\n )}\n >\n {children}\n </div>\n\n {(error || hasCounter || requiredEmpty) && (\n <div\n className={cn(\n \"flex items-start justify-between gap-2 min-h-[1rem]\",\n // The notice alone is only true while the control is SHOWING an\n // example (a visible placeholder). An empty box with no example text,\n // or a select, has nothing to be mistaken for an answer — so the row\n // stays hidden until `:placeholder-shown` matches inside this field.\n !error && !hasCounter && \"hidden [[data-field-root]:has(:placeholder-shown)_&]:flex\",\n )}\n >\n {error ? (\n <p className=\"type-secondary text-destructive flex items-center gap-1\">\n <CircleAlertIcon className=\"h-3 w-3 flex-shrink-0\" />\n <span>{error}</span>\n {/* The host's error actions (Copy, Copy for AI, fix request): the slot every package error uses.\n The raw `error` goes through untouched so the host formats a non-string one itself. */}\n <ErrorActions\n {...(typeof error === \"string\" ? { message: error } : {})}\n error={error}\n origin=\"design-system/LabeledField\"\n />\n </p>\n ) : requiredEmpty ? (\n <p\n data-slot=\"field-empty-notice\"\n className=\"hidden type-secondary text-muted-foreground items-center gap-1 [[data-field-root]:has(:placeholder-shown)_&]:flex\"\n >\n <CircleAlertIcon className=\"h-3 w-3 flex-shrink-0\" />\n <span>Empty — the gray text is an example, not your answer.</span>\n </p>\n ) : (\n <span />\n )}\n {hasCounter && (\n <span\n className={cn(\n \"type-secondary tabular-nums text-muted-foreground ml-auto\",\n nearLimit && \"text-warning\",\n overLimit && \"text-destructive font-medium\",\n )}\n >\n {maxCount != null ? `${count} / ${maxCount}` : `${count}`}\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\n\n","\"use client\";\n\n// A small info glyph that opens a hover card: title, text or content, a copy button, a \"Required\"\n// pill and an optional \"Get help from Matrx AI\" action. Moved from matrx-frontend\n// components/official/HelpIcon (wave 2, 2026-10-22). Copy goes through kit's one clipboard door\n// (a failure opens the clipboard fallback dialog); the blue / amber hard-codes are the info and\n// warning role tokens now. New usages of a label's one-sentence definition belong in `InfoHint`\n// (reachable by mouse, keyboard and touch); this icon opens on mouse hover only.\n\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport { openClipboardFallback } from \"@ai-matrx/kit/clipboard-fallback-opener\";\nimport { toast } from \"@ai-matrx/kit/notify\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { CheckIcon, CircleDotIcon, CircleHelpIcon, CopyIcon, InfoIcon } from \"../icons\";\nimport { Button } from \"./controls\";\n\nconst { useState, useLayoutEffect, useRef } = React;\n\nexport interface HelpIconProps {\n text?: string;\n content?: React.ReactNode;\n className?: string;\n title?: string;\n required?: boolean;\n onAiAssistance?: () => void;\n}\n\nexport function HelpIcon({ \n text, \n content, \n className = \"\", \n title = \"\", \n required = false,\n onAiAssistance\n}: HelpIconProps) {\n const [copied, setCopied] = useState(false);\n const [isVisible, setIsVisible] = useState(false);\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const iconRef = useRef<HTMLDivElement>(null);\n const tooltipRef = useRef<HTMLDivElement>(null);\n const hideTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const showTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n \n const handleCopy = async (e: React.MouseEvent) => {\n e.stopPropagation();\n if (text) {\n // The success notice goes through kit's one toast (the host's, once registered); a failure opens the fallback dialog instead of a second notice.\n if (!(await copyText(text, { successMessage: \"Copied to clipboard\", notify: (message, kind) => { if (kind === \"success\") toast.success(message); } }))) {\n // A copy that did not land says so: the fallback dialog shows the text to copy by hand.\n void openClipboardFallback(text);\n return;\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n };\n\n const handleAiClick = (e: React.MouseEvent) => {\n e.stopPropagation();\n if (onAiAssistance) {\n onAiAssistance();\n }\n };\n \n const updatePosition = () => {\n if (iconRef.current && tooltipRef.current) {\n const rect = iconRef.current.getBoundingClientRect();\n const tooltipRect = tooltipRef.current.getBoundingClientRect();\n const viewportWidth = window.innerWidth;\n \n let left = rect.left + (rect.width / 2) - (tooltipRect.width / 2);\n let top = rect.top - tooltipRect.height - 8;\n \n // Adjust if tooltip would go off-screen\n if (left < 10) left = 10;\n if (left + tooltipRect.width > viewportWidth - 10) {\n left = viewportWidth - tooltipRect.width - 10;\n }\n \n // If tooltip would go above viewport, position below icon\n if (top < 10) {\n top = rect.bottom + 8;\n }\n \n setPosition({ top, left });\n }\n };\n \n const showTooltip = () => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n \n if (!isVisible && !showTimeoutRef.current) {\n showTimeoutRef.current = setTimeout(() => {\n setIsVisible(true);\n showTimeoutRef.current = null;\n }, 200);\n }\n };\n \n const hideTooltip = () => {\n if (showTimeoutRef.current) {\n clearTimeout(showTimeoutRef.current);\n showTimeoutRef.current = null;\n }\n \n hideTimeoutRef.current = setTimeout(() => {\n setIsVisible(false);\n }, 150);\n };\n \n const cancelHideTooltip = () => {\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n hideTimeoutRef.current = null;\n }\n };\n \n // A LAYOUT effect: the card is measured and placed before the browser paints it. As a plain\n // effect it painted at the window's top-left corner first, then jumped to the icon (2026-10-08).\n useLayoutEffect(() => {\n if (isVisible) {\n updatePosition();\n window.addEventListener('scroll', updatePosition);\n window.addEventListener('resize', updatePosition);\n }\n \n return () => {\n window.removeEventListener('scroll', updatePosition);\n window.removeEventListener('resize', updatePosition);\n if (hideTimeoutRef.current) {\n clearTimeout(hideTimeoutRef.current);\n }\n if (showTimeoutRef.current) {\n clearTimeout(showTimeoutRef.current);\n }\n };\n }, [isVisible]);\n \n // Format text to handle both literal newlines and \\n escape sequences\n const formatTextWithLineBreaks = (text: string) => {\n const processedText = text.replace(/\\\\n/g, '\\n');\n return processedText.split('\\n').map((line, index) => (\n <React.Fragment key={index}>\n {index > 0 && <br />}\n {line}\n </React.Fragment>\n ));\n };\n \n // The nothing-to-show guard sits BELOW every hook. Above them it made all 8\n // hook calls conditional (react-hooks/rules-of-hooks) — a HelpIcon whose\n // `text` arrives asynchronously would crash with \"rendered more hooks than\n // during the previous render\".\n if (!text && !content) return null;\n\n return (\n <div \n className={`inline-block relative cursor-help ${className}`}\n ref={iconRef}\n onMouseEnter={showTooltip}\n onMouseLeave={hideTooltip}\n >\n <InfoIcon className=\"h-4 w-4 text-muted-foreground transition-colors duration-200\" />\n \n {isVisible && typeof document !== 'undefined' && createPortal(\n <div \n ref={tooltipRef}\n className=\"fixed max-w-sm bg-textured border-border rounded-lg shadow-xl z-[9999] animate-in fade-in-0 zoom-in-95 duration-100\"\n style={{ \n top: `${position.top}px`, \n left: `${position.left}px`,\n pointerEvents: 'auto' \n }}\n onMouseEnter={cancelHideTooltip}\n onMouseLeave={hideTooltip}\n >\n <div className=\"p-3\">\n {/* Header row with icon and title */}\n <div className=\"flex items-center gap-2 mb-2\">\n <CircleHelpIcon className=\"h-4 w-4 flex-shrink-0 text-info-ink\" />\n {title && (\n <h3 className=\"text-foreground type-title\">\n {title}\n </h3>\n )}\n {text && (\n <Button\n variant=\"quiet\"\n className=\"ml-auto\"\n icon={copied ? <CheckIcon /> : <CopyIcon />}\n aria-label=\"Copy to clipboard\"\n onClick={handleCopy}\n />\n )}\n </div>\n \n {/* Content */}\n <div className=\"type-body text-foreground leading-relaxed\">\n {content ? content : (text && formatTextWithLineBreaks(text))}\n </div>\n \n {/* Required field pill */}\n {required && (\n <div className=\"mt-3 inline-flex items-center gap-1.5 px-2.5 py-1 bg-warning/15 text-warning-ink type-secondary font-medium rounded-full\">\n <div className=\"w-1.5 h-1.5 bg-warning-ink rounded-full\"></div>\n Required Field\n </div>\n )}\n \n {/* AI Assistance button */}\n {onAiAssistance && (\n <Button variant=\"primary\" icon={<CircleDotIcon />} className=\"mt-3 w-full\" onClick={handleAiClick}>\n Get Help From Matrx AI\n </Button>\n )}\n </div>\n \n {/* Tooltip arrow */}\n <div className=\"absolute -bottom-1.5 left-1/2 -translate-x-1/2 w-3 h-3 bg-textured border-r border-b border-border rotate-45\"></div>\n </div>,\n document.body\n )}\n </div>\n );\n}\n","\"use client\";\n\n// A list of short texts typed one by one (Enter or comma adds): the field on top, the chips under it,\n// each chip with its own remove button, and a copy-all button in the field. Moved from matrx-frontend\n// components/official/TextArrayInput (wave 2, 2026-10-22), with its two private helpers: copy goes\n// through kit's one clipboard door (a failure opens the clipboard fallback dialog) and `cleanUrl`\n// (strip tracking parameters, keep p / q / id) lives here next to its only caller.\n\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport { toast } from \"@ai-matrx/kit/notify\";\nimport { openClipboardFallback } from \"@ai-matrx/kit/clipboard-fallback-opener\";\nimport * as React from \"react\";\n\nimport { CheckIcon, CopyIcon, XIcon } from \"../icons\";\nimport { Button } from \"./controls\";\nimport { Input } from \"./doors\";\n\n/** A URL without its tracking parameters (keeps `p`, `q`, `id`); anything that is not a URL comes back unchanged. */\nexport function cleanUrl(url: string): string {\n try {\n const parsed = new URL(url);\n const kept = new URLSearchParams();\n for (const [key, value] of new URLSearchParams(parsed.search)) {\n if ([\"p\", \"q\", \"id\"].includes(key)) kept.set(key, value);\n }\n parsed.search = kept.toString();\n return parsed.toString();\n } catch {\n return url;\n }\n}\n\nexport interface TextArrayInputProps {\n value?: string[];\n onChange?: (value: string[]) => void;\n placeholder?: string;\n className?: string;\n /** Classes of each chip (its fill and ink). Default: the primary fill. */\n chipClassName?: string;\n /** Drop repeats. Default true. */\n uniqueFilter?: boolean;\n /** Show the copy-all button when there are values. Default true. */\n showCopyIcon?: boolean;\n /** Strip tracking parameters from each added item. */\n shouldCleanUrl?: boolean;\n /** Override sequential focus for copy/remove controls in dense composite fields. */\n auxiliaryControlsTabIndex?: number;\n}\n\nexport function TextArrayInput({\n value: externalValue,\n onChange,\n placeholder = \"Add items (press Enter)\",\n className = \"\",\n chipClassName = \"bg-primary text-primary-foreground\",\n uniqueFilter = true,\n showCopyIcon = true,\n shouldCleanUrl = false,\n auxiliaryControlsTabIndex,\n}: TextArrayInputProps) {\n const [internalValue, setInternalValue] = React.useState<string[]>([]);\n const [inputValue, setInputValue] = React.useState(\"\");\n const [copied, setCopied] = React.useState(false);\n\n const value = externalValue || internalValue;\n const tabIndexProp = auxiliaryControlsTabIndex === undefined ? {} : { tabIndex: auxiliaryControlsTabIndex };\n\n const handleCopy = async () => {\n const text = value.join(\", \");\n // Success is told through kit's one toast; a failure opens the fallback dialog (no second notice).\n if (!(await copyText(text, { successMessage: \"Copied\", notify: (message, kind) => { if (kind === \"success\") toast.success(message); } }))) {\n void openClipboardFallback(text);\n return;\n }\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n };\n\n const handleChange = (newItems: string[]) => {\n const processed = uniqueFilter ? [...new Set(newItems)] : newItems;\n if (onChange) onChange(processed);\n else setInternalValue(processed);\n };\n\n const handleSubmit = (e: React.SyntheticEvent) => {\n e.preventDefault();\n if (!inputValue.trim()) return;\n const added = inputValue\n .split(\",\")\n .map((item) => {\n const trimmed = item.trim();\n return shouldCleanUrl && trimmed ? cleanUrl(trimmed) : trimmed;\n })\n .filter((item) => item.length > 0);\n handleChange([...value, ...added]);\n setInputValue(\"\");\n };\n\n return (\n <div className={`space-y-3 ${className}`}>\n <form onSubmit={handleSubmit} className=\"relative w-full\">\n <Input\n adornment=\"end\"\n type=\"text\"\n value={inputValue}\n onChange={(e) => setInputValue(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") handleSubmit(e);\n }}\n placeholder={placeholder}\n className=\"w-full\"\n />\n {showCopyIcon && value.length > 0 && (\n <Button\n {...tabIndexProp}\n variant=\"quiet\"\n icon={copied ? <CheckIcon /> : <CopyIcon />}\n {...(copied ? { glyphTone: \"success\" as const } : {})}\n aria-label=\"Copy values\"\n onClick={handleCopy}\n className=\"absolute right-2 top-1/2 -translate-y-1/2\"\n />\n )}\n </form>\n\n <div className=\"flex flex-wrap gap-2\">\n {value.length === 0 ? (\n <span className=\"type-body inline-flex items-center rounded-full bg-muted px-3 py-1 text-muted-foreground\">None Added</span>\n ) : (\n value.map((item, index) => (\n <span\n key={`${item}-${index}`}\n className={`inline-flex cursor-default items-center gap-1 rounded-full px-3 py-1 text-sm transition-all duration-200 ${chipClassName}`}\n >\n {item}\n <button\n {...tabIndexProp}\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n handleChange(value.filter((_, i) => i !== index));\n }}\n className=\"cursor-pointer rounded-full p-0.5 transition-colors duration-200 hover:bg-primary-foreground/20\"\n aria-label={`Remove ${item}`}\n >\n <XIcon className=\"h-3.5 w-3.5\" />\n </button>\n </span>\n ))\n )}\n </div>\n </div>\n );\n}\n","/**\n * UntrustedCount — a number that refuses to be reported when the read that\n * produced it failed.\n *\n * THE DEAD END this kills: every count on a surface is derived from the rows\n * currently in state (`rows.length`, `rows.filter(…).length`). When a fetch\n * fails and the rows are cleared — which is the correct thing to do, since\n * stale rows under a fresh banner are their own defect — every one of those\n * counters silently becomes `0`. A console then reports \"Total 0 · Failed 0\"\n * in confident bold type, which is not \"we couldn't read this\": it is a\n * positive claim about the database that nobody is entitled to make. Zero is\n * the single most dangerous default a failed read can produce, because it is\n * indistinguishable from good news.\n *\n * `StaleDataNotice` is the banner half of the same rule and this is the inline\n * half — a surface that shows the notice and still prints `0` beside it is\n * contradicting itself, and the number wins because it looks like data.\n *\n * Renders the value when the read succeeded, an em dash when it failed, and a\n * quiet ellipsis while it is still in flight. It carries the screen-reader\n * explanation itself so a caller cannot forget it: an em dash is mute to a\n * screen reader, so without the label the failure is invisible to exactly the\n * users least able to infer it from context.\n *\n * Tell it the read's outcome ONE of two ways:\n * - `read={{ status, error }}` — the same `ReadOutcome` a table's `read=`\n * takes (structurally the design-system `MatrxDataTableRead`);\n * - `trustworthy={!loadFailed}` — when all you hold is the failure flag.\n *\n * Styling is entirely the caller's — this owns the VALUE, never the chrome, so\n * it drops unchanged into a stat card, a pill badge, or a sentence. The shared\n * count primitives (KpiTile, MetricCell, ResearchFilterBar) take the same\n * `read=` and resolve it with `countReadState` below, so every stat tile on the\n * platform says \"—\" the same way.\n */\n\nimport type { ReadOutcome } from \"./read-gate\";\n\n/** The read outcome a count primitive is told: a `ReadOutcome` (or a `MatrxDataTableRead`). */\nexport type CountRead = Pick<ReadOutcome, \"status\" | \"error\" | \"hasData\">;\n\n/** What a count may honestly show for its read: the number, a failure dash, or a loading mark. */\nexport type CountReadState = \"ready\" | \"loading\" | \"failed\";\n\n/**\n * Fold a count's read input into what it may show.\n * - First load (nothing known yet): \"loading\" → \"…\".\n * - A read that failed with nothing known: \"failed\" → \"—\".\n * - STALE-WHILE-ERROR (RC-B12 r13 ruling): once a read has produced a value\n * (`read.hasData`), a refetch in flight or a failed refresh keeps showing the\n * last known value (\"ready\") — the surface's stale notice says it may be out\n * of date; `countIsStale` lets a count mark itself. No flicker to \"…\" or \"—\".\n * With neither input the number is shown (nothing was said about a read).\n */\nexport function countReadState(input: {\n read?: CountRead | null | undefined;\n trustworthy?: boolean | undefined;\n}): CountReadState {\n const { read, trustworthy } = input;\n if (trustworthy === false) return \"failed\";\n if (read) {\n const failed = read.status === \"error\" || (read.error != null && read.error !== false && read.error !== \"\");\n if (read.hasData) return \"ready\";\n if (failed) return \"failed\";\n if (read.status === \"loading\") return \"loading\";\n }\n return \"ready\";\n}\n\n/** A last-known value shown over a failed refresh (see `countReadState`). */\nexport function countIsStale(read: CountRead | null | undefined): boolean {\n if (!read?.hasData) return false;\n return read.status === \"error\" || (read.error != null && read.error !== false && read.error !== \"\");\n}\n\n/** The screen-reader sentence for a count that could not be read. */\nexport function unavailableCountLabel(label: string): string {\n return `${label} unavailable — could not be read`;\n}\n\ntype UntrustedCountRead =\n | {\n /**\n * Whether the read behind this number succeeded. Pass `!loadFailed` — the\n * same flag that drives the surface's `StaleDataNotice`, so the banner and\n * the number can never disagree.\n */\n trustworthy: boolean;\n read?: never;\n }\n | {\n /** The read behind this number — `{ status, error }` (a table's `read=` value fits). */\n read: CountRead;\n trustworthy?: never;\n };\n\nexport type UntrustedCountProps = UntrustedCountRead & {\n /** The derived count (or its formatted text). Never rendered unless the read succeeded. */\n value: number | string;\n /**\n * What this counts, as the user reads it on screen (\"Total\", \"Unresolved\").\n * Becomes \"<label> unavailable\" for screen readers when the read failed.\n */\n label: string;\n className?: string;\n};\n\nexport function UntrustedCount({\n value,\n trustworthy,\n read,\n label,\n className,\n}: UntrustedCountProps) {\n const state = countReadState({ read, trustworthy });\n if (state === \"ready\") {\n if (countIsStale(read)) {\n return (\n <span\n className={className}\n aria-label={`${label} ${value} — last known value, couldn't refresh`}\n title=\"Couldn't refresh — last known value\"\n >\n {value}\n </span>\n );\n }\n return <span className={className}>{value}</span>;\n }\n if (state === \"loading\") {\n return (\n <span className={className} aria-busy=\"true\" aria-label={`${label} loading`}>\n …\n </span>\n );\n }\n return (\n <span\n className={className}\n aria-label={unavailableCountLabel(label)}\n title=\"Couldn't be read\"\n >\n —\n </span>\n );\n}\n","// design-system controls/kpi-tile.tsx (moved from matrx-frontend components/official/kpi, wave 2, 2026-10-22;\n// tone colors are the role tokens, the drill-in link is the registered tap-target link via HostLink)\n//\n// THE KPI TILE — one number, its label, an optional one-line hint, and an\n// optional drill-in. The shared primitive for KPI pages (Spend's TotalsStrip\n// tile is the model it was lifted from). A tile with `href` is a link: every\n// number that names a set of records opens that set.\n//\n// A number that could not be measured is never shown as 0: pass\n// `value={null}` and the tile renders \"—\" with the hint saying why. A number\n// read from the database takes that read's outcome — `read={{ status, error }}`\n// (a table's `read=` value fits): a failed read renders \"—\" with an\n// \"unavailable\" label for screen readers, an in-flight read renders loading.\n//\n// `title` is the number's one-sentence definition. It renders through\n// `InfoHint` from the design system — an info icon right after the label that\n// opens on hover, keyboard focus, and tap — never as a native `title=` on the\n// tile, which phones and keyboard users can't reach.\n//\n// `trend` draws a small history line beside the number (oldest first). Pass it\n// only when real history exists — never a flat stand-in; `period` names the\n// span (\"28 days\") for screen readers and the hover label.\n\n\"use client\";\n\nimport type { ReactNode } from \"react\";\n\nimport { cn } from \"../cn\";\nimport { HostLink } from \"../host-link\";\nimport { countReadState, unavailableCountLabel, type CountRead } from \"../read-state/untrusted-count\";\nimport { InfoHint } from \"./info-hint\";\n\nexport type KpiTone = \"neutral\" | \"good\" | \"warn\" | \"bad\";\n\nconst TONE_VALUE: Record<KpiTone, string> = {\n neutral: \"text-foreground\",\n good: \"text-success-ink\",\n warn: \"text-warning-ink\",\n bad: \"text-destructive-ink\",\n};\n\nconst TONE_DOT: Record<KpiTone, string | null> = {\n neutral: null,\n good: \"bg-success\",\n warn: \"bg-warning\",\n bad: \"bg-destructive\",\n};\n\nexport interface KpiTileProps {\n label: string;\n /** `null` = not measured; renders \"—\", never 0. */\n value: ReactNode | null;\n hint?: ReactNode;\n tone?: KpiTone;\n /** Drill-in destination. The whole tile becomes the link. */\n href?: string;\n /** Definition — what the number counts, in one sentence (≤ 140 chars). Renders as an InfoHint after the label. */\n title?: string;\n loading?: boolean;\n /** The read behind `value`. Failed → \"—\" (never 0); loading → the loading bar. */\n read?: CountRead | null;\n /** Real history behind the number, oldest first (≥ 2 points), and the span it covers. */\n trend?: KpiTrend | null;\n className?: string;\n}\n\nexport interface KpiTrend {\n values: readonly number[];\n /** The span the line covers (\"28 days\", \"12 weeks\"). */\n period: string;\n /** What the line counts when it is not the tile's number (\"Posts per week\"). */\n label?: string;\n}\n\nconst SPARK_W = 64;\nconst SPARK_H = 20;\n\n/** The tile's history line: a filled area under the line (none when flat), scaled from its low point. */\nfunction KpiSparkline({ trend, label }: { trend: KpiTrend; label: string }) {\n const n = trend.values.length;\n if (n < 2) return null;\n const min = Math.min(...trend.values);\n const max = Math.max(...trend.values);\n // A floor of 10% of the peak: a change of 11 on 3,700 stays a near-flat line, never a cliff.\n const range = Math.max(max - min, Math.abs(max) * 0.1) || 1;\n // A level line sits at mid-height: drawn on the floor it would read as zero.\n const y = (v: number) => (max === min ? SPARK_H / 2 : SPARK_H - 2 - ((v - min) / range) * (SPARK_H - 4));\n const pts = trend.values\n .map((v, i) => `${((i / (n - 1)) * SPARK_W).toFixed(1)},${y(v).toFixed(1)}`)\n .join(\" \");\n return (\n <svg\n viewBox={`0 0 ${SPARK_W} ${SPARK_H}`}\n preserveAspectRatio=\"none\"\n role=\"img\"\n aria-label={`${trend.label ?? label}, last ${trend.period}`}\n className=\"h-5 w-16 shrink-0 text-primary\"\n >\n <title>{`${trend.label ?? label}, last ${trend.period}`}</title>\n {/* A flat series is a line only: an area under it would read as a filled bar, not \"no change\". */}\n {max === min ? null : <polygon points={`0,${SPARK_H} ${pts} ${SPARK_W},${SPARK_H}`} fill=\"currentColor\" fillOpacity={0.15} />}\n <polyline points={pts} fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinejoin=\"round\" vectorEffect=\"non-scaling-stroke\" />\n </svg>\n );\n}\n\nexport function KpiTile({\n label,\n value,\n hint,\n tone = \"neutral\",\n href,\n title,\n loading: loadingProp = false,\n read,\n trend,\n className,\n}: KpiTileProps) {\n const readState = countReadState({ read });\n const loading = loadingProp || readState === \"loading\";\n const failed = readState === \"failed\";\n const shown = failed ? null : value;\n const dot = TONE_DOT[tone];\n const body = (\n <>\n {/* A label wraps to a second line rather than being cut (\"NO DEFAULT\n MANDA…\" on a phone, punch list 2026-09-26) — a KPI whose name is\n unreadable is a number without a meaning. */}\n <div className=\"flex min-w-0 items-start gap-1.5 type-meta font-medium uppercase tracking-wide text-muted-foreground\">\n {dot ? (\n <span aria-hidden className={cn(\"mt-1 inline-block h-2 w-2 shrink-0 rounded-sm\", dot)} />\n ) : null}\n <span className=\"line-clamp-2 break-words\">\n {label}\n {title ? (\n <>\n {\" \"}\n <InfoHint text={title} label={`What ${label} means`} />\n </>\n ) : null}\n </span>\n </div>\n {loading ? (\n <div className=\"my-0.5 h-6 w-12 animate-pulse rounded bg-muted\" aria-hidden />\n ) : (\n <div className=\"flex min-w-0 items-end justify-between gap-2\">\n <div\n className={cn(\n \"truncate text-lg font-semibold leading-tight tabular-nums\",\n shown === null ? \"text-muted-foreground\" : TONE_VALUE[tone],\n )}\n aria-label={failed ? unavailableCountLabel(label) : undefined}\n title={failed ? \"Couldn't be read\" : undefined}\n >\n {shown === null ? \"—\" : shown}\n </div>\n {trend && shown !== null ? <KpiSparkline trend={trend} label={label} /> : null}\n </div>\n )}\n {hint ? (\n <div className=\"truncate type-meta text-muted-foreground\">{hint}</div>\n ) : null}\n </>\n );\n\n const shell = cn(\n \"flex min-w-0 flex-col gap-0.5 rounded-md border border-border bg-card px-3 py-2\",\n className,\n );\n\n if (href && !loading && shown !== null) {\n return (\n <HostLink\n href={href}\n data-look-surface=\"card\"\n className={cn(\n shell,\n \"transition-colors hover:border-primary/50 hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n >\n {body}\n </HostLink>\n );\n }\n return (\n <div className={shell} data-look-surface=\"card\" aria-busy={loading || undefined}>\n {body}\n </div>\n );\n}\n\n/** The standard responsive tile row. */\nexport function KpiGrid({\n children,\n className,\n}: {\n children: ReactNode;\n className?: string;\n}) {\n return (\n <div\n className={cn(\n \"grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-6\",\n className,\n )}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\n// A button whose action is confirmed ON the button: after the click its glyph turns into a check\n// (and its tooltip says so) for a moment, then goes back. Moved from matrx-frontend\n// components/official/ActionFeedbackButton onto THE control (wave 2, 2026-10-22), so it has the\n// controls' one geometry — no size, no color of its own. A glyph whose color carries meaning says so\n// with `glyphTone`; `className` places it, never restyles it.\n\nimport * as React from \"react\";\n\nimport { CheckCircle2Icon } from \"../icons\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { Button, type ButtonProps } from \"./controls\";\n\nexport interface ActionFeedbackButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\" | \"onClick\"> {\n /** The glyph, as an element (it keeps its own className). */\n icon: React.ReactNode;\n /** Required: an icon-only button says what it does. */\n tooltip: string;\n onClick: () => void;\n /** Tone, never size. Default `quiet`. */\n variant?: ButtonProps[\"variant\"];\n /** The glyph's own status ink while it is NOT confirming. */\n glyphTone?: ButtonProps[\"glyphTone\"];\n /** Shown during the confirmation. Default: the package's check-circle. */\n successIcon?: React.ReactNode;\n successTooltip?: string;\n /** Milliseconds the confirmation stays. Default 2000. */\n feedbackDuration?: number;\n /** Tooltip while disabled, when it differs from `tooltip`. */\n disabledTooltip?: string;\n}\n\nexport function ActionFeedbackButton({\n icon,\n tooltip,\n onClick,\n variant = \"quiet\",\n glyphTone,\n successIcon,\n successTooltip = \"Success!\",\n feedbackDuration = 2000,\n disabledTooltip,\n disabled = false,\n ...props\n}: ActionFeedbackButtonProps) {\n const [showSuccess, setShowSuccess] = React.useState(false);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n React.useEffect(() => () => {\n if (timer.current) clearTimeout(timer.current);\n }, []);\n\n const handleClick = () => {\n onClick();\n setShowSuccess(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setShowSuccess(false), feedbackDuration);\n };\n\n const text = showSuccess ? successTooltip : disabled && disabledTooltip ? disabledTooltip : tooltip;\n const button = (\n <Button\n variant={variant}\n icon={showSuccess ? (successIcon ?? <CheckCircle2Icon />) : icon}\n {...(showSuccess ? { glyphTone: \"success\" as const } : glyphTone ? { glyphTone } : {})}\n {...props}\n aria-label={text}\n // A confirming button ignores a second click; a disabled one wears the native state.\n disabled={disabled || showSuccess}\n onClick={handleClick}\n />\n );\n return (\n <Tooltip>\n <TooltipTrigger asChild>{disabled ? <span className=\"inline-flex\">{button}</span> : button}</TooltipTrigger>\n <TooltipContent side=\"bottom\" sideOffset={5} className=\"z-[9999]\">\n {text}\n </TooltipContent>\n </Tooltip>\n );\n}\n","\"use client\";\n\n/**\n * CitationChip — THE shared presentational citation-chip primitive.\n *\n * One tappable source chip + its excerpt popover (number badge / icon /\n * title / locator / verbatim quote / open action). Every citation chip UI\n * renders through this:\n * - chat Sources footer (features/agents/components/messages-display/\n * citations/MessageSourcesRow.tsx — MessageCitationSource),\n * - education trust chips (features/education/trust/components/\n * SourceCitations.tsx — TrustEnvelope SourceCitation),\n * - the popover body alone backs the inline superscript marker\n * (components/mardown-display/chat-markdown/citations/\n * CitationMarkerInline.tsx).\n *\n * BOUNDARY: deliberately pure-presentational and citation-shape-agnostic —\n * it knows NOTHING of MessageCitationSource, TrustEnvelope, or openers.\n * Consumers map their citation shape to these props and pass `onOpen`\n * pre-wired to their canonical opener (useOpenCitationSource /\n * openCitationSource). That keeps chat free of TrustEnvelope coupling and\n * education free of the chat execution-system — the ONE chip stays shared.\n *\n * Styling knobs (chipClassName / clampExcerpt / chipSuffix / number) exist\n * so each consumer keeps its established visual language; `cn` uses\n * tailwind-merge, so a consumer's max-w/gap override wins over the base.\n */\n\nimport { useState } from \"react\";\nimport type * as React from \"react\";\nimport {\n Popover,\n PopoverContent,\n PopoverTrigger,\n} from \"../popover\";\nimport { cn } from \"../cn\";\nimport { ArrowUpRightIcon, QuoteIcon } from \"../icons\";\n\nexport interface CitationPopoverBodyProps {\n /** Icon representing the source (FileText for documents, Globe for web…). */\n icon: React.ComponentType<{ className?: string; \"aria-hidden\"?: boolean }>;\n /** Source title / domain / fallback label. */\n label: string;\n /** Secondary locator line under the title (e.g. \"Page 3 · example.com\"). */\n locator?: string | null;\n /** Verbatim cited excerpt, rendered as a blockquote. */\n excerpt?: string | null;\n /** Clamp the excerpt to 6 lines (long chat quotes). Default false. */\n clampExcerpt?: boolean;\n /** Open-the-real-source action; the button renders only when provided. */\n onOpen?: (() => void) | undefined;\n /** Label for the open action (e.g. \"Open source\", \"Open web source\"). */\n openLabel?: string;\n}\n\n/**\n * The popover interior: icon + title + locator, excerpt blockquote, open\n * action. Exported so non-chip triggers (the inline superscript marker)\n * share the identical body.\n */\nexport function CitationPopoverBody({\n icon: Icon,\n label,\n locator,\n excerpt,\n clampExcerpt = false,\n onOpen,\n openLabel = \"Open source\",\n}: CitationPopoverBodyProps) {\n return (\n <div className=\"flex flex-col gap-2\">\n <div className=\"flex items-start gap-2\">\n <Icon\n className=\"mt-0.5 h-4 w-4 shrink-0 text-muted-foreground\"\n aria-hidden\n />\n <div className=\"min-w-0\">\n <p className=\"truncate type-title text-foreground\">\n {label}\n </p>\n {locator && (\n <p className=\"type-secondary text-muted-foreground\">{locator}</p>\n )}\n </div>\n </div>\n {excerpt && (\n <blockquote className=\"flex gap-2 rounded-md bg-muted/60 p-2 type-secondary italic text-muted-foreground\">\n <QuoteIcon className=\"h-3 w-3 shrink-0\" aria-hidden />\n <span className={cn(\"not-italic\", clampExcerpt && \"line-clamp-6\")}>\n {excerpt}\n </span>\n </blockquote>\n )}\n {onOpen && (\n <button\n type=\"button\"\n onClick={onOpen}\n className=\"inline-flex items-center gap-1 self-start text-xs font-medium text-primary hover:underline\"\n >\n <ArrowUpRightIcon className=\"h-3 w-3\" aria-hidden />\n {openLabel}\n </button>\n )}\n </div>\n );\n}\n\nexport interface CitationChipProps extends CitationPopoverBodyProps {\n /** 1-based display number badge on the chip. Omit for unnumbered chips. */\n number?: number;\n /** Trailing inline suffix on the chip (e.g. \"p.7\"). */\n chipSuffix?: string | null;\n /** Native `title` attribute for the chip button. */\n chipTitle?: string;\n /** Appended to the chip button's classes (tailwind-merge: overrides win). */\n chipClassName?: string;\n}\n\nexport function CitationChip({\n number,\n chipSuffix,\n chipTitle,\n chipClassName,\n ...body\n}: CitationChipProps) {\n const { icon: Icon, label } = body;\n // Opening the source closes the excerpt — it never floats over the viewer\n // it just opened (verify-4 #33/#34).\n const [open, setOpen] = useState(false);\n const onOpen = body.onOpen\n ? () => {\n setOpen(false);\n body.onOpen?.();\n }\n : undefined;\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <button\n type=\"button\"\n title={chipTitle}\n className={cn(\n \"inline-flex max-w-[16rem] items-center gap-1 rounded-md border border-border bg-muted/50 px-1.5 py-0.5 text-xs text-foreground transition-colors hover:bg-accent\",\n chipClassName,\n )}\n >\n {number != null && (\n <span className=\"inline-flex h-4 min-w-4 shrink-0 items-center justify-center rounded-full bg-muted px-1 text-[0.65rem] font-medium leading-none text-muted-foreground\">\n {number}\n </span>\n )}\n <Icon className=\"h-3 w-3 shrink-0 text-muted-foreground\" aria-hidden />\n <span className=\"truncate\">{label}</span>\n {chipSuffix && (\n <span className=\"shrink-0 text-muted-foreground\">{chipSuffix}</span>\n )}\n </button>\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" align=\"start\" className=\"p-3\">\n <CitationPopoverBody {...body} onOpen={onOpen} />\n </PopoverContent>\n </Popover>\n );\n}\n\nexport default CitationChip;\n","\"use client\";\n\n/**\n * ToolRail — the vertical tool rail of a canvas workspace (Acrobat, Figma): one icon-only control\n * per tool, one tool active, groups split by a hairline. `orientation=\"horizontal\"` makes the same\n * control a tool strip.\n *\n * `role=\"toolbar\"` with ONE tab stop (roving): Tab enters on the active tool (or the first\n * enabled one), the arrow keys of the rail's axis move focus (wrapping, skipping disabled tools),\n * Home/End jump, Enter/Space choose. Choosing the active tool again clears it when\n * `allowDeselect`. Every tool is named by its tooltip and `aria-label` (with its shortcut hint),\n * the active tool is `aria-pressed`. The rail has a fixed 28px control per tool, so activating or\n * hovering never moves anything.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { Button } from \"./controls\";\n\nexport interface ToolRailItem {\n id: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n /** Shown after the label in the tooltip (\"V\", \"Ctrl+Z\"). */\n shortcut?: string;\n disabled?: boolean;\n}\n\nexport interface ToolRailProps {\n /** Groups of tools; a hairline sits between groups. */\n groups: ReadonlyArray<ReadonlyArray<ToolRailItem>>;\n /** The active tool's id, or null for none. */\n value: string | null;\n onValueChange: (id: string | null, item: ToolRailItem) => void;\n orientation?: \"vertical\" | \"horizontal\";\n /** Choosing the active tool again sets `null` (a tool you can put down). Default false. */\n allowDeselect?: boolean;\n className?: string;\n \"aria-label\": string;\n}\n\nexport function ToolRail({\n groups,\n value,\n onValueChange,\n orientation = \"vertical\",\n allowDeselect = false,\n className,\n \"aria-label\": ariaLabel,\n}: ToolRailProps) {\n const flat = React.useMemo(() => groups.flat(), [groups]);\n const refs = React.useRef(new Map<string, HTMLButtonElement>());\n const enabled = flat.filter((t) => !t.disabled);\n const activeEnabled = enabled.find((t) => t.id === value);\n const [focusId, setFocusId] = React.useState<string | null>(null);\n const stopId = (focusId && enabled.some((t) => t.id === focusId) ? focusId : null) ?? activeEnabled?.id ?? enabled[0]?.id;\n const vertical = orientation === \"vertical\";\n\n const focusAt = (id: string | undefined) => {\n if (!id) return;\n setFocusId(id);\n refs.current.get(id)?.focus();\n };\n const onKeyDown = (e: React.KeyboardEvent, id: string) => {\n const at = enabled.findIndex((t) => t.id === id);\n const next = vertical ? \"ArrowDown\" : \"ArrowRight\";\n const prev = vertical ? \"ArrowUp\" : \"ArrowLeft\";\n if (e.key === next) { e.preventDefault(); focusAt(enabled[(at + 1) % enabled.length]?.id); }\n else if (e.key === prev) { e.preventDefault(); focusAt(enabled[(at - 1 + enabled.length) % enabled.length]?.id); }\n else if (e.key === \"Home\") { e.preventDefault(); focusAt(enabled[0]?.id); }\n else if (e.key === \"End\") { e.preventDefault(); focusAt(enabled[enabled.length - 1]?.id); }\n };\n\n return (\n <div\n role=\"toolbar\"\n aria-label={ariaLabel}\n aria-orientation={orientation}\n data-matrx-tool-rail=\"\"\n data-orientation={orientation}\n className={cn(\"flex w-fit shrink-0 items-center gap-1\", vertical ? \"flex-col\" : \"flex-row\", className)}\n >\n {groups.map((group, gi) => (\n <React.Fragment key={gi}>\n {gi > 0 ? (\n <div\n role=\"separator\"\n aria-orientation={vertical ? \"horizontal\" : \"vertical\"}\n className={cn(\"shrink-0 bg-border\", vertical ? \"my-0.5 h-px w-5\" : \"mx-0.5 h-5 w-px\")}\n />\n ) : null}\n {group.map((tool) => {\n const on = tool.id === value;\n const Icon = tool.icon;\n const name = tool.shortcut ? `${tool.label} (${tool.shortcut})` : tool.label;\n return (\n <Tooltip key={tool.id}>\n <TooltipTrigger asChild>\n <Button\n ref={(el: HTMLButtonElement | null) => {\n if (el) refs.current.set(tool.id, el);\n else refs.current.delete(tool.id);\n }}\n variant={on ? \"primary\" : \"quiet\"}\n icon={<Icon />}\n aria-label={name}\n pressed={on}\n disabled={tool.disabled}\n tabIndex={tool.id === stopId ? 0 : -1}\n data-tool-id={tool.id}\n onFocus={() => setFocusId(tool.id)}\n onKeyDown={(e) => onKeyDown(e, tool.id)}\n onClick={() => onValueChange(on && allowDeselect ? null : tool.id, tool)}\n />\n </TooltipTrigger>\n <TooltipContent side={vertical ? \"right\" : \"bottom\"} sideOffset={6}>\n {name}\n </TooltipContent>\n </Tooltip>\n );\n })}\n </React.Fragment>\n ))}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * PageRangeInput — \"1-3, 5, 8-\" in one field, with the parse reported underneath.\n *\n * Validation offers, never blocks: the text is always the caller's to keep. `onChange` reports\n * the text AND its parse (`pages`, `issues`); an issue shows as one hint line and sets\n * `aria-invalid`, but nothing is refused. The hint line is always reserved (one line of height),\n * so showing a hint, a count or an error never shifts the layout. Grammar: `page-ranges.ts`.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { Input } from \"./doors\";\nimport { type ParsedPageRanges, formatPageRanges, parsePageRanges } from \"./page-ranges\";\n\nexport interface PageRangeInputProps {\n /** The typed text (controlled). */\n value: string;\n onChange: (text: string, parsed: ParsedPageRanges) => void;\n /** Pages in the document; ranges are checked against it and \"8-\" runs to it. */\n pageCount: number;\n \"aria-label\"?: string;\n id?: string;\n placeholder?: string;\n disabled?: boolean;\n className?: string;\n /** Pressed Enter on a range that parsed clean. */\n onSubmit?: (parsed: ParsedPageRanges) => void;\n}\n\nexport function PageRangeInput({\n value,\n onChange,\n pageCount,\n placeholder = \"e.g. 1-3, 5, 8-\",\n disabled,\n className,\n onSubmit,\n id,\n \"aria-label\": ariaLabel = \"Page range\",\n}: PageRangeInputProps) {\n const autoId = React.useId();\n const hintId = `${id ?? autoId}-hint`;\n const parsed = React.useMemo(() => parsePageRanges(value, pageCount), [value, pageCount]);\n const first = parsed.issues[0];\n const hint = parsed.empty\n ? `${pageCount} page${pageCount === 1 ? \"\" : \"s\"}`\n : first\n ? first.hint\n : `${parsed.pages.length} page${parsed.pages.length === 1 ? \"\" : \"s\"}: ${formatPageRanges(parsed.pages)}`;\n return (\n <div className={cn(\"flex min-w-0 flex-col gap-1\", className)} data-matrx-page-range-input=\"\">\n <Input\n id={id}\n value={value}\n disabled={disabled}\n placeholder={placeholder}\n aria-label={ariaLabel}\n aria-invalid={first ? true : undefined}\n aria-describedby={hintId}\n autoComplete=\"off\"\n spellCheck={false}\n inputMode=\"text\"\n onChange={(e) => onChange(e.target.value, parsePageRanges(e.target.value, pageCount))}\n onKeyDown={(e) => {\n if (e.key === \"Enter\" && parsed.valid) onSubmit?.(parsed);\n }}\n />\n <p\n id={hintId}\n role={first ? \"alert\" : \"status\"}\n data-state={first ? \"issue\" : parsed.empty ? \"idle\" : \"ok\"}\n className={cn(\"min-h-4 truncate text-xs leading-4\", first ? \"text-destructive\" : \"text-muted-foreground\")}\n >\n {hint}\n </p>\n </div>\n );\n}\n","/**\n * Page ranges — \"1-3, 5, 8-\" in, the pages out. Pure; the one parser behind `PageRangeInput`\n * and every PDF tool that takes a range (Split, Extract, Delete, Rotate, Print).\n *\n * Grammar (spaces anywhere are ignored): a token is `N`, `A-B`, `A-` (to the last page) or\n * `-B` (from the first). Tokens are separated by `,` or `;`. `end` and `last` mean the last\n * page. VALIDATION OFFERS, NEVER BLOCKS: a bad token is reported in `issues` with a hint and\n * skipped, the good tokens still count, and a reversed range (`5-3`) is read as `3-5` with a\n * note. Page numbers are 1-based.\n */\n\nexport type PageRangeIssueKind = \"syntax\" | \"out-of-range\" | \"reversed\" | \"zero\";\n\nexport interface PageRangeIssue {\n /** The token as typed (trimmed). */\n token: string;\n kind: PageRangeIssueKind;\n /** A sentence that says what to do, ready to show. */\n hint: string;\n}\n\nexport interface ParsedPageRanges {\n /** Every selected page, ascending, no repeats. */\n pages: number[];\n /** The same pages as ascending, non-touching [from, to] spans. */\n spans: Array<[number, number]>;\n issues: PageRangeIssue[];\n /** True when the text named at least one page and raised no issue. */\n valid: boolean;\n /** True when the text is empty (nothing typed yet — not an error). */\n empty: boolean;\n}\n\nconst WORD_END = /^(end|last)$/i;\n\nfunction num(part: string, pageCount: number): number | null {\n const p = part.trim();\n if (WORD_END.test(p)) return pageCount;\n if (!/^\\d+$/.test(p)) return null;\n return Number.parseInt(p, 10);\n}\n\nexport function spansOf(pages: readonly number[]): Array<[number, number]> {\n const out: Array<[number, number]> = [];\n for (const p of pages) {\n const last = out[out.length - 1];\n if (last && p === last[1] + 1) last[1] = p;\n else out.push([p, p]);\n }\n return out;\n}\n\n/** Parse `text` against a document of `pageCount` pages. */\nexport function parsePageRanges(text: string, pageCount: number): ParsedPageRanges {\n const issues: PageRangeIssue[] = [];\n const picked = new Set<number>();\n const trimmed = text.trim();\n if (trimmed === \"\") return { pages: [], spans: [], issues, valid: false, empty: true };\n const count = Math.max(0, Math.trunc(pageCount));\n\n for (const raw of trimmed.split(/[,;]/)) {\n const token = raw.trim();\n if (token === \"\") continue;\n const dash = token.indexOf(\"-\");\n let from: number | null;\n let to: number | null;\n if (dash === -1) {\n from = to = num(token, count);\n } else {\n const a = token.slice(0, dash);\n const b = token.slice(dash + 1);\n from = a.trim() === \"\" ? 1 : num(a, count);\n to = b.trim() === \"\" ? count : num(b, count);\n if (a.trim() === \"\" && b.trim() === \"\") from = to = null;\n }\n if (from === null || to === null) {\n issues.push({ token, kind: \"syntax\", hint: `“${token}” is not a page or range. Use numbers like 1-3, 5, 8-.` });\n continue;\n }\n if (from === 0 || to === 0) {\n issues.push({ token, kind: \"zero\", hint: `Pages start at 1; “${token}” was skipped.` });\n continue;\n }\n if (from > to) {\n issues.push({ token, kind: \"reversed\", hint: `“${token}” runs backwards; read as ${to}-${from}.` });\n [from, to] = [to, from];\n }\n if (from > count) {\n issues.push({ token, kind: \"out-of-range\", hint: `This file has ${count} page${count === 1 ? \"\" : \"s\"}; “${token}” was skipped.` });\n continue;\n }\n if (to > count) {\n issues.push({ token, kind: \"out-of-range\", hint: `This file has ${count} page${count === 1 ? \"\" : \"s\"}; “${token}” was cut to ${from}-${count}.` });\n to = count;\n }\n for (let p = from; p <= to; p++) picked.add(p);\n }\n const pages = [...picked].sort((x, y) => x - y);\n return { pages, spans: spansOf(pages), issues, valid: pages.length > 0 && issues.length === 0, empty: false };\n}\n\n/** The shortest text that parses back to `pages` (\"1-3, 5, 8-12\"). An open end is not written. */\nexport function formatPageRanges(pages: readonly number[]): string {\n const sorted = [...new Set(pages.filter((p) => Number.isInteger(p) && p > 0))].sort((a, b) => a - b);\n return spansOf(sorted)\n .map(([a, b]) => (a === b ? String(a) : b === a + 1 ? `${a}, ${b}` : `${a}-${b}`))\n .join(\", \");\n}\n","\"use client\";\n\n/**\n * OpacitySlider — a 0..1 opacity as a slider plus a percent field, one value, two ways to set it.\n * The value is a fraction (0-1) in and out; the field shows whole percent and commits on\n * blur/Enter (a text draft while typing, so it can be emptied without painting \"0\"). Arrow keys on\n * the slider step 1% (Shift: 10%). The percent field has a fixed width, so a change never shifts\n * the row.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { Slider } from \"../slider\";\nimport { Input } from \"./doors\";\n\nexport interface OpacitySliderProps {\n /** 0-1. */\n value: number;\n onChange: (value: number) => void;\n min?: number;\n max?: number;\n disabled?: boolean;\n className?: string;\n \"aria-label\"?: string;\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(hi, Math.max(lo, n));\nconst toPercent = (v: number) => Math.round(v * 100);\n\nexport function OpacitySlider({\n value,\n onChange,\n min = 0,\n max = 1,\n disabled,\n className,\n \"aria-label\": ariaLabel = \"Opacity\",\n}: OpacitySliderProps) {\n const [draft, setDraft] = React.useState<string | null>(null);\n const percent = toPercent(clamp(value, min, max));\n const commit = () => {\n if (draft !== null && draft.trim() !== \"\" && Number.isFinite(Number(draft))) {\n onChange(clamp(Math.round(Number(draft)) / 100, min, max));\n }\n setDraft(null);\n };\n return (\n <div className={cn(\"flex min-w-0 items-center gap-2\", className)} data-matrx-opacity-slider=\"\">\n <Slider\n className=\"min-w-0 flex-1\"\n aria-label={ariaLabel}\n {...(disabled !== undefined ? { disabled } : {})}\n min={toPercent(min)}\n max={toPercent(max)}\n step={1}\n value={[percent]}\n onValueChange={([v]) => onChange(clamp((v ?? 0) / 100, min, max))}\n />\n {/* The percent field fits its 4rem slot: a field's 8rem floor (controls.css \"A field never\n collapses\") is lowered here through its own knob, or the field spilled over the next control. */}\n <div className=\"flex w-16 shrink-0 items-center gap-1\" style={{ [\"--matrx-control-field-min\" as string]: \"0px\" }}>\n <Input\n numeric\n inputMode=\"numeric\"\n size={3}\n className=\"w-full\"\n aria-label={`${ariaLabel} percent`}\n disabled={disabled}\n value={draft ?? String(percent)}\n onFocus={(e) => e.currentTarget.select()}\n onChange={(e) => setDraft(e.target.value.replace(/[^\\d]/g, \"\").slice(0, 3))}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") commit();\n if (e.key === \"Escape\") setDraft(null);\n }}\n />\n <span aria-hidden className=\"text-xs text-muted-foreground\">%</span>\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * ColorSwatchRow — a row of color swatches, one chosen (a highlight color, a pen, a stamp).\n * `role=\"radiogroup\"` with a roving tab stop: Tab enters on the chosen swatch, Left/Right (and\n * Up/Down) move and choose, Home/End jump. The chosen swatch shows a ring plus a check, so it\n * never reads by color alone, and the ring is drawn inside the swatch's own box (no layout\n * shift). The swatch color itself is data the caller passes (an annotation palette), the only\n * place a literal color appears; everything around it is a token.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { RadixCheckIcon } from \"../icons\";\n\nexport interface ColorSwatch {\n /** Any CSS color. */\n value: string;\n /** The swatch's spoken name (\"Yellow\"). */\n label: string;\n}\n\nexport interface ColorSwatchRowProps {\n colors: readonly ColorSwatch[];\n /** The chosen color's `value` (compared case-insensitively); none chosen when it matches nothing. */\n value: string | null | undefined;\n onChange: (value: string, swatch: ColorSwatch) => void;\n disabled?: boolean;\n className?: string;\n \"aria-label\"?: string;\n}\n\nexport function ColorSwatchRow({\n colors,\n value,\n onChange,\n disabled,\n className,\n \"aria-label\": ariaLabel = \"Color\",\n}: ColorSwatchRowProps) {\n const refs = React.useRef<Array<HTMLButtonElement | null>>([]);\n const chosen = colors.findIndex((c) => c.value.toLowerCase() === (value ?? \"\").toLowerCase());\n const stop = chosen >= 0 ? chosen : 0;\n const move = (to: number) => {\n const i = (to + colors.length) % colors.length;\n const c = colors[i];\n if (!c) return;\n refs.current[i]?.focus();\n onChange(c.value, c);\n };\n return (\n <div\n role=\"radiogroup\"\n aria-label={ariaLabel}\n aria-disabled={disabled || undefined}\n className={cn(\"flex flex-wrap items-center gap-1\", className)}\n data-matrx-color-swatch-row=\"\"\n >\n {colors.map((c, i) => {\n const on = i === chosen;\n return (\n <button\n key={`${c.value}-${i}`}\n ref={(el) => {\n refs.current[i] = el;\n }}\n type=\"button\"\n role=\"radio\"\n aria-checked={on}\n aria-label={c.label}\n title={c.label}\n disabled={disabled}\n tabIndex={i === stop ? 0 : -1}\n data-state={on ? \"checked\" : \"unchecked\"}\n onClick={() => onChange(c.value, c)}\n onKeyDown={(e) => {\n const k = e.key;\n if (k === \"ArrowRight\" || k === \"ArrowDown\") { e.preventDefault(); move(i + 1); }\n else if (k === \"ArrowLeft\" || k === \"ArrowUp\") { e.preventDefault(); move(i - 1); }\n else if (k === \"Home\") { e.preventDefault(); move(0); }\n else if (k === \"End\") { e.preventDefault(); move(colors.length - 1); }\n }}\n className={cn(\n \"relative inline-flex size-6 shrink-0 items-center justify-center rounded-full border border-border outline-none\",\n \"focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-1 focus-visible:ring-offset-background\",\n \"disabled:cursor-not-allowed disabled:border-dashed\",\n on && \"ring-2 ring-foreground ring-offset-1 ring-offset-background\",\n )}\n style={{ backgroundColor: c.value }}\n >\n {on ? <RadixCheckIcon className=\"size-3 mix-blend-difference text-white\" /> : null}\n </button>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * AnchoredToolbar — a floating toolbar anchored to a rectangle (a text selection, a picked\n * region, a selected annotation). It is a Popover whose anchor is the rect, so it is portaled and\n * positioned fixed: it never takes space in the page and never moves it. It sits above the rect\n * and flips below it (and slides along the edge) when there is no room; a rect scrolled out of the\n * viewport is left to the host to close (`onOpenChange`). Focus stays where it was (a selection\n * must not be lost by showing its toolbar); Escape and an outside press call `onOpenChange(false)`.\n *\n * `rect` is in viewport coordinates (`getBoundingClientRect()` / `Range.getBoundingClientRect()`).\n * Put an `OverflowToolbar` (or any row of controls) in `children`.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"../popover\";\n\nexport interface AnchorRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface AnchoredToolbarProps {\n open: boolean;\n onOpenChange?: (open: boolean) => void;\n /** The selection rect, viewport coordinates. Null closes the toolbar. */\n rect: AnchorRect | DOMRectReadOnly | null;\n /** Preferred side; it flips when it does not fit. Default \"top\". */\n side?: \"top\" | \"bottom\";\n align?: \"start\" | \"center\" | \"end\";\n /** Gap between the rect and the toolbar, px. Default 8. */\n offset?: number;\n className?: string;\n \"aria-label\": string;\n children: React.ReactNode;\n}\n\n/** A virtual element for the popper: the rect, re-read on every position pass. */\nfunction virtualFor(rect: AnchorRect) {\n return {\n getBoundingClientRect: () =>\n ({\n x: rect.x, y: rect.y, left: rect.x, top: rect.y,\n width: rect.width, height: rect.height,\n right: rect.x + rect.width, bottom: rect.y + rect.height,\n toJSON: () => ({}),\n }) as DOMRect,\n };\n}\n\nexport function AnchoredToolbar({\n open,\n onOpenChange,\n rect,\n side = \"top\",\n align = \"center\",\n offset = 8,\n className,\n \"aria-label\": ariaLabel,\n children,\n}: AnchoredToolbarProps) {\n // A fresh virtual element whenever the rect's numbers change: Radix re-measures on a new anchor.\n const x = rect?.x ?? 0, y = rect?.y ?? 0, w = rect?.width ?? 0, h = rect?.height ?? 0;\n const virtualRef = React.useMemo(\n () => ({ current: virtualFor({ x, y, width: w, height: h }) }),\n [x, y, w, h],\n );\n const visible = open && rect !== null;\n return (\n <Popover open={visible} {...(onOpenChange ? { onOpenChange } : {})}>\n <PopoverAnchor virtualRef={virtualRef} />\n <PopoverContent\n role=\"toolbar\"\n aria-label={ariaLabel}\n data-matrx-anchored-toolbar=\"\"\n side={side}\n align={align}\n sideOffset={offset}\n padding=\"xs\"\n animated={false}\n className={cn(\"w-auto min-w-0 max-w-[calc(100vw-1rem)] overflow-visible\", className)}\n collisionPadding={8}\n avoidCollisions\n onOpenAutoFocus={(e) => e.preventDefault()}\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n {children}\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\n/**\n * IconSelect — an icon-only select: a 28px circle that opens either a plain select or (searchable) a\n * popover list with a filter box. Moved from matrx-frontend `components/official/IconSelect`\n * (wave 3, 2026-10-22).\n *\n * Navigation items MUST set `href`: Cmd/Ctrl/Shift/Alt or middle click then opens it in a new tab\n * through kit's one outbound door instead of choosing the item.\n *\n * The trigger forwards its ref and spreads the rest on purpose: `PopoverTrigger asChild` (Radix Slot)\n * clones its onClick / aria-expanded / data-state / ref onto it. Without both, the popover can never\n * open (found 2026-09-23); `icon-select.test.tsx` pins it.\n */\n\nimport * as React from \"react\";\n\nimport { openOutbound } from \"@ai-matrx/kit/outbound\";\n\nimport { cn } from \"../cn\";\nimport { Command, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList } from \"../command\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { Select, SelectContent, SelectGroup, SelectItem, SelectTrigger } from \"../select\";\nimport { Button } from \"./controls\";\n\nexport interface IconSelectItem {\n id: string;\n label: string;\n icon?: React.ReactNode;\n value: string;\n /** Set on navigation items: a modified or middle click opens this URL in a new tab instead of choosing. */\n href?: string;\n}\n\nexport interface IconSelectProps {\n items: IconSelectItem[];\n icon?: React.ReactNode;\n value?: string;\n onValueChange?: (value: string) => void;\n disabled?: boolean;\n /** A searchable popover list instead of a plain select. */\n searchable?: boolean;\n searchPlaceholder?: string;\n /** Accessible name for the icon-only trigger (required in spirit: the trigger has no text). */\n ariaLabel?: string;\n /** The trigger's size: `default` 28px; `touch` 40px on a phone and 32px from `sm` up. */\n size?: \"default\" | \"touch\";\n /** Where the trigger sits (margin, flex); never how it looks. */\n className?: string;\n}\n\ninterface ClickLike {\n metaKey?: boolean;\n ctrlKey?: boolean;\n shiftKey?: boolean;\n altKey?: boolean;\n button?: number;\n}\n\n/** A click that asks for a new tab: a modifier, or the middle button. */\nfunction wantsNewTab(e: ClickLike): boolean {\n return Boolean(e.metaKey || e.ctrlKey || e.shiftKey || e.altKey || e.button === 1);\n}\n\nconst TRIGGER_SIZE = {\n default: \"\",\n touch: \"!h-10 !w-10 sm:!h-8 sm:!w-8\",\n} as const;\n\nconst TRIGGER_FACE = \"h-7 w-7 justify-center border-none bg-muted px-0 focus:outline-none focus:ring-0\";\n\nconst IconSelectTrigger = React.forwardRef<\n HTMLButtonElement,\n Pick<IconSelectProps, \"icon\" | \"disabled\" | \"ariaLabel\" | \"size\"> & Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\">\n>(function IconSelectTrigger({ icon, disabled, ariaLabel, size = \"default\", className, ...rest }, ref) {\n return (\n <Button\n ref={ref}\n variant=\"quiet\"\n disabled={disabled}\n icon={icon}\n className={cn(TRIGGER_SIZE[size], className)}\n {...rest}\n aria-label={ariaLabel ?? rest[\"aria-label\"] ?? \"Choose an option\"}\n />\n );\n});\n\nexport function IconSelect({\n items,\n icon,\n value,\n onValueChange,\n disabled = false,\n searchable = false,\n searchPlaceholder = \"Search...\",\n ariaLabel = \"Choose an option\",\n size = \"default\",\n className,\n}: IconSelectProps) {\n const [open, setOpen] = React.useState(false);\n // cmdk's onSelect does not receive the mouse event, so a modified click is remembered here.\n const skipSelectRef = React.useRef(false);\n\n if (searchable) {\n return (\n <Popover open={open} onOpenChange={setOpen}>\n <PopoverTrigger asChild>\n <IconSelectTrigger icon={icon} disabled={disabled} ariaLabel={ariaLabel} size={size} className={className} />\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" className=\"p-0\" align=\"start\">\n <Command>\n <CommandInput placeholder={searchPlaceholder} className=\"h-9 text-sm\" />\n <CommandList>\n <CommandEmpty>No results found.</CommandEmpty>\n <CommandGroup className=\"max-h-72 overflow-auto\">\n {items.map((item) => (\n <CommandItem\n key={item.id}\n value={item.label}\n onPointerDown={(e) => {\n if (item.href && wantsNewTab(e)) {\n skipSelectRef.current = true;\n e.preventDefault();\n openOutbound(item.href, \"_blank\", \"noopener\");\n setOpen(false);\n }\n }}\n onSelect={() => {\n if (skipSelectRef.current) {\n skipSelectRef.current = false;\n return;\n }\n onValueChange?.(item.value);\n setOpen(false);\n }}\n >\n <div className=\"flex items-center\">\n {item.icon && <span className=\"mr-2\">{item.icon}</span>}\n {item.label}\n </div>\n </CommandItem>\n ))}\n </CommandGroup>\n </CommandList>\n </Command>\n </PopoverContent>\n </Popover>\n );\n }\n\n return (\n <Select {...(value === undefined ? {} : { value })} {...(onValueChange ? { onValueChange } : {})} disabled={disabled}>\n <SelectTrigger\n aria-label={ariaLabel}\n className={cn(TRIGGER_FACE, TRIGGER_SIZE[size], className)}\n hideArrow={true}\n >\n {icon}\n </SelectTrigger>\n <SelectContent>\n <SelectGroup>\n {items.map((item) => (\n <SelectItem\n key={item.id}\n value={item.value}\n onPointerDown={(e) => {\n if (item.href && wantsNewTab(e)) {\n e.preventDefault();\n openOutbound(item.href, \"_blank\", \"noopener\");\n }\n }}\n >\n <div className=\"flex items-center\">\n {item.icon && <span className=\"mr-2\">{item.icon}</span>}\n {item.label}\n </div>\n </SelectItem>\n ))}\n </SelectGroup>\n </SelectContent>\n </Select>\n );\n}\n","\"use client\";\n\n/**\n * AdvancedCollapsible — a bordered collapsible section with an icon + title header and, when open, an\n * action row: save, reset (both confirm on the button), copy the content, and full screen.\n * Moved from matrx-frontend `components/official/AdvancedCollapsible` (wave 3, 2026-10-22).\n *\n * - Copy goes through kit's one clipboard door (a toast on success, the manual-copy dialog when the\n * browser refuses); no host copy component.\n * - Full screen is the package Dialog at `size=\"full\"`, with the same actions in its header; the app's\n * FullScreenOverlay is not needed.\n * - Glyph colors are glyph tones (info / warning / primary), not palette classes.\n */\n\nimport * as React from \"react\";\n\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport { openClipboardFallback } from \"@ai-matrx/kit/clipboard-fallback-opener\";\nimport { toast } from \"@ai-matrx/kit/notify\";\n\nimport { cn } from \"../cn\";\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from \"../collapsible\";\nimport { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle } from \"../dialog\";\nimport { ChevronDownIcon, CopyIcon, Maximize2Icon, Minimize2Icon, RefreshCwIcon, SaveIcon } from \"../icons\";\nimport { IconButton } from \"../icon-button\";\nimport { ActionFeedbackButton } from \"./action-feedback-button\";\n\nexport interface AdvancedCollapsibleProps {\n icon: React.ReactNode;\n title: React.ReactNode;\n initialOpen?: boolean;\n onStateChange?: (open: boolean) => void;\n children: React.ReactNode;\n /** Where the section sits (margin, width); never how it looks. */\n className?: string;\n onSave?: () => void;\n onReset?: () => void;\n /** Called after the content was copied (the copy itself always happens). */\n onCopy?: () => void;\n saveTooltip?: string;\n resetTooltip?: string;\n copyTooltip?: string;\n fullscreenTooltip?: string;\n fullscreenExitTooltip?: string;\n fullScreenTitle?: string;\n fullScreenDescription?: string;\n}\n\nexport function AdvancedCollapsible({\n icon,\n title,\n initialOpen = true,\n onStateChange,\n children,\n className,\n onSave,\n onReset,\n onCopy,\n saveTooltip = \"Save\",\n resetTooltip = \"Reset\",\n copyTooltip = \"Copy to clipboard\",\n fullscreenTooltip = \"Expand to full screen\",\n fullscreenExitTooltip = \"Exit full screen\",\n fullScreenTitle,\n fullScreenDescription,\n}: AdvancedCollapsibleProps) {\n const [isOpen, setIsOpen] = React.useState(initialOpen);\n const [isFullScreen, setIsFullScreen] = React.useState(false);\n const contentRef = React.useRef<HTMLDivElement>(null);\n const fullRef = React.useRef<HTMLDivElement>(null);\n\n const handleOpenChange = (open: boolean) => {\n setIsOpen(open);\n onStateChange?.(open);\n };\n\n const handleCopy = async () => {\n const box = isFullScreen ? fullRef.current : contentRef.current;\n // innerText keeps the visible line breaks; a DOM without it (a test runner) reads textContent.\n const text = box ? (box.innerText ?? box.textContent ?? \"\") : \"\";\n if (!text) return;\n const landed = await copyText(text, {\n successMessage: \"Copied to clipboard\",\n notify: (message, kind) => {\n if (kind === \"success\") toast.success(message);\n },\n });\n // A copy that did not land opens the manual-copy dialog, which shows the text.\n if (!landed) void openClipboardFallback(text);\n else onCopy?.();\n };\n\n const actions = (\n <div className=\"flex items-center justify-end gap-2\">\n {onSave && (\n <ActionFeedbackButton\n icon={<SaveIcon />}\n glyphTone=\"info\"\n tooltip={saveTooltip}\n successTooltip=\"Saved!\"\n onClick={onSave}\n />\n )}\n {onReset && (\n <ActionFeedbackButton\n icon={<RefreshCwIcon />}\n glyphTone=\"warning\"\n tooltip={resetTooltip}\n successTooltip=\"Reset!\"\n onClick={onReset}\n />\n )}\n <IconButton icon={CopyIcon} tooltip={copyTooltip} onClick={() => void handleCopy()} />\n <IconButton\n icon={isFullScreen ? Minimize2Icon : Maximize2Icon}\n glyphTone=\"primary\"\n tooltip={isFullScreen ? fullscreenExitTooltip : fullscreenTooltip}\n onClick={() => setIsFullScreen(!isFullScreen)}\n />\n </div>\n );\n\n const heading = typeof title === \"string\" ? title : \"Content\";\n\n return (\n <>\n <Collapsible\n open={isOpen}\n onOpenChange={handleOpenChange}\n className={cn(\"w-full rounded-xl border border-border shadow-sm\", className)}\n >\n <CollapsibleTrigger className=\"relative flex w-full items-center justify-between rounded-t-xl px-4 py-3 font-medium hover:bg-muted\">\n <div className=\"flex items-center gap-2\">\n {icon}\n {typeof title === \"string\" ? <span>{title}</span> : title}\n </div>\n <ChevronDownIcon\n className={cn(\n \"h-4 w-4 shrink-0 text-muted-foreground transition-transform duration-(--matrx-motion-duration-base) motion-reduce:transition-none\",\n isOpen && \"rotate-180\",\n )}\n />\n </CollapsibleTrigger>\n <CollapsibleContent>\n <div className=\"relative\">\n <div className=\"absolute left-8 right-8 top-0 h-px bg-border\" />\n <div ref={contentRef} className=\"p-4\">\n {children}\n </div>\n <div className=\"mb-1 mr-1 mt-2\">{actions}</div>\n </div>\n </CollapsibleContent>\n </Collapsible>\n\n <Dialog open={isFullScreen} onOpenChange={setIsFullScreen}>\n <DialogContent size=\"full\" height=\"tall\">\n <DialogHeader>\n <DialogTitle>{fullScreenTitle || heading}</DialogTitle>\n {fullScreenDescription ? <DialogDescription>{fullScreenDescription}</DialogDescription> : null}\n </DialogHeader>\n {actions}\n <div ref={fullRef} className=\"min-h-0 flex-1 overflow-auto p-4\">\n {children}\n </div>\n </DialogContent>\n </Dialog>\n </>\n );\n}\n","\"use client\";\nimport React from \"react\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\nimport { Button, type GlyphTone } from \"./controls/index\";\nimport { MOTION_SPIN } from \"./motion\";\n\n// Moved whole from matrx-frontend components/official/IconButton (chat host slots, 2026-10-08).\n\n/**\n * A door onto THE control: an icon-only controls `Button` (the 28px circle) with an optional\n * tooltip. It has no size and no color of its own — a glyph whose color carries meaning says\n * so with `glyphTone`; `className` places it (margin, position, flex), never restyles it.\n */\nexport interface IconButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\"> {\n /** Any glyph component (a design-system glyph, a Lucide icon, …); it receives `className`. */\n icon: React.ComponentType<{ className?: string }>;\n tooltip?: string;\n /** Legacy tone words map onto the control's variants: ghost → quiet, default → primary,\n * destructive → danger. */\n variant?: \"ghost\" | \"outline\" | \"default\" | \"secondary\" | \"destructive\" | \"link\";\n /** The glyph's own status ink when its color carries meaning. */\n glyphTone?: GlyphTone;\n /** Work in flight: the glyph turns (a refresh, a duplicate, an export). */\n spinning?: boolean;\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\";\n tooltipAlign?: \"start\" | \"center\" | \"end\";\n tooltipOffset?: number;\n}\n\nconst VARIANT = {\n ghost: \"quiet\",\n outline: \"outline\",\n secondary: \"outline\",\n default: \"primary\",\n destructive: \"danger\",\n link: \"link\",\n} as const;\n\nexport function IconButton({\n icon: Icon,\n tooltip,\n variant = \"ghost\",\n glyphTone,\n spinning = false,\n tooltipSide = \"bottom\",\n tooltipAlign = \"center\",\n tooltipOffset = 5,\n \"aria-label\": ariaLabel,\n ...props\n}: IconButtonProps) {\n const control = (\n <Button\n variant={VARIANT[variant]}\n icon={spinning ? <Icon className={MOTION_SPIN} /> : <Icon />}\n {...(glyphTone ? { glyphTone } : {})}\n aria-label={ariaLabel ?? tooltip ?? \"Action\"}\n {...props}\n />\n );\n if (!tooltip) return control;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{control}</TooltipTrigger>\n <TooltipContent side={tooltipSide} align={tooltipAlign} className=\"z-[9999]\" sideOffset={tooltipOffset}>\n {tooltip}\n </TooltipContent>\n </Tooltip>\n );\n}\n","\"use client\";\n\n/**\n * EmptyStateCard — the centered \"nothing here\" block: a large tinted icon, a title, a sentence, and an\n * optional call to action. Moved from matrx-frontend `components/official/cards/EmptyStateCard`\n * (wave 3, 2026-10-22).\n *\n * The old alternate-state machinery (six class props: icon color, icon background, button color, ...) is one\n * named option: `tone=\"success\"` draws the done / all-clear look from the success role; the default is the\n * primary role. The call to action is the controls `Button` (primary, or outline in the success tone).\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { Button } from \"./controls\";\n\nexport interface EmptyStateCardProps {\n title: string;\n description: string;\n /** Any glyph component (a package glyph, a Lucide icon); it receives `className`. */\n icon: React.ComponentType<{ className?: string; strokeWidth?: number }>;\n buttonText?: string;\n onButtonClick?: () => void;\n /** Drawn beside the call to action. */\n secondaryButton?: React.ReactNode;\n /** `primary` (default) or `success`, the all-clear look. */\n tone?: \"primary\" | \"success\";\n}\n\nconst TONE = {\n primary: { data: \"primary\", button: \"primary\" },\n success: { data: \"success\", button: \"outline\" },\n} as const;\n\nexport function EmptyStateCard({\n title,\n description,\n icon: Icon,\n buttonText,\n onButtonClick,\n secondaryButton,\n tone = \"primary\",\n}: EmptyStateCardProps) {\n const t = TONE[tone];\n return (\n <div data-tone={t.data} className=\"matrx-hue-card flex flex-col items-center justify-center px-6 py-12 text-center\">\n <div className=\"matrx-hue-icon mb-6 rounded-full p-6\">\n <Icon className=\"h-12 w-12\" strokeWidth={1.5} />\n </div>\n <h3 className={cn(\"mb-3 text-xl font-semibold\", tone === \"success\" ? \"text-success-ink\" : \"text-foreground\")}>\n {title}\n </h3>\n <p className=\"mb-8 max-w-md text-muted-foreground\">{description}</p>\n {buttonText && (\n <div className=\"flex flex-col gap-4 sm:flex-row\">\n <Button variant={t.button} {...(tone === \"success\" ? { tone: \"success\" as const } : {})} {...(onButtonClick ? { onClick: onButtonClick } : {})}>\n {buttonText}\n </Button>\n {secondaryButton}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * THE HUE CARDS — the colored icon cards: a card (`HueCard`, with a compact iOS squircle form), a grid of them\n * (`HueGrid`), a horizontal row (`HueRow`) and its list (`HueList`), and the 2x2 gradient widget (`IosWidget`);\n * plus the plain tile (`TileCard`) and its grid (`TileCardGrid`).\n *\n * Moved from matrx-frontend `components/official/card-and-grid/*` and `components/official/cards/CardGrid`\n * (wave 3, 2026-10-22). The ~150 palette classes (`bg-indigo-100 dark:bg-indigo-900/70`, gradient stops, ...) are\n * gone: a card's color is a NAMED hue (`CardColor`) that picks the chip tone table in `controls.css`, so it\n * is a token in light and dark. The look follows the tokens:\n * - the former `yellow` and `amber` share the amber token (the table has no yellow); `purple` is `violet`,\n * `pink` is `fuchsia`, `gray` is `slate`, `red` is the destructive role, `green` the success role;\n * - the squircle / widget gradient runs from the hue to the hue darkened toward black.\n * Links draw through `HostLink` (the registered tap-target link). Text is foreground / muted tokens only.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"../cn\";\nimport { HostLink } from \"../host-link\";\nimport { ChevronRightIcon, PlusIcon } from \"../icons\";\n\n/** The names callers already use. Each picks one tone of the chip table (see `HUE_TONE`). */\nexport type CardColor =\n | \"indigo\"\n | \"emerald\"\n | \"blue\"\n | \"amber\"\n | \"purple\"\n | \"gray\"\n | \"red\"\n | \"green\"\n | \"yellow\"\n | \"pink\"\n | \"orange\"\n | \"teal\"\n | \"cyan\"\n | \"lime\"\n | \"rose\"\n | \"violet\"\n | \"slate\";\n\n/** CardColor -> the `data-tone` of the chip table in controls.css. */\nexport const HUE_TONE: Record<CardColor, string> = {\n indigo: \"indigo\",\n emerald: \"emerald\",\n blue: \"blue\",\n amber: \"amber\",\n purple: \"violet\",\n gray: \"slate\",\n red: \"destructive\",\n green: \"success\",\n yellow: \"amber\",\n pink: \"fuchsia\",\n orange: \"orange\",\n teal: \"teal\",\n cyan: \"cyan\",\n lime: \"lime\",\n rose: \"rose\",\n violet: \"violet\",\n slate: \"slate\",\n};\n\nexport type CardSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\n\ntype SizedIcon = React.ReactElement<{ size?: number; className?: string }>;\n\nfunction sizedIcon(icon: SizedIcon, fallback: number): React.ReactNode {\n return React.isValidElement<{ size?: number }>(icon)\n ? React.cloneElement(icon, { size: icon.props.size || fallback })\n : icon;\n}\n\nfunction tone(color: CardColor): string {\n return HUE_TONE[color] ?? HUE_TONE.slate;\n}\n\n/** The card's destination: a link when it has a path, else a click target. */\nfunction Destination({\n path,\n onClick,\n external,\n className,\n children,\n}: {\n path?: string | undefined;\n onClick?: (() => void) | undefined;\n external?: boolean | undefined;\n className?: string;\n children: React.ReactNode;\n}) {\n if (path) {\n return (\n <HostLink\n href={path}\n className={className ?? \"block\"}\n {...(onClick ? { onClick } : {})}\n {...(external ? { target: \"_blank\", rel: \"noopener noreferrer\" } : {})}\n >\n {children}\n </HostLink>\n );\n }\n return (\n <div {...(className ? { className } : {})} {...(onClick ? { onClick } : {})}>\n {children}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* HueCard */\n/* ------------------------------------------------------------------ */\n\nexport interface HueCardProps {\n title: string;\n description?: string;\n descriptionNode?: React.ReactNode;\n icon: SizedIcon;\n color: CardColor;\n path?: string;\n size?: CardSize;\n /** Where the card sits (width, margin, grid span); never how it looks. */\n className?: string;\n onClick?: () => void;\n /** The compact iOS form: a small squircle with the icon and a label, no description. */\n compact?: boolean;\n /** `path` points at a separately hosted app: open it in a new tab. */\n external?: boolean;\n}\n\nconst SIZE_PADDING: Record<CardSize, string> = {\n xs: \"p-3\",\n sm: \"p-4\",\n md: \"p-5\",\n lg: \"p-6\",\n xl: \"p-8\",\n};\n\nexport function HueCard({\n title,\n description,\n descriptionNode,\n icon,\n color,\n path,\n size = \"md\",\n className,\n onClick,\n compact = false,\n external = false,\n}: HueCardProps) {\n if (compact) {\n return (\n <Destination path={path} onClick={onClick} external={external}>\n <div\n data-tone={tone(color)}\n className={cn(\"matrx-hue-card flex cursor-pointer select-none flex-col items-center gap-1.5\", className)}\n >\n <div className=\"matrx-hue-squircle flex aspect-square w-full max-w-[62px] items-center justify-center rounded-[22%] shadow-sm transition-colors\">\n {sizedIcon(icon, 36)}\n </div>\n <span className=\"type-meta w-full truncate px-0.5 text-center font-medium leading-tight text-foreground\">\n {title}\n </span>\n </div>\n </Destination>\n );\n }\n\n return (\n <Destination path={path} onClick={onClick} external={external}>\n <div\n data-tone={tone(color)}\n className={cn(\n \"matrx-hue-card matrx-hue-surface cursor-pointer rounded-xl bg-card shadow-md transition-colors\",\n SIZE_PADDING[size],\n className,\n )}\n >\n <div className=\"flex flex-col items-center space-y-3 text-center\">\n <div className=\"matrx-hue-icon rounded-full p-3\">{sizedIcon(icon, 28)}</div>\n <h3 className=\"text-lg font-semibold\">{title}</h3>\n {description && <p className=\"type-body text-muted-foreground\">{description}</p>}\n {descriptionNode && !description && descriptionNode}\n </div>\n </div>\n </Destination>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* HueGrid */\n/* ------------------------------------------------------------------ */\n\nexport interface HueGridProps {\n title?: string;\n description?: string;\n items: HueCardProps[];\n /** 1 to 6 columns at the widest breakpoint. Default 6. */\n columns?: number;\n className?: string;\n /** Places every card (width, span); never how it looks. */\n cardClassName?: string;\n /** Draw a dashed \"add\" tile after the cards. */\n showAddButton?: boolean;\n onAddButtonClick?: () => void;\n addButtonText?: string;\n /** Compact iOS icons, four to a row. */\n compact?: boolean;\n}\n\nconst GRID_COLUMNS: Record<number, string> = {\n 1: \"grid-cols-1\",\n 2: \"grid-cols-1 sm:grid-cols-2\",\n 3: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3\",\n 4: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4\",\n 5: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-5\",\n 6: \"grid-cols-1 sm:grid-cols-2 md:grid-cols-3 lg:grid-cols-4 xl:grid-cols-6\",\n};\n\nexport function HueGrid({\n title,\n description,\n items,\n columns = 6,\n className,\n cardClassName,\n showAddButton = false,\n onAddButtonClick,\n addButtonText = \"Add\",\n compact = false,\n}: HueGridProps) {\n const colsClass = compact ? \"grid-cols-4\" : GRID_COLUMNS[Math.min(6, Math.max(1, columns))];\n return (\n <div className={className}>\n {title && <h2 className=\"mb-4 text-base font-semibold\">{title}</h2>}\n {description && <p className=\"type-body mb-4 text-muted-foreground\">{description}</p>}\n <div className={cn(\"grid\", compact ? \"gap-2\" : \"gap-4\", colsClass)}>\n {items.map((item, index) => (\n <HueCard key={`card-${index}`} {...item} compact={compact} className={cn(cardClassName, item.className)} />\n ))}\n {showAddButton && (\n <button\n type=\"button\"\n onClick={onAddButtonClick}\n className={cn(\n \"flex cursor-pointer flex-col items-center justify-center space-y-3 rounded-xl border-2 border-dashed border-border p-5 text-center transition-colors hover:bg-muted\",\n cardClassName,\n )}\n >\n <span className=\"rounded-full bg-muted p-3 text-muted-foreground\">\n <PlusIcon className=\"h-7 w-7\" />\n </span>\n <span className=\"text-lg font-semibold\">{addButtonText}</span>\n </button>\n )}\n </div>\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* HueRow / HueList */\n/* ------------------------------------------------------------------ */\n\nexport interface HueRowProps {\n title: string;\n description?: string;\n descriptionNode?: React.ReactNode;\n icon: SizedIcon;\n color: CardColor;\n path?: string;\n className?: string;\n rightIcon?: React.ReactNode;\n onClick?: () => void;\n showBorder?: boolean;\n isLast?: boolean;\n}\n\nexport function HueRow({\n title,\n description,\n descriptionNode,\n icon,\n color,\n path,\n className,\n rightIcon = <ChevronRightIcon className=\"h-5 w-5 text-muted-foreground\" />,\n onClick,\n showBorder = true,\n isLast = false,\n}: HueRowProps) {\n return (\n <Destination path={path} onClick={onClick}>\n <div\n data-tone={tone(color)}\n className={cn(\n \"matrx-hue-card matrx-hue-surface flex cursor-pointer items-center justify-between rounded-lg p-4 transition-colors\",\n !isLast && showBorder && \"border-b border-border\",\n className,\n )}\n >\n <div className=\"flex items-center\">\n <div className=\"matrx-hue-icon mr-4 rounded-lg p-2\">{sizedIcon(icon, 20)}</div>\n <div>\n <h3 className=\"font-medium\">{title}</h3>\n {description && <p className=\"type-body text-muted-foreground\">{description}</p>}\n {descriptionNode && !description && descriptionNode}\n </div>\n </div>\n {rightIcon}\n </div>\n </Destination>\n );\n}\n\nexport interface HueListProps {\n title?: string;\n description?: string;\n items: HueRowProps[];\n className?: string;\n /** Places every row; never how it looks. */\n cardClassName?: string;\n showBorders?: boolean;\n /** Wrap the rows in the raised rounded container. Default true. */\n showContainer?: boolean;\n}\n\nexport function HueList({\n title,\n description,\n items,\n className,\n cardClassName,\n showBorders = true,\n showContainer = true,\n}: HueListProps) {\n const rows = items.map((item, index) => (\n <HueRow\n key={`row-${index}`}\n {...item}\n isLast={index === items.length - 1}\n showBorder={showBorders}\n className={cn(cardClassName, item.className)}\n />\n ));\n return (\n <div className={className}>\n {title && <h2 className=\"mb-4 text-base font-semibold\">{title}</h2>}\n {description && <p className=\"type-body mb-4 text-muted-foreground\">{description}</p>}\n {showContainer ? <div className=\"rounded-xl bg-card shadow-md\">{rows}</div> : rows}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* IosWidget */\n/* ------------------------------------------------------------------ */\n\nexport interface IosWidgetProps {\n title: string;\n description?: string;\n icon: SizedIcon;\n color: CardColor;\n path?: string;\n badge?: string;\n className?: string;\n onClick?: () => void;\n}\n\n/** The iOS 2x2 widget: occupies the grid area its parent gives it; a hue gradient, a large icon, title, brief text. */\nexport function IosWidget({ title, description, icon, color, path, badge, className, onClick }: IosWidgetProps) {\n return (\n <Destination path={path} onClick={onClick} className=\"contents\">\n <div\n data-tone={tone(color)}\n className={cn(\n \"matrx-hue-card matrx-hue-squircle flex h-full w-full cursor-pointer select-none flex-col justify-between rounded-[20px] p-3 shadow-md transition-[filter] active:brightness-90\",\n className,\n )}\n >\n <div className=\"flex items-start justify-between\">\n <div>{sizedIcon(icon, 32)}</div>\n {badge && (\n <span className=\"type-meta rounded-full bg-black/25 px-2 py-0.5 font-semibold leading-tight\">{badge}</span>\n )}\n </div>\n <div>\n <p className=\"type-title line-clamp-2 leading-tight\">{title}</p>\n {description && <p className=\"type-meta mt-0.5 line-clamp-2 leading-tight\">{description}</p>}\n </div>\n </div>\n </Destination>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* TileCard / TileCardGrid */\n/* ------------------------------------------------------------------ */\n\nexport interface TileCardProps {\n icon?: React.ReactNode;\n title?: React.ReactNode;\n description?: React.ReactNode;\n onClick?: () => void;\n href?: string;\n /** Places the tile (width, height); never how it looks. */\n className?: string;\n}\n\n/** A tall, plain tile: a primary-ink icon and title over a muted description; the border takes the brand on hover. */\nexport function TileCard({ icon, title, description, onClick, href, className }: TileCardProps) {\n const face = cn(\n \"flex h-64 cursor-pointer flex-col items-center justify-center space-y-6 rounded-xl border-2 border-border bg-muted p-4 text-xl transition-colors hover:border-primary hover:bg-accent\",\n className,\n );\n const content = (\n <>\n {icon && <div className=\"h-12 w-12 text-primary-ink\">{icon}</div>}\n {title && <span className=\"font-medium text-primary-ink\">{title}</span>}\n {description && <p className=\"type-secondary mt-1 text-center text-muted-foreground\">{description}</p>}\n </>\n );\n return href ? (\n <HostLink href={href} className={face}>\n {content}\n </HostLink>\n ) : (\n <div onClick={onClick} className={face}>\n {content}\n </div>\n );\n}\n\nexport interface TileCardGridProps {\n title?: React.ReactNode;\n description?: React.ReactNode;\n cards: TileCardProps[];\n /** 1 to 4 columns from the md breakpoint. Default 2. */\n columns?: 1 | 2 | 3 | 4;\n className?: string;\n}\n\nconst TILE_COLUMNS = { 1: \"md:grid-cols-1\", 2: \"md:grid-cols-2\", 3: \"md:grid-cols-3\", 4: \"md:grid-cols-4\" } as const;\n\nexport function TileCardGrid({ title, description, cards, columns = 2, className }: TileCardGridProps) {\n return (\n <div className={cn(\"w-full\", className)}>\n {(title || description) && (\n <div className=\"pb-8 text-center\">\n {title && <h2 className=\"text-2xl font-bold text-foreground md:text-3xl\">{title}</h2>}\n {description && <p className=\"mt-2 text-muted-foreground\">{description}</p>}\n </div>\n )}\n <div className={cn(\"grid grid-cols-1 gap-6\", TILE_COLUMNS[columns] ?? TILE_COLUMNS[2])}>\n {cards.map((card, index) => (\n <TileCard key={index} {...card} />\n ))}\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["React","Fragment","jsx","Button","parseDateOnly","toDateOnly","React","v","Fragment","jsx","jsxs","toDateOnly","parseDateOnly","days","useState","useEffect","jsx","jsxs","useState","useEffect","jsx","jsxs","state","step","useEffect","useState","jsx","useState","useEffect","useState","forwardRef","jsx","jsxs","forwardRef","useState","useState","jsx","jsxs","useState","jsx","jsx","jsx","jsxs","jsx","jsxs","TONE","tone","Button","React","jsx","jsxs","useEffect","useRef","useState","jsx","jsxs","useState","useRef","useEffect","Button","useRef","useState","jsx","jsxs","useRef","useState","Button","useState","jsx","jsxs","useState","jsx","jsxs","tone","React","jsx","jsxs","jsx","jsxs","Button","jsx","jsxs","React","jsx","jsxs","useState","useLayoutEffect","useRef","React","text","Button","copyText","toast","openClipboardFallback","React","jsx","jsxs","copyText","toast","openClipboardFallback","Button","jsx","Fragment","jsx","jsxs","tone","React","jsx","jsxs","Button","useState","jsx","jsxs","useState","React","jsx","jsxs","Button","React","jsx","jsxs","React","jsx","jsxs","React","jsx","React","jsx","jsxs","React","jsx","jsxs","IconSelectTrigger","Button","React","copyText","openClipboardFallback","toast","jsx","jsxs","Button","Fragment","jsx","jsxs","copyText","toast","openClipboardFallback","jsx","jsxs","TONE","tone","Button","React","Fragment","jsx","jsxs"]}
|