@ai-matrx/design-system 0.86.350 → 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 +5 -0
- package/dist/carousel.js +2 -2
- package/dist/{chunk-BCGNEWZM.js → chunk-FLWSEDUW.js} +2 -2
- package/dist/{chunk-UTADJKVR.js → chunk-GMNROZQJ.js} +3 -3
- package/dist/{chunk-UTADJKVR.js.map → chunk-GMNROZQJ.js.map} +1 -1
- package/dist/{chunk-SC3XPADZ.js → chunk-UGQRAQTE.js} +431 -342
- package/dist/chunk-UGQRAQTE.js.map +1 -0
- package/dist/controls.cjs +547 -458
- package/dist/controls.cjs.map +1 -1
- package/dist/controls.css +27 -18
- package/dist/controls.d.cts +51 -3
- package/dist/controls.d.ts +51 -3
- package/dist/controls.js +10 -2
- package/dist/data-table/index.cjs +45 -38
- package/dist/data-table/index.cjs.map +1 -1
- package/dist/data-table/index.js +44 -37
- package/dist/data-table/index.js.map +1 -1
- package/dist/desktop.cjs +90 -29
- package/dist/desktop.cjs.map +1 -1
- package/dist/desktop.css +19 -0
- package/dist/desktop.d.cts +1 -1
- package/dist/desktop.d.ts +1 -1
- package/dist/desktop.js +90 -29
- package/dist/desktop.js.map +1 -1
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/settings.cjs +2 -2
- package/dist/settings.cjs.map +1 -1
- package/dist/settings.js +1 -1
- package/dist/writing-field.cjs +2 -2
- package/dist/writing-field.cjs.map +1 -1
- package/dist/writing-field.js +1 -1
- package/package.json +2 -2
- package/dist/chunk-SC3XPADZ.js.map +0 -1
- /package/dist/{chunk-BCGNEWZM.js.map → chunk-FLWSEDUW.js.map} +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.86.351
|
|
4
|
+
|
|
5
|
+
- New `Checklist`, `ChecklistItem`, `ChecklistMark` and `ChecklistMeter` controls: a status-marked list of conditions with a segmented progress meter and one action slot per row. Additive; no consumer action required.
|
|
6
|
+
- `Tile` gains `iconTone` (a `ChipTone`): the icon alone becomes a 28px colored square while the card stays neutral — a grid of actions where each job keeps its hue. Additive; no consumer action required.
|
|
7
|
+
|
|
3
8
|
## 0.86.350
|
|
4
9
|
|
|
5
10
|
- `Button` gains `variant="meta"`: a section heading's own action ("Edit" beside "Pinned") at the heading's 11px/500 meta size, muted ink, full ink on hover. `Tile layout="icon" dense`: the sidebar pinned grid's tight launcher tile (2.75rem, one-line label that ellipsizes, never broken mid-word). Additive; no consumer action required.
|
package/dist/carousel.js
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import {
|
|
3
3
|
IconButton
|
|
4
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-UGQRAQTE.js";
|
|
5
5
|
import "./chunk-6NOLVA4E.js";
|
|
6
6
|
import "./chunk-5IR3BZOS.js";
|
|
7
7
|
import "./chunk-ZRHVA3DL.js";
|
|
8
8
|
import "./chunk-XERGQT2M.js";
|
|
9
9
|
import "./chunk-WQ2QCMMA.js";
|
|
10
10
|
import "./chunk-YRF22M5S.js";
|
|
11
|
-
import "./chunk-
|
|
11
|
+
import "./chunk-GMNROZQJ.js";
|
|
12
12
|
import "./chunk-K4XCB576.js";
|
|
13
13
|
import "./chunk-HKLIRHT2.js";
|
|
14
14
|
import "./chunk-DRSBLHOF.js";
|
|
@@ -9,7 +9,7 @@ import {
|
|
|
9
9
|
} from "./chunk-VQQ3O7J5.js";
|
|
10
10
|
import {
|
|
11
11
|
ConfirmDialog
|
|
12
|
-
} from "./chunk-
|
|
12
|
+
} from "./chunk-GMNROZQJ.js";
|
|
13
13
|
import {
|
|
14
14
|
ErrorBox
|
|
15
15
|
} from "./chunk-HKLIRHT2.js";
|
|
@@ -778,4 +778,4 @@ export {
|
|
|
778
778
|
CanvasLayout,
|
|
779
779
|
ModeSwitch
|
|
780
780
|
};
|
|
781
|
-
//# sourceMappingURL=chunk-
|
|
781
|
+
//# sourceMappingURL=chunk-FLWSEDUW.js.map
|
|
@@ -279,12 +279,12 @@ function SettingRow({ label, line, htmlFor, children, className }) {
|
|
|
279
279
|
] });
|
|
280
280
|
}
|
|
281
281
|
var Tile = React2.forwardRef(
|
|
282
|
-
({ layout = "row", variant = "outline", icon, title, wrapTitle, line, end, selected, selectedStyle, tooltip, level, fit, endInset, oneLine, dashed, hoverStyle, danger, dimmed, glyphTone, hero, tone, dense, asChild = false, className, children, onClick, type, ...props }, ref) => {
|
|
282
|
+
({ layout = "row", variant = "outline", icon, title, wrapTitle, line, end, selected, selectedStyle, tooltip, level, fit, endInset, oneLine, dashed, hoverStyle, danger, dimmed, glyphTone, hero, tone, iconTone, dense, asChild = false, className, children, onClick, type, ...props }, ref) => {
|
|
283
283
|
const Component = asChild ? Slot : "button";
|
|
284
284
|
const ariaDisabled = props["aria-disabled"];
|
|
285
285
|
const inert = ariaDisabled === true || ariaDisabled === "true";
|
|
286
286
|
const body = /* @__PURE__ */ jsxs3(Fragment, { children: [
|
|
287
|
-
icon ? /* @__PURE__ */ jsx3("span", { className: "matrx-tile-icon", children: icon }) : null,
|
|
287
|
+
icon ? /* @__PURE__ */ jsx3("span", { className: "matrx-tile-icon", "data-tone": iconTone && iconTone !== "neutral" ? iconTone : void 0, children: icon }) : null,
|
|
288
288
|
/* @__PURE__ */ jsxs3("span", { className: "matrx-tile-text", children: [
|
|
289
289
|
/* @__PURE__ */ jsx3("span", { className: "matrx-tile-title", children: title }),
|
|
290
290
|
line ? /* @__PURE__ */ jsx3("span", { className: "matrx-tile-line", children: line }) : null
|
|
@@ -482,4 +482,4 @@ export {
|
|
|
482
482
|
DangerZone,
|
|
483
483
|
PromoBanner
|
|
484
484
|
};
|
|
485
|
-
//# sourceMappingURL=chunk-
|
|
485
|
+
//# sourceMappingURL=chunk-GMNROZQJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/alert-dialog.tsx","../src/confirm-dialog.tsx","../src/controls/surfaces.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * AlertDialog — the confirm/destroy surface (78 host import sites).\n *\n * Ported from matrx-frontend `components/ui/alert-dialog.tsx`, which was the\n * only variant in the fleet that had been hardened. Its rulings, kept verbatim:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate a\n * wrapper once carried (\"Radix ids differ between SSR and client\") was\n * false, and it deleted always-visible Triggers (delete buttons, mostly)\n * from SSR and the first client paint.\n *\n * 2. AN UNDESCRIBED ALERT DIALOG STILL DESCRIBES ITSELF. A confirm dialog with\n * no `AlertDialogDescription` gets a screen-reader-only one rather than a\n * console warning — the surface where a blind user is about to destroy\n * something is the wrong place to ship an accessibility gap.\n *\n * ADDED HERE, from the same doctrine `Dialog` already carries and this\n * component demonstrably needed:\n *\n * 3. IT IS CLAMPED TO THE VIEWPORT AND SCROLLS INSIDE ITSELF\n * (`max-h-[85dvh] overflow-y-auto`). The host copy was NOT — an alert\n * dialog whose body listed what is about to be deleted pushed Cancel and\n * Continue below the fold on a short viewport, and the only way out was a\n * backdrop click. On an ALERT dialog Radix does not dismiss on backdrop\n * click, so the surface was a genuine dead end. Recorded in CHANGELOG as a\n * real defect fixed in the port, not \"preserved\".\n *\n * 4. THE ACTIONS ARE 44px TALL ON COARSE POINTERS. `AlertDialogAction` and\n * `AlertDialogCancel` inherit the package Button's own target rules through\n * `buttonVariants`; the footer keeps them safe-area padded on mobile.\n *\n * 5. THE STICKY FOOTER NEVER PAINTS OVER THE BODY (0.11.3). Ruling 3's footer\n * bled over the card's bottom padding with a negative block margin, and\n * `position: sticky` clamps a box to its containing block — so the footer\n * was dragged UP by `--dialog-pad` against the card's `gap-4`, covering the\n * last 8px of the consequence copy at every length, unreachable because the\n * card did not scroll. The bleed is now the card's RESERVATION\n * (`.matrx-dialog-card` hands its bottom padding to the footer), which\n * sticky has nothing to clamp. See `sticky-footer-geometry.test.tsx`.\n *\n * SEAM INVERSION. The host resolved its portal target through\n * `usePopoutContainer` (its window-panel popout body); here that is the\n * package's `PortalContainerProvider`, with an explicit `container` prop still\n * winning.\n */\n\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport * as React from \"react\";\n\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./cn\";\nimport { useModalLayer } from \"./floating-layer\";\nimport { CENTERED_DIALOG, MOTION_DIALOG, MOTION_OVERLAY } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\nimport { keepMovedFocus } from \"./focus-return\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\n/**\n * Portal-seam-aware AlertDialogPortal. Explicit `container` wins; with none,\n * the injected container; with neither, Radix's `document.body`.\n */\nconst AlertDialogPortal = ({\n container,\n ...props\n}: Omit<\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Portal>,\n \"container\"\n> & {\n /** `undefined` → use the injected container; `null` → force document.body. */\n container?: HTMLElement | null | undefined;\n}) => {\n const resolved = usePortalContainer(container);\n return (\n <AlertDialogPrimitive.Portal container={resolved ?? null} {...props} />\n );\n};\nAlertDialogPortal.displayName = \"AlertDialogPortal\";\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n ref={ref}\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\n/**\n * Unstyled, non-portalling Content for custom layouts. AlertDialog is always\n * modal, so `aria-modal` is stated rather than derived.\n */\nconst AlertDialogContentPrimitive = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ onCloseAutoFocus, ...props }, ref) => {\n // Always blocking: floating layers opened from it stack above its scrim.\n useModalLayer(true);\n return <AlertDialogPrimitive.Content {...props} ref={ref} aria-modal=\"true\" onCloseAutoFocus={keepMovedFocus(onCloseAutoFocus)} />;\n});\nAlertDialogContentPrimitive.displayName = \"AlertDialogContentPrimitive\";\n\nconst AlertDialogDescription = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName;\n\nexport interface AlertDialogContentProps\n extends React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honors `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst AlertDialogContent = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Content>,\n AlertDialogContentProps\n>(({ className, children, container, animated = true, ...props }, ref) => {\n const hasDescription =\n treeContainsComponent(children, AlertDialogDescription) ||\n treeContainsComponent(children, AlertDialogPrimitive.Description);\n return (\n <AlertDialogPortal container={container}>\n <AlertDialogOverlay />\n <AlertDialogContentPrimitive\n ref={ref}\n data-slot=\"alert-dialog-content\"\n className={cn(\n `matrx-dialog-card fixed left-[50%] top-[50%] z-[10000] grid min-w-0 w-full max-w-lg ${CENTERED_DIALOG} gap-4 border bg-background p-6 shadow-lg`,\n // Ruling 3 — never taller than the viewport, always scrollable, and\n // the footer stays reachable via --dialog-pad like Dialog's.\n // Ruling 5 (0.11.3) — `matrx-dialog-card` hands the bottom padding to\n // a sticky footer when there is one, so the footer's box matches the\n // space the grid gave it and sticky never clamps it up over the\n // consequence copy.\n \"max-h-[85dvh] overflow-y-auto overscroll-contain [--dialog-pad:1.5rem] overflow-x-clip [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full\",\n \"sm:rounded-lg\",\n animated && MOTION_DIALOG,\n className,\n )}\n {...props}\n >\n {hasDescription ? null : (\n <AlertDialogPrimitive.Description className=\"sr-only\">\n Please confirm the action described in this dialog.\n </AlertDialogPrimitive.Description>\n )}\n {children}\n </AlertDialogContentPrimitive>\n </AlertDialogPortal>\n );\n});\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"flex flex-col space-y-2 text-center sm:text-left\", className)}\n {...props}\n />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end sm:gap-0 sm:space-x-2\",\n // Ruling 3/4 — sticky to the card edges so a scrolled body never shows\n // through under the actions, and safe-area padded on a phone.\n //\n // 🚨 THERE IS NO `mb-[…]` HERE, AND THERE MUST NEVER BE ONE AGAIN\n // (0.11.3, feedback bf8fb00b). The bleed over the card's bottom padding\n // used to be a NEGATIVE BLOCK MARGIN, which makes this box taller than\n // the grid area the card allocates it — and `position: sticky` CLAMPS a\n // box to its containing block, so the browser yanked the footer UP by\n // `--dialog-pad` against the card's `gap-4` and painted 8px of opaque\n // footer over the last line of the consequence, at every length. The\n // card now RESERVES this footer's block size instead (`matrx-dialog-card`\n // in styles.css hands over its `padding-bottom`), so the bleed costs no\n // margin at all. Guard: `sticky-footer-geometry.test.tsx`.\n //\n // These stay UTILITIES rather than a shipped rule so a caller's\n // `className` still wins through tailwind-merge — a shipped rule would\n // have to be unlayered to survive Tailwind preflight (§ THE PREFLIGHT\n // RULE in styles.css) and would then override every caller's padding.\n \"sticky bottom-0 z-10 bg-background pt-3\",\n \"mx-[calc(var(--dialog-pad,0px)*-1)] px-[var(--dialog-pad,0px)] pb-[var(--dialog-pad,0px)]\",\n className,\n )}\n {...props}\n />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n data-slot=\"alert-dialog-action\"\n className={cn(buttonVariants(), className)}\n {...props}\n />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n data-slot=\"alert-dialog-cancel\"\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className,\n )}\n {...props}\n />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogContentPrimitive,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n};\n","\"use client\";\n\n/**\n * ConfirmDialog — the `window.confirm` replacement, declarative half.\n *\n * WHY IT LIVES HERE AND NOT IN `@ai-matrx/kit` (census row 19i, decided by the\n * package-graph ruling of 2026-09-07, on the row-20a Tooltip precedent).\n *\n * kit shipped this dialog with its own inlined AlertDialog, its own inlined\n * button class strings, a hardcoded 80%-opaque black scrim, and\n * `data-[state=open]:animate-in … zoom-in-95 … slide-in-from-top-[48%]` —\n * host-plugin utilities `tailwindcss-animate`/`tw-animate-css` supply and a\n * package cannot ship. kit ships NO stylesheet at all, so in three of the four\n * consumers the most consequential surface in the app (the one standing\n * between a user and a destroyed thing) appeared with no animation, no error,\n * and a scrim that ignored the theme. kit could not import the fix:\n * `@ai-matrx/design-system` depends on `@ai-matrx/kit`, so importing back is a\n * cycle; giving kit its own sheet would invent a second required-CSS contract\n * no consumer performs (the C26 silent host contract, one layer down).\n *\n * The resolution is the one row 20a already proved: the surface moves to the\n * package that owns the surface. This file is built on THIS package's\n * `AlertDialog` — so it inherits, for free and forever:\n *\n * - the package motion layer (`matrx-motion-overlay` / `matrx-motion-dialog`),\n * whose rules ship in `styles.css` and are proven present in the tarball;\n * - `--matrx-overlay-scrim`, a token that answers to the host's theme,\n * instead of an opaque black literal;\n * - AlertDialog ruling 3 — clamped to `max-h-[85dvh]`, scrolling inside\n * itself, with a sticky footer. **This is what makes the consequence-first\n * copy law survivable**: a confirmation that names everything it is about\n * to destroy can be long, and in kit's copy a long one pushed Cancel and\n * Continue below the fold of a short viewport with no backdrop dismissal —\n * a dead end on a destructive action;\n * - `buttonVariants` as the ONE source of button appearance, including the\n * 44px coarse-pointer target;\n * - `PortalContainerProvider`, so a dialog opened inside a popped-out window\n * panel renders in THAT window's document.\n *\n * kit keeps `./confirm-opener` — the pure, React-free imperative `confirm()`\n * and its `globalThis`-slotted host registry — and re-exports nothing of this.\n * Consumers mount `<ConfirmDialogHost />` from here and call `confirm()` from\n * there. See `confirm-host.tsx` for the join.\n *\n * BEHAVIOR IS THE KIT PORT, VERBATIM. Every prop, default and interaction is\n * unchanged; only the chrome underneath it is the package's.\n *\n * Pattern: hold the pending target in state, render `<ConfirmDialog />` once at\n * the bottom of the component, and open it by setting the target. When busy\n * state is meaningful (a network delete that should hold the dialog open with a\n * spinner), use THIS component inline; the imperative `confirm()` closes\n * immediately on click.\n */\n\nimport * as React from \"react\";\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./alert-dialog\";\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./cn\";\nimport { Loader2Icon } from \"./icons\";\nimport { MOTION_SPIN } from \"./motion\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: React.ReactNode;\n /**\n * THE CONSEQUENCE. Per the platform's destructive-and-expensive-actions law,\n * a confirmation must name what is lost, what is duplicated, and/or what it\n * costs — \"Are you sure?\" is not a confirmation. This renders as the dialog's\n * accessible description, so a screen-reader user is told the consequence\n * too, and it is never clamped or truncated.\n */\n description?: React.ReactNode | undefined;\n /**\n * Rich body rendered between the header and the footer. Use it for\n * supplementary or interactive content that is not part of the dialog's\n * accessible consequence description.\n */\n content?: React.ReactNode | undefined;\n /** Extra classes for the dialog content (e.g. a wider max-w for diffs). */\n contentClassName?: string | undefined;\n confirmLabel?: string | undefined;\n /**\n * `null` hides the cancel button entirely — for acknowledge-only dialogs\n * where there is nothing to cancel. Anything else labels it.\n */\n cancelLabel?: string | null | undefined;\n variant?: \"default\" | \"destructive\" | undefined;\n busy?: boolean | undefined;\n /**\n * Blocks confirming without pretending work is in flight. For a dialog whose\n * `content` asks the user something the action cannot proceed without — the\n * choice is missing, not loading — `busy` would show a misleading spinner.\n */\n confirmDisabled?: boolean | undefined;\n /**\n * The question is not answerable yet — Confirm is ABSENT, not disabled (a\n * control is absent or honest, never dead). The body carries its own loading\n * state; Cancel stays. Set by `ConfirmDialogHost` while `ConfirmOptions.ready`\n * is pending (0.54.0).\n */\n confirmHeld?: boolean | undefined;\n /**\n * Explicit portal target. Default (undefined): the container injected by\n * `PortalContainerProvider`, else `document.body`. Hosts with retargeting\n * needs (a popped-out browser window whose dialog must render in THAT\n * window's document) may still pass the element directly.\n */\n portalContainer?: HTMLElement | null | undefined;\n onConfirm: () => void | Promise<void>;\n}\n\n/**\n * Drop-in replacement for `window.confirm`. Use this anywhere you would\n * otherwise reach for a browser-level confirm dialog.\n */\nexport function ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n content,\n contentClassName,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n busy = false,\n confirmDisabled = false,\n confirmHeld = false,\n portalContainer,\n onConfirm,\n}: ConfirmDialogProps) {\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent\n className={contentClassName}\n {...(portalContainer === undefined ? {} : { container: portalContainer })}\n >\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n {description ? (\n <AlertDialogDescription asChild>\n <div>{description}</div>\n </AlertDialogDescription>\n ) : null}\n </AlertDialogHeader>\n {content ?? null}\n <AlertDialogFooter>\n {cancelLabel === null ? null : (\n <AlertDialogCancel className=\"max-lg:min-h-11\" disabled={busy}>\n {cancelLabel}\n </AlertDialogCancel>\n )}\n {confirmHeld ? null : (\n <AlertDialogAction\n disabled={busy || confirmDisabled}\n onClick={(event) => {\n event.preventDefault();\n void onConfirm();\n }}\n className={cn(\n \"max-lg:min-h-11\",\n // One source of button appearance: the destructive look comes\n // from `buttonVariants`, not a second hand-written copy of it.\n // tailwind-merge makes it WIN over the default variant classes.\n variant === \"destructive\" &&\n buttonVariants({ variant: \"destructive\" }),\n )}\n >\n {busy ? (\n <Loader2Icon className={cn(\"mr-2 h-4 w-4\", MOTION_SPIN)} />\n ) : null}\n {confirmLabel}\n </AlertDialogAction>\n )}\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","\"use client\";\n\n/**\n * The settled surfaces that hold the one control (owner, 2026-10-02/03):\n * one surface level, ~36px hairline rows, 8px radius; the empty state; the\n * region-shaped skeleton; the three delete tiers; the one-feature promo banner.\n * Skins are locked in `controls.css` like the controls themselves.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\n\nimport { swallowClick } from \"../button\";\nimport { cn } from \"../cn\";\nimport { ConfirmDialog } from \"../confirm-dialog\";\nimport { ChevronRightIcon, Trash2Icon } from \"../icons\";\nimport { Skeleton } from \"../skeleton\";\nimport { Button, ControlRow, type ChipTone, type GlyphTone } from \"./controls\";\n\n/* ------------------------------------------------------------------ */\n/* Row groups */\n/* ------------------------------------------------------------------ */\n\nexport interface RowGroupProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n /** 11px uppercase heading above the group. */\n title?: React.ReactNode;\n /** The danger-zone skin (delete tier 3). */\n danger?: boolean;\n}\n\n/** A bordered group of hairline rows — the one surface for grouped content. */\nexport function RowGroup({ title, danger, className, children, ...props }: RowGroupProps) {\n return (\n <section\n data-matrx-row-group=\"\"\n data-danger={danger ? \"\" : undefined}\n className={cn(\"matrx-control-group\", className)}\n {...props}\n >\n {title ? <h2 className=\"matrx-control-group-title\">{title}</h2> : null}\n <div className=\"matrx-control-group-body\">{children}</div>\n </section>\n );\n}\n\nexport interface SettingRowProps {\n label: React.ReactNode;\n /** One 12px line under the label. */\n line?: React.ReactNode;\n /** Ties the label to the control it describes. */\n htmlFor?: string;\n /** The row's controls, right-aligned on one line. */\n children?: React.ReactNode;\n className?: string;\n}\n\n/** One ~36px row: 13px label, optional 12px line, controls on the right. */\nexport function SettingRow({ label, line, htmlFor, children, className }: SettingRowProps) {\n return (\n <div data-matrx-setting-row=\"\" className={cn(\"matrx-control-setting-row\", className)}>\n <div className=\"matrx-control-setting-text\">\n {htmlFor ? (\n <label htmlFor={htmlFor} className=\"matrx-control-setting-label\">\n {label}\n </label>\n ) : (\n <div className=\"matrx-control-setting-label\">{label}</div>\n )}\n {line ? <div className=\"matrx-control-setting-line\">{line}</div> : null}\n </div>\n {children ? (\n <ControlRow nowrap data-matrx-row-actions=\"\">\n {children}\n </ControlRow>\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Tile — the pressable row / tile (a choice, a destination) */\n/* ------------------------------------------------------------------ */\n\nexport type TileLayout = \"row\" | \"stack\" | \"adaptive\" | \"icon\";\n\nexport interface TileProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"title\"> {\n /** `row` (default): glyph, then a 13px title over a 12px line, start-aligned, full width — a\n * choice in a list, a quick action. `stack`: glyph on top, title and line under it — a grid\n * tile. `adaptive`: `stack` from the `sm` breakpoint (640px) up, a compact `row` below it — a\n * grid of option cards that becomes a list on a phone. `icon`: the launcher tile of an icon\n * grid (a \"Can make\" grid, a sidebar's pinned apps, a copy palette) — the glyph centered over\n * an 11px label centered under it, up to two lines, no frame, a pick is a soft tint, `end`\n * is a badge on the top corner, `line` is hidden. All are taller than a control: they carry\n * text, so they never take the 28px lock. */\n layout?: TileLayout;\n /** `outline` (default): the bordered card skin. `quiet`: no frame until hover — a row in a\n * menu-like list. */\n variant?: \"outline\" | \"quiet\";\n /** Leading 16px glyph (an avatar or image works too). */\n icon?: React.ReactNode;\n /** The 13px title. */\n title: React.ReactNode;\n /** The title wraps over several lines (up to 6) instead of one line with an ellipsis: a quiz\n * answer, a step, a sentence-long choice. Off by default — a short title is one line. */\n wrapTitle?: boolean;\n /** One 12px secondary line (clamped to two lines; one with `oneLine`). */\n line?: React.ReactNode;\n /** The `line` stays ONE line with an ellipsis, so every row of a master list keeps one height. */\n oneLine?: boolean;\n /** Trailing content in a row (a chevron, a count, a shortcut). */\n end?: React.ReactNode;\n /** A choice: `true` tints it and sets `aria-pressed`; `false` sets `aria-pressed=\"false\"`. A link tile (`asChild`) never sets `aria-pressed`: the caller sets `aria-current`. */\n selected?: boolean;\n /** How `selected` looks. `outline` (default): primary frame and tint. `fill`: a soft neutral fill,\n * no outline, ink unchanged — a sidebar's active row. `primary`: the solid primary fill with\n * every ink (title, line, glyph, end) on primary — the open item of a master list. */\n selectedStyle?: \"outline\" | \"fill\" | \"primary\";\n /** The hover / focus tooltip (the native `title` attribute: `title` is the visible label). */\n tooltip?: string;\n /** Nesting depth under a parent row: each level moves the row's start past one glyph and its\n * gap, so an icon-less child's title starts where its parent's title does. */\n level?: 1 | 2 | 3;\n /** Size to the content and never shrink or truncate the title — a code, a short value. */\n fit?: boolean;\n /** Keep room at the row's end for a control laid OVER it (a row's More button): `control`\n * reserves one control's width plus its gap, so the title never runs under it. */\n endInset?: \"control\";\n /** A dashed border: the \"add another\" tile (an empty slot to fill), never a choice. */\n dashed?: boolean;\n /** hoverStyle=\"fill\": the pointer's soft neutral fill (the desktop look's secondary fill) instead of the accent. */\n hoverStyle?: \"fill\";\n /** A destructive row (Remove, Delete): destructive title and glyph, destructive hover tint. */\n danger?: boolean;\n /**\n * A choice that is ALREADY USED elsewhere (an option already placed, a field already mapped): a\n * faint shade and quieter ink, still fully pressable — a hint for the eye, never a disabled state.\n */\n dimmed?: boolean;\n /** The glyph's own status ink when its color carries meaning (Button's `glyphTone`). */\n glyphTone?: GlyphTone;\n /** The inviting choice card for a front door: roomy padding, a 40px icon square, a 14px title. */\n hero?: boolean;\n /** Tint card, edge and icon square from one `ChipTone` (the `Chip` hue tokens). */\n tone?: ChipTone;\n /** A 28px navigation / filter row for sidebars and dense lists: `min-height` is the control size,\n * padding 4px 8px, gap 8px, 13px title. The `line` is HIDDEN when dense (one line, always).\n * `variant=\"quiet\"` + `dense` is a clean nav row: transparent until hover / selected. */\n dense?: boolean;\n /** Render the one child element (a link) with the tile's skin; its children are ignored —\n * the tile draws `icon`/`title`/`line`/`end`. */\n asChild?: boolean;\n}\n\n/**\n * THE pressable row / tile: two named layouts, two skins, no size. `className` places it\n * (width, grid cell); its height follows its text.\n */\nexport const Tile = React.forwardRef<HTMLButtonElement, TileProps>(\n (\n { layout = \"row\", variant = \"outline\", icon, title, wrapTitle, line, end, selected, selectedStyle, tooltip, level, fit, endInset, oneLine, dashed, hoverStyle, danger, dimmed, glyphTone, hero, tone, dense, asChild = false, className, children, onClick, type, ...props },\n ref,\n ) => {\n const Component = asChild ? Slot : \"button\";\n const ariaDisabled = props[\"aria-disabled\"];\n const inert = ariaDisabled === true || ariaDisabled === \"true\";\n const body = (\n <>\n {icon ? <span className=\"matrx-tile-icon\">{icon}</span> : null}\n <span className=\"matrx-tile-text\">\n <span className=\"matrx-tile-title\">{title}</span>\n {line ? <span className=\"matrx-tile-line\">{line}</span> : null}\n </span>\n {end ? <span className=\"matrx-tile-end\">{end}</span> : null}\n </>\n );\n return (\n <Component\n ref={ref}\n type={asChild ? undefined : (type ?? \"button\")}\n data-matrx-tile=\"\"\n data-layout={layout}\n data-variant={variant}\n data-selected={selected ? \"\" : undefined}\n data-selected-style={selected && (selectedStyle === \"fill\" || selectedStyle === \"primary\") ? selectedStyle : undefined}\n data-level={level}\n data-fit={fit ? \"\" : undefined}\n data-one-line={oneLine ? \"\" : undefined}\n data-end-inset={endInset}\n data-dashed={dashed ? \"\" : undefined}\n data-hover-style={hoverStyle}\n title={tooltip}\n data-danger={danger ? \"\" : undefined}\n data-dimmed={dimmed ? \"\" : undefined}\n data-wrap-title={wrapTitle ? \"\" : undefined}\n data-glyph-tone={glyphTone}\n data-hero={hero ? \"\" : undefined}\n data-dense={dense ? \"\" : undefined}\n data-tone={tone}\n aria-pressed={asChild || selected === undefined ? undefined : selected}\n className={cn(\"matrx-tile\", className)}\n {...props}\n onClick={inert ? swallowClick : onClick}\n >\n {asChild && React.isValidElement(children) ? (\n React.cloneElement(children as React.ReactElement<{ children?: React.ReactNode }>, undefined, body)\n ) : (\n body\n )}\n </Component>\n );\n },\n);\nTile.displayName = \"Tile\";\n\n/* ------------------------------------------------------------------ */\n/* Section disclosure header */\n/* ------------------------------------------------------------------ */\n\nexport type DisclosureHeaderVariant = \"row\" | \"label\";\n\nexport interface DisclosureHeaderProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"title\"> {\n /** Whether the section under the header is showing. Sets `aria-expanded`. */\n open: boolean;\n /** `row` (default): a 13px/500 title — a collapsible section, a group of results, a \"details\"\n * fold. `label`: the 11px uppercase muted label that heads a sidebar or menu group. */\n variant?: DisclosureHeaderVariant;\n /** Optional 16px glyph after the chevron (row variant). */\n icon?: React.ReactNode;\n /** Colors ONLY the icon: a status tone uses its `-ink` token, a hue its `--matrx-chip-<hue>-ink`.\n * A section that carries a color (violet Organization, amber Projects) keeps it here. */\n glyphTone?: GlyphTone | ChipTone;\n /** The section's name. */\n title: React.ReactNode;\n /** A short muted fact after the title: a count, a size, \"3 of 12\". Never a sentence. */\n meta?: React.ReactNode;\n /** Trailing content pinned to the end (a status glyph, a count badge). Non-interactive — a\n * control beside the header sits outside it, never inside the button. */\n end?: React.ReactNode;\n /** One 12px secondary line under the title (row variant) — what the section holds. */\n line?: React.ReactNode;\n /** Where the turning chevron sits. `start` (default) leads the row; `end` trails it, for a\n * sidebar section whose label keeps the column's left edge. */\n chevron?: \"start\" | \"end\";\n}\n\n/**\n * THE section-disclosure header: a chevron that turns, a title, an optional count and trailing\n * status — one full-width pressable row that opens and closes the section below it. Every\n * \"click the heading to fold\" row is this, never a raw button with a hand-drawn chevron.\n */\nexport const DisclosureHeader = React.forwardRef<HTMLButtonElement, DisclosureHeaderProps>(\n ({ open, variant = \"row\", icon, glyphTone, title, meta, end, line, chevron = \"start\", className, type, ...props }, ref) => (\n <button\n ref={ref}\n type={type ?? \"button\"}\n aria-expanded={open}\n data-matrx-disclosure=\"\"\n data-variant={variant}\n data-open={open ? \"\" : undefined}\n data-chevron={chevron}\n className={cn(\"matrx-disclosure\", className)}\n {...props}\n >\n {chevron === \"start\" ? (\n <span className=\"matrx-disclosure-chevron\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n ) : null}\n {icon ? (\n <span className=\"matrx-disclosure-icon\" data-glyph-tone={glyphTone}>\n {icon}\n </span>\n ) : null}\n {line ? (\n <span className=\"matrx-disclosure-text\">\n <span className=\"matrx-disclosure-title\">{title}</span>\n <span className=\"matrx-disclosure-line\">{line}</span>\n </span>\n ) : (\n <span className=\"matrx-disclosure-title\">{title}</span>\n )}\n {meta === undefined || meta === null || meta === false ? null : (\n <span className=\"matrx-disclosure-meta\">{meta}</span>\n )}\n {end ? <span className=\"matrx-disclosure-end\">{end}</span> : null}\n {chevron === \"end\" ? (\n <span className=\"matrx-disclosure-chevron\" data-end=\"\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n ) : null}\n </button>\n ),\n);\nDisclosureHeader.displayName = \"DisclosureHeader\";\n\n/* ------------------------------------------------------------------ */\n/* Empty state */\n/* ------------------------------------------------------------------ */\n\nexport interface EmptyStateProps {\n /** A 20px glyph inside the tinted disc. */\n icon: React.ReactNode;\n /** 13px title. */\n title: React.ReactNode;\n /** One 12px line. */\n line?: React.ReactNode;\n /** The one 28px action (a controls `Button`). */\n action?: React.ReactNode;\n className?: string;\n}\n\n/** Tinted icon disc + 13px title + one line + one 28px button. */\nexport function EmptyState({ icon, title, line, action, className }: EmptyStateProps) {\n return (\n <div data-matrx-empty-state=\"\" className={cn(\"matrx-control-empty\", className)}>\n <div className=\"matrx-control-empty-disc\" aria-hidden=\"true\">\n {icon}\n </div>\n <div>\n <div className=\"matrx-control-empty-title\">{title}</div>\n {line ? <div className=\"matrx-control-empty-line\">{line}</div> : null}\n </div>\n {action ? <ControlRow className=\"justify-center\">{action}</ControlRow> : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Region skeleton */\n/* ------------------------------------------------------------------ */\n\nexport interface RegionSkeletonProps {\n /** The region's shape: hairline rows, a form's label+field pairs, or cards. */\n shape?: \"rows\" | \"form\" | \"cards\";\n /** How many rows / fields / cards. */\n count?: number;\n /** Rows: a second (meta) line under each title. */\n twoLine?: boolean;\n className?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * A skeleton shaped like the region it stands in for — never one block for a\n * page, never a spinner in the middle. A spinner belongs only inside a busy\n * control.\n */\nexport function RegionSkeleton({\n shape = \"rows\",\n count = shape === \"cards\" ? 3 : shape === \"form\" ? 4 : 8,\n twoLine = false,\n className,\n \"aria-label\": ariaLabel = \"Loading\",\n}: RegionSkeletonProps) {\n const items = Array.from({ length: count }, (_, i) => i);\n if (shape === \"form\") {\n return (\n <div aria-busy=\"true\" aria-label={ariaLabel} className={cn(\"flex flex-col gap-3\", className)}>\n {items.map((i) => (\n <div key={i} className=\"flex flex-col gap-1.5\">\n <Skeleton className=\"h-3 w-24\" />\n <Skeleton className=\"h-7 rounded-full\" />\n </div>\n ))}\n </div>\n );\n }\n if (shape === \"cards\") {\n return (\n <div aria-busy=\"true\" aria-label={ariaLabel} className={cn(\"grid gap-2 sm:grid-cols-3\", className)}>\n {items.map((i) => (\n <div key={i} className=\"flex items-center gap-3 rounded-lg border border-border p-3\">\n <Skeleton className=\"size-8 rounded-full\" />\n <div className=\"flex flex-1 flex-col gap-1.5\">\n <Skeleton className=\"h-3.5 w-2/3\" />\n <Skeleton className=\"h-2.5 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n return (\n <div aria-busy=\"true\" aria-label={ariaLabel} className={cn(\"divide-y divide-border\", className)}>\n {items.map((i) => (\n <div key={i} className=\"flex min-h-9 items-center gap-3 px-3 py-1.5\">\n <Skeleton className=\"size-4 rounded-full\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <Skeleton className=\"h-3.5\" style={{ width: `${30 + ((i * 17) % 35)}%` }} />\n {twoLine ? <Skeleton className=\"h-2.5 w-1/4\" /> : null}\n </div>\n <Skeleton className=\"hidden h-[1.125rem] w-16 rounded-md sm:block\" />\n <Skeleton className=\"size-5 rounded-full\" />\n </div>\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* The three delete tiers */\n/* ------------------------------------------------------------------ */\n\nexport interface DeleteButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\" | \"aria-label\"> {\n /** What it deletes, e.g. \"Delete reference\". */\n \"aria-label\": string;\n}\n\n/** Tier 1 — the quiet trash glyph: muted until hover, destructive on hover. */\nexport const DeleteButton = React.forwardRef<HTMLButtonElement, DeleteButtonProps>((props, ref) => (\n <Button ref={ref} variant=\"quiet\" icon={<Trash2Icon />} data-delete=\"\" title={props[\"aria-label\"]} {...props} />\n));\nDeleteButton.displayName = \"DeleteButton\";\n\nexport interface ConfirmDeleteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** \"Delete this project?\" */\n title: React.ReactNode;\n /** REQUIRED: name the cost — what is lost, what goes with it. Never \"Are you sure?\". */\n cost: React.ReactNode;\n /** The confirm button names the act, e.g. \"Delete project\". */\n confirmLabel: string;\n onConfirm: () => void | Promise<void>;\n busy?: boolean;\n}\n\n/** Tier 2 — a confirm that names the cost. */\nexport function ConfirmDelete({ open, onOpenChange, title, cost, confirmLabel, onConfirm, busy }: ConfirmDeleteProps) {\n return (\n <ConfirmDialog\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={cost}\n confirmLabel={confirmLabel}\n variant=\"destructive\"\n busy={busy}\n onConfirm={onConfirm}\n />\n );\n}\n\n/** Tier 3 — the danger zone: a red-ruled group of rows at the end of settings. */\nexport function DangerZone({\n title = \"Danger zone\",\n children,\n className,\n}: {\n title?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <RowGroup title={title} danger className={className}>\n {children}\n </RowGroup>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Promo banner */\n/* ------------------------------------------------------------------ */\n\nexport type PromoTone = \"primary\" | \"success\" | \"warning\" | \"info\";\n\nexport interface PromoBannerProps {\n /** A 16px glyph inside the tinted disc. */\n icon: React.ReactNode;\n /** 11px label before the title, e.g. \"Next challenge\". Never a pill. */\n eyebrow?: React.ReactNode;\n /** One line, 13px. */\n title: React.ReactNode;\n /** One line, 12px, ≤60 characters. Omit rather than pad. */\n line?: React.ReactNode;\n /** Outline badges — the evidence behind the promo. */\n chips?: React.ReactNode;\n /** The one action: a controls `Button` (or a link wearing it). */\n action?: React.ReactNode;\n tone?: PromoTone;\n /**\n * Let the title wrap onto as many lines as it needs, for a sentence that must be read whole (a question with its\n * answer buttons beside it). Default false: one line, truncated.\n */\n wrap?: boolean;\n className?: string;\n /** Accessible name of the region. Defaults to \"Featured\". */\n \"aria-label\"?: string;\n}\n\n/**\n * A page-top variant that promotes ONE feature in one bordered row (~56px):\n * [disc] EYEBROW · Title / one line … [chips] [Action]. On a phone the chips\n * wrap under the text and the action stretches full width.\n */\nexport function PromoBanner({\n icon,\n eyebrow,\n title,\n line,\n chips,\n action,\n tone = \"primary\",\n wrap = false,\n className,\n \"aria-label\": ariaLabel,\n}: PromoBannerProps) {\n return (\n <section\n aria-label={ariaLabel ?? (typeof eyebrow === \"string\" ? eyebrow : \"Featured\")}\n data-matrx-promo=\"\"\n data-tone={tone}\n data-wrap={wrap ? \"\" : undefined}\n className={cn(\"matrx-control-promo\", className)}\n >\n <span className=\"matrx-control-promo-disc\" aria-hidden=\"true\">\n {icon}\n </span>\n <div className=\"matrx-control-promo-text\">\n <div className=\"matrx-control-promo-head\">\n {eyebrow ? <span className=\"matrx-control-promo-eyebrow\">{eyebrow}</span> : null}\n {eyebrow ? (\n <span className=\"matrx-control-promo-eyebrow\" aria-hidden=\"true\">\n ·\n </span>\n ) : null}\n <span className=\"matrx-control-promo-title\">{title}</span>\n </div>\n {line ? <div className=\"matrx-control-promo-line\">{line}</div> : null}\n </div>\n {chips ? <div className=\"matrx-control-promo-chips\">{chips}</div> : null}\n {action ? (\n <ControlRow nowrap className=\"matrx-control-promo-action\">\n {action}\n </ControlRow>\n ) : null}\n </section>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","React","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/alert-dialog.tsx","../src/confirm-dialog.tsx","../src/controls/surfaces.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * AlertDialog — the confirm/destroy surface (78 host import sites).\n *\n * Ported from matrx-frontend `components/ui/alert-dialog.tsx`, which was the\n * only variant in the fleet that had been hardened. Its rulings, kept verbatim:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate a\n * wrapper once carried (\"Radix ids differ between SSR and client\") was\n * false, and it deleted always-visible Triggers (delete buttons, mostly)\n * from SSR and the first client paint.\n *\n * 2. AN UNDESCRIBED ALERT DIALOG STILL DESCRIBES ITSELF. A confirm dialog with\n * no `AlertDialogDescription` gets a screen-reader-only one rather than a\n * console warning — the surface where a blind user is about to destroy\n * something is the wrong place to ship an accessibility gap.\n *\n * ADDED HERE, from the same doctrine `Dialog` already carries and this\n * component demonstrably needed:\n *\n * 3. IT IS CLAMPED TO THE VIEWPORT AND SCROLLS INSIDE ITSELF\n * (`max-h-[85dvh] overflow-y-auto`). The host copy was NOT — an alert\n * dialog whose body listed what is about to be deleted pushed Cancel and\n * Continue below the fold on a short viewport, and the only way out was a\n * backdrop click. On an ALERT dialog Radix does not dismiss on backdrop\n * click, so the surface was a genuine dead end. Recorded in CHANGELOG as a\n * real defect fixed in the port, not \"preserved\".\n *\n * 4. THE ACTIONS ARE 44px TALL ON COARSE POINTERS. `AlertDialogAction` and\n * `AlertDialogCancel` inherit the package Button's own target rules through\n * `buttonVariants`; the footer keeps them safe-area padded on mobile.\n *\n * 5. THE STICKY FOOTER NEVER PAINTS OVER THE BODY (0.11.3). Ruling 3's footer\n * bled over the card's bottom padding with a negative block margin, and\n * `position: sticky` clamps a box to its containing block — so the footer\n * was dragged UP by `--dialog-pad` against the card's `gap-4`, covering the\n * last 8px of the consequence copy at every length, unreachable because the\n * card did not scroll. The bleed is now the card's RESERVATION\n * (`.matrx-dialog-card` hands its bottom padding to the footer), which\n * sticky has nothing to clamp. See `sticky-footer-geometry.test.tsx`.\n *\n * SEAM INVERSION. The host resolved its portal target through\n * `usePopoutContainer` (its window-panel popout body); here that is the\n * package's `PortalContainerProvider`, with an explicit `container` prop still\n * winning.\n */\n\nimport * as AlertDialogPrimitive from \"@radix-ui/react-alert-dialog\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport * as React from \"react\";\n\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./cn\";\nimport { useModalLayer } from \"./floating-layer\";\nimport { CENTERED_DIALOG, MOTION_DIALOG, MOTION_OVERLAY } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\nimport { keepMovedFocus } from \"./focus-return\";\n\nconst AlertDialog = AlertDialogPrimitive.Root;\n\nconst AlertDialogTrigger = AlertDialogPrimitive.Trigger;\n\n/**\n * Portal-seam-aware AlertDialogPortal. Explicit `container` wins; with none,\n * the injected container; with neither, Radix's `document.body`.\n */\nconst AlertDialogPortal = ({\n container,\n ...props\n}: Omit<\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Portal>,\n \"container\"\n> & {\n /** `undefined` → use the injected container; `null` → force document.body. */\n container?: HTMLElement | null | undefined;\n}) => {\n const resolved = usePortalContainer(container);\n return (\n <AlertDialogPrimitive.Portal container={resolved ?? null} {...props} />\n );\n};\nAlertDialogPortal.displayName = \"AlertDialogPortal\";\n\nconst AlertDialogOverlay = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Overlay\n ref={ref}\n data-slot=\"alert-dialog-overlay\"\n className={cn(\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n />\n));\nAlertDialogOverlay.displayName = AlertDialogPrimitive.Overlay.displayName;\n\n/**\n * Unstyled, non-portalling Content for custom layouts. AlertDialog is always\n * modal, so `aria-modal` is stated rather than derived.\n */\nconst AlertDialogContentPrimitive = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content>\n>(({ onCloseAutoFocus, ...props }, ref) => {\n // Always blocking: floating layers opened from it stack above its scrim.\n useModalLayer(true);\n return <AlertDialogPrimitive.Content {...props} ref={ref} aria-modal=\"true\" onCloseAutoFocus={keepMovedFocus(onCloseAutoFocus)} />;\n});\nAlertDialogContentPrimitive.displayName = \"AlertDialogContentPrimitive\";\n\nconst AlertDialogDescription = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Description\n ref={ref}\n data-slot=\"alert-dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nAlertDialogDescription.displayName =\n AlertDialogPrimitive.Description.displayName;\n\nexport interface AlertDialogContentProps\n extends React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Content> {\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honors `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst AlertDialogContent = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Content>,\n AlertDialogContentProps\n>(({ className, children, container, animated = true, ...props }, ref) => {\n const hasDescription =\n treeContainsComponent(children, AlertDialogDescription) ||\n treeContainsComponent(children, AlertDialogPrimitive.Description);\n return (\n <AlertDialogPortal container={container}>\n <AlertDialogOverlay />\n <AlertDialogContentPrimitive\n ref={ref}\n data-slot=\"alert-dialog-content\"\n className={cn(\n `matrx-dialog-card fixed left-[50%] top-[50%] z-[10000] grid min-w-0 w-full max-w-lg ${CENTERED_DIALOG} gap-4 border bg-background p-6 shadow-lg`,\n // Ruling 3 — never taller than the viewport, always scrollable, and\n // the footer stays reachable via --dialog-pad like Dialog's.\n // Ruling 5 (0.11.3) — `matrx-dialog-card` hands the bottom padding to\n // a sticky footer when there is one, so the footer's box matches the\n // space the grid gave it and sticky never clamps it up over the\n // consequence copy.\n \"max-h-[85dvh] overflow-y-auto overscroll-contain [--dialog-pad:1.5rem] overflow-x-clip [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full\",\n \"sm:rounded-lg\",\n animated && MOTION_DIALOG,\n className,\n )}\n {...props}\n >\n {hasDescription ? null : (\n <AlertDialogPrimitive.Description className=\"sr-only\">\n Please confirm the action described in this dialog.\n </AlertDialogPrimitive.Description>\n )}\n {children}\n </AlertDialogContentPrimitive>\n </AlertDialogPortal>\n );\n});\nAlertDialogContent.displayName = AlertDialogPrimitive.Content.displayName;\n\nconst AlertDialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(\"flex flex-col space-y-2 text-center sm:text-left\", className)}\n {...props}\n />\n);\nAlertDialogHeader.displayName = \"AlertDialogHeader\";\n\nconst AlertDialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(\n \"flex flex-col-reverse gap-2 sm:flex-row sm:justify-end sm:gap-0 sm:space-x-2\",\n // Ruling 3/4 — sticky to the card edges so a scrolled body never shows\n // through under the actions, and safe-area padded on a phone.\n //\n // 🚨 THERE IS NO `mb-[…]` HERE, AND THERE MUST NEVER BE ONE AGAIN\n // (0.11.3, feedback bf8fb00b). The bleed over the card's bottom padding\n // used to be a NEGATIVE BLOCK MARGIN, which makes this box taller than\n // the grid area the card allocates it — and `position: sticky` CLAMPS a\n // box to its containing block, so the browser yanked the footer UP by\n // `--dialog-pad` against the card's `gap-4` and painted 8px of opaque\n // footer over the last line of the consequence, at every length. The\n // card now RESERVES this footer's block size instead (`matrx-dialog-card`\n // in styles.css hands over its `padding-bottom`), so the bleed costs no\n // margin at all. Guard: `sticky-footer-geometry.test.tsx`.\n //\n // These stay UTILITIES rather than a shipped rule so a caller's\n // `className` still wins through tailwind-merge — a shipped rule would\n // have to be unlayered to survive Tailwind preflight (§ THE PREFLIGHT\n // RULE in styles.css) and would then override every caller's padding.\n \"sticky bottom-0 z-10 bg-background pt-3\",\n \"mx-[calc(var(--dialog-pad,0px)*-1)] px-[var(--dialog-pad,0px)] pb-[var(--dialog-pad,0px)]\",\n className,\n )}\n {...props}\n />\n);\nAlertDialogFooter.displayName = \"AlertDialogFooter\";\n\nconst AlertDialogTitle = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Title\n ref={ref}\n data-slot=\"alert-dialog-title\"\n className={cn(\"text-lg font-semibold\", className)}\n {...props}\n />\n));\nAlertDialogTitle.displayName = AlertDialogPrimitive.Title.displayName;\n\nconst AlertDialogAction = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Action>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Action>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Action\n ref={ref}\n data-slot=\"alert-dialog-action\"\n className={cn(buttonVariants(), className)}\n {...props}\n />\n));\nAlertDialogAction.displayName = AlertDialogPrimitive.Action.displayName;\n\nconst AlertDialogCancel = React.forwardRef<\n React.ComponentRef<typeof AlertDialogPrimitive.Cancel>,\n React.ComponentPropsWithoutRef<typeof AlertDialogPrimitive.Cancel>\n>(({ className, ...props }, ref) => (\n <AlertDialogPrimitive.Cancel\n ref={ref}\n data-slot=\"alert-dialog-cancel\"\n className={cn(\n buttonVariants({ variant: \"outline\" }),\n \"mt-2 sm:mt-0\",\n className,\n )}\n {...props}\n />\n));\nAlertDialogCancel.displayName = AlertDialogPrimitive.Cancel.displayName;\n\nexport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogContentPrimitive,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogOverlay,\n AlertDialogPortal,\n AlertDialogTitle,\n AlertDialogTrigger,\n};\n","\"use client\";\n\n/**\n * ConfirmDialog — the `window.confirm` replacement, declarative half.\n *\n * WHY IT LIVES HERE AND NOT IN `@ai-matrx/kit` (census row 19i, decided by the\n * package-graph ruling of 2026-09-07, on the row-20a Tooltip precedent).\n *\n * kit shipped this dialog with its own inlined AlertDialog, its own inlined\n * button class strings, a hardcoded 80%-opaque black scrim, and\n * `data-[state=open]:animate-in … zoom-in-95 … slide-in-from-top-[48%]` —\n * host-plugin utilities `tailwindcss-animate`/`tw-animate-css` supply and a\n * package cannot ship. kit ships NO stylesheet at all, so in three of the four\n * consumers the most consequential surface in the app (the one standing\n * between a user and a destroyed thing) appeared with no animation, no error,\n * and a scrim that ignored the theme. kit could not import the fix:\n * `@ai-matrx/design-system` depends on `@ai-matrx/kit`, so importing back is a\n * cycle; giving kit its own sheet would invent a second required-CSS contract\n * no consumer performs (the C26 silent host contract, one layer down).\n *\n * The resolution is the one row 20a already proved: the surface moves to the\n * package that owns the surface. This file is built on THIS package's\n * `AlertDialog` — so it inherits, for free and forever:\n *\n * - the package motion layer (`matrx-motion-overlay` / `matrx-motion-dialog`),\n * whose rules ship in `styles.css` and are proven present in the tarball;\n * - `--matrx-overlay-scrim`, a token that answers to the host's theme,\n * instead of an opaque black literal;\n * - AlertDialog ruling 3 — clamped to `max-h-[85dvh]`, scrolling inside\n * itself, with a sticky footer. **This is what makes the consequence-first\n * copy law survivable**: a confirmation that names everything it is about\n * to destroy can be long, and in kit's copy a long one pushed Cancel and\n * Continue below the fold of a short viewport with no backdrop dismissal —\n * a dead end on a destructive action;\n * - `buttonVariants` as the ONE source of button appearance, including the\n * 44px coarse-pointer target;\n * - `PortalContainerProvider`, so a dialog opened inside a popped-out window\n * panel renders in THAT window's document.\n *\n * kit keeps `./confirm-opener` — the pure, React-free imperative `confirm()`\n * and its `globalThis`-slotted host registry — and re-exports nothing of this.\n * Consumers mount `<ConfirmDialogHost />` from here and call `confirm()` from\n * there. See `confirm-host.tsx` for the join.\n *\n * BEHAVIOR IS THE KIT PORT, VERBATIM. Every prop, default and interaction is\n * unchanged; only the chrome underneath it is the package's.\n *\n * Pattern: hold the pending target in state, render `<ConfirmDialog />` once at\n * the bottom of the component, and open it by setting the target. When busy\n * state is meaningful (a network delete that should hold the dialog open with a\n * spinner), use THIS component inline; the imperative `confirm()` closes\n * immediately on click.\n */\n\nimport * as React from \"react\";\n\nimport {\n AlertDialog,\n AlertDialogAction,\n AlertDialogCancel,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n} from \"./alert-dialog\";\nimport { buttonVariants } from \"./button\";\nimport { cn } from \"./cn\";\nimport { Loader2Icon } from \"./icons\";\nimport { MOTION_SPIN } from \"./motion\";\n\nexport interface ConfirmDialogProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: React.ReactNode;\n /**\n * THE CONSEQUENCE. Per the platform's destructive-and-expensive-actions law,\n * a confirmation must name what is lost, what is duplicated, and/or what it\n * costs — \"Are you sure?\" is not a confirmation. This renders as the dialog's\n * accessible description, so a screen-reader user is told the consequence\n * too, and it is never clamped or truncated.\n */\n description?: React.ReactNode | undefined;\n /**\n * Rich body rendered between the header and the footer. Use it for\n * supplementary or interactive content that is not part of the dialog's\n * accessible consequence description.\n */\n content?: React.ReactNode | undefined;\n /** Extra classes for the dialog content (e.g. a wider max-w for diffs). */\n contentClassName?: string | undefined;\n confirmLabel?: string | undefined;\n /**\n * `null` hides the cancel button entirely — for acknowledge-only dialogs\n * where there is nothing to cancel. Anything else labels it.\n */\n cancelLabel?: string | null | undefined;\n variant?: \"default\" | \"destructive\" | undefined;\n busy?: boolean | undefined;\n /**\n * Blocks confirming without pretending work is in flight. For a dialog whose\n * `content` asks the user something the action cannot proceed without — the\n * choice is missing, not loading — `busy` would show a misleading spinner.\n */\n confirmDisabled?: boolean | undefined;\n /**\n * The question is not answerable yet — Confirm is ABSENT, not disabled (a\n * control is absent or honest, never dead). The body carries its own loading\n * state; Cancel stays. Set by `ConfirmDialogHost` while `ConfirmOptions.ready`\n * is pending (0.54.0).\n */\n confirmHeld?: boolean | undefined;\n /**\n * Explicit portal target. Default (undefined): the container injected by\n * `PortalContainerProvider`, else `document.body`. Hosts with retargeting\n * needs (a popped-out browser window whose dialog must render in THAT\n * window's document) may still pass the element directly.\n */\n portalContainer?: HTMLElement | null | undefined;\n onConfirm: () => void | Promise<void>;\n}\n\n/**\n * Drop-in replacement for `window.confirm`. Use this anywhere you would\n * otherwise reach for a browser-level confirm dialog.\n */\nexport function ConfirmDialog({\n open,\n onOpenChange,\n title,\n description,\n content,\n contentClassName,\n confirmLabel = \"Confirm\",\n cancelLabel = \"Cancel\",\n variant = \"default\",\n busy = false,\n confirmDisabled = false,\n confirmHeld = false,\n portalContainer,\n onConfirm,\n}: ConfirmDialogProps) {\n return (\n <AlertDialog open={open} onOpenChange={onOpenChange}>\n <AlertDialogContent\n className={contentClassName}\n {...(portalContainer === undefined ? {} : { container: portalContainer })}\n >\n <AlertDialogHeader>\n <AlertDialogTitle>{title}</AlertDialogTitle>\n {description ? (\n <AlertDialogDescription asChild>\n <div>{description}</div>\n </AlertDialogDescription>\n ) : null}\n </AlertDialogHeader>\n {content ?? null}\n <AlertDialogFooter>\n {cancelLabel === null ? null : (\n <AlertDialogCancel className=\"max-lg:min-h-11\" disabled={busy}>\n {cancelLabel}\n </AlertDialogCancel>\n )}\n {confirmHeld ? null : (\n <AlertDialogAction\n disabled={busy || confirmDisabled}\n onClick={(event) => {\n event.preventDefault();\n void onConfirm();\n }}\n className={cn(\n \"max-lg:min-h-11\",\n // One source of button appearance: the destructive look comes\n // from `buttonVariants`, not a second hand-written copy of it.\n // tailwind-merge makes it WIN over the default variant classes.\n variant === \"destructive\" &&\n buttonVariants({ variant: \"destructive\" }),\n )}\n >\n {busy ? (\n <Loader2Icon className={cn(\"mr-2 h-4 w-4\", MOTION_SPIN)} />\n ) : null}\n {confirmLabel}\n </AlertDialogAction>\n )}\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n","\"use client\";\n\n/**\n * The settled surfaces that hold the one control (owner, 2026-10-02/03):\n * one surface level, ~36px hairline rows, 8px radius; the empty state; the\n * region-shaped skeleton; the three delete tiers; the one-feature promo banner.\n * Skins are locked in `controls.css` like the controls themselves.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\n\nimport { swallowClick } from \"../button\";\nimport { cn } from \"../cn\";\nimport { ConfirmDialog } from \"../confirm-dialog\";\nimport { ChevronRightIcon, Trash2Icon } from \"../icons\";\nimport { Skeleton } from \"../skeleton\";\nimport { Button, ControlRow, type ChipTone, type GlyphTone } from \"./controls\";\n\n/* ------------------------------------------------------------------ */\n/* Row groups */\n/* ------------------------------------------------------------------ */\n\nexport interface RowGroupProps extends Omit<React.HTMLAttributes<HTMLElement>, \"title\"> {\n /** 11px uppercase heading above the group. */\n title?: React.ReactNode;\n /** The danger-zone skin (delete tier 3). */\n danger?: boolean;\n}\n\n/** A bordered group of hairline rows — the one surface for grouped content. */\nexport function RowGroup({ title, danger, className, children, ...props }: RowGroupProps) {\n return (\n <section\n data-matrx-row-group=\"\"\n data-danger={danger ? \"\" : undefined}\n className={cn(\"matrx-control-group\", className)}\n {...props}\n >\n {title ? <h2 className=\"matrx-control-group-title\">{title}</h2> : null}\n <div className=\"matrx-control-group-body\">{children}</div>\n </section>\n );\n}\n\nexport interface SettingRowProps {\n label: React.ReactNode;\n /** One 12px line under the label. */\n line?: React.ReactNode;\n /** Ties the label to the control it describes. */\n htmlFor?: string;\n /** The row's controls, right-aligned on one line. */\n children?: React.ReactNode;\n className?: string;\n}\n\n/** One ~36px row: 13px label, optional 12px line, controls on the right. */\nexport function SettingRow({ label, line, htmlFor, children, className }: SettingRowProps) {\n return (\n <div data-matrx-setting-row=\"\" className={cn(\"matrx-control-setting-row\", className)}>\n <div className=\"matrx-control-setting-text\">\n {htmlFor ? (\n <label htmlFor={htmlFor} className=\"matrx-control-setting-label\">\n {label}\n </label>\n ) : (\n <div className=\"matrx-control-setting-label\">{label}</div>\n )}\n {line ? <div className=\"matrx-control-setting-line\">{line}</div> : null}\n </div>\n {children ? (\n <ControlRow nowrap data-matrx-row-actions=\"\">\n {children}\n </ControlRow>\n ) : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Tile — the pressable row / tile (a choice, a destination) */\n/* ------------------------------------------------------------------ */\n\nexport type TileLayout = \"row\" | \"stack\" | \"adaptive\" | \"icon\";\n\nexport interface TileProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"title\"> {\n /** `row` (default): glyph, then a 13px title over a 12px line, start-aligned, full width — a\n * choice in a list, a quick action. `stack`: glyph on top, title and line under it — a grid\n * tile. `adaptive`: `stack` from the `sm` breakpoint (640px) up, a compact `row` below it — a\n * grid of option cards that becomes a list on a phone. `icon`: the launcher tile of an icon\n * grid (a \"Can make\" grid, a sidebar's pinned apps, a copy palette) — the glyph centered over\n * an 11px label centered under it, up to two lines, no frame, a pick is a soft tint, `end`\n * is a badge on the top corner, `line` is hidden. All are taller than a control: they carry\n * text, so they never take the 28px lock. */\n layout?: TileLayout;\n /** `outline` (default): the bordered card skin. `quiet`: no frame until hover — a row in a\n * menu-like list. */\n variant?: \"outline\" | \"quiet\";\n /** Leading 16px glyph (an avatar or image works too). */\n icon?: React.ReactNode;\n /** The 13px title. */\n title: React.ReactNode;\n /** The title wraps over several lines (up to 6) instead of one line with an ellipsis: a quiz\n * answer, a step, a sentence-long choice. Off by default — a short title is one line. */\n wrapTitle?: boolean;\n /** One 12px secondary line (clamped to two lines; one with `oneLine`). */\n line?: React.ReactNode;\n /** The `line` stays ONE line with an ellipsis, so every row of a master list keeps one height. */\n oneLine?: boolean;\n /** Trailing content in a row (a chevron, a count, a shortcut). */\n end?: React.ReactNode;\n /** A choice: `true` tints it and sets `aria-pressed`; `false` sets `aria-pressed=\"false\"`. A link tile (`asChild`) never sets `aria-pressed`: the caller sets `aria-current`. */\n selected?: boolean;\n /** How `selected` looks. `outline` (default): primary frame and tint. `fill`: a soft neutral fill,\n * no outline, ink unchanged — a sidebar's active row. `primary`: the solid primary fill with\n * every ink (title, line, glyph, end) on primary — the open item of a master list. */\n selectedStyle?: \"outline\" | \"fill\" | \"primary\";\n /** The hover / focus tooltip (the native `title` attribute: `title` is the visible label). */\n tooltip?: string;\n /** Nesting depth under a parent row: each level moves the row's start past one glyph and its\n * gap, so an icon-less child's title starts where its parent's title does. */\n level?: 1 | 2 | 3;\n /** Size to the content and never shrink or truncate the title — a code, a short value. */\n fit?: boolean;\n /** Keep room at the row's end for a control laid OVER it (a row's More button): `control`\n * reserves one control's width plus its gap, so the title never runs under it. */\n endInset?: \"control\";\n /** A dashed border: the \"add another\" tile (an empty slot to fill), never a choice. */\n dashed?: boolean;\n /** hoverStyle=\"fill\": the pointer's soft neutral fill (the desktop look's secondary fill) instead of the accent. */\n hoverStyle?: \"fill\";\n /** A destructive row (Remove, Delete): destructive title and glyph, destructive hover tint. */\n danger?: boolean;\n /**\n * A choice that is ALREADY USED elsewhere (an option already placed, a field already mapped): a\n * faint shade and quieter ink, still fully pressable — a hint for the eye, never a disabled state.\n */\n dimmed?: boolean;\n /** The glyph's own status ink when its color carries meaning (Button's `glyphTone`). */\n glyphTone?: GlyphTone;\n /** The inviting choice card for a front door: roomy padding, a 40px icon square, a 14px title. */\n hero?: boolean;\n /** Tint card, edge and icon square from one `ChipTone` (the `Chip` hue tokens). */\n tone?: ChipTone;\n /** Tint ONLY the icon, as a 28px colored square, on a neutral card: a grid of actions where each\n * job keeps its own hue (quick actions) without every card turning into a colored card. */\n iconTone?: ChipTone;\n /** A 28px navigation / filter row for sidebars and dense lists: `min-height` is the control size,\n * padding 4px 8px, gap 8px, 13px title. The `line` is HIDDEN when dense (one line, always).\n * `variant=\"quiet\"` + `dense` is a clean nav row: transparent until hover / selected. */\n dense?: boolean;\n /** Render the one child element (a link) with the tile's skin; its children are ignored —\n * the tile draws `icon`/`title`/`line`/`end`. */\n asChild?: boolean;\n}\n\n/**\n * THE pressable row / tile: two named layouts, two skins, no size. `className` places it\n * (width, grid cell); its height follows its text.\n */\nexport const Tile = React.forwardRef<HTMLButtonElement, TileProps>(\n (\n { layout = \"row\", variant = \"outline\", icon, title, wrapTitle, line, end, selected, selectedStyle, tooltip, level, fit, endInset, oneLine, dashed, hoverStyle, danger, dimmed, glyphTone, hero, tone, iconTone, dense, asChild = false, className, children, onClick, type, ...props },\n ref,\n ) => {\n const Component = asChild ? Slot : \"button\";\n const ariaDisabled = props[\"aria-disabled\"];\n const inert = ariaDisabled === true || ariaDisabled === \"true\";\n const body = (\n <>\n {icon ? (\n <span className=\"matrx-tile-icon\" data-tone={iconTone && iconTone !== \"neutral\" ? iconTone : undefined}>\n {icon}\n </span>\n ) : null}\n <span className=\"matrx-tile-text\">\n <span className=\"matrx-tile-title\">{title}</span>\n {line ? <span className=\"matrx-tile-line\">{line}</span> : null}\n </span>\n {end ? <span className=\"matrx-tile-end\">{end}</span> : null}\n </>\n );\n return (\n <Component\n ref={ref}\n type={asChild ? undefined : (type ?? \"button\")}\n data-matrx-tile=\"\"\n data-layout={layout}\n data-variant={variant}\n data-selected={selected ? \"\" : undefined}\n data-selected-style={selected && (selectedStyle === \"fill\" || selectedStyle === \"primary\") ? selectedStyle : undefined}\n data-level={level}\n data-fit={fit ? \"\" : undefined}\n data-one-line={oneLine ? \"\" : undefined}\n data-end-inset={endInset}\n data-dashed={dashed ? \"\" : undefined}\n data-hover-style={hoverStyle}\n title={tooltip}\n data-danger={danger ? \"\" : undefined}\n data-dimmed={dimmed ? \"\" : undefined}\n data-wrap-title={wrapTitle ? \"\" : undefined}\n data-glyph-tone={glyphTone}\n data-hero={hero ? \"\" : undefined}\n data-dense={dense ? \"\" : undefined}\n data-tone={tone}\n aria-pressed={asChild || selected === undefined ? undefined : selected}\n className={cn(\"matrx-tile\", className)}\n {...props}\n onClick={inert ? swallowClick : onClick}\n >\n {asChild && React.isValidElement(children) ? (\n React.cloneElement(children as React.ReactElement<{ children?: React.ReactNode }>, undefined, body)\n ) : (\n body\n )}\n </Component>\n );\n },\n);\nTile.displayName = \"Tile\";\n\n/* ------------------------------------------------------------------ */\n/* Section disclosure header */\n/* ------------------------------------------------------------------ */\n\nexport type DisclosureHeaderVariant = \"row\" | \"label\";\n\nexport interface DisclosureHeaderProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"title\"> {\n /** Whether the section under the header is showing. Sets `aria-expanded`. */\n open: boolean;\n /** `row` (default): a 13px/500 title — a collapsible section, a group of results, a \"details\"\n * fold. `label`: the 11px uppercase muted label that heads a sidebar or menu group. */\n variant?: DisclosureHeaderVariant;\n /** Optional 16px glyph after the chevron (row variant). */\n icon?: React.ReactNode;\n /** Colors ONLY the icon: a status tone uses its `-ink` token, a hue its `--matrx-chip-<hue>-ink`.\n * A section that carries a color (violet Organization, amber Projects) keeps it here. */\n glyphTone?: GlyphTone | ChipTone;\n /** The section's name. */\n title: React.ReactNode;\n /** A short muted fact after the title: a count, a size, \"3 of 12\". Never a sentence. */\n meta?: React.ReactNode;\n /** Trailing content pinned to the end (a status glyph, a count badge). Non-interactive — a\n * control beside the header sits outside it, never inside the button. */\n end?: React.ReactNode;\n /** One 12px secondary line under the title (row variant) — what the section holds. */\n line?: React.ReactNode;\n /** Where the turning chevron sits. `start` (default) leads the row; `end` trails it, for a\n * sidebar section whose label keeps the column's left edge. */\n chevron?: \"start\" | \"end\";\n}\n\n/**\n * THE section-disclosure header: a chevron that turns, a title, an optional count and trailing\n * status — one full-width pressable row that opens and closes the section below it. Every\n * \"click the heading to fold\" row is this, never a raw button with a hand-drawn chevron.\n */\nexport const DisclosureHeader = React.forwardRef<HTMLButtonElement, DisclosureHeaderProps>(\n ({ open, variant = \"row\", icon, glyphTone, title, meta, end, line, chevron = \"start\", className, type, ...props }, ref) => (\n <button\n ref={ref}\n type={type ?? \"button\"}\n aria-expanded={open}\n data-matrx-disclosure=\"\"\n data-variant={variant}\n data-open={open ? \"\" : undefined}\n data-chevron={chevron}\n className={cn(\"matrx-disclosure\", className)}\n {...props}\n >\n {chevron === \"start\" ? (\n <span className=\"matrx-disclosure-chevron\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n ) : null}\n {icon ? (\n <span className=\"matrx-disclosure-icon\" data-glyph-tone={glyphTone}>\n {icon}\n </span>\n ) : null}\n {line ? (\n <span className=\"matrx-disclosure-text\">\n <span className=\"matrx-disclosure-title\">{title}</span>\n <span className=\"matrx-disclosure-line\">{line}</span>\n </span>\n ) : (\n <span className=\"matrx-disclosure-title\">{title}</span>\n )}\n {meta === undefined || meta === null || meta === false ? null : (\n <span className=\"matrx-disclosure-meta\">{meta}</span>\n )}\n {end ? <span className=\"matrx-disclosure-end\">{end}</span> : null}\n {chevron === \"end\" ? (\n <span className=\"matrx-disclosure-chevron\" data-end=\"\" aria-hidden=\"true\">\n <ChevronRightIcon />\n </span>\n ) : null}\n </button>\n ),\n);\nDisclosureHeader.displayName = \"DisclosureHeader\";\n\n/* ------------------------------------------------------------------ */\n/* Empty state */\n/* ------------------------------------------------------------------ */\n\nexport interface EmptyStateProps {\n /** A 20px glyph inside the tinted disc. */\n icon: React.ReactNode;\n /** 13px title. */\n title: React.ReactNode;\n /** One 12px line. */\n line?: React.ReactNode;\n /** The one 28px action (a controls `Button`). */\n action?: React.ReactNode;\n className?: string;\n}\n\n/** Tinted icon disc + 13px title + one line + one 28px button. */\nexport function EmptyState({ icon, title, line, action, className }: EmptyStateProps) {\n return (\n <div data-matrx-empty-state=\"\" className={cn(\"matrx-control-empty\", className)}>\n <div className=\"matrx-control-empty-disc\" aria-hidden=\"true\">\n {icon}\n </div>\n <div>\n <div className=\"matrx-control-empty-title\">{title}</div>\n {line ? <div className=\"matrx-control-empty-line\">{line}</div> : null}\n </div>\n {action ? <ControlRow className=\"justify-center\">{action}</ControlRow> : null}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Region skeleton */\n/* ------------------------------------------------------------------ */\n\nexport interface RegionSkeletonProps {\n /** The region's shape: hairline rows, a form's label+field pairs, or cards. */\n shape?: \"rows\" | \"form\" | \"cards\";\n /** How many rows / fields / cards. */\n count?: number;\n /** Rows: a second (meta) line under each title. */\n twoLine?: boolean;\n className?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * A skeleton shaped like the region it stands in for — never one block for a\n * page, never a spinner in the middle. A spinner belongs only inside a busy\n * control.\n */\nexport function RegionSkeleton({\n shape = \"rows\",\n count = shape === \"cards\" ? 3 : shape === \"form\" ? 4 : 8,\n twoLine = false,\n className,\n \"aria-label\": ariaLabel = \"Loading\",\n}: RegionSkeletonProps) {\n const items = Array.from({ length: count }, (_, i) => i);\n if (shape === \"form\") {\n return (\n <div aria-busy=\"true\" aria-label={ariaLabel} className={cn(\"flex flex-col gap-3\", className)}>\n {items.map((i) => (\n <div key={i} className=\"flex flex-col gap-1.5\">\n <Skeleton className=\"h-3 w-24\" />\n <Skeleton className=\"h-7 rounded-full\" />\n </div>\n ))}\n </div>\n );\n }\n if (shape === \"cards\") {\n return (\n <div aria-busy=\"true\" aria-label={ariaLabel} className={cn(\"grid gap-2 sm:grid-cols-3\", className)}>\n {items.map((i) => (\n <div key={i} className=\"flex items-center gap-3 rounded-lg border border-border p-3\">\n <Skeleton className=\"size-8 rounded-full\" />\n <div className=\"flex flex-1 flex-col gap-1.5\">\n <Skeleton className=\"h-3.5 w-2/3\" />\n <Skeleton className=\"h-2.5 w-1/2\" />\n </div>\n </div>\n ))}\n </div>\n );\n }\n return (\n <div aria-busy=\"true\" aria-label={ariaLabel} className={cn(\"divide-y divide-border\", className)}>\n {items.map((i) => (\n <div key={i} className=\"flex min-h-9 items-center gap-3 px-3 py-1.5\">\n <Skeleton className=\"size-4 rounded-full\" />\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <Skeleton className=\"h-3.5\" style={{ width: `${30 + ((i * 17) % 35)}%` }} />\n {twoLine ? <Skeleton className=\"h-2.5 w-1/4\" /> : null}\n </div>\n <Skeleton className=\"hidden h-[1.125rem] w-16 rounded-md sm:block\" />\n <Skeleton className=\"size-5 rounded-full\" />\n </div>\n ))}\n </div>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* The three delete tiers */\n/* ------------------------------------------------------------------ */\n\nexport interface DeleteButtonProps\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"children\" | \"aria-label\"> {\n /** What it deletes, e.g. \"Delete reference\". */\n \"aria-label\": string;\n}\n\n/** Tier 1 — the quiet trash glyph: muted until hover, destructive on hover. */\nexport const DeleteButton = React.forwardRef<HTMLButtonElement, DeleteButtonProps>((props, ref) => (\n <Button ref={ref} variant=\"quiet\" icon={<Trash2Icon />} data-delete=\"\" title={props[\"aria-label\"]} {...props} />\n));\nDeleteButton.displayName = \"DeleteButton\";\n\nexport interface ConfirmDeleteProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n /** \"Delete this project?\" */\n title: React.ReactNode;\n /** REQUIRED: name the cost — what is lost, what goes with it. Never \"Are you sure?\". */\n cost: React.ReactNode;\n /** The confirm button names the act, e.g. \"Delete project\". */\n confirmLabel: string;\n onConfirm: () => void | Promise<void>;\n busy?: boolean;\n}\n\n/** Tier 2 — a confirm that names the cost. */\nexport function ConfirmDelete({ open, onOpenChange, title, cost, confirmLabel, onConfirm, busy }: ConfirmDeleteProps) {\n return (\n <ConfirmDialog\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n description={cost}\n confirmLabel={confirmLabel}\n variant=\"destructive\"\n busy={busy}\n onConfirm={onConfirm}\n />\n );\n}\n\n/** Tier 3 — the danger zone: a red-ruled group of rows at the end of settings. */\nexport function DangerZone({\n title = \"Danger zone\",\n children,\n className,\n}: {\n title?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n}) {\n return (\n <RowGroup title={title} danger className={className}>\n {children}\n </RowGroup>\n );\n}\n\n/* ------------------------------------------------------------------ */\n/* Promo banner */\n/* ------------------------------------------------------------------ */\n\nexport type PromoTone = \"primary\" | \"success\" | \"warning\" | \"info\";\n\nexport interface PromoBannerProps {\n /** A 16px glyph inside the tinted disc. */\n icon: React.ReactNode;\n /** 11px label before the title, e.g. \"Next challenge\". Never a pill. */\n eyebrow?: React.ReactNode;\n /** One line, 13px. */\n title: React.ReactNode;\n /** One line, 12px, ≤60 characters. Omit rather than pad. */\n line?: React.ReactNode;\n /** Outline badges — the evidence behind the promo. */\n chips?: React.ReactNode;\n /** The one action: a controls `Button` (or a link wearing it). */\n action?: React.ReactNode;\n tone?: PromoTone;\n /**\n * Let the title wrap onto as many lines as it needs, for a sentence that must be read whole (a question with its\n * answer buttons beside it). Default false: one line, truncated.\n */\n wrap?: boolean;\n className?: string;\n /** Accessible name of the region. Defaults to \"Featured\". */\n \"aria-label\"?: string;\n}\n\n/**\n * A page-top variant that promotes ONE feature in one bordered row (~56px):\n * [disc] EYEBROW · Title / one line … [chips] [Action]. On a phone the chips\n * wrap under the text and the action stretches full width.\n */\nexport function PromoBanner({\n icon,\n eyebrow,\n title,\n line,\n chips,\n action,\n tone = \"primary\",\n wrap = false,\n className,\n \"aria-label\": ariaLabel,\n}: PromoBannerProps) {\n return (\n <section\n aria-label={ariaLabel ?? (typeof eyebrow === \"string\" ? eyebrow : \"Featured\")}\n data-matrx-promo=\"\"\n data-tone={tone}\n data-wrap={wrap ? \"\" : undefined}\n className={cn(\"matrx-control-promo\", className)}\n >\n <span className=\"matrx-control-promo-disc\" aria-hidden=\"true\">\n {icon}\n </span>\n <div className=\"matrx-control-promo-text\">\n <div className=\"matrx-control-promo-head\">\n {eyebrow ? <span className=\"matrx-control-promo-eyebrow\">{eyebrow}</span> : null}\n {eyebrow ? (\n <span className=\"matrx-control-promo-eyebrow\" aria-hidden=\"true\">\n ·\n </span>\n ) : null}\n <span className=\"matrx-control-promo-title\">{title}</span>\n </div>\n {line ? <div className=\"matrx-control-promo-line\">{line}</div> : null}\n </div>\n {chips ? <div className=\"matrx-control-promo-chips\">{chips}</div> : null}\n {action ? (\n <ControlRow nowrap className=\"matrx-control-promo-action\">\n {action}\n </ControlRow>\n ) : null}\n </section>\n );\n}\n"],"mappings":"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","names":["jsx","jsxs","React","jsx","jsxs"]}
|