@ai-matrx/design-system 0.86.342 → 0.86.344

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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/accordion.tsx","../src/badge.tsx","../src/pill-guard.ts","../src/alert.tsx","../src/read-state/use-read.ts","../src/avatar.tsx","../src/card.tsx","../src/creatable-picker.tsx","../src/overflow-toolbar.tsx","../src/progress.tsx","../src/scroll-area.tsx","../src/score-ring.tsx","../src/separator.tsx","../src/sidebar.tsx","../src/switch.tsx","../src/tabbed-bottom-sheet.tsx","../src/tabs.tsx","../src/scroll-fade.tsx","../src/hover-card.tsx","../src/contact-values/contact-values.tsx","../src/peek.tsx","../src/peek-record.ts","../src/peek-model.ts","../src/peek-glyphs.tsx","../src/peek-card.tsx","../src/contact-values/social-brand-paths.ts","../src/contact-values/glyphs.tsx","../src/contact-values/model.ts","../src/candidate-card.tsx","../src/media-option.tsx","../src/assist-peek.tsx","../src/radio-group.tsx","../src/toggle.tsx","../src/floating-dock.tsx","../src/deferred-dialog.tsx","../src/deferred-dialogs.tsx","../src/clipboard-fallback-host.tsx","../src/floating-sheet.tsx","../src/simple-tooltip.tsx","../src/loading-spinner.tsx","../src/mini-loader.tsx","../src/suspense-loader.tsx","../src/shimmer-text.tsx","../src/form-theme.ts","../src/first-use-hint.tsx","../src/review-changes.tsx","../src/grid-canvas/grid-canvas.tsx","../src/grid-canvas/layout.ts"],"sourcesContent":["\"use client\";\n\n/**\n * Accordion — the last primitive the fleet was still standing in for.\n *\n * The census that motivated this file (2026-09-07, census row 19c): the growth\n * waves collapsed Card, Table, Alert, Avatar, Progress, Collapsible, Checkbox,\n * Slider and RadioGroup into this package, but Accordion existed nowhere in\n * it — so `aidream/apps/workflow-studio`'s DB-authored component scope was\n * still handing agent-authored components four dependency-free `<div>`s named\n * Accordion / AccordionItem / AccordionTrigger / AccordionContent. A DB-\n * authored component that asked for an accordion got four stacked divs: every\n * section permanently open, no trigger, no keyboard, no ARIA. That is the\n * \"dead-looking screen\" failure, not a styling nit.\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. The matrx-frontend\n * original carried a wrapper that deferred rendering until after hydration on\n * the theory that \"Radix generates dynamic aria-controls ids that differ\n * between SSR and client\". That is false — Radix ids come from React's\n * SSR-stable `useId` — and the gate deleted every accordion HEADER (and any\n * defaultValue-open item) from SSR and the first client paint. Same reasoning,\n * same verdict, as `collapsible.tsx`.\n *\n * Density is a PROP, exactly as on Card and Table: declared once on the root,\n * read from context by every trigger and panel, so an accordion cannot end up\n * with a `p-4` header above a `p-2` body.\n *\n * sm → py-2 trigger, pb-2 content (dense panels, inspector sidebars)\n * md → p-4 trigger, pb-4 content (reading surfaces; the default)\n *\n * The open/close height transition is package-owned CSS\n * (`.matrx-accordion-content` in `styles.css`, keyed off Radix's\n * `--radix-accordion-content-height`). It is NOT the Tailwind\n * `animate-accordion-down` utility the matrx-frontend fork used: that name\n * only exists in a host `tailwind.config.js`, so a fresh consumer got a\n * component that jumped open with no animation and no error — the exact\n * silent-host-contract failure C26 (the styling contract) exists to stop.\n *\n * Color is tokens only.\n */\n\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { RadixChevronDownIcon } from \"./icons\";\n\nexport type AccordionSize = \"sm\" | \"md\";\n\nconst ACCORDION_SIZES: Record<\n AccordionSize,\n { trigger: string; content: string }\n> = {\n sm: { trigger: \"py-2 text-sm\", content: \"pb-2\" },\n md: { trigger: \"p-4 text-sm\", content: \"px-4 pb-4\" },\n};\n\nconst AccordionSizeContext = React.createContext<AccordionSize>(\"md\");\n\n/** The density the nearest enclosing `<Accordion>` declared. `md` outside one. */\nexport function useAccordionSize(): AccordionSize {\n return React.useContext(AccordionSizeContext);\n}\n\ntype AccordionRootProps = React.ComponentPropsWithoutRef<\n typeof AccordionPrimitive.Root\n> & {\n /** Density for this accordion and every section inside it. Default `md`. */\n size?: AccordionSize;\n};\n\nexport type AccordionProps = AccordionRootProps;\n\nconst Accordion = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Root>,\n AccordionRootProps\n>(({ size = \"md\", ...props }, ref) => (\n <AccordionSizeContext.Provider value={size}>\n <AccordionPrimitive.Root ref={ref} data-slot=\"accordion\" data-size={size} {...props} />\n </AccordionSizeContext.Provider>\n));\nAccordion.displayName = \"Accordion\";\n\nconst AccordionItem = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n data-slot=\"accordion-item\"\n // A single-item accordion is a disclosure, not a list — the divider under\n // it would be a line under nothing.\n className={cn(\"[&:not(:only-child)]:border-b\", className)}\n {...props}\n />\n));\nAccordionItem.displayName = \"AccordionItem\";\n\nexport interface AccordionTriggerProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> {\n /**\n * Controls rendered on the trigger row, before the chevron (a count badge, a\n * status pill). They live INSIDE the button, so keep them non-interactive —\n * a nested button is invalid HTML and swallows the toggle.\n */\n rightElements?: React.ReactNode;\n}\n\nconst AccordionTrigger = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Trigger>,\n AccordionTriggerProps\n>(({ className, children, rightElements, ...props }, ref) => {\n const size = useAccordionSize();\n return (\n <AccordionPrimitive.Header className=\"flex w-full\">\n <AccordionPrimitive.Trigger\n ref={ref}\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded-md text-left font-medium transition-all\",\n \"hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:opacity-50\",\n \"[&[data-state=open]>[data-slot=accordion-trigger-end]>svg]:rotate-180\",\n ACCORDION_SIZES[size].trigger,\n className,\n )}\n {...props}\n >\n {children}\n <span\n data-slot=\"accordion-trigger-end\"\n className=\"flex shrink-0 items-center gap-2\"\n >\n {rightElements}\n <RadixChevronDownIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform duration-200\" />\n </span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n});\nAccordionTrigger.displayName = \"AccordionTrigger\";\n\nconst AccordionContent = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => {\n const size = useAccordionSize();\n return (\n <AccordionPrimitive.Content\n ref={ref}\n data-slot=\"accordion-content\"\n className=\"matrx-accordion-content overflow-hidden text-sm\"\n {...props}\n >\n <div className={cn(ACCORDION_SIZES[size].content, className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n});\nAccordionContent.displayName = \"AccordionContent\";\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\n// THE PILL CLAMP (owner, 2026-10-04). A badge holds a short label. Its text is\n// one line, ellipsised, inside a 16rem box, and a string label becomes the\n// tooltip — so a value that turns out to be a sentence (\"140 cards - 1 section\n// could not be covered …\") can never stretch a capsule across the page or wrap\n// it to two lines. A value that IS a sentence belongs in a list row, not here.\n// The dev pill guard (`enablePillGuard`) screams at any capsule that still\n// renders wider than its budget or on two lines.\nexport const badgeVariants = cva(\n \"inline-flex min-w-0 max-w-[16rem] items-center gap-1 whitespace-nowrap rounded-md border px-2 py-0.5 text-[11px] font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-0 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"border-transparent bg-primary/15 text-primary-ink\",\n secondary: \"border-transparent bg-secondary text-secondary-foreground\",\n destructive: \"border-transparent bg-destructive/15 text-destructive-ink\",\n outline: \"border-border text-foreground\",\n success: \"border-transparent bg-success/15 text-success-ink\",\n warning: \"border-transparent bg-warning/15 text-warning-ink\",\n info: \"border-info/30 bg-info/15 text-info-ink\",\n error: \"border-transparent bg-destructive/15 text-destructive-ink\",\n neutral: \"border-border bg-muted text-muted-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {}\n\n/** The plain text a badge's children spell, when they are only text. */\nfunction textOf(children: React.ReactNode): string | null {\n const parts: string[] = [];\n let onlyText = true;\n React.Children.forEach(children, (c) => {\n if (typeof c === \"string\" || typeof c === \"number\") parts.push(String(c));\n else if (c != null && typeof c !== \"boolean\") onlyText = false;\n });\n const text = parts.join(\"\").trim();\n return onlyText && text ? text : null;\n}\n\nexport function Badge({ className, variant, children, title, ...props }: BadgeProps) {\n // Text children are wrapped so they — not the icons beside them — truncate:\n // `text-overflow` never reaches the anonymous text boxes of a flex container.\n // A RUN of adjacent text children (`{label}: {n} override{s}` is five of\n // them in JSX) is ONE span: wrapped one by one, each piece was its own\n // flex item with its own `gap-1` and its own ellipsis, so a long pill\n // clipped mid-word at uneven widths (\"5 override s\"). It clamps whole.\n const clamped: React.ReactNode[] = [];\n let run = \"\";\n const flush = () => {\n if (run === \"\") return;\n clamped.push(\n <span key={`t${clamped.length}`} data-slot=\"badge-text\" className=\"min-w-0 truncate\">\n {run}\n </span>,\n );\n run = \"\";\n };\n for (const c of React.Children.toArray(children)) {\n if (typeof c === \"string\" || typeof c === \"number\") run += String(c);\n else {\n flush();\n clamped.push(c);\n }\n }\n flush();\n return (\n <span\n data-slot=\"badge\"\n title={title ?? textOf(children) ?? undefined}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n >\n {clamped}\n </span>\n );\n}\n","\"use client\";\n\nimport { layoutScale } from \"./layout-scale\";\n\n// THE PILL GUARD — development builds only (owner, 2026-10-04).\n//\n// A pill / chip / badge / capsule holds a SHORT label. The defect it exists for:\n// \"Also made from\" drew each related item as a rounded-full link holding a\n// sentence, up to 24rem wide — a quarter of the page per capsule, impossible to\n// read. Badge now clamps itself (badge.tsx), but a hand-rolled capsule anywhere\n// in a host is invisible to that. So, like the tap-target guard, this measures\n// what actually rendered: every capsule on the page (a Badge, anything marked\n// `data-matrx-pill`, and any `rounded-full` a/button/span/div carrying text) is\n// checked after layout settles, and one that is wider than the budget or wraps\n// to a second line gets a dashed red outline and ONE console error naming it.\n//\n// OFF until the host turns it on with `enablePillGuard()` from code the HOST\n// compiles in development (matrx-frontend: components/icons/tap-target-setup.ts).\n// Never gate on `process.env.NODE_ENV` in here — this package's build inlines it.\n//\n// Opt-out for a capsule that is deliberately wide (a full-width segmented bar):\n// `data-matrx-pill=\"off\"` on it.\n\n/** A capsule wider than this is a sentence in a button. The static twin\n * (matrx-frontend check:ui-drift `unclamped-text-pill`) uses the same budget. */\nexport const PILL_MAX_WIDTH_PX = 320;\n\n/** A pill wider than its own label by more than this was STRETCHED by its\n * parent (a grid cell's default `justify-items: stretch`, a `w-full`, a\n * `flex-1`): the label sits at one end of an empty capsule (2026-10-04,\n * /education/overview at 375px — every metric pill filled its grid column). */\nexport const PILL_STRETCH_TOLERANCE_PX = 8;\n// A pill that runs past its container or the viewport is flagged too (0.61.11:\n// \"206 Flashcard Stu…\" ran off a 375px screen once the pills stopped stretching).\n\nconst SELECTOR = [\n '[data-slot=\"badge\"]',\n \"[data-matrx-pill]\",\n \"a.rounded-full\",\n \"button.rounded-full\",\n \"span.rounded-full\",\n \"div.rounded-full\",\n].join(\",\");\n\nconst SLOT = Symbol.for(\"@ai-matrx/design-system:pill-guard\");\ntype GlobalWithSlot = typeof globalThis & { [SLOT]?: () => void };\n\nfunction px(v: string | null | undefined): number {\n const n = Number.parseFloat(v ?? \"\");\n return Number.isFinite(n) ? n : 0;\n}\n\nfunction describe(el: Element): string {\n const t = (el.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n return t.length > 60 ? `${t.slice(0, 57)}…` : t;\n}\n\n/**\n * The text nodes that draw the capsule's own label: every descendant text node\n * except those inside an out-of-flow child (`position: absolute | fixed`), a\n * hidden one, or an interactive child (a tab, a button, a link). An\n * out-of-flow child sits ON the capsule, not in its line; a capsule whose text\n * all lives in interactive children is a TRACK (a tab bar, a mode switcher) and\n * each child is a pill the guard judges by itself.\n */\nconst INTERACTIVE = 'a[href],button,[role=\"tab\"],[role=\"button\"],[role=\"radio\"],[role=\"link\"],[role=\"menuitem\"],[role=\"option\"]';\n\nfunction ownTextNodes(el: HTMLElement, view: Window & typeof globalThis): Text[] {\n const out: Text[] = [];\n const walker = el.ownerDocument.createTreeWalker(el, 4 /* NodeFilter.SHOW_TEXT */);\n for (let n = walker.nextNode(); n; n = walker.nextNode()) {\n let offFlow = false;\n for (let p = n.parentElement; p && p !== el; p = p.parentElement) {\n const pcs = view.getComputedStyle(p);\n if (\n pcs.position === \"absolute\" ||\n pcs.position === \"fixed\" ||\n pcs.display === \"none\" ||\n p.matches(INTERACTIVE)\n ) {\n offFlow = true;\n break;\n }\n }\n if (!offFlow) out.push(n as Text);\n }\n return out;\n}\n\n/**\n * A PROGRESS TRACK IS NOT A PILL (2026-10-05): a `rounded-full` bar that fills to a percentage — it\n * says so with `role=\"progressbar\"` / `aria-valuenow`, or it clips (`overflow: hidden`) a direct\n * child whose inline width is a percentage — is a gauge. It may hold an icon or a \"60%\" label and\n * is as wide as its row by design; a width budget and a stretch test do not apply to it.\n */\nexport function isProgressTrack(el: HTMLElement): boolean {\n if (el.getAttribute(\"role\") === \"progressbar\" || el.hasAttribute(\"aria-valuenow\")) return true;\n if (el.closest('[role=\"progressbar\"]') === el.parentElement && el.parentElement?.getAttribute(\"role\") === \"progressbar\") return true;\n const view = el.ownerDocument.defaultView;\n const clips = el.style.overflow === \"hidden\" || el.className.split(/\\s+/).includes(\"overflow-hidden\") || view?.getComputedStyle(el).overflow === \"hidden\";\n if (!clips) return false;\n return Array.from(el.children).some((c) => /%$/.test((c as HTMLElement).style?.width ?? \"\"));\n}\n\n/**\n * Why this capsule breaks the pill budget, or null. Pure: reads layout only.\n * `maxWidth` defaults to PILL_MAX_WIDTH_PX.\n */\nexport function findPillViolation(el: HTMLElement, maxWidth = PILL_MAX_WIDTH_PX): string | null {\n if (el.getAttribute(\"data-matrx-pill\") === \"off\") return null;\n if (isProgressTrack(el)) return null;\n const view = el.ownerDocument.defaultView;\n if (!view) return null;\n // Only the capsule's OWN text is its label. A count badge pinned to an icon\n // disc (`absolute -top-1`) is a separate pill the guard checks by itself; the\n // disc holding it is still an icon disc, not a two-line label.\n const own = ownTextNodes(el, view);\n if (!own.some((t) => (t.textContent ?? \"\").trim())) return null; // an icon disc or an avatar, not a label\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n const cs = view.getComputedStyle(el);\n if (cs.display === \"none\" || cs.visibility === \"hidden\") return null;\n // Every distance below is judged in LAYOUT pixels (see layout-scale.ts): a pill inside a\n // zoomed tile is the same pill.\n const scale = layoutScale(el);\n const width = rect.width / scale;\n if (width > maxWidth + 0.5) {\n return `pill is ${Math.round(width)}px wide (budget ${maxWidth}px) holding \"${describe(el)}\" — a pill holds a short label: clamp it (Badge, or truncate + max-w + title) or render a list row.`;\n }\n const past = overflowPast(el, rect, view, scale);\n if (past) {\n return `pill overflows ${past.what} by ${Math.round(past.by)}px holding \"${describe(el)}\" — a pill never runs past its row or the page gutter: let the row wrap and give the pill max-w-full with a truncating label.`;\n }\n const lines = lineCount(el, own, cs, rect.height);\n if (lines > 1) {\n return `pill wraps to ${lines} lines holding \"${describe(el)}\" — a pill is one line: clamp it (Badge, or truncate + max-w + title) or render a list row.`;\n }\n // A CIRCLE IS NOT A CAPSULE (2026-10-04, /bring-your-work step numbers): a fixed round marker\n // holding a digit or initials (`size-6 rounded-full`) is as wide as it is tall by design — its\n // empty sides are the circle, never a parent stretching it.\n if (Math.abs(width - rect.height / scale) < 1) return null;\n const slack = stretchSlack(el, own, cs, width, view, scale);\n if (slack !== null && slack > PILL_STRETCH_TOLERANCE_PX) {\n return `pill is stretched: ${Math.round(slack)}px of empty capsule beside \"${describe(el)}\" — a pill hugs its label; stop the parent stretching it (a grid cell: justify-self-start; drop w-full / flex-1), or render a full-width tappable item as a row, never a pill.`;\n }\n return null;\n}\n\n/**\n * How far the capsule runs past its parent's box or the viewport, or null.\n * A pill inside a sideways track (an ancestor that scrolls horizontally, with\n * more content to its right) is off-screen by design and is not judged. A pill is judged against its\n * parent, its nearest clipping ancestor (overflow hidden/auto/scroll/clip), and the viewport\n * but the viewport only for the part the clippers leave drawn, never inside a transformed\n * (panned/zoomed) ancestor, and never when it is wholly off screen. A parent with no box (display:\n * contents, or no layout engine) is skipped; the viewport is still checked.\n */\nfunction overflowPast(\n el: HTMLElement,\n rect: DOMRect,\n view: Window & typeof globalThis,\n scale = 1,\n): { what: string; by: number } | null {\n // A sideways TRACK: an ancestor that scrolls horizontally. A pill beyond its\n // edge is off-screen by design, so it is not judged. A scroller that ALSO\n // scrolls vertically (a table body, a page) exempts it too, but only when\n // something else extends the scroll width further right than the pill does:\n // computed overflow cannot tell a table scroller from a page whose\n // overflow-x is merely `auto`, and when the pill itself is the right-most\n // thing it is the pill that makes the page scroll sideways (the 0.61.12 miss).\n for (let p = el.parentElement; p; p = p.parentElement) {\n const ox = view.getComputedStyle(p).overflowX;\n if ((ox === \"auto\" || ox === \"scroll\") && p.scrollWidth > p.clientWidth + 1) {\n if (p.scrollHeight <= p.clientHeight + 1) return null;\n const contentRight = rect.right - p.getBoundingClientRect().left + p.scrollLeft;\n if (contentRight < p.scrollWidth - 4) return null;\n }\n }\n // A pinned capsule (a count badge at `absolute -top-1 -right-1`) sits ON\n // its parent's corner by design: only the viewport judges it.\n const pinned = [\"absolute\", \"fixed\"].includes(view.getComputedStyle(el).position);\n const parent = el.parentElement;\n if (parent && !pinned) {\n const pr = parent.getBoundingClientRect();\n if (pr.width > 0) {\n const by = Math.max(rect.right - pr.right, pr.left - rect.left) / scale;\n if (by > 0.5) return { what: \"its container\", by };\n }\n }\n // The nearest CLIPPING ancestor (overflow hidden/auto/scroll/clip) is the\n // box the pill must fit. It is judged when it is not the parent already\n // judged above.\n let clip: HTMLElement | null = null;\n let transformed = false;\n // A transformed layer BETWEEN the pill and its clip is a pan/zoom world inside\n // a viewport (a chart, a canvas): panning carries the pill past the clip by\n // design, so there only a pill wider than the clip — one no pan can ever show\n // whole — is an overflow.\n let pannedInsideClip = false;\n const root = el.ownerDocument.documentElement;\n for (let p = el.parentElement; p && p !== root; p = p.parentElement) {\n const pcs = view.getComputedStyle(p);\n if (!clip && pcs.overflowX !== \"visible\" && pcs.overflowX !== \"\") clip = p;\n if (\n (pcs.transform && pcs.transform !== \"none\") ||\n (pcs.translate && pcs.translate !== \"none\") ||\n (pcs.scale && pcs.scale !== \"none\") ||\n (pcs.rotate && pcs.rotate !== \"none\")\n ) {\n transformed = true;\n if (!clip) pannedInsideClip = true;\n }\n }\n if (clip && !pinned && clip !== parent) {\n const cr = clip.getBoundingClientRect();\n if (cr.width > 0) {\n const by = pannedInsideClip\n ? (rect.width - cr.width) / scale\n : Math.max(rect.right - cr.right, cr.left - rect.left) / scale;\n if (by > 0.5) return { what: \"its clipping container\", by };\n }\n }\n // Where the pill is actually drawn: its box cut by every clipping ancestor.\n let left = rect.left;\n let right = rect.right;\n let top = rect.top;\n let bottom = rect.bottom;\n for (let p = el.parentElement; p && p !== root; p = p.parentElement) {\n const pcs = view.getComputedStyle(p);\n if (pcs.overflowX === \"visible\" && pcs.overflowY === \"visible\") continue;\n const cr = p.getBoundingClientRect();\n if (cr.width === 0 && cr.height === 0) continue;\n if (pcs.overflowX !== \"visible\") {\n left = Math.max(left, cr.left);\n right = Math.min(right, cr.right);\n }\n if (pcs.overflowY !== \"visible\") {\n top = Math.max(top, cr.top);\n bottom = Math.min(bottom, cr.bottom);\n }\n }\n const vw = root.clientWidth || view.innerWidth;\n const vh = root.clientHeight || view.innerHeight;\n // A transformed ancestor (a panned/zoomed canvas tile) places the pill by\n // design; a pill whose drawn part is entirely off screen is not on the page\n // right now. Neither is a layout defect of the pill.\n if (transformed) return null;\n if (vw > 0 && (right <= left || right <= 0 || left >= vw)) return null;\n if (vh > 0 && (bottom <= top || bottom <= 0 || top >= vh)) return null;\n if (vw > 0) {\n const by = Math.max(right - vw, -left);\n if (by > 0.5) return { what: \"the viewport\", by };\n }\n return null;\n}\n\n/**\n * How much wider the capsule's content box is than the ink it holds (its own\n * text runs plus its in-flow glyphs and images), or null when the engine\n * reports no line boxes (jsdom) — never guessed. A label wider than its box\n * (truncated) gives a negative slack: not stretched.\n */\nfunction stretchSlack(\n el: HTMLElement,\n own: Text[],\n cs: CSSStyleDeclaration,\n width: number,\n view: Window & typeof globalThis,\n scale = 1,\n): number | null {\n const range = el.ownerDocument.createRange?.();\n if (!range || typeof range.getClientRects !== \"function\") return null;\n let left = Infinity;\n let right = -Infinity;\n const take = (r: DOMRect | DOMRectReadOnly) => {\n if (r.width <= 0 || r.height <= 0) return;\n left = Math.min(left, r.left);\n right = Math.max(right, r.right);\n };\n for (const node of own) {\n if (!(node.textContent ?? \"\").trim()) continue;\n range.selectNodeContents(node);\n Array.from(range.getClientRects()).forEach(take);\n }\n range.detach?.();\n if (!Number.isFinite(left)) return null; // no measured text: not this check's question\n // Ink is text, glyphs, images, a remove button and any in-flow mark that says so (`data-matrx-pill-ink`: a status\n // dot before the label). A dot left out of the ink read as 12px of \"empty capsule\" beside it.\n // A chip's own remove button (\"Wilhelm Achterberg ×\") is ink too: its × is a child button's text,\n // not the chip's, and measured as empty capsule every removable chip read as stretched.\n el.querySelectorAll(\"svg, img, button, [role='button'], [data-matrx-pill-ink]\").forEach((g) => {\n for (let p: Element | null = g; p && p !== el; p = p.parentElement) {\n const pcs = view.getComputedStyle(p);\n if (pcs.position === \"absolute\" || pcs.position === \"fixed\" || pcs.display === \"none\") return;\n }\n take(g.getBoundingClientRect());\n });\n // A painted mark with no text of its own (a `bg-success` status dot) is ink by its fill, marked or not:\n // \"Live · Set active\" and \"Coming Soon\" read as 10–12px of empty capsule beside their dots (2026-10-18).\n el.querySelectorAll(\"span, i, div\").forEach((g) => {\n if ((g.textContent ?? \"\").trim() || g.querySelector(\"*\")) return;\n const gcs = view.getComputedStyle(g);\n if (gcs.position === \"absolute\" || gcs.position === \"fixed\" || gcs.display === \"none\") return;\n if (paintsNothing(gcs.backgroundColor)) return;\n take(g.getBoundingClientRect());\n });\n const inner = width - px(cs.paddingLeft) - px(cs.paddingRight) - px(cs.borderLeftWidth) - px(cs.borderRightWidth);\n return inner - (right - left) / scale;\n}\n\n/** A computed color with zero alpha (`transparent`, `rgba(… 0)`, `rgb(… / 0)`) paints nothing. */\nfunction paintsNothing(color: string): boolean {\n return !color || color === \"transparent\" || /^\\w+\\((?:[^,/)]*,){3}\\s*0(?:\\.0*)?%?\\s*\\)$|\\/\\s*0(?:\\.0*)?%?\\s*\\)$/.test(color);\n}\n\n/**\n * How many text lines the capsule draws. Measured from the text's own line\n * boxes when the engine reports them (a real browser); otherwise estimated\n * from the content height. Line boxes, not height, so a count badge drawn in a\n * box taller than its `leading-none` line (a 16px \"99+\" dot) is not \"2 lines\".\n */\nfunction lineCount(el: HTMLElement, own: Text[], cs: CSSStyleDeclaration, height: number): number {\n const range = el.ownerDocument.createRange?.();\n if (range && typeof range.getClientRects === \"function\") {\n // Text line boxes only: a range over the whole element also returns the\n // boxes of its glyph <svg> and of every positioned child, which are not lines.\n const rects: DOMRect[] = [];\n for (const node of own) {\n if (!(node.textContent ?? \"\").trim()) continue;\n range.selectNodeContents(node);\n rects.push(...Array.from(range.getClientRects()).filter((r) => r.width > 0 && r.height > 0));\n }\n range.detach?.();\n if (rects.length) {\n const mids: number[] = [];\n for (const r of rects) {\n const mid = r.top + r.height / 2;\n if (!mids.some((m) => Math.abs(m - mid) < r.height / 2)) mids.push(mid);\n }\n return mids.length;\n }\n }\n const fontSize = px(cs.fontSize) || 12;\n const lineHeight = Math.max(px(cs.lineHeight), fontSize * 1.25);\n const inner = height - px(cs.paddingTop) - px(cs.paddingBottom) - px(cs.borderTopWidth) - px(cs.borderBottomWidth);\n return inner > lineHeight * 1.5 ? Math.round(inner / lineHeight) : 1;\n}\n\n// The destructive token, so the mark reads as an error in both themes.\nconst OUTLINE = \"2px dashed hsl(var(--destructive))\";\n\n/**\n * Turn the development pill guard on. Returns the function that turns it off.\n * Idempotent: a second call keeps the first install.\n */\nexport function enablePillGuard(options: { maxWidth?: number; root?: Document } = {}): () => void {\n const g = globalThis as GlobalWithSlot;\n if (g[SLOT]) return g[SLOT]!;\n const doc = options.root ?? (typeof document === \"undefined\" ? null : document);\n const view = doc?.defaultView;\n if (!doc || !view) return () => {};\n const maxWidth = options.maxWidth ?? PILL_MAX_WIDTH_PX;\n const marked = new Map<HTMLElement, string>(); // el → its own outline before we painted\n const reported = new Set<string>();\n let timer: ReturnType<typeof setTimeout> | null = null;\n let observer: MutationObserver | null = null;\n\n const scan = () => {\n timer = null;\n observer?.disconnect(); // our own attribute writes must not re-trigger a scan\n for (const [el, before] of marked) {\n if (!el.isConnected || !findPillViolation(el, maxWidth)) {\n el.style.outline = before;\n el.removeAttribute(\"data-matrx-pill-violation\");\n marked.delete(el);\n }\n }\n doc.querySelectorAll<HTMLElement>(SELECTOR).forEach((el) => {\n const reason = findPillViolation(el, maxWidth);\n if (!reason) return;\n if (!marked.has(el)) marked.set(el, el.style.outline);\n el.style.outline = OUTLINE;\n el.style.outlineOffset = \"1px\";\n el.setAttribute(\"data-matrx-pill-violation\", reason);\n if (!reported.has(reason)) {\n reported.add(reason);\n console.error(`[pill-guard] ${reason}`, el);\n }\n });\n observe();\n };\n const schedule = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(scan, 400);\n };\n const observe = () => {\n if (!doc.body) return;\n observer ??= new view.MutationObserver(schedule);\n observer.observe(doc.body, { childList: true, subtree: true, characterData: true });\n };\n view.addEventListener(\"resize\", schedule);\n observe();\n schedule();\n\n const off = () => {\n observer?.disconnect();\n view.removeEventListener(\"resize\", schedule);\n if (timer) clearTimeout(timer);\n for (const [el, before] of marked) {\n el.style.outline = before;\n el.removeAttribute(\"data-matrx-pill-violation\");\n }\n marked.clear();\n delete g[SLOT];\n };\n g[SLOT] = off;\n return off;\n}\n","\"use client\";\n\n/**\n * Alert — the inline status banner (76 host import sites).\n *\n * Ported from matrx-frontend `components/ui/alert.tsx`. That copy shipped two\n * variants, `default` and `destructive`, so every \"this is a warning\" and\n * \"this succeeded\" banner in the fleet was hand-rolled: an amber or emerald\n * `<div>` carrying literal palette classes and a hand-written dark-mode twin,\n * written once per surface. The census that opened this wave found dozens of those\n * across four repos.\n *\n * So the variant set is the token vocabulary this package already declares —\n * `default | destructive | warning | success | info` — and none of them\n * hardcode a color (C26). A host that wants a different amber changes\n * `--warning`; it never writes another banner.\n *\n * `Alert` is a plain `role=\"alert\"` region, NOT a toast: it stays on the page,\n * it is not dismissed on a timer, and a screen reader announces it where it\n * sits. Transient notifications are the host's toast system.\n */\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { ErrorActions, type ErrorActionsInput } from \"./error-box\";\n\nimport { cn } from \"./cn\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg~*]:pl-7\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground [&>svg]:text-foreground\",\n destructive:\n \"border-destructive/50 bg-destructive/5 text-destructive-ink dark:border-destructive [&>svg]:text-destructive-ink\",\n warning:\n \"border-warning/50 bg-warning/5 text-warning-ink dark:border-warning [&>svg]:text-warning-ink\",\n success:\n \"border-success/50 bg-success/5 text-success-ink dark:border-success [&>svg]:text-success-ink\",\n info: \"border-info/50 bg-info/5 text-info-ink dark:border-info [&>svg]:text-info-ink\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface AlertProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof alertVariants> {\n /**\n * The error's facts for the host's error actions (destructive only): the raw\n * error, the operation, the records. Without it the host reads the words\n * from the rendered Alert.\n */\n errorFacts?: ErrorActionsInput | undefined;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant, children, errorFacts, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n data-slot=\"alert\"\n data-variant={variant ?? \"default\"}\n className={cn(alertVariants({ variant }), className)}\n {...props}\n >\n {children}\n {/* A destructive Alert is an error on screen: the host's error actions\n (ErrorActionsProvider) ride it. The words are the Alert's own, so the\n host reads them from the rendered box. */}\n {variant === \"destructive\" ? (\n <ErrorActions origin=\"design-system/Alert\" {...errorFacts} />\n ) : null}\n </div>\n ),\n);\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"alert-description\"\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertDescription, AlertTitle, alertVariants };\n","\"use client\";\n\n/**\n * THE hand-rolled read, done once (RC-B12 round 12). Components that fetched\n * in a `useEffect` with `const [loading, setLoading] = useState(true)` and a\n * `catch { console.error(…) }` left their list at `[]` when the read failed —\n * and the empty view then said \"No items yet\". `useRead` owns the three\n * states, so a failure is always a status the view can gate on:\n *\n * const read = useRead(() => listThings(orgId), [orgId]);\n * <ReadGate status={read.status} error={read.error} onRetry={read.retry}\n * what=\"your things\" isEmpty={!read.data?.length} empty={<p>No things yet.</p>}>\n * <ThingList things={read.data ?? []} />\n * </ReadGate>\n *\n * - status: \"loading\" while a read is in flight (earlier data stays visible),\n * \"error\" when the latest read failed, \"ready\" when it succeeded (or when the\n * read is disabled — nothing was asked, so nothing is claimed).\n * - retry(): run the read again.\n * - setData(): local edits after a create/delete, without a re-read.\n * Late answers from a superseded read are dropped.\n */\nimport { useEffect, useEffectEvent, useState } from \"react\";\nimport type { ReadStatus } from \"./read-gate\";\n\nexport interface ReadResult<T> {\n data: T | undefined;\n status: ReadStatus;\n error: unknown;\n isLoading: boolean;\n isError: boolean;\n /** A read has succeeded at least once — its value is known (stale-while-error for counts and rows). */\n hasData: boolean;\n retry: () => void;\n setData: (next: T | ((prev: T | undefined) => T)) => void;\n}\n\nexport function useRead<T>(\n read: () => Promise<T>,\n /** What the read depends on — serializable values (ids, filters). A change re-reads. */\n deps: readonly unknown[],\n options: { enabled?: boolean; initialData?: T } = {},\n): ReadResult<T> {\n const { enabled = true, initialData } = options;\n const [data, setDataState] = useState<T | undefined>(initialData);\n const [attempt, setAttempt] = useState(0);\n // Status is DERIVED from which read last settled (the react-hooks lint\n // forbids setting state synchronously inside the effect): a read is in\n // flight exactly while the latest settled key is not the current key.\n const [settled, setSettled] = useState<{ key: string; ok: boolean; error: unknown } | null>(null);\n const [everSucceeded, setEverSucceeded] = useState(false);\n const runRead = useEffectEvent(() => read());\n const fetchKey = JSON.stringify([attempt, ...deps]);\n\n useEffect(() => {\n if (!enabled) return undefined;\n let superseded = false;\n let promise: Promise<T>;\n try {\n promise = Promise.resolve(runRead());\n } catch (err) {\n promise = Promise.reject(err);\n }\n promise.then(\n (result) => {\n if (superseded) return;\n setDataState(result);\n setEverSucceeded(true);\n setSettled({ key: fetchKey, ok: true, error: null });\n },\n (err: unknown) => {\n if (superseded) return;\n setSettled({ key: fetchKey, ok: false, error: err ?? new Error(\"The read failed\") });\n },\n );\n return () => {\n // deps changed, retry, or unmount: this run's answer is no longer wanted.\n superseded = true;\n };\n }, [enabled, fetchKey]);\n\n const status: ReadStatus = !enabled\n ? \"ready\"\n : settled?.key !== fetchKey\n ? \"loading\"\n : settled.ok\n ? \"ready\"\n : \"error\";\n const error = status === \"error\" ? settled?.error : null;\n\n const retry = () => setAttempt((n) => n + 1);\n const setData = (next: T | ((prev: T | undefined) => T)) => {\n setDataState((prev) => (typeof next === \"function\" ? (next as (p: T | undefined) => T)(prev) : next));\n };\n\n return { data, status, error, isLoading: status === \"loading\", isError: status === \"error\", hasData: everSucceeded, retry, setData };\n}\n","\"use client\";\n\n/**\n * Avatar — Radix avatar with the package's token vocabulary.\n *\n * The forks differed only in the root's fixed size (matrx-frontend `h-10 w-10`,\n * dashboard `h-9 w-9`) and in whether the fallback carried type styling. Both\n * are settled here as props rather than copies: `size` picks the box, and the\n * fallback always carries the muted type treatment (dashboard's version — a\n * fallback renders initials, and unstyled initials inherit whatever the row\n * was using, which is how the two hosts' avatars stopped matching).\n */\n\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nconst AVATAR_SIZES: Record<AvatarSize, string> = {\n // xs: the 16px author mark inside a dense line (a comment-thread reply row).\n xs: \"h-4 w-4 text-[9px]\",\n sm: \"h-8 w-8 text-[11px]\",\n md: \"h-9 w-9 text-xs\",\n lg: \"h-10 w-10 text-sm\",\n};\n\nexport interface AvatarProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> {\n /** Box size. Default `lg` (the h-10 box matrx-frontend has always shipped). */\n size?: AvatarSize;\n}\n\nconst Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarProps\n>(({ className, size = \"lg\", ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n data-slot=\"avatar\"\n className={cn(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n AVATAR_SIZES[size],\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted font-medium text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarFallback, AvatarImage };\n","\"use client\";\n\n/**\n * Card — the surface every host had already forked, four different ways.\n *\n * The census that motivated this file (2026-09-07): matrx-frontend padded its\n * sections `p-2`, matrx-extend `p-4`, aidream/apps/dashboard `p-6`, and\n * matrx-games ran a Base-UI-generation card of its own. The STRUCTURE was\n * identical in all of them — a bordered, tokenised surface with header /\n * title / description / content / footer slots. Only the density differed.\n *\n * So density is a PROP, not a fork. `size` is declared once on `<Card>` and\n * every section reads it from context, which means a host cannot end up with a\n * `p-6` header above a `p-2` body — the failure mode that made the forks drift\n * in the first place. A host that wants its historical density binds the size\n * once at its import site; nothing else moves.\n *\n * sm → p-2, rounded-xl, `shadow` (matrx-frontend's density)\n * md → p-4, rounded-lg, `shadow-sm` (matrx-extend's density; the default)\n * lg → p-6, rounded-lg, `shadow-sm` (dashboard's density)\n *\n * Color is tokens only (`bg-card` / `text-card-foreground` / `border`), so a\n * host re-themes cards by redefining tokens, never by editing this file.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type CardSize = \"sm\" | \"md\" | \"lg\";\n\ninterface CardSizeSpec {\n root: string;\n pad: string;\n padTopless: string;\n}\n\nconst CARD_SIZES: Record<CardSize, CardSizeSpec> = {\n sm: {\n root: \"rounded-xl border bg-card text-card-foreground shadow\",\n pad: \"p-2\",\n padTopless: \"p-2 pt-0\",\n },\n md: {\n root: \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n pad: \"p-4\",\n padTopless: \"p-4 pt-0\",\n },\n lg: {\n root: \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n pad: \"p-6\",\n padTopless: \"p-6 pt-0\",\n },\n};\n\nconst CardSizeContext = React.createContext<CardSize>(\"md\");\n\n/** The size the nearest enclosing `<Card>` declared. `md` outside one. */\nexport function useCardSize(): CardSize {\n return React.useContext(CardSizeContext);\n}\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Density for this card and every section inside it. Default `md`. */\n size?: CardSize;\n}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, size = \"md\", ...props }, ref) => (\n <CardSizeContext.Provider value={size}>\n <div\n ref={ref}\n data-slot=\"card\"\n data-size={size}\n className={cn(CARD_SIZES[size].root, className)}\n {...props}\n />\n </CardSizeContext.Provider>\n ),\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n ref={ref}\n data-slot=\"card-header\"\n className={cn(\n \"flex flex-col space-y-1.5 rounded-t-[inherit]\",\n CARD_SIZES[size].pad,\n className,\n )}\n {...props}\n />\n );\n});\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n data-slot=\"card-title\"\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\n/**\n * Trailing control slot for a header (a menu button, a status pill). Absent\n * from every fork except matrx-games', which is why headers elsewhere grew\n * one-off absolute wrappers. Positions itself against the header's row.\n */\nconst CardAction = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-action\"\n className={cn(\"ml-auto self-start\", className)}\n {...props}\n />\n));\nCardAction.displayName = \"CardAction\";\n\n/** The space between a card body's stacked children (0.68.22): 8 / 12 / 16 / 24px. */\nexport type CardGap = \"sm\" | \"md\" | \"lg\" | \"xl\";\nconst CARD_GAP_CLASS: Record<CardGap, string> = {\n sm: \"space-y-2\",\n md: \"space-y-3\",\n lg: \"space-y-4\",\n xl: \"space-y-6\",\n};\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * STACK SPACING, named (0.68.22): the body's children stack with this much space between\n * them — never a pasted `space-y-3`. Omit for no stack spacing.\n */\n gap?: CardGap;\n /**\n * `default`: the card's density padding (no top pad under a header). `none`: the content\n * runs edge to edge (a table, a list with its own row padding, an image).\n */\n padding?: \"default\" | \"none\";\n}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, gap, padding = \"default\", ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n ref={ref}\n data-slot=\"card-content\"\n data-gap={gap}\n className={cn(\n padding === \"none\" ? \"p-0\" : CARD_SIZES[size].padTopless,\n gap && CARD_GAP_CLASS[gap],\n className,\n )}\n {...props}\n />\n );\n },\n);\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n ref={ref}\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-[inherit]\",\n CARD_SIZES[size].padTopless,\n className,\n )}\n {...props}\n />\n );\n});\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n};\n","\"use client\";\n\n/**\n * CreatablePicker — ported verbatim from matrx-frontend\n * `components/ui/creatable-picker.tsx`.\n *\n * P23 — EVERY PICKER TAKES NEW INPUT.\n *\n * Arman, 2026-08-23: \"We have to annihilate the UIs that offer options but\n * don't allow custom entry because those are the ones that lose the platform\n * the best users… the moment I went in to assign a tier, I got a pop up that\n * forced me to choose from the shitty options I had in front of me. So instead\n * of our system getting significantly better because I took the initiative to\n * add something, our system was too arrogant and cocky and didn't want my\n * opinion. … It's the lazy coding agent who builds a popover with a drop down,\n * but is too lazy to include an add feature.\"\n *\n * THIS COMPONENT IS THE ANSWER, and it is the ONLY shape a keyword-system\n * choice control may take. Type-ahead over the existing options, and whatever\n * you typed that matched nothing is offered back as \"Create «what you typed»\".\n * One click turns it into a real row through the feature's ONE write path and\n * selects it — never a second creation path, never a \"go somewhere else first\".\n *\n * P11 — THE ONE EXCEPTION, AND IT IS NEVER A DEAD END. A platform-shared\n * vocabulary (traffic classes, the platform dimensions every tenant shares) is\n * governed centrally, so this control does not pretend it can widen it. It SAYS\n * so and offers the door instead: `lockedNote` + `lockedAction` render a\n * footer that takes the person to \"make this your own dimension\".\n *\n * It knows nothing about any vocabulary. The caller supplies the options and\n * ONE `onCreate` that writes through whatever the canonical path for that\n * vocabulary already is — this component must never grow a write path of its\n * own, or it becomes the second one.\n *\n * SoR: common-docs/systems/marketing/seo/seo-keywords/keyword-system-decisions.md\n * (P23, P11) + value-system.md § THE ASSIGNMENT LAYER.\n *\n * Seam inversions (the only changes from the origin):\n * - Popover/Command come from this package's own primitives (which route\n * portals through the `PortalContainerProvider` seam).\n * - The lucide icons become package-inlined SVGs (C19); `LucideIcon` in the\n * `footerActions` contract becomes the structural `PickerIcon`.\n */\n\nimport { SelectChevron } from \"./select\";\nimport {\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"./cn\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"./command\";\nimport { ExternalLinkIcon, Loader2Icon, LockIcon, CheckIcon, PlusIcon } from \"./icons\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\n\n/** Structural stand-in for the host's `LucideIcon` in `footerActions`. */\nexport type PickerIcon = ComponentType<{ className?: string }>;\n\n/**\n * \"Add a offering…\" is the kind of small wrongness that makes a product feel\n * unfinished, and the noun is caller-supplied so the article has to be derived.\n */\nfunction article(noun: string): string {\n return /^[aeiou]/i.test(noun.trim()) ? `an ${noun}` : `a ${noun}`;\n}\n\nexport interface CreatableOption {\n value: string;\n label: string;\n /** Right-aligned detail — a count, a description, \"yours\". */\n hint?: string;\n /** Rendered instead of the plain label (a band chip, a colored pill). */\n render?: ReactNode;\n /** Extra words the type-ahead should match on. */\n keywords?: string;\n /**\n * The heading this option files under. Options keep the caller's order; a\n * group is opened the first time an option names it. Omit on every option\n * for a single ungrouped list.\n *\n * THE CATALOG IS NOT A WALL (Arman, 2026-08-24, on being shown offerings\n * that were not his): a set that legitimately holds more than this tenant's\n * own rows says so with a heading instead of hiding the rest.\n */\n group?: string;\n}\n\nexport interface CreatablePickerProps {\n value: string | null;\n options: CreatableOption[];\n onSelect: (value: string) => void;\n placeholder: string;\n searchPlaceholder?: string;\n /** The noun in \"Add a level…\" / \"Create «x»\". Always a person's word. */\n noun: string;\n /**\n * Turns typed text into a real row and returns the option value to select.\n * Return null when the caller handled it another way (opened a dialog that\n * needs more than a name — a level needs a threshold).\n */\n onCreate?: (typed: string) => Promise<string | null>;\n /**\n * Creating this noun needs more than a name, so the picker hands the typed\n * text to the caller's dialog instead of writing anything itself.\n */\n onCreateRequiresMore?: (typed: string) => void;\n disabled?: boolean;\n loading?: boolean;\n className?: string;\n triggerClassName?: string;\n emptyLabel?: string;\n ariaLabel?: string;\n /** P11: a sentence saying this vocabulary is platform-governed. */\n lockedNote?: string;\n /** P11: the door out of that refusal — never leave them with only \"no\". */\n lockedAction?: { label: string; onSelect: () => void };\n /**\n * Rendered inside the create footer, above the create button — for the one\n * extra choice a vocabulary needs at creation time (a category's parent,\n * say). It is a SLOT, not a second write path: whatever it collects is read\n * by the caller's own `onCreate`. A function receives what the person typed,\n * so a slot can offer matching suggestions (e.g. a shared catalog) instead\n * of a fixed block.\n */\n createExtra?: ReactNode | ((typed: string) => ReactNode);\n /**\n * THE MANAGE DOOR. Arman, 2026-08-24: \"where we have 'add' we should also\n * have a 'manage' button that opens that thing in a new tab.\" A control that\n * names a vocabulary must also be able to reach the place that vocabulary is\n * governed — otherwise the person who wants to rename, re-parent, or retire\n * an option has to go hunting for a screen they may not know exists.\n *\n * It opens in a NEW TAB on purpose: nobody loses the row they were editing\n * in order to go look at the catalog.\n */\n manageAction?: { label: string; href: string };\n /**\n * Doors to a DIFFERENT answer than this vocabulary can give. The offering\n * picker's \"this isn't something we offer\" lives here, because that ruling\n * is a traffic class, not an offering — and sending someone to look for\n * another column on their own is the dead end this slot exists to close.\n */\n footerActions?: Array<{\n label: string;\n icon?: PickerIcon;\n onSelect: () => void;\n /** A sentence under the door saying what it does, when it needs one. */\n note?: string;\n }>;\n /**\n * What the TRIGGER shows for the current selection, when the caller wants\n * something other than the option row's own `render`. A dense table cell\n * needs one compact line (\"Data Destruction Services · ITAD\"); the list row\n * it came from is indented and annotated. Same selection, two jobs.\n */\n renderSelected?: ReactNode;\n size?: \"sm\" | \"md\";\n}\n\nexport function CreatablePicker({\n value,\n options,\n onSelect,\n placeholder,\n searchPlaceholder,\n noun,\n onCreate,\n onCreateRequiresMore,\n disabled,\n loading,\n className,\n triggerClassName,\n emptyLabel = \"No match.\",\n ariaLabel,\n lockedNote,\n lockedAction,\n createExtra,\n manageAction,\n footerActions,\n renderSelected,\n size = \"sm\",\n}: CreatablePickerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [busy, setBusy] = useState(false);\n /**\n * THE FOOTER IS NEVER A DEAD CLICK. Arman, 2026-08-24: \"one of the options is\n * to allow you to add. When I click add offering, however, nothing happens.\"\n * He was right, and the cause was here, not in the popover: with nothing\n * typed, `create(\"\")` fell straight out of `if (!name) return` and the\n * button ate the click in silence. A control whose whole purpose is P23 may\n * not be the control that ignores you — so an empty \"Add…\" now puts the\n * cursor in the box and SAYS what it wants.\n */\n const inputRef = useRef<HTMLInputElement>(null);\n const [needsName, setNeedsName] = useState(false);\n\n const selected = options.find((option) => option.value === value) ?? null;\n\n // Caller order is the order. A heading opens the first time an option names\n // it, so a tree stays in tree order inside its own heading.\n const groups: Array<{ heading?: string; options: CreatableOption[] }> = [];\n for (const option of options) {\n const last = groups[groups.length - 1];\n if (last && last.heading === option.group) last.options.push(option);\n else\n groups.push(\n option.group === undefined\n ? { options: [option] }\n : { heading: option.group, options: [option] },\n );\n }\n\n const typed = query.trim();\n const exactMatch = options.some(\n (option) => option.label.toLowerCase() === typed.toLowerCase(),\n );\n const canCreate = Boolean(onCreate ?? onCreateRequiresMore) && !lockedNote;\n\n const close = () => {\n setOpen(false);\n setQuery(\"\");\n setNeedsName(false);\n };\n\n const create = async (text: string) => {\n const name = text.trim();\n if (busy) return;\n // `onCreateRequiresMore` opens a dialog that asks for the name itself, so\n // a blank click there is legitimate — it opens the dialog empty. Only the\n // write-it-now path needs a name before it can do anything.\n if (onCreateRequiresMore) {\n close();\n onCreateRequiresMore(name);\n return;\n }\n if (!onCreate) return;\n if (!name) {\n setNeedsName(true);\n inputRef.current?.focus();\n return;\n }\n setBusy(true);\n try {\n const next = await onCreate(name);\n if (next) onSelect(next);\n close();\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Popover open={open} onOpenChange={(next) => (next ? setOpen(true) : close())}>\n <PopoverTrigger asChild disabled={disabled}>\n <button\n type=\"button\"\n aria-label={ariaLabel ?? placeholder}\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 text-left shadow-xs transition-colors\",\n \"hover:border-primary/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n size === \"sm\" ? \"h-8 text-xs\" : \"h-9 text-sm\",\n className,\n triggerClassName,\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {selected ? (\n (renderSelected ?? selected.render ?? selected.label)\n ) : (\n <span className=\"text-muted-foreground\">\n {loading ? \"Loading…\" : placeholder}\n </span>\n )}\n </span>\n <SelectChevron size=\"sm\" />\n </button>\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" align=\"start\" className=\"p-0\">\n <Command\n filter={(itemValue, search, keywords) => {\n const haystack = `${itemValue} ${keywords?.join(\" \") ?? \"\"}`.toLowerCase();\n return haystack.includes(search.toLowerCase()) ? 1 : 0;\n }}\n >\n <CommandInput\n ref={inputRef}\n value={query}\n onValueChange={(next) => {\n setQuery(next);\n if (next.trim()) setNeedsName(false);\n }}\n placeholder={searchPlaceholder ?? `Search or add ${article(noun)}…`}\n />\n <CommandList>\n <CommandEmpty>{emptyLabel}</CommandEmpty>\n {groups.map((group) => (\n <CommandGroup\n key={group.heading ?? \"__ungrouped__\"}\n {...(group.heading === undefined\n ? {}\n : { heading: group.heading })}\n >\n {group.options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.label}\n {...(option.keywords\n ? { keywords: [option.keywords] }\n : {})}\n onSelect={() => {\n onSelect(option.value);\n close();\n }}\n className=\"gap-2 text-xs\"\n >\n <CheckIcon\n className={cn(\n \"size-3.5 shrink-0\",\n option.value === value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <span className=\"min-w-0 flex-1 truncate\">\n {option.render ?? option.label}\n </span>\n {option.hint ? (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {option.hint}\n </span>\n ) : null}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n\n {/* The \"+ Add\" footer sits OUTSIDE CommandList so the search can\n never hide the one thing the person came here to do (P23). */}\n {canCreate ? (\n <div className=\"space-y-1 border-t border-border p-1\">\n {createExtra && typed && !exactMatch ? (\n <div className=\"px-1 pt-0.5\">\n {typeof createExtra === \"function\"\n ? createExtra(typed)\n : createExtra}\n </div>\n ) : null}\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void create(typed)}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:opacity-50\"\n >\n {busy ? (\n <Loader2Icon className=\"size-3.5 shrink-0 matrx-spin\" />\n ) : (\n <PlusIcon className=\"size-3.5 shrink-0\" />\n )}\n <span className=\"min-w-0 truncate\">\n {typed && !exactMatch\n ? `Create “${typed}”`\n : `Add ${article(noun)}…`}\n </span>\n </button>\n {needsName ? (\n <p className=\"px-2 pb-0.5 text-[11px] leading-snug text-muted-foreground\">\n Type the name of the {noun} you want to add — then this\n creates it.\n </p>\n ) : null}\n </div>\n ) : null}\n\n {/* THE DOORS. Everything this control names must be reachable from\n it: the place the vocabulary is governed, and the other answer\n when this vocabulary is the wrong one to be answering with. */}\n {footerActions?.length || manageAction ? (\n <div className=\"space-y-0.5 border-t border-border p-1\">\n {footerActions?.map((action) => {\n const Icon = action.icon;\n return (\n <div key={action.label}>\n <button\n type=\"button\"\n onClick={() => {\n close();\n action.onSelect();\n }}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n {Icon ? <Icon className=\"size-3.5 shrink-0\" /> : null}\n <span className=\"min-w-0 truncate\">{action.label}</span>\n </button>\n {action.note ? (\n <p className=\"px-2 pb-1 text-[10px] leading-snug text-muted-foreground\">\n {action.note}\n </p>\n ) : null}\n </div>\n );\n })}\n {manageAction ? (\n <OutboundLink\n href={manageAction.href}\n onClick={close}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{manageAction.label}</span>\n </OutboundLink>\n ) : null}\n </div>\n ) : null}\n\n {/* P11 — shared vocabulary. Say it, then hand them the door. */}\n {lockedNote ? (\n <div className=\"space-y-1 border-t border-border p-2\">\n <p className=\"flex gap-1.5 text-[11px] leading-snug text-muted-foreground\">\n <LockIcon className=\"mt-px size-3 shrink-0\" />\n <span>{lockedNote}</span>\n </p>\n {lockedAction ? (\n <button\n type=\"button\"\n onClick={() => {\n close();\n lockedAction.onSelect();\n }}\n className=\"flex w-full items-center gap-2 rounded-sm px-1 py-1 text-left text-xs font-medium text-primary-ink transition-colors hover:bg-accent\"\n >\n <PlusIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{lockedAction.label}</span>\n </button>\n ) : null}\n </div>\n ) : null}\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\n/**\n * OverflowToolbar — a horizontal row of consistent, compact action buttons\n * that collapses the buttons that don't fit into a single \"more\" (…) menu.\n * Ported verbatim from matrx-frontend\n * `components/official/toolbar/OverflowToolbar.tsx` (S20).\n *\n * ┌───────────────────────────────────────────────┐\n * │ [leading] [Btn] [Btn] [Btn] [ … ] │\n * └───────────────────────────────────────────────┘\n *\n * Design rules (the primitive enforces them so callers can't drift):\n * - Every button is the same height (h-7), padding, text size, icon size.\n * - `hideLabel` renders an icon-only button with a tooltip — use it for\n * \"obvious\" actions (Find, Source, …).\n * - `tone: \"primary\"` colors a button without changing its size, so the\n * primary action is NOT visually larger than the rest.\n * - When the row is too narrow, the LAST actions collapse into the overflow\n * menu first. Order your actions most-important-first.\n *\n * Measurement is done with a hidden \"ghost\" row (always renders every action\n * + the kebab) read via a ResizeObserver, so the visible row never reflows\n * mid-frame.\n *\n * Seam inversions (host-shaped chrome becomes injected):\n * - `icon: LucideIcon` → the structural `ToolbarIcon`\n * (`ComponentType<{ className?: string }>`) — any SVG component fits.\n * - The host Tooltip wrapper → `renderTooltip` prop. Without it, icon-only\n * buttons render bare (they always carry `aria-label`); hosts inject their\n * tooltip system for the original hover behavior.\n * - The host ItemMenu overflow menu → `renderOverflowMenu` prop (required):\n * the host receives the collapsed actions plus the ready-made kebab trigger\n * and renders them with its own menu system.\n */\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"./cn\";\nimport { Loader2Icon, MoreHorizontalIcon } from \"./icons\";\n\nexport type ToolbarActionTone = \"default\" | \"primary\" | \"destructive\";\n\n/** Structural icon contract (a lucide icon satisfies it, so does any SVG component). */\nexport type ToolbarIcon = React.ComponentType<{ className?: string }>;\n\nexport interface ToolbarAction {\n id: string;\n label: string;\n icon: ToolbarIcon;\n /** Click handler. Ignored when `href` is set. */\n onSelect?: () => void;\n /** Renders an anchor instead of a button. */\n href?: string;\n target?: \"_blank\";\n disabled?: boolean;\n /** Swaps the icon for a spinner and (optionally) shows `runningLabel`. */\n running?: boolean;\n runningLabel?: string;\n tone?: ToolbarActionTone;\n /** Icon-only button (tooltip carries the label). For obvious actions. */\n hideLabel?: boolean;\n /** Drop the action entirely. */\n hidden?: boolean;\n}\n\nexport interface OverflowToolbarProps {\n actions: ToolbarAction[];\n /**\n * Optional element pinned at the start of the row — never collapsed, never\n * measured into the action budget except as a fixed prefix (e.g. a surface\n * switcher / context chip cluster).\n */\n leading?: React.ReactNode;\n /** Accessible label for the overflow trigger. */\n overflowAriaLabel?: string;\n className?: string;\n /**\n * Injected overflow-menu seam: render the collapsed actions with the host's\n * menu system, using `trigger` (the ready-made kebab button) as the menu\n * trigger element.\n */\n renderOverflowMenu: (args: {\n actions: ToolbarAction[];\n trigger: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Injected tooltip seam for icon-only buttons (their label lives nowhere\n * else on screen). Omitted → the bare control renders (aria-label intact).\n */\n renderTooltip?: (control: React.ReactElement, label: string) => React.ReactNode;\n}\n\nconst GAP_PX = 6; // gap-1.5\n\n// ── Button ──────────────────────────────────────────────────────────────────\n\nconst TONE: Record<ToolbarActionTone, string> = {\n default: \"border border-border bg-background hover:bg-accent text-foreground\",\n primary: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"border border-destructive/40 text-destructive-ink hover:bg-destructive/10\",\n};\n\nfunction ToolbarButton({\n action,\n enableTooltip = false,\n renderTooltip,\n}: {\n action: ToolbarAction;\n /** Wrap icon-only buttons in a styled tooltip. Off for the ghost row. */\n enableTooltip?: boolean;\n renderTooltip?:\n | ((control: React.ReactElement, label: string) => React.ReactNode)\n | undefined;\n}) {\n const tone = action.tone ?? \"default\";\n const Icon = action.running ? Loader2Icon : action.icon;\n const showLabel =\n !action.hideLabel || (action.running && action.runningLabel);\n const text =\n action.running && action.runningLabel ? action.runningLabel : action.label;\n\n const className = cn(\n \"inline-flex items-center gap-1 h-7 rounded-md text-[11px] font-medium transition-colors whitespace-nowrap\",\n \"disabled:opacity-50\",\n action.hideLabel && !action.running ? \"w-7 justify-center px-0\" : \"px-2\",\n TONE[tone],\n );\n\n const inner = (\n <>\n <Icon\n className={cn(\"w-3.5 h-3.5 shrink-0\", action.running && \"matrx-spin\")}\n />\n {showLabel && <span>{text}</span>}\n </>\n );\n\n const control =\n action.href && !action.disabled ? (\n <a\n href={action.href}\n target={action.target}\n rel={action.target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n className={className}\n aria-label={action.label}\n >\n {inner}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={action.onSelect}\n disabled={action.disabled}\n className={className}\n aria-label={action.label}\n >\n {inner}\n </button>\n );\n\n // Icon-only buttons need a styled tooltip to be discoverable — the label\n // lives nowhere else on screen. Labeled buttons are self-describing.\n if (enableTooltip && action.hideLabel && renderTooltip) {\n return <>{renderTooltip(control, action.label)}</>;\n }\n\n return control;\n}\n\nfunction OverflowTrigger({ ariaLabel }: { ariaLabel: string }) {\n return (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n aria-haspopup=\"menu\"\n title=\"More actions\"\n className={cn(\n \"inline-flex items-center justify-center h-7 w-7 rounded-md transition-colors\",\n \"border border-border bg-background hover:bg-accent text-foreground\",\n )}\n >\n <MoreHorizontalIcon className=\"w-3.5 h-3.5\" />\n </button>\n );\n}\n\n// ── Toolbar ───────────────────────────────────────────────────────────────\n\nexport function OverflowToolbar({\n actions,\n leading,\n overflowAriaLabel = \"More actions\",\n className,\n renderOverflowMenu,\n renderTooltip,\n}: OverflowToolbarProps) {\n const visibleActions = useMemo(\n () => actions.filter((a) => !a.hidden),\n [actions],\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n const ghostRef = useRef<HTMLDivElement>(null);\n // The leading slot renders ONCE (in the visible row) — it may host a\n // stateful/data-fetching component, so we never duplicate it into the ghost.\n // Its width is read directly off this ref instead.\n const leadingRef = useRef<HTMLSpanElement>(null);\n const [visibleCount, setVisibleCount] = useState(visibleActions.length);\n\n // Re-measure whenever the rendered text/state of any action changes (label,\n // icon-only mode, or running label all change a button's width).\n const signature = visibleActions\n .map(\n (a) =>\n `${a.id}:${a.hideLabel ? 1 : 0}:${a.running ? 1 : 0}:${a.runningLabel ?? \"\"}:${a.label}`,\n )\n .join(\"|\");\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n const ghost = ghostRef.current;\n if (!container || !ghost) return undefined;\n\n const compute = () => {\n const available = container.clientWidth;\n const n = visibleActions.length;\n const children = Array.from(ghost.children) as HTMLElement[];\n const hasLeading = leading != null;\n const leadingW = hasLeading ? (leadingRef.current?.offsetWidth ?? 0) : 0;\n const itemW = (i: number) => children[i]?.offsetWidth ?? 0;\n const kebabW = children[n]?.offsetWidth ?? 28;\n\n // Width consumed by the always-present leading slot.\n const base = leadingW + (hasLeading && n > 0 ? GAP_PX : 0);\n\n // Does everything fit with no kebab?\n let totalAll = base;\n for (let i = 0; i < n; i++) totalAll += itemW(i) + (i > 0 ? GAP_PX : 0);\n if (totalAll <= available) {\n setVisibleCount(n);\n return;\n }\n\n // Otherwise fit as many as possible while reserving room for the kebab.\n let used = base;\n let count = 0;\n for (let i = 0; i < n; i++) {\n const add = itemW(i) + (count > 0 ? GAP_PX : 0);\n if (used + add + GAP_PX + kebabW <= available) {\n used += add;\n count += 1;\n } else break;\n }\n setVisibleCount(count);\n };\n\n compute();\n const ro = new ResizeObserver(compute);\n ro.observe(container);\n return () => ro.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [signature, leading != null]);\n\n const shown = visibleActions.slice(0, visibleCount);\n const hidden = visibleActions.slice(visibleCount);\n\n return (\n <div ref={containerRef} className={cn(\"relative min-w-0\", className)}>\n {/* Ghost measuring row — every action button + kebab, never visible.\n The leading slot is intentionally NOT duplicated here (it may be a\n stateful/fetching component); its width is read off `leadingRef`. */}\n <div\n ref={ghostRef}\n aria-hidden\n className=\"pointer-events-none absolute left-0 top-0 flex items-center gap-1.5 opacity-0\"\n >\n {visibleActions.map((a) => (\n <ToolbarButton key={a.id} action={a} />\n ))}\n <OverflowTrigger ariaLabel={overflowAriaLabel} />\n </div>\n\n {/* Visible row — right-aligned cluster that collapses overflow. */}\n <div className=\"flex items-center justify-end gap-1.5\">\n {leading != null && (\n <span ref={leadingRef} className=\"shrink-0\">\n {leading}\n </span>\n )}\n {shown.map((a) => (\n <ToolbarButton\n key={a.id}\n action={a}\n enableTooltip\n renderTooltip={renderTooltip}\n />\n ))}\n {hidden.length > 0 &&\n renderOverflowMenu({\n actions: hidden,\n trigger: <OverflowTrigger ariaLabel={overflowAriaLabel} />,\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Progress — a determinate bar.\n *\n * THE INDETERMINATE CASE IS NOT SILENT. Radix treats `value={null}` (or an\n * omitted value) as indeterminate, and the shadcn fork every host copied\n * computed `translateX(-${100 - (value || 0)}%)`, which turns an unknown value\n * into a confident, wrong \"0%\" — a bar that says the work has not started when\n * the truth is that nobody knows. Here an indeterminate bar renders a moving\n * sweep and carries `data-state=\"indeterminate\"`, so it LOOKS different from\n * stalled-at-zero.\n *\n * `tone` maps the fill onto the semantic status tokens, rather than leaving a\n * host to reach for a raw palette utility on a failing bar.\n */\n\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type ProgressTone = \"default\" | \"success\" | \"warning\" | \"destructive\";\n\nconst PROGRESS_TONES: Record<ProgressTone, string> = {\n default: \"bg-primary\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n destructive: \"bg-destructive\",\n};\n\nexport interface ProgressProps\n extends React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> {\n /** Fill color, from the semantic status tokens. Default `default`. */\n tone?: ProgressTone;\n /** Classes for the moving fill. */\n indicatorClassName?: string;\n}\n\nconst Progress = React.forwardRef<\n React.ComponentRef<typeof ProgressPrimitive.Root>,\n ProgressProps\n>(({ className, tone = \"default\", indicatorClassName, ...props }, ref) => {\n const { value, max } = props;\n const ceiling = max ?? 100;\n const isIndeterminate = value === null || value === undefined;\n const pct = isIndeterminate\n ? 0\n : Math.min(100, Math.max(0, (value / ceiling) * 100));\n\n return (\n <ProgressPrimitive.Root\n ref={ref}\n data-slot=\"progress\"\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-primary/20\",\n className,\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"h-full flex-1 transition-all\",\n PROGRESS_TONES[tone],\n // The sweep sets its own width (package layer); a `w-full` utility\n // here would outrank it and paint a solid bar.\n isIndeterminate ? \"matrx-progress-indeterminate\" : \"w-full\",\n indicatorClassName,\n )}\n style={\n isIndeterminate ? undefined : { transform: `translateX(-${100 - pct}%)` }\n }\n />\n </ProgressPrimitive.Root>\n );\n});\nProgress.displayName = ProgressPrimitive.Root.displayName;\n\nexport { Progress };\n","\"use client\";\n\n/**\n * ScrollArea — Radix scroll area with a custom, token-colored scrollbar.\n *\n * Every fork was the same component; what they could not share was the\n * VIEWPORT. Radix renders an internal `display: table` div inside the\n * viewport, and workflow-studio's fork had to reach through it\n * (`[&>div]:!block [&>div]:min-w-0`) so long content wraps instead of forcing\n * the table cell wider than its container. That is the exact reason a host\n * forks: a class it cannot pass. So the viewport is addressable here —\n * `viewportClassName` and `viewportRef` — and nobody needs a copy to style it.\n *\n * `viewportRef` also unlocks the thing hosts hand-rolled around this\n * component: programmatic scrolling (scroll-to-bottom on a new message,\n * restoring a position) needs the scrolling element, and the Root's ref is not\n * it.\n *\n * A `max-h-*` on the Root reaches the viewport (`max-h-[inherit]`): `h-full` of an auto-height\n * Root is auto, so without it the viewport grew to its content, the Root clipped it, and a\n * capped list could not be scrolled.\n *\n * The thumb reads `bg-border`; a host that wants workflow-studio's dimmer\n * thumb passes `scrollBarClassName`.\n */\n\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport interface ScrollAreaProps\n extends React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> {\n /** Classes for the scrolling viewport (not the Root). */\n viewportClassName?: string;\n /** Ref to the scrolling element — the one `scrollTop` lives on. */\n viewportRef?: React.Ref<HTMLDivElement>;\n /** Classes for the vertical scrollbar this component renders. */\n scrollBarClassName?: string;\n /** Scrollbar orientation to render. Default `vertical`. */\n orientation?: \"vertical\" | \"horizontal\";\n}\n\nconst ScrollArea = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.Root>,\n ScrollAreaProps\n>(\n (\n {\n className,\n children,\n viewportClassName,\n viewportRef,\n scrollBarClassName,\n orientation = \"vertical\",\n ...props\n },\n ref,\n ) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n data-slot=\"scroll-area\"\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={viewportRef}\n data-slot=\"scroll-area-viewport\"\n className={cn(\"h-full w-full max-h-[inherit] rounded-[inherit]\", viewportClassName)}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar orientation={orientation} className={scrollBarClassName} />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n ),\n);\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n","\"use client\";\n\n/**\n * ScoreRing — SVG progress ring + the shared score→color threshold semantics.\n * Ported verbatim from matrx-frontend `components/official/ScoreRing.tsx`\n * (S18). The thresholds ARE the product: green at/above `good`, orange\n * at/above `warning`, red below, muted for null. No seams.\n */\n\nimport { cn } from \"./cn\";\n\nexport interface ScoreThresholds {\n /** Scores at or above this value are green. */\n good: number;\n /** Scores at or above this value (but below good) are orange. */\n warning: number;\n}\n\nexport const DEFAULT_SCORE_THRESHOLDS: ScoreThresholds = {\n good: 75,\n warning: 50,\n};\n\n/** Semantic score color shared by ring and accent consumers. */\nexport function scoreRingColorClasses(\n pct: number | null,\n thresholds: ScoreThresholds = DEFAULT_SCORE_THRESHOLDS,\n): string {\n if (pct === null) return \"text-muted-foreground\";\n if (pct >= thresholds.good) return \"text-success-ink\";\n if (pct >= thresholds.warning) return \"text-warning-ink\";\n return \"text-destructive-ink\";\n}\n\n/** Solid-background twin of `scoreRingColorClasses`. */\nexport function scoreAccentBgClasses(\n pct: number | null,\n thresholds: ScoreThresholds = DEFAULT_SCORE_THRESHOLDS,\n): string {\n if (pct === null) return \"bg-muted-foreground/30\";\n if (pct >= thresholds.good) return \"bg-success\";\n if (pct >= thresholds.warning) return \"bg-warning\";\n return \"bg-destructive\";\n}\n\nexport interface ScoreRingProps {\n pct: number | null;\n size?: number;\n strokeWidth?: number;\n label?: string;\n valueClassName?: string;\n className?: string;\n thresholds?: ScoreThresholds;\n /** Visible suffix; study keeps `%`, while Lighthouse convention omits it. */\n suffix?: string;\n}\n\n/**\n * Shared SVG score ring. `pct` is 0–100; threshold semantics are supplied by\n * the domain (for example Lighthouse uses 90/50 while study uses 75/50).\n */\nexport function ScoreRing({\n pct,\n size = 112,\n strokeWidth = 8,\n label,\n valueClassName,\n className,\n thresholds = DEFAULT_SCORE_THRESHOLDS,\n suffix = \"%\",\n}: ScoreRingProps) {\n const radius = 50 - strokeWidth / 2;\n const circumference = 2 * Math.PI * radius;\n const boundedPct = pct === null ? 0 : Math.max(0, Math.min(100, pct));\n const dashOffset = circumference * (1 - boundedPct / 100);\n\n return (\n <div\n className={cn(\n \"relative flex shrink-0 items-center justify-center\",\n className,\n )}\n style={{ width: size, height: size }}\n role=\"img\"\n aria-label={`${label ?? \"Score\"}: ${pct === null ? \"not available\" : `${pct} out of 100`}`}\n >\n <svg viewBox=\"0 0 100 100\" className=\"h-full w-full -rotate-90\">\n <circle\n cx=\"50\"\n cy=\"50\"\n r={radius}\n className=\"stroke-muted\"\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n {pct !== null ? (\n <circle\n cx=\"50\"\n cy=\"50\"\n r={radius}\n className={cn(\n \"transition-[stroke-dashoffset] duration-700 ease-out\",\n scoreRingColorClasses(pct, thresholds),\n )}\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n fill=\"none\"\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n />\n ) : null}\n </svg>\n <div className=\"absolute flex flex-col items-center justify-center\">\n <span\n className={cn(\n \"font-bold tabular-nums text-foreground\",\n valueClassName ?? \"text-2xl\",\n )}\n >\n {pct === null ? \"—\" : `${pct}${suffix}`}\n </span>\n {label ? (\n <span className=\"max-w-[74px] truncate text-[9px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n </span>\n ) : null}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport const Separator = React.forwardRef<\n React.ComponentRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = \"horizontal\", decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-px w-full\" : \"h-full w-px\",\n className,\n )}\n {...props}\n />\n));\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n","\"use client\";\n\n/**\n * Sidebar — ported from shadcn/ui `apps/v4/registry/new-york-v4/ui/sidebar.tsx`\n * (MIT, Copyright (c) 2023 shadcn). Behavior-verbatim; only coupling seams changed:\n *\n * - Imports resolve to this package's own Button, Input, Separator, Sheet, Skeleton,\n * Tooltip and `useIsMobile`; the toggle glyph is the package-inlined `PanelLeftIcon` (C19).\n * - Tokens use the AI Matrx vocabulary (`--sidebar-background`, `--sidebar-foreground`,\n * `--sidebar-accent`, `--sidebar-border`, `--sidebar-ring`, …), defaulted in tokens.css.\n * - No persistence (C10): the original wrote a cookie on every toggle. A host that keeps the\n * state passes `open` / `onOpenChange` and stores it where its own state lives.\n * - The keyboard shortcut is a prop (`keyboardShortcut`, default \"b\"; `null` turns it off for\n * hosts that own their accelerators, such as a desktop app menu).\n * - Collapse timing is a knob: `--sidebar-duration` / `--sidebar-easing` on the provider,\n * defined from THE panel motion (`--matrx-motion-duration-panel` / `--matrx-motion-ease-panel`,\n * 0.56.0 — the motion standard), never shadcn's 200ms linear.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { Button } from \"./button\";\nimport { cn } from \"./cn\";\nimport { PanelLeftIcon } from \"./icons\";\nimport { Input } from \"./input\";\nimport { Separator } from \"./separator\";\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from \"./sheet\";\nimport { Skeleton } from \"./skeleton\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"./tooltip\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\";\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n keyboardShortcut = SIDEBAR_KEYBOARD_SHORTCUT,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** ⌘/Ctrl + this key toggles the sidebar. `null` when the host owns its shortcuts. */\n keyboardShortcut?: string | null;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n if (!keyboardShortcut) return;\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === keyboardShortcut && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [keyboardShortcut, toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\";\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n \"--sidebar-duration\": \"var(--matrx-motion-duration-panel)\",\n \"--sidebar-easing\": \"var(--matrx-motion-ease-panel)\",\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar-background\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar-background text-sidebar-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n // The original spread the desktop container's div props onto the Sheet root, which\n // accepts none of them; the mobile sheet takes only its open state.\n <Sheet open={openMobile} onOpenChange={setOpenMobile}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar-background p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-(--sidebar-duration) ease-(--sidebar-easing)\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-(--sidebar-duration) ease-(--sidebar-easing) md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex h-full w-full flex-col bg-sidebar-background group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar-background\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-(--sidebar-duration) ease-(--sidebar-easing) focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative [&:has(>[data-sidebar=menu-action])>[data-sidebar=menu-button]]:pr-8\", className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : \"button\";\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform peer-hover/menu-button:text-sidebar-accent-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground data-[state=open]:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n size?: \"sm\" | \"md\";\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n sidebarMenuButtonVariants,\n useSidebar,\n};\n","\"use client\";\n\n/**\n * Switch — Radix switch, one implementation, two sizes.\n *\n * The four forks were the same control with two different tracks: a 16px track\n * with a visible border and an overhanging thumb (matrx-frontend) and a 20px\n * track with a transparent border and an inset thumb (matrx-extend, dashboard,\n * workflow-studio). Both stay reachable through `size`, so no host has to keep\n * a copy to keep its look:\n *\n * sm → h-4 track, bordered, thumb sits proud of the rail\n * md → h-5 track, transparent border, thumb sits inside (the default)\n *\n * The unchecked track reads `bg-input`, the token that exists for exactly this\n * — workflow-studio's fork used `bg-muted`, which is the surface token and\n * makes an off switch disappear into a muted panel.\n */\n\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type SwitchSize = \"sm\" | \"md\";\n\nconst SWITCH_SIZES: Record<SwitchSize, { root: string; thumb: string }> = {\n sm: {\n root: \"h-4 w-9 border-border data-[state=unchecked]:bg-input\",\n thumb:\n \"h-4 w-4 border border-primary data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\",\n },\n md: {\n root: \"h-5 w-9 border-transparent data-[state=unchecked]:bg-input\",\n thumb:\n \"h-4 w-4 data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\",\n },\n};\n\nexport interface SwitchProps\n extends React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root> {\n /** Track size. Default `md`. */\n size?: SwitchSize;\n}\n\nconst Switch = React.forwardRef<\n React.ComponentRef<typeof SwitchPrimitives.Root>,\n SwitchProps\n>(({ className, size = \"md\", ...props }, ref) => (\n <SwitchPrimitives.Root\n ref={ref}\n data-slot=\"switch\"\n className={cn(\n \"peer inline-flex shrink-0 items-center rounded-full border-2 shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary\",\n SWITCH_SIZES[size].root,\n className,\n )}\n {...props}\n >\n <SwitchPrimitives.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"pointer-events-none block rounded-full bg-background shadow-lg ring-0 transition-transform\",\n SWITCH_SIZES[size].thumb,\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","\"use client\";\n\n/**\n * TabbedBottomSheet — iOS Settings–style two-level navigation for tabbed menus.\n * Ported verbatim from matrx-frontend\n * `components/official/bottom-sheet/TabbedBottomSheet.tsx` (S19).\n *\n * Level 1: a scrollable list of tabs (icon + label + chevron).\n * Level 2: drill into one tab's content with a back button in the header.\n *\n * Two invariants make this ONE surface instead of a different panel per tab:\n *\n * 1. **Fixed height** (`size=\"full\"`) — the sheet is the same near-full\n * height on the index and inside every tab, and it never resizes as\n * content loads, filters, or expands. An adaptive height here meant the\n * panel grew and shrank under the user's thumb on every keystroke.\n * 2. **One typography scale** (`matrx-mobile-sheet`, host globals.css) —\n * the tab bodies are the same components the desktop window renders at\n * desktop density (11–12px). That is unreadable and untappable on a\n * phone, so the sheet promotes small text to mobile sizes and every\n * field to the 16px that stops iOS focus-zoom. Panels stay density-free;\n * the host decides the density.\n *\n * Seam inversions: `ChevronRight` is the package's inlined SVG (C19); the\n * `matrx-mobile-sheet` and `pb-safe` utility classes are host-owned CSS.\n */\n\nimport { useState, type ComponentType, type ReactNode } from \"react\";\n\nimport { BottomSheet, BottomSheetBody, BottomSheetHeader } from \"./bottom-sheet\";\nimport { ChevronRightIcon } from \"./icons\";\n\n/** What a tab body can do to the sheet that hosts it. */\nexport interface TabbedBottomSheetTabNav {\n /**\n * Leave this tab for the index, keeping the sheet open. A finished pick\n * inside a tab (attach a note) calls this instead of closing the sheet, so\n * the person lands where they can continue (PB-08, 2026-10-01: attaching a\n * note closed the whole sheet with no way back to its other tabs).\n */\n showIndex: () => void;\n}\n\nexport interface TabbedBottomSheetTab {\n id: string;\n label: string;\n icon?: ComponentType<{ className?: string }>;\n /** Optional trailing badge / dot shown on the index row. */\n trailing?: ReactNode;\n /** The tab body, or a render function given the sheet's navigation. */\n content: ReactNode | ((nav: TabbedBottomSheetTabNav) => ReactNode);\n}\n\nexport interface TabbedBottomSheetProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n tabs: TabbedBottomSheetTab[];\n /** Start each open inside this tab when it exists; otherwise show the index. */\n initialTabId?: string | null;\n}\n\nexport function TabbedBottomSheet({\n open,\n onOpenChange,\n title,\n tabs,\n initialTabId = null,\n}: TabbedBottomSheetProps) {\n const [selectedTabId, setSelectedTabId] = useState<string | null>(initialTabId);\n\n // Every open starts on its requested tab, or the index. Adjusted during render (the React-docs\n // pattern for state derived from a prop change) rather than in an effect,\n // which would render the previous tab's body for one frame first.\n const [wasOpen, setWasOpen] = useState(open);\n if (open !== wasOpen) {\n setWasOpen(open);\n if (open) setSelectedTabId(initialTabId);\n }\n\n const selectedTab = selectedTabId\n ? tabs.find((tab) => tab.id === selectedTabId)\n : null;\n\n return (\n <BottomSheet\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n size=\"full\"\n >\n <div className=\"matrx-mobile-sheet flex min-h-0 flex-1 flex-col\">\n <BottomSheetHeader\n title={selectedTab ? selectedTab.label : title}\n showBack={!!selectedTab}\n onBack={() => setSelectedTabId(null)}\n />\n {selectedTab ? (\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden pb-safe\">\n {typeof selectedTab.content === \"function\"\n ? selectedTab.content({ showIndex: () => setSelectedTabId(null) })\n : selectedTab.content}\n </div>\n ) : (\n <BottomSheetBody>\n <ul className=\"divide-y divide-border\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <li key={tab.id}>\n <button\n type=\"button\"\n onClick={() => setSelectedTabId(tab.id)}\n className=\"flex w-full items-center gap-3 px-4 py-3.5 text-left transition-colors hover:bg-muted/60 active:bg-muted\"\n >\n {Icon ? (\n <Icon className=\"h-5 w-5 shrink-0 text-muted-foreground\" />\n ) : null}\n <span className=\"min-w-0 flex-1 text-base text-foreground\">\n {tab.label}\n </span>\n {tab.trailing}\n <ChevronRightIcon className=\"h-5 w-5 shrink-0 text-muted-foreground\" />\n </button>\n </li>\n );\n })}\n </ul>\n </BottomSheetBody>\n )}\n </div>\n </BottomSheet>\n );\n}\n","\"use client\";\n\n/**\n * Tabs — Radix tabs, carrying two rulings the forks had already paid for.\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no mount gate. A wrapper in\n * matrx-frontend used to defer rendering until after hydration (\"Radix\n * generates dynamic aria-controls ids that differ between SSR and client\").\n * That was false — Radix ids come from React's SSR-stable `useId` — and the\n * gate deleted the ENTIRE tab bar and active panel from SSR and the first\n * client paint.\n *\n * 2. INACTIVE PANELS UNMOUNT — Radix's default, restored in matrx-frontend on\n * 2026-08-15 after a wrapper hardcoded `forceMount`. Every tab panel in that\n * app was live at all times: effects running, fetches firing, subscriptions\n * open, registrations registered — while invisible. Not theoretical: on the\n * agent-apps executions page both tabs' tables registered a runtime provider\n * for the same surface at the same depth, the HIDDEN tab won the tie-break,\n * and agents on the VISIBLE tab were handed the other tab's rows.\n *\n * `forceMount` is OPT-IN. Pass it on the panels that genuinely must survive\n * a switch — an in-flight editor, a scroll position, a live stream that\n * must not be torn down. `data-[state=inactive]:hidden` is applied\n * unconditionally (inert when the panel unmounts), so passing the prop is\n * the whole opt-in.\n *\n * Do NOT reach for `forceMount` to preserve a form draft. Lift that state to\n * the component that owns the `<Tabs>`; the panel is then free to unmount\n * and the draft survives a close/reopen too, which force-mounting never gave\n * you.\n *\n * `TabsTriggerCore` is the trigger WITHOUT the resting muted-foreground\n * treatment, for hosts that color their own inactive tabs. Both triggers\n * otherwise share one class string.\n */\n\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TABS_TRIGGER_BASE =\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\";\n\nconst TabsList = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n data-slot=\"tabs-list\"\n className={cn(\n \"inline-flex h-9 items-center justify-center-safe gap-1 rounded-lg bg-muted p-1 text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n data-slot=\"tabs-trigger\"\n className={cn(\n TABS_TRIGGER_BASE,\n \"text-muted-foreground hover:text-foreground\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\n/** The trigger without the resting muted/hover treatment. */\nconst TabsTriggerCore = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n data-slot=\"tabs-trigger\"\n className={cn(TABS_TRIGGER_BASE, className)}\n {...props}\n />\n));\nTabsTriggerCore.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n data-slot=\"tabs-content\"\n className={cn(\n \"data-[state=inactive]:hidden\",\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport { Tabs, TabsContent, TabsList, TabsTrigger, TabsTriggerCore };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\n/**\n * ScrollFade — a reusable \"there's more content this way\" affordance.\n *\n * Applies a `mask-image` gradient that fades the content at whichever scroll\n * edge still has hidden content. At the top of the scroll the top edge is crisp;\n * once you scroll down, the top fades and (if more remains) the bottom fades too.\n * Without it, a clipped scroll area reads as \"what you see is all there is\" — the\n * fade tells the user to keep scrolling.\n *\n * Moved whole from @ai-matrx/chat/ui/scroll-fade (one implementation, 2026-10-21); the hook is `useScrollMaskFade` here\n * because `useScrollFade` is the menu's class-driven hook. Two ways to use it:\n * 1. `<ScrollFade className=\"flex-1\">…</ScrollFade>` — owns the scroll container.\n * 2. `const { ref, style } = useScrollMaskFade(); <div ref={ref} style={style} className=\"overflow-y-auto\">`\n * — attach the fade to a scroll element you already render.\n *\n * The fade is dynamic (driven by scroll position + content/size changes), so an\n * area that isn't overflowing shows no fade at all.\n */\n\ntype Orientation = \"vertical\" | \"horizontal\";\n\ninterface Edges {\n start: boolean;\n end: boolean;\n}\n\nconst EDGE_EPSILON = 1; // sub-pixel rounding guard\n\nfunction readEdges(el: HTMLElement, orientation: Orientation): Edges {\n if (orientation === \"horizontal\") {\n return {\n start: el.scrollLeft > EDGE_EPSILON,\n end:\n el.scrollLeft + el.clientWidth < el.scrollWidth - EDGE_EPSILON,\n };\n }\n return {\n start: el.scrollTop > EDGE_EPSILON,\n end: el.scrollTop + el.clientHeight < el.scrollHeight - EDGE_EPSILON,\n };\n}\n\nfunction buildMask(\n edges: Edges,\n orientation: Orientation,\n fade: number,\n): string | undefined {\n // Fully crisp both ends → no mask (avoids a needless compositing layer).\n if (!edges.start && !edges.end) return undefined;\n const dir = orientation === \"horizontal\" ? \"to right\" : \"to bottom\";\n const stops: string[] = [];\n stops.push(edges.start ? \"transparent 0\" : \"#000 0\");\n if (edges.start) stops.push(`#000 ${fade}px`);\n if (edges.end) stops.push(`#000 calc(100% - ${fade}px)`);\n stops.push(edges.end ? \"transparent 100%\" : \"#000 100%\");\n return `linear-gradient(${dir}, ${stops.join(\", \")})`;\n}\n\n/**\n * Attach a dynamic scroll-edge fade to an element you render yourself.\n * Spread the returned `style` onto the scroll container and set its `ref`.\n */\nexport function useScrollMaskFade<T extends HTMLElement = HTMLDivElement>(\n orientation: Orientation = \"vertical\",\n fade = 28,\n) {\n const ref = React.useRef<T>(null);\n const [edges, setEdges] = React.useState<Edges>({ start: false, end: false });\n\n React.useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const update = () => {\n const next = readEdges(el, orientation);\n setEdges((prev) =>\n prev.start === next.start && prev.end === next.end ? prev : next,\n );\n };\n\n update();\n el.addEventListener(\"scroll\", update, { passive: true });\n // Content or viewport size changes can flip whether an edge overflows.\n const ro = new ResizeObserver(update);\n ro.observe(el);\n const mo = new MutationObserver(update);\n mo.observe(el, { childList: true, subtree: true, characterData: true });\n\n return () => {\n el.removeEventListener(\"scroll\", update);\n ro.disconnect();\n mo.disconnect();\n };\n }, [orientation]);\n\n const mask = buildMask(edges, orientation, fade);\n const style: React.CSSProperties = mask\n ? { maskImage: mask, WebkitMaskImage: mask }\n : {};\n\n return { ref, style, edges };\n}\n\nexport interface ScrollFadeProps\n extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: Orientation;\n /** Fade depth in px at each active edge. */\n fade?: number;\n}\n\n/** A scroll container that fades its content at overflowing edges. */\nexport const ScrollFade = React.forwardRef<HTMLDivElement, ScrollFadeProps>(\n ({ orientation = \"vertical\", fade = 28, className, style, children, ...props }, forwardedRef) => {\n const { ref: scrollRef, style: maskStyle } = useScrollMaskFade<HTMLDivElement>(\n orientation,\n fade,\n );\n\n // Merge the internal scroll ref with an optional forwarded ref.\n const setRefs = (node: HTMLDivElement | null) => {\n scrollRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n };\n\n return (\n <div\n ref={setRefs}\n className={cn(\n orientation === \"horizontal\"\n ? \"overflow-x-auto\"\n : \"overflow-y-auto\",\n \"overscroll-x-contain\",\n className,\n )}\n style={{ ...maskStyle, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\nScrollFade.displayName = \"ScrollFade\";\n","\"use client\";\n\n/**\n * HoverCard — the rich hover surface (16 host import sites).\n *\n * Ported from matrx-frontend `components/ui/hover-card.tsx`, including its\n * recorded ruling:\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate the\n * host wrapper once carried (\"Radix generates dynamic aria-controls ids that\n * differ between SSR and client\") was doubly false here:\n * `@radix-ui/react-hover-card` generates no ids of its own at all, and Radix\n * ids generally come from React's SSR-stable `useId`. The gate was actively\n * harmful — a Trigger wraps ALWAYS-VISIBLE content, so `return null` deleted\n * that subtree from SSR and the first client paint.\n *\n * SEAM INVERSION (new here). The host copy portalled nowhere — it rendered\n * `Content` inline, so a hover card inside an overflow-hidden ancestor was\n * clipped, and one inside a popped-out window-panel could not exist. It now\n * portals through the package's `PortalContainerProvider` seam like every\n * other floating surface in this package, with an explicit `container` prop\n * winning and `document.body` as the fallback. Behavior for a card that was\n * never clipped is unchanged.\n *\n * A HOVER CARD IS NOT A TOOLTIP AND NOT A MENU: it is hover-only and not\n * focusable, so nothing inside it may be the ONLY way to reach an action —\n * touch and keyboard users never open it. Put the action somewhere else too.\n */\n\nimport * as HoverCardPrimitive from \"@radix-ui/react-hover-card\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\n/**\n * ONE HOVER-CARD BEHAVIOR (Arman, 2026-10-14: \"tooltips need to remain long enough to put your\n * mouse over them ... so you can copy/paste them\"). Opens after ~600 ms (a deliberate hover, not\n * a fly-over), and stays open 300 ms after the pointer leaves so it can travel onto the card; the\n * card stays open while hovered and its text is selectable. A call site may ask for a LONGER\n * delay to either, never a shorter one: `openDelay` below 500 and `closeDelay` below 300 are\n * raised to the floor, because a card that slips away before the pointer reaches it is the defect.\n */\nexport const HOVER_CARD_OPEN_DELAY_MS = 600;\nexport const HOVER_CARD_OPEN_DELAY_FLOOR_MS = 500;\nexport const HOVER_CARD_CLOSE_DELAY_MS = 300;\n\nconst HoverCard = ({\n openDelay = HOVER_CARD_OPEN_DELAY_MS,\n closeDelay = HOVER_CARD_CLOSE_DELAY_MS,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) => (\n <HoverCardPrimitive.Root\n openDelay={Math.max(openDelay, HOVER_CARD_OPEN_DELAY_FLOOR_MS)}\n closeDelay={Math.max(closeDelay, HOVER_CARD_CLOSE_DELAY_MS)}\n {...props}\n />\n);\nHoverCard.displayName = \"HoverCard\";\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger;\n\nexport interface HoverCardContentProps\n extends React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.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 — a picker re-anchoring while the user\n * types, a measurement pass. It is NOT the reduced-motion switch;\n * `styles.css` already honors `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst HoverCardContent = React.forwardRef<\n React.ComponentRef<typeof HoverCardPrimitive.Content>,\n HoverCardContentProps\n>(\n (\n { className, align = \"center\", sideOffset = 4, container, animated = true, ...props },\n ref,\n ) => {\n const resolved = usePortalContainer(container);\n return (\n <HoverCardPrimitive.Portal container={resolved ?? null}>\n <HoverCardPrimitive.Content\n ref={ref}\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-[10001] w-64 select-text rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n );\n});\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName;\n\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\n","\"use client\";\n\n/**\n * THE contact values — one component per kind of value a person reaches someone through: an email,\n * a phone number, a postal address, a social profile, a web address. Every place in every app that\n * shows one of these renders it here, never a hand-built `mailto:`, `tel:` or profile link.\n *\n * Each draws inline at the text's size — its glyph, the value, a copy button that is always there\n * (shown on hover/focus, so nothing ever shifts) — and opens THE Peek on hover (a tap opens the phone\n * drawer). The peek does the real things: compose, call, text, map, validate, search, open the\n * profile with our referral. A value whose `state` is `broken` or `not-us` is never a link of any kind.\n *\n * <EmailValue email=\"ana@solarbright.com\" />\n * <PhoneValue phone=\"949 555 0142\" />\n * <AddressValue address={[\"1 Main St\", \"Irvine, CA 92618\"]} />\n * <SocialHandleValue value=\"https://www.linkedin.com/in/ana-ruiz\" followers={1840} />\n * <UrlValue url=\"solarbright.com\" title=\"SolarBright — home solar\" />\n *\n * Address validation is the host's (it calls a server): mount `ContactValuesHostProvider` once with\n * `validateAddress`. Without one, the peek simply has no Validate action.\n */\n\nimport * as React from \"react\";\n\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport { openOutbound } from \"@ai-matrx/kit/outbound\";\n\nimport { cn } from \"../cn\";\nimport { Button } from \"../controls/controls\";\nimport { Tile } from \"../controls/surfaces\";\nimport { Peek } from \"../peek\";\nimport { PeekHoverCard } from \"../peek-card\";\nimport type { PeekBlock, PeekGlyph, PeekRecord, PeekRow } from \"../peek-record\";\nimport { AtSignGlyph, BadgeCheckGlyph, LinkOffGlyph, MailGlyph, MapPinGlyph, MessageSquareGlyph, PhoneGlyph, socialGlyph } from \"./glyphs\";\nimport { CheckIcon, CopyIcon, GlobeIcon, SearchIcon, UsersIcon } from \"../icons\";\nimport {\n CONTACT_STATE_LABEL,\n addressText,\n compactCount,\n mailtoHref,\n mapsHref,\n parseEmail,\n parsePhone,\n parseSocial,\n parseUrl,\n smsHref,\n telHref,\n webSearchHref,\n type AddressValidation,\n type ContactValueState,\n type ParsedSocial,\n} from \"./model\";\nimport type { SocialBrandMark } from \"./social-brand-paths\";\n\n// ── host port ───────────────────────────────────────────────────────────────────────────────────\n\nexport interface ContactValuesHost {\n /** Check a postal address against a real geocoder (the host's server route). */\n validateAddress?: (address: string) => Promise<AddressValidation>;\n}\n\nconst HostContext = React.createContext<ContactValuesHost>({});\n\nexport function ContactValuesHostProvider({ children, ...host }: ContactValuesHost & { children: React.ReactNode }) {\n const value = React.useMemo(() => host, [host.validateAddress]); // eslint-disable-line react-hooks/exhaustive-deps\n return <HostContext.Provider value={value}>{children}</HostContext.Provider>;\n}\n\nexport function useContactValuesHost(): ContactValuesHost {\n return React.useContext(HostContext);\n}\n\n// ── the inline shell ────────────────────────────────────────────────────────────────────────────\n\nconst markCache = new Map<SocialBrandMark, PeekGlyph>();\nfunction markFor(platform: SocialBrandMark): PeekGlyph {\n let glyph = markCache.get(platform);\n if (!glyph) {\n glyph = socialGlyph(platform);\n markCache.set(platform, glyph);\n }\n return glyph;\n}\n\ninterface ShellProps {\n kind: string;\n glyph?: PeekGlyph;\n text: string;\n copy: string;\n state: ContactValueState;\n record: PeekRecord;\n peek: boolean;\n /** Let the value run to several lines (an address) instead of ending in \"…\". */\n wrap?: boolean;\n}\n\nfunction CopyButton({ text, kind }: { text: string; kind: string }) {\n const [done, setDone] = React.useState(false);\n React.useEffect(() => {\n if (!done) return;\n const t = setTimeout(() => setDone(false), 1200);\n return () => clearTimeout(t);\n }, [done]);\n const Glyph = done ? CheckIcon : CopyIcon;\n return (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={`Copy ${kind}`}\n title={done ? \"Copied\" : `Copy ${kind}`}\n icon={<Glyph className=\"size-[1em]\" />}\n data-matrx-contact-copy=\"\"\n onClick={(event) => {\n event.stopPropagation();\n event.preventDefault();\n void copyText(text).then((ok) => setDone(ok));\n }}\n className=\"shrink-0\"\n />\n );\n}\n\n/** The peek, pinned open by a click and closed by a click outside or Escape; hover opens it too. */\nfunction usePinnedHover() {\n const [hovered, setHovered] = React.useState(false);\n const [held, setHeld] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const trigger = React.useRef<HTMLButtonElement | null>(null);\n React.useEffect(() => {\n if (!pinned) return;\n const onDown = (event: PointerEvent) => {\n const target = event.target as Element | null;\n if (!target) return;\n if (trigger.current?.contains(target) || target.closest(\"[data-matrx-peek-host],[role=menu],[data-radix-popper-content-wrapper]\")) return;\n setPinned(false);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setPinned(false);\n };\n document.addEventListener(\"pointerdown\", onDown, true);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"pointerdown\", onDown, true);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [pinned]);\n return { open: hovered || held || pinned, setHovered, setHeld, setPinned, trigger };\n}\n\nfunction ValueShell({ kind, glyph: Glyph, text, copy, state, record, peek, wrap }: ShellProps) {\n const { open, setHovered, setHeld, setPinned, trigger } = usePinnedHover();\n const off = state !== \"ok\";\n const value = (\n <span className={cn(\"min-w-0\", wrap ? \"whitespace-pre-line break-words\" : \"truncate\", off ? \"text-muted-foreground line-through\" : \"text-foreground\")}>{text}</span>\n );\n const body = (\n <>\n {Glyph ? <Glyph className=\"size-[1em] shrink-0 text-muted-foreground\" /> : null}\n {value}\n {off ? <span className=\"shrink-0 text-muted-foreground no-underline\">{`· ${CONTACT_STATE_LABEL[state as Exclude<ContactValueState, \"ok\">]}`}</span> : null}\n </>\n );\n return (\n <span\n data-matrx-contact-value={kind}\n data-state={state}\n className={cn(\"group/contact inline-flex min-w-0 max-w-full gap-1 align-baseline\", wrap ? \"items-start\" : \"items-center\")}\n >\n {peek ? (\n <PeekHoverCard\n label={text}\n open={open}\n onOpenChange={(next) => {\n setHovered(next);\n if (!next) setPinned(false);\n }}\n trigger={\n <Tile\n ref={trigger}\n type=\"button\"\n dense\n variant=\"quiet\"\n title={body}\n className=\"min-w-0 max-w-full\"\n onClick={() => setPinned((p) => !p)}\n />\n }\n >\n <Peek record={record} size=\"sm\" onHoldChange={setHeld} />\n </PeekHoverCard>\n ) : (\n <span className={cn(\"inline-flex min-w-0 max-w-full gap-1\", wrap ? \"items-start\" : \"items-center\")}>{body}</span>\n )}\n <CopyButton text={copy} kind={kind} />\n </span>\n );\n}\n\nfunction stateCallout(state: ContactValueState): PeekRecord[\"callout\"] | undefined {\n if (state === \"ok\") return undefined;\n return {\n title: CONTACT_STATE_LABEL[state],\n glyph: LinkOffGlyph,\n text: state === \"broken\" ? \"This address no longer answers, so it is not offered as a link.\" : \"Matched by name only — this is someone else, so it is not offered as a link.\",\n };\n}\n\nconst actions = (rows: (PeekRow | null | false | undefined)[]): PeekBlock => ({\n section: \"Actions\",\n rows: rows.filter((r): r is PeekRow => Boolean(r)),\n});\n\nexport interface ContactValueCommonProps {\n /** Whose value it is (\"Ana Ruiz\", \"SolarBright\") — the peek's subtitle. */\n owner?: string;\n /** `broken` / `not-us`: drawn struck through with its reason, never a link. Default `ok`. */\n state?: ContactValueState;\n /** Open the peek on hover/tap. Default true; `false` keeps only the inline value and Copy. */\n peek?: boolean;\n}\n\n// ── email ───────────────────────────────────────────────────────────────────────────────────────\n\nexport interface EmailValueProps extends ContactValueCommonProps {\n email: string;\n}\n\nexport function EmailValue({ email, owner, state = \"ok\", peek = true }: EmailValueProps) {\n const parsed = parseEmail(email);\n const ok = state === \"ok\" && parsed.valid;\n const site = parsed.domain ? parseUrl(parsed.domain) : null;\n const record: PeekRecord = {\n kind: \"Email\",\n id: parsed.address,\n title: parsed.address,\n glyph: MailGlyph,\n ...(owner ? { subtitle: owner } : {}),\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n ...(!parsed.valid && state === \"ok\" ? [{ fact: \"Not a complete email address\", glyph: LinkOffGlyph, muted: true }] : []),\n ...(parsed.domain ? [{ property: \"Domain\", value: parsed.domain, ...(ok && site?.href ? { href: site.href } : {}) }] : []),\n actions([\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(`\"${parsed.address}\"`) },\n ]),\n ],\n ...(ok ? { primary: { label: \"Send email\", onSelect: () => window.location.assign(mailtoHref(parsed.address)) } } : {}),\n copyData: { email: parsed.address, ...(owner ? { owner } : {}) },\n };\n return <ValueShell kind=\"email\" glyph={MailGlyph} text={parsed.address} copy={parsed.address} state={state} record={record} peek={peek} />;\n}\n\n// ── phone ───────────────────────────────────────────────────────────────────────────────────────\n\nexport interface PhoneValueProps extends ContactValueCommonProps {\n phone: string;\n /** The calling code for a number written without `+`. Default \"1\" (North America). */\n defaultCallingCode?: string;\n}\n\nexport function PhoneValue({ phone, owner, state = \"ok\", peek = true, defaultCallingCode = \"1\" }: PhoneValueProps) {\n const parsed = parsePhone(phone, defaultCallingCode);\n const ok = state === \"ok\" && parsed.valid;\n const record: PeekRecord = {\n kind: \"Phone number\",\n id: parsed.e164 ?? parsed.raw,\n title: parsed.display,\n glyph: PhoneGlyph,\n ...(owner ? { subtitle: owner } : {}),\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n ...(!parsed.valid && state === \"ok\" ? [{ fact: \"Not a complete phone number\", glyph: LinkOffGlyph, muted: true }] : []),\n ...(parsed.e164 ? [{ property: \"E.164\", value: parsed.e164 }] : []),\n ...(parsed.region ? [{ property: \"Region\", value: parsed.region }] : []),\n ...(parsed.extension ? [{ property: \"Extension\", value: parsed.extension }] : []),\n actions([\n ok && { text: \"Send a text\", glyph: MessageSquareGlyph, href: smsHref(parsed) },\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(`\"${parsed.display}\"`) },\n ]),\n ],\n ...(ok ? { primary: { label: \"Call\", onSelect: () => window.location.assign(telHref(parsed)) } } : {}),\n copyData: { phone: parsed.e164 ?? parsed.raw, display: parsed.display, ...(parsed.region ? { region: parsed.region } : {}), ...(owner ? { owner } : {}) },\n };\n return <ValueShell kind=\"phone number\" glyph={PhoneGlyph} text={parsed.display} copy={parsed.e164 ?? parsed.raw} state={state} record={record} peek={peek} />;\n}\n\n// ── address ─────────────────────────────────────────────────────────────────────────────────────\n\nexport interface AddressValueProps extends ContactValueCommonProps {\n /** One string (lines split on newlines) or its lines; empty lines are dropped. */\n address: string | readonly (string | null | undefined)[];\n /** Draw each line on its own line. Default: one line, joined with commas. */\n multiline?: boolean;\n}\n\ntype Validation = { phase: \"idle\" } | { phase: \"checking\" } | { phase: \"done\"; result: AddressValidation } | { phase: \"failed\"; error: unknown };\n\nconst VALIDATION_TONE = { verified: \"success\", partial: \"warning\", unknown: \"danger\" } as const;\nconst VALIDATION_TEXT = { verified: \"Verified address\", partial: \"Partly matched\", unknown: \"No match found\" } as const;\n\nexport function AddressValue({ address, owner, state = \"ok\", peek = true, multiline = false }: AddressValueProps) {\n const one = addressText(address);\n const lines = typeof address === \"string\" ? address.split(/\\n+/).map((l) => l.trim()).filter(Boolean) : address.map((l) => (l ?? \"\").trim()).filter(Boolean);\n const { validateAddress } = useContactValuesHost();\n const [validation, setValidation] = React.useState<Validation>({ phase: \"idle\" });\n React.useEffect(() => setValidation({ phase: \"idle\" }), [one]);\n const ok = state === \"ok\" && one.length > 0;\n const validate = React.useCallback(() => {\n if (!validateAddress) return;\n setValidation({ phase: \"checking\" });\n validateAddress(one).then(\n (result) => setValidation({ phase: \"done\", result }),\n (error: unknown) => setValidation({ phase: \"failed\", error }),\n );\n }, [validateAddress, one]);\n const validationBlock: PeekBlock | null =\n validation.phase === \"done\"\n ? {\n section: \"Validation\",\n glyph: BadgeCheckGlyph,\n tone: VALIDATION_TONE[validation.result.status],\n rows: [\n {\n text: VALIDATION_TEXT[validation.result.status],\n tone: VALIDATION_TONE[validation.result.status],\n ...(validation.result.formatted ? { detail: validation.result.formatted } : {}),\n },\n ],\n }\n : validation.phase === \"failed\"\n ? { section: \"Validation\", tone: \"danger\", rows: [{ text: \"Couldn't reach the address check\", tone: \"danger\", detail: validation.error instanceof Error ? validation.error.message : String(validation.error) }] }\n : validation.phase === \"checking\"\n ? { section: \"Validation\", rows: [{ text: \"Checking…\" }] }\n : null;\n const record: PeekRecord = {\n kind: \"Address\",\n id: one,\n title: lines[0] ?? one,\n ...(lines.length > 1 ? { subtitle: lines.slice(1).join(\", \") } : owner ? { subtitle: owner } : {}),\n glyph: MapPinGlyph,\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n ...(owner && lines.length > 1 ? [{ property: \"For\", value: owner }] : []),\n ...(validationBlock ? [validationBlock] : []),\n actions([\n ok && validateAddress && validation.phase !== \"done\" && { text: \"Open in maps\", glyph: MapPinGlyph, href: mapsHref(one) },\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(one) },\n ]),\n ],\n ...(ok && validateAddress && validation.phase !== \"done\"\n ? { primary: { label: validation.phase === \"checking\" ? \"Checking…\" : \"Validate\", onSelect: validate } }\n : ok\n ? { primary: { label: \"Open in maps\", onSelect: () => openOutbound(mapsHref(validation.phase === \"done\" && validation.result.formatted ? validation.result.formatted : one)) } }\n : {}),\n copyData: { address: one, ...(owner ? { owner } : {}), ...(validation.phase === \"done\" ? { validation: validation.result } : {}) },\n };\n return (\n <ValueShell\n kind=\"address\"\n glyph={MapPinGlyph}\n text={multiline ? lines.join(\"\\n\") : one}\n copy={lines.join(\"\\n\")}\n state={state}\n record={record}\n peek={peek}\n {...(multiline ? { wrap: true } : {})}\n />\n );\n}\n\n// ── social ──────────────────────────────────────────────────────────────────────────────────────\n\nexport interface SocialHandleValueProps extends ContactValueCommonProps {\n /** A profile URL, an `@handle` or a bare handle. */\n value: string;\n /** The platform when `value` is a handle (\"linkedin\", \"Twitter\", \"ig\" …). */\n platform?: string | null;\n /** Follower count, when known. */\n followers?: number | null;\n /** The profile's display name, when known. */\n name?: string | null;\n}\n\nfunction socialRecord(parsed: ParsedSocial, props: SocialHandleValueProps, glyph: PeekGlyph): PeekRecord {\n const state = props.state ?? \"ok\";\n const ok = state === \"ok\" && Boolean(parsed.href);\n return {\n kind: \"Social profile\",\n id: parsed.href ?? parsed.display,\n title: props.name || parsed.display,\n subtitle: props.name ? `${parsed.display} · ${parsed.platformName}` : parsed.platformName,\n glyph,\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n { property: \"Platform\", value: parsed.platformName },\n ...(parsed.handle ? [{ property: \"Handle\", value: parsed.display }] : []),\n ...(props.followers != null ? [{ fact: `${compactCount(props.followers)} followers`, glyph: UsersIcon }] : []),\n ...(props.owner ? [{ property: \"For\", value: props.owner }] : []),\n actions([\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(`${parsed.display} ${parsed.platformName}`) },\n ]),\n ],\n ...(ok ? { primary: { label: \"Open profile\", onSelect: () => openOutbound(parsed.href!) } } : {}),\n copyData: { platform: parsed.platformName, handle: parsed.display, ...(parsed.href ? { url: parsed.href } : {}), ...(props.followers != null ? { followers: props.followers } : {}) },\n };\n}\n\nexport function SocialHandleValue(props: SocialHandleValueProps) {\n const { value, platform, state = \"ok\", peek = true } = props;\n const parsed = parseSocial(value, platform);\n const glyph = parsed.platform === \"other\" ? AtSignGlyph : markFor(parsed.platform);\n return (\n <ValueShell\n kind={`${parsed.platformName} handle`}\n glyph={glyph}\n text={parsed.display}\n copy={parsed.handle ? parsed.display : parsed.href ?? parsed.display}\n state={state}\n record={socialRecord(parsed, props, glyph)}\n peek={peek}\n />\n );\n}\n\n// ── url ─────────────────────────────────────────────────────────────────────────────────────────\n\nexport interface UrlValueProps extends ContactValueCommonProps {\n url: string;\n /** The page's title, when known — the peek's title. */\n title?: string | null;\n /** The inline globe. Off when the address already has its own place and the icon only wraps. */\n icon?: boolean;\n}\n\nexport function UrlValue({ url, title, owner, state = \"ok\", peek = true, icon = true }: UrlValueProps) {\n const parsed = parseUrl(url);\n const ok = state === \"ok\" && Boolean(parsed.href);\n const record: PeekRecord = {\n kind: \"Web address\",\n id: parsed.href ?? url,\n title: title || parsed.domain,\n subtitle: title ? parsed.display : owner ?? parsed.display,\n glyph: GlobeIcon,\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n { property: \"Domain\", value: parsed.domain },\n ...(owner && title ? [{ property: \"For\", value: owner }] : []),\n actions([\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(parsed.domain) },\n ]),\n ],\n ...(ok ? { primary: { label: \"Open\", onSelect: () => openOutbound(parsed.href!) } } : {}),\n copyData: { url: parsed.href ?? url, domain: parsed.domain, ...(title ? { title } : {}) },\n };\n return <ValueShell kind=\"link\" {...(icon ? { glyph: GlobeIcon } : {})} text={parsed.display} copy={parsed.href ?? url} state={state} record={record} peek={peek} />;\n}\n\n// ── one door by type ────────────────────────────────────────────────────────────────────────────\n\nexport type ContactValueType = \"email\" | \"phone\" | \"address\" | \"social\" | \"url\";\n\nexport type ContactValueProps = ContactValueCommonProps & { type: ContactValueType; value: string; platform?: string | null; followers?: number | null; title?: string | null; icon?: boolean };\n\n/** Any contact value by its type — for a renderer that only knows the field's type at run time. */\nexport function ContactValue({ type, value, platform, followers, title, icon, ...common }: ContactValueProps) {\n switch (type) {\n case \"email\":\n return <EmailValue email={value} {...common} />;\n case \"phone\":\n return <PhoneValue phone={value} {...common} />;\n case \"address\":\n return <AddressValue address={value} {...common} />;\n case \"social\":\n return <SocialHandleValue value={value} {...(platform !== undefined ? { platform } : {})} {...(followers !== undefined ? { followers } : {})} {...common} />;\n case \"url\":\n return <UrlValue url={value} {...(title !== undefined ? { title } : {})} {...(icon !== undefined ? { icon } : {})} {...common} />;\n }\n}\n","\"use client\";\n\n/**\n * Peek — THE way to show one record at a glance. One typed record in; the card, its phone drawer and\n * its Copy door all come out of it. A caller describes the RECORD (its name, facts, sections, doors),\n * never the card: there is no JSX slot, no class, no glyph or label for a door, nothing to style. What\n * a record needs that this cannot say becomes a new field here, reviewed once — never a hand-built\n * card beside it.\n *\n * <PeekHoverCard trigger={<button>…</button>}>\n * <Peek record={agentPeekRecord(agent)} />\n * </PeekHoverCard>\n *\n * Copy is on by default: the door hands Alchemy `copyData` (or, absent, the record as drawn), through\n * the same host port every table row uses. A record that must not be copied says `copy: false`.\n */\n\nimport * as React from \"react\";\n\nimport { useMatrxDataTableHost } from \"./table-host/host\";\nimport { RecordId, isRecordUuid } from \"./record-id\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\nimport { Chip, ChipSet, MissingTag, PropertyRow, Switch } from \"./controls/index\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport { CheckIcon, CopyIcon, UploadIcon } from \"./icons\";\nimport { cn } from \"./cn\";\nimport { Button } from \"./button\";\nimport { Button as ControlButton } from \"./controls/controls\";\nimport { ErrorNotice } from \"./error-notice\";\nimport { RefreshCwIcon } from \"./icons\";\nimport {\n isPart,\n isProperty,\n isSection,\n peekRecordData,\n type PeekBlock,\n type PeekEntityRenderer,\n type PeekFact,\n type PeekPart,\n type PeekPartRenderer,\n type PeekProperty,\n type PeekRecord,\n type PeekSection,\n type PeekTone,\n} from \"./peek-record\";\nimport { PeekHoldContext, usePeekHold, type PeekCardDensity, type PeekCardFrame, type PeekCardHeight, type PeekCardOrientation, type PeekCardSize } from \"./peek-model\";\nimport {\n PeekCard,\n PeekCardAvatar,\n PeekCardBody,\n PeekCardCallout,\n PeekCardCode,\n PeekCardMedia,\n PeekCardRows,\n PeekCardFavorite,\n PeekCardFooter,\n PeekCardHeader,\n PeekCardRow,\n PeekCardSection,\n PeekCardTags,\n PeekCardText,\n} from \"./peek-card\";\n\nexport interface PeekProps {\n record: PeekRecord;\n /**\n * A menu the card opened (Copy, More) is open — its pointer is outside the card. A host that closes\n * the card on pointer-leave (a list's hover preview) holds it while this is true. PeekHoverCard\n * already does.\n */\n onHoldChange?: (held: boolean) => void;\n size?: PeekCardSize;\n orientation?: PeekCardOrientation;\n height?: PeekCardHeight;\n density?: PeekCardDensity;\n frame?: PeekCardFrame;\n /** The body is still loading: its shimmer shows and every action waits. */\n loading?: boolean;\n}\n\nconst PeekEntityRendererContext = React.createContext<PeekEntityRenderer | null>(null);\n\n/** The host's (or a package's) identity renderer for the peeks inside it. */\nexport function PeekEntityRendererProvider({ render, children }: { render: PeekEntityRenderer; children: React.ReactNode }) {\n return <PeekEntityRendererContext.Provider value={render}>{children}</PeekEntityRendererContext.Provider>;\n}\n\nconst PeekPartRendererContext = React.createContext<PeekPartRenderer | null>(null);\n\n/** The app's renderer for the parts only it can draw (custom fields, the access notice). */\nexport function PeekPartRendererProvider({ render, children }: { render: PeekPartRenderer; children: React.ReactNode }) {\n return <PeekPartRendererContext.Provider value={render}>{children}</PeekPartRendererContext.Provider>;\n}\n\nconst screamedParts = new Set<string>();\nfunction screamPartOnce(kind: string) {\n if (screamedParts.has(kind)) return;\n screamedParts.add(kind);\n console.error(`[Peek] part \"${kind}\" drawn with no PeekPartRendererProvider above it — the app's own rendering (custom fields, access notice, thumbnails, formatted text) is missing here`);\n}\n\nfunction HostPart({ part }: { part: PeekPart }) {\n const render = React.useContext(PeekPartRendererContext);\n const drawn = render?.(part);\n if (drawn) return <>{drawn}</>;\n if (!render) {\n // The app's parts were never mounted: say so once, instead of custom fields quietly missing.\n screamPartOnce(\"token\" in part ? `${part.part}:${part.token}` : part.part);\n }\n // No renderer: never a blank card where a record could not be read, never lost text.\n if (part.part === \"access\") return <p className=\"type-secondary text-muted-foreground\">Not available</p>;\n if (part.part === \"markdown\") {\n return (\n <PeekCardText breaks {...(part.clamp ? { clamp: part.clamp } : {})}>\n {part.text}\n </PeekCardText>\n );\n }\n return null;\n}\n\n/** The record could not be read: the design system's failed-read notice, never an empty-looking card. */\nfunction Failure({ failure }: { failure: NonNullable<PeekRecord[\"failure\"]> }) {\n const flagOnly = failure.error === true || failure.error == null || failure.error === \"\";\n return (\n <ErrorNotice\n size=\"compact\"\n title={`Couldn't load ${failure.what}`}\n // The caller's sentence (or the flag-only one) is what the person reads; the raw error always rides\n // along, so the copy menu's For-AI payload keeps its code and stack.\n {...(failure.message\n ? { message: failure.message }\n : flagOnly\n ? { message: `The read for ${failure.what} failed, so nothing here is an answer — not \"empty\".` }\n : {})}\n {...(flagOnly ? {} : { error: failure.error })}\n operation={`Load ${failure.what}`}\n {...(failure.onRetry\n ? {\n actions: (\n <Button variant=\"outline\" size=\"sm\" className=\"h-7 gap-1.5 text-xs\" onClick={failure.onRetry}>\n <RefreshCwIcon className=\"h-3.5 w-3.5\" /> Try again\n </Button>\n ),\n }\n : {})}\n />\n );\n}\n\nfunction EntityText({ entity, name }: { entity: NonNullable<PeekFact[\"entity\"]>; name: string }) {\n const render = React.useContext(PeekEntityRendererContext);\n const { EntityRef } = useMatrxDataTableHost();\n const className = \"type-secondary min-w-0 max-w-full truncate text-foreground\";\n const drawn = render?.({ ...entity, name, className });\n if (drawn) return <>{drawn}</>;\n if (EntityRef) {\n return (\n <EntityRef\n token={entity.token}\n id={entity.id}\n className={className}\n {...(entity.newTab ? { openInNewTab: true } : {})}\n {...(entity.showActions ? { alwaysShowActions: true } : {})}\n >\n {name}\n </EntityRef>\n );\n }\n // No renderer and no host door: the name as text — never a blank row.\n return <span className={className}>{name}</span>;\n}\n\n/** A link to a page somewhere else: the record's own text, opened in a new tab. */\nfunction Outbound({ href, children }: { href: string; children: React.ReactNode }) {\n // THE outbound door: our referral rides every link to another site (kit's OutboundLink).\n return (\n <OutboundLink href={href} className=\"break-all text-primary underline-offset-2 hover:underline\" onClick={(event) => event.stopPropagation()}>\n {children}\n </OutboundLink>\n );\n}\n\n/** THE INPUT PREVIEW: the real controls, drawn small and inert — what a person filling it will see. */\nfunction InputPreview({ section }: { section: PeekSection }) {\n const { choices, field, toggle } = section;\n if (!choices && !field && !toggle) return null;\n return (\n <div data-peek-input-preview={choices ? \"choices\" : toggle ? \"toggle\" : field?.drop ? \"drop\" : \"field\"} inert className=\"select-none\">\n {choices ? (\n <ChipSet>\n {choices.options.slice(0, 8).map((option) => (\n <Chip key={option} label={option} pressed={Boolean(choices.picked?.includes(option))} />\n ))}\n {choices.options.length > 8 ? <Chip label={`+${choices.options.length - 8}`} /> : null}\n </ChipSet>\n ) : toggle ? (\n <div className=\"flex items-center gap-2\">\n <Switch checked={toggle.on} tabIndex={-1} aria-hidden />\n <span className=\"type-secondary text-foreground\">{toggle.label ?? (toggle.on ? \"On\" : \"Off\")}</span>\n </div>\n ) : field?.drop ? (\n <div className=\"flex h-9 items-center justify-center gap-1.5 rounded-md border border-dashed border-border bg-background type-meta text-muted-foreground\">\n {field.glyph ? <field.glyph className=\"size-3.5 shrink-0\" /> : <UploadIcon className=\"size-3.5 shrink-0\" />}\n {field.text ?? field.placeholder}\n </div>\n ) : field ? (\n <div\n className={cn(\n \"flex gap-2 rounded-md border border-border bg-background px-2.5 shadow-sm\",\n field.lines === 2 ? \"min-h-12 items-start py-1.5\" : \"h-7 items-center\",\n )}\n >\n {field.glyph ? <field.glyph className={cn(\"size-3.5 shrink-0 text-muted-foreground\", field.lines === 2 && \"mt-0.5\")} /> : null}\n <span className={cn(\"type-secondary min-w-0 flex-1\", field.lines === 2 ? \"line-clamp-2\" : \"truncate\", field.text ? \"text-foreground\" : \"text-muted-foreground\")}>\n {field.text || field.placeholder}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\n/** An exact token in a monospace chip; a press copies it and says so for a moment. */\nfunction TokenChip({ token }: { token: string }) {\n const [copied, setCopied] = React.useState(false);\n React.useEffect(() => {\n if (!copied) return;\n const timer = window.setTimeout(() => setCopied(false), 1400);\n return () => window.clearTimeout(timer);\n }, [copied]);\n const Glyph = copied ? CheckIcon : CopyIcon;\n return (\n <ControlButton\n type=\"button\"\n variant=\"quiet\"\n iconEnd={<Glyph className={cn(\"size-3.5 shrink-0\", copied ? \"text-success-ink\" : \"text-muted-foreground group-hover/token:text-foreground\")} />}\n data-peek-token=\"\"\n onClick={(event) => {\n event.stopPropagation();\n void copyText(token).then(setCopied);\n }}\n aria-label={copied ? `Copied ${token}` : `Copy ${token}`}\n title={copied ? \"Copied\" : \"Copy\"}\n className=\"group/token max-w-full self-start font-mono\"\n >\n <span className=\"truncate\">{token}</span>\n </ControlButton>\n );\n}\n\nfunction Property({ block }: { block: PeekProperty }) {\n return (\n <PropertyRow label={block.property}>\n {block.value === \"\" && block.missing ? (\n <MissingTag>{block.missing}</MissingTag>\n ) : (\n <span className=\"break-words\">\n {block.href ? <Outbound href={block.href}>{block.value}</Outbound> : block.value}\n </span>\n )}\n </PropertyRow>\n );\n}\n\nfunction Block({ block }: { block: PeekBlock }) {\n if (isPart(block)) return <HostPart part={block} />;\n if (isProperty(block)) return <Property block={block} />;\n if (isSection(block)) {\n return (\n <PeekCardSection label={block.section} {...(block.glyph ? { icon: block.glyph } : {})} {...(block.tone ? { tone: block.tone } : {})}>\n {block.text && block.markdown ? <HostPart part={{ part: \"markdown\", text: block.text, ...(block.clamp ? { clamp: block.clamp } : {}) }} /> : null}\n {block.text && !block.markdown ? (\n <PeekCardText {...(block.clamp ? { clamp: block.clamp } : {})} {...(block.breaks ? { breaks: true } : {})}>\n {block.text}\n </PeekCardText>\n ) : null}\n {block.tags?.length ? <PeekCardTags tags={block.tags} /> : null}\n {block.items?.length ? <SectionItems items={block.items} {...(block.limit ? { limit: block.limit } : {})} /> : null}\n {block.rows?.length ? (\n <PeekCardRows\n numbered={Boolean(block.numbered)}\n limit={block.limit}\n rows={block.rows.map((row, i) => ({\n key: `${i}:${row.text}`,\n text: row.entity ? <EntityText entity={row.entity} name={row.text} /> : row.text,\n title: row.text,\n detail: row.detail,\n glyph: row.glyph,\n tone: row.tone,\n href: row.entity ? undefined : row.href,\n status: row.status,\n doors: row.doors,\n }))}\n />\n ) : null}\n {block.code ? <PeekCardCode text={block.code.text} language={block.code.language} caption={block.code.caption} /> : null}\n <InputPreview section={block} />\n {block.token ? <TokenChip token={block.token} /> : null}\n {block.links?.length ? (\n <ul className=\"flex flex-col gap-0.5\">\n {block.links.map((link, i) => (\n <li key={`${i}:${link.href}`} className=\"type-secondary min-w-0 truncate\">\n <Outbound href={link.href}>{link.text}</Outbound>\n </li>\n ))}\n </ul>\n ) : null}\n </PeekCardSection>\n );\n }\n if (block.entity) {\n const entity = <EntityText entity={block.entity} name={block.fact} />;\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n {block.glyph ? <block.glyph className=\"size-3.5 shrink-0 text-muted-foreground\" /> : null}\n <div className=\"flex min-w-0 flex-1\">{entity}</div>\n </div>\n );\n }\n if (block.href) {\n return (\n <div className=\"flex min-w-0 items-start gap-2\">\n {block.glyph ? <block.glyph className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" /> : null}\n <span className=\"type-secondary min-w-0 break-words\">\n <Outbound href={block.href}>{block.fact}</Outbound>\n {block.meta ? <span className=\"type-meta block text-muted-foreground\">{block.meta}</span> : null}\n </span>\n </div>\n );\n }\n return (\n <PeekCardRow\n {...(block.glyph ? { icon: block.glyph } : {})}\n {...(block.meta ? { meta: block.meta } : {})}\n {...(block.muted ? { tone: \"muted\" as const } : {})}\n {...(block.wrap ? { wrap: true } : {})}\n >\n {block.fact}\n </PeekCardRow>\n );\n}\n\nfunction Media({ media }: { media: NonNullable<PeekRecord[\"media\"]> }) {\n const render = React.useContext(PeekPartRendererContext);\n const drawn = !media.src && media.file\n ? render?.({ part: \"media\", token: \"file\", id: media.file.id, name: media.alt, ...(media.file.mimeType ? { mimeType: media.file.mimeType } : {}) })\n : null;\n return <PeekCardMedia alt={media.alt} aspect={media.aspect} src={media.src} drawn={drawn} />;\n}\n\nfunction SectionItems({ items, limit }: { items: readonly string[]; limit?: number }) {\n const shown = limit && items.length > limit ? items.slice(0, limit) : items;\n const rest = items.length - shown.length;\n return (\n <ul className=\"flex flex-col gap-0.5\">\n {shown.map((item, i) => (\n <li key={`${i}:${item}`} className=\"type-secondary break-words text-foreground\">\n {item}\n </li>\n ))}\n {rest > 0 ? <li className=\"type-meta text-muted-foreground\">{`+${rest} more`}</li> : null}\n </ul>\n );\n}\n\nconst blockKey = (block: PeekBlock, index: number) =>\n `${index}:${isPart(block) ? block.part : isProperty(block) ? block.property : isSection(block) ? block.section : block.fact}`;\n\nexport function Peek(props: PeekProps) {\n const parent = React.useContext(PeekHoldContext);\n const [held, hold] = usePeekHold();\n const { onHoldChange } = props;\n React.useEffect(() => {\n onHoldChange?.(held);\n }, [held, onHoldChange]);\n const relay = React.useCallback(\n (open: boolean) => {\n parent(open);\n hold(open);\n },\n [parent, hold],\n );\n return (\n <PeekHoldContext.Provider value={relay}>\n <PeekBody {...props} />\n </PeekHoldContext.Provider>\n );\n}\n\n/** A status subtitle's ink per tone (text tokens only). */\nconst SUBTITLE_INK: Record<PeekTone, string> = {\n neutral: \"text-muted-foreground\",\n info: \"text-info-ink\",\n success: \"text-success-ink\",\n warning: \"text-warning-ink\",\n danger: \"text-destructive-ink\",\n};\n\nfunction PeekBody({ record, size, orientation, height, density, frame, loading }: PeekProps) {\n const hasFooter = Boolean(record.primary || record.onSettings || record.doors?.length || record.href || record.copyData !== false);\n const copyData = record.copyData;\n return (\n <PeekCard\n {...(size ? { size } : {})}\n {...(orientation ? { orientation } : {})}\n {...(height ? { height } : {})}\n {...(density ? { density } : {})}\n {...(frame ? { frame } : {})}\n {...(loading ? { loading } : {})}\n >\n <PeekCardHeader\n title={record.title}\n {...(record.subtitle\n ? {\n subtitle: record.subtitleTone ? (\n <span data-tone={record.subtitleTone} className={cn(\"font-medium\", SUBTITLE_INK[record.subtitleTone])}>\n {record.subtitle}\n </span>\n ) : (\n record.subtitle\n ),\n }\n : {})}\n {...(record.avatar\n ? { leading: <PeekCardAvatar initials={record.avatar.initials} src={record.avatar.src} /> }\n : record.glyph\n ? { leading: <record.glyph /> }\n : {})}\n {...(record.favorite || record.badge\n ? {\n trailing: (\n <>\n {record.badge ? (\n <Chip\n data-peek-badge=\"\"\n label={record.badge.text}\n tone={record.badge.tone ?? \"neutral\"}\n {...(record.badge.glyph ? { icon: <record.badge.glyph /> } : {})}\n />\n ) : null}\n {record.favorite ? <PeekCardFavorite on={record.favorite.on} onToggle={record.favorite.onToggle} /> : null}\n </>\n ),\n }\n : {})}\n {...(record.favorite?.on && record.favorite.pinnedLabel ? { pinned: record.favorite.pinnedLabel } : {})}\n {...((record.showId ?? isRecordUuid(record.id)) ? { id: <RecordId value={record.id} label={record.kind} /> } : {})}\n />\n {record.failure || record.media || record.callout || record.body?.length || record.aside?.length ? (\n <PeekCardBody\n {...(record.aside?.length\n ? { aside: record.aside.map((block, i) => <Block key={blockKey(block, i)} block={block} />) }\n : {})}\n >\n {record.failure ? <Failure failure={record.failure} /> : null}\n {record.media ? <Media media={record.media} /> : null}\n {record.callout ? (\n <PeekCardCallout title={record.callout.title} {...(record.callout.glyph ? { icon: record.callout.glyph } : {})}>\n {record.callout.text || record.callout.lines?.length ? (\n <>\n {record.callout.text}\n {record.callout.lines?.map((line, i) => (\n <div key={`${i}:${line.text}`} className=\"type-meta text-muted-foreground\" {...(line.hint ? { title: line.hint } : {})}>\n {line.text}\n </div>\n ))}\n </>\n ) : null}\n </PeekCardCallout>\n ) : null}\n {record.body?.map((block, i) => <Block key={blockKey(block, i)} block={block} />)}\n </PeekCardBody>\n ) : null}\n {hasFooter ? (\n <PeekCardFooter\n {...(record.primary ? { primary: { label: record.primary.label, onClick: record.primary.onSelect } } : {})}\n {...(record.onSettings ? { onSettings: record.onSettings } : {})}\n {...(record.doors ? { doors: record.doors } : {})}\n {...(record.href ? { openHref: record.href } : {})}\n {...(copyData !== false\n ? {\n copy: {\n data: copyData === undefined ? () => peekRecordData(record) : copyData,\n dataType: record.kind,\n label: record.title,\n sourceId: record.id,\n },\n }\n : {})}\n />\n ) : null}\n </PeekCard>\n );\n}\n","// The peek's RECORD — what a caller hands <Peek> — and the record as Copy hands it to Alchemy. No\n// components here, so peek.tsx hot-swaps in place (React Fast Refresh) on an edit.\n\nimport type * as React from \"react\";\n\nimport type { PeekDoor, PeekDoors } from \"./peek-model\";\n\n/** A glyph component (a Lucide icon, a design-system icon); drawn 14–16px in muted ink. */\nexport type PeekGlyph = React.ComponentType<{ className?: string }>;\n\n/** One fact on one line: an optional glyph, the text, an optional quieter second line. */\nexport interface PeekFact {\n fact: string;\n /**\n * The fact NAMES a record (a model, a person, a project): it opens like every identity in the app.\n * Drawn by the host's identity renderer for that token (`PeekEntityRenderer`), else the table host's\n * `EntityRef` around `fact`, else `fact` as text.\n */\n entity?: {\n token: string;\n id: string;\n offeringId?: string | null;\n /** Opening the record starts a new tab (the peek's context stays where it is). */\n newTab?: boolean;\n /** Its open / peek buttons stay shown, not only on hover. */\n showActions?: boolean;\n };\n glyph?: PeekGlyph;\n /** A quieter second line (an email, a date). */\n meta?: string;\n /** The whole row is meta (dates, counts). */\n muted?: boolean;\n /** Let a long fact run to several lines instead of ending in \"…\". */\n wrap?: boolean;\n /** The fact is a page somewhere else: its text is a link that opens in a new tab. */\n href?: string;\n}\n\n/** A status color, from the design system's semantic tokens. */\nexport type PeekTone = \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n\n/**\n * One child of the record in a section's list (a step, a finding, an attached place, a reason).\n * Text first; everything else is optional and drawn in one fixed place on the row.\n */\nexport interface PeekRow {\n text: string;\n /** A quieter line under the text. */\n detail?: string;\n glyph?: PeekGlyph;\n /** A small dot before the text, in this tone (a finding's grade, a step's state). */\n tone?: PeekTone;\n /** The row NAMES a record: drawn like a fact's `entity` (the host's identity renderer, else `EntityRef`). */\n entity?: { token: string; id: string; offeringId?: string | null };\n /** The row's text is a link: a web address opens in a new tab, an app path moves within the app. */\n href?: string;\n /** A short tag at the row's right edge (\"Needs attention\"), its reason as the tooltip. */\n status?: { text: string; tone?: PeekTone; hint?: string };\n /** The row's own doors, by kind (Edit, Sneak peek …), at most two, drawn at its right edge. */\n doors?: readonly PeekDoor[];\n}\n\n/** Code or raw text, drawn monospaced and kept exactly as written (it scrolls, it never wraps). */\nexport interface PeekCode {\n text: string;\n /** The language name shown over it (\"TypeScript\", \"JSON\"). */\n language?: string;\n /** Where it comes from (\"src/app.ts · 12–30\"). */\n caption?: string;\n}\n\n/** A labeled block: running text, tags, a list of child rows, code — or several. */\nexport interface PeekSection {\n section: string;\n glyph?: PeekGlyph;\n /** A status color for the whole section (an error's severity): its label and edge take the tone. */\n tone?: PeekTone;\n text?: string;\n /** Lines before the text ends in \"…\". */\n clamp?: 2 | 3 | 4 | 6;\n /** Keep the text's own line breaks and indents (a note's content, an address) instead of one flowing paragraph. */\n breaks?: boolean;\n /** The text is markdown: the app's formatted-text renderer draws it (part `markdown`); without one, it reads as written. */\n markdown?: boolean;\n tags?: readonly string[];\n /** Short lines under the label (reasons, sources), one per line; past `limit` they end in \"+N more\". */\n items?: readonly string[];\n limit?: number;\n /** Child rows (steps, findings, reasons), each with its own optional status and doors; `limit` applies. */\n rows?: readonly PeekRow[];\n /** Number the rows (a sequence: workflow steps). */\n numbered?: boolean;\n code?: PeekCode;\n /** Pages somewhere else under the label (evidence, sources), one per line, each opening in a new tab. */\n links?: readonly { text: string; href: string }[];\n /**\n * THE INPUT PREVIEW (a form field at a glance, drawn with the real controls, inert): the choices\n * an input offers as chips, the picked ones on — what a person filling it will see.\n */\n choices?: { options: readonly string[]; picked?: readonly string[] };\n /** THE INPUT PREVIEW for a typed value: a sample field showing `text`, else the `placeholder`. */\n field?: PeekFieldPreview;\n /** THE INPUT PREVIEW for an on/off input: the real switch, inert, with its state in words. */\n toggle?: { on: boolean; label?: string };\n /** An exact token (`{{name}}`, an id, a key) in a monospace chip; a press copies it. */\n token?: string;\n}\n\n/** A sample field: one line, two lines (long text), or a drop zone (a file or media input). */\nexport interface PeekFieldPreview {\n text?: string;\n placeholder: string;\n lines?: 1 | 2;\n /** The input's glyph, at the field's leading edge. */\n glyph?: PeekGlyph;\n /** A file / media input: a dashed drop zone instead of a text box. */\n drop?: boolean;\n}\n\n/**\n * A label with its value — the design system's `PropertyRow` (label gray over value black, one left\n * edge). For a record's named attributes: Source, Found by, Certainty. `href`: the value is a page\n * somewhere else and opens in a new tab.\n */\nexport interface PeekProperty {\n property: string;\n value: string;\n href?: string;\n /** An empty value shows this tag (\"None\", \"Empty\") — never a blank row. */\n missing?: string;\n}\n\n/**\n * A part the HOST draws for this record, from what the app knows and this package does not:\n * - `custom-fields` — the organization's own fields for the record (nothing when its table takes none);\n * - `access` — the honest state when the record could not be read (gone, or not shared with this\n * person), in place of a body that would otherwise be blank;\n * - `media` / `markdown` — a stored file's thumbnail; formatted text.\n * Drawn by the renderer `PeekPartRendererProvider` gives; with none, `custom-fields` draws nothing,\n * `access` says \"Not available\", `markdown` shows its text as written, `media` its name.\n */\nexport type PeekPart =\n | { part: \"custom-fields\"; token: string; id: string }\n /** `error`: what the read threw, so the host can say WHY (gone, not shared, offline) rather than guess. */\n | { part: \"access\"; token: string; id: string; error?: unknown }\n /** A stored file's thumbnail. `mimeType` picks image / video frame / type icon; `name` is the file's name. */\n | { part: \"media\"; token: string; id: string; mimeType?: string; name?: string }\n /**\n * Formatted text (markdown) — a section with `markdown: true` hands its text here. `clamp`: the\n * section's line limit — the host draws a short preview of that many lines (inline, a shape as one line).\n */\n | { part: \"markdown\"; text: string; clamp?: 2 | 3 | 4 | 6 };\n\n/**\n * A picture at the top of the card (a file's thumbnail). `src` is an image address; `file` is a stored\n * file the HOST draws (through `PeekPartRendererProvider`, as part `media`). `alt` is always required.\n */\nexport interface PeekMedia {\n alt: string;\n /** Default 4:3. */\n aspect?: \"4:3\" | \"16:9\" | \"1:1\";\n src?: string;\n file?: { id: string; mimeType?: string };\n}\n\nexport type PeekBlock = PeekFact | PeekSection | PeekProperty | PeekPart;\n\nexport interface PeekRecord {\n /** What it is in a person's words (\"Agent\", \"Task\") — Alchemy's For AI tag says it. */\n kind: string;\n /** The record's id. */\n id: string;\n /**\n * Show the id under the name with one-click copy (THE id, `RecordId`). Default: when `id` is a real\n * record id (a UUID). A real id that is not a UUID (a model id, a provider id) says `true`; a\n * made-up key says nothing and stays hidden.\n */\n showId?: boolean;\n /** Its full name — the card's strongest line; wraps, never truncates. */\n title: string;\n /** One short line under the name. */\n subtitle?: string;\n /** The subtitle is a status: it takes this tone's ink (\"Required · no value yet\" in warning). */\n subtitleTone?: PeekTone;\n /** A chip at the header's right edge naming what the record is (\"Dropdown\"), in a status tone. */\n badge?: { text: string; tone?: \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"destructive\" | \"info\"; glyph?: PeekGlyph };\n /** A glyph that rides the title's first line. */\n glyph?: PeekGlyph;\n /** A person's picture (or initials) in the glyph's place, on the title's first line. */\n avatar?: { initials: string; src?: string };\n /** A picture over the body (a file's thumbnail). */\n media?: PeekMedia;\n /** The favorite star; `pinnedLabel` is the gold line under the name while it is on (\"Pinned to favorites\"). */\n favorite?: { on: boolean; onToggle: () => void; pinnedLabel?: string };\n /**\n * The one fact that changes what the record IS (an agent that runs an ensemble). At most one.\n * `lines` are its quieter details, each with an optional hover hint (the full list a line shortens).\n */\n callout?: { title: string; glyph?: PeekGlyph; text?: string; lines?: readonly { text: string; hint?: string }[] };\n /** The body, in reading order. */\n body?: readonly PeekBlock[];\n /** Supporting facts: beside the body in landscape, under it in portrait. */\n aside?: readonly PeekBlock[];\n /**\n * The record could not be read: the body is the design system's failed-read notice (\"Couldn't load\n * {what}\", the error's own sentence and its copy menu, Try again when `onRetry` is given) instead of\n * blocks that would read as an empty record. `message` replaces the error's sentence when the caller\n * knows better why.\n */\n failure?: { what: string; error?: unknown; message?: string; onRetry?: () => void };\n /** The one main action. */\n primary?: { label: string; onSelect: () => void };\n /** The record has settings: the first door. */\n onSettings?: () => void;\n /** Up to three record doors, by kind. */\n doors?: PeekDoors;\n /** The record's own page: the right-most door, in a new tab. */\n href?: string;\n /**\n * What Copy hands Alchemy. Absent: the record as drawn. A getter is read on the click (load the\n * full record only when someone copies it). `false`: this record has no Copy door.\n */\n copyData?: unknown | (() => unknown) | false;\n}\n\nexport const isSection = (block: PeekBlock): block is PeekSection => \"section\" in block;\nexport const isProperty = (block: PeekBlock): block is PeekProperty => \"property\" in block;\nexport const isPart = (block: PeekBlock): block is PeekPart => \"part\" in block;\n\n/** Draws a host part (`PeekPart`). `null`: nothing to draw for it. */\nexport type PeekPartRenderer = (part: PeekPart) => React.ReactNode | null;\n\n/** Draws a named record by token (`ai_model` → the app's model door). `null`: not this renderer's token. */\nexport type PeekEntityRenderer = (entity: { token: string; id: string; name: string; offeringId?: string | null; className: string }) => React.ReactNode | null;\n\n/**\n * The record as drawn — what Copy hands Alchemy when the caller gives nothing richer. It reads like\n * the card: each section under its own name, facts as a plain list, the callout as a note.\n */\nexport function peekRecordData(record: PeekRecord): Record<string, unknown> {\n const out: Record<string, unknown> = { kind: record.kind, id: record.id, name: record.title };\n if (record.subtitle) out[\"subtitle\"] = record.subtitle;\n if (record.badge) out[\"type\"] = record.badge.text;\n if (record.callout) {\n out[\"note\"] = [record.callout.title, record.callout.text, ...(record.callout.lines?.map((line) => line.hint ?? line.text) ?? [])]\n .filter(Boolean)\n .join(\" — \");\n }\n const facts: string[] = [];\n for (const block of [...(record.body ?? []), ...(record.aside ?? [])]) {\n // A host part is drawn from the app's own data; Copy of the record carries what the card states.\n if (isPart(block)) continue;\n if (isProperty(block)) {\n out[block.property] = block.href ? `${block.value} (${block.href})` : block.value;\n } else if (isSection(block)) {\n const parts: Record<string, unknown> = {};\n if (block.text) parts[\"text\"] = block.text;\n if (block.tags?.length) parts[\"tags\"] = [...block.tags];\n if (block.items?.length) parts[\"items\"] = [...block.items];\n if (block.links?.length) parts[\"links\"] = block.links.map((l) => `${l.text} — ${l.href}`);\n if (block.rows?.length) {\n parts[\"rows\"] = block.rows.map((row) =>\n [row.text, row.detail, row.status ? `(${row.status.text})` : null, row.href].filter(Boolean).join(\" — \"),\n );\n }\n if (block.code) parts[\"code\"] = block.code.text;\n if (block.choices) parts[\"choices\"] = [...block.choices.options];\n if (block.field?.text) parts[\"value\"] = block.field.text;\n if (block.toggle) parts[\"on\"] = block.toggle.on;\n if (block.token) parts[\"token\"] = block.token;\n const keys = Object.keys(parts);\n if (keys.length === 1) out[block.section] = parts[keys[0]!];\n else if (keys.length) out[block.section] = parts;\n } else {\n const text = block.meta ? `${block.fact} (${block.meta})` : block.fact;\n facts.push(block.href ? `${text} — ${block.href}` : text);\n }\n }\n if (facts.length) out[\"facts\"] = facts;\n if (record.href) out[\"link\"] = record.href;\n return out;\n}\n\n","// The peek's model: its options, size tables, door list and contexts — everything that is not a\n// component lives here, so the component files hot-swap in place (React Fast Refresh) on an edit.\n\nimport * as React from \"react\";\n\nimport { CopyPlusGlyph, MessageCircleGlyph, RocketGlyph } from \"./peek-glyphs\";\nimport { DownloadIcon, PencilIcon } from \"./icons\";\n\n\nexport type PeekCardSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type PeekCardOrientation = \"portrait\" | \"landscape\";\n/**\n * `fit`: the card is as tall as its content, between the size's floor and its height. `fixed`: always\n * that height. `content`: exactly as tall as its content, no floor, capped at the size's height — a\n * notice-shaped peek (an assist, a confirmation) that holds two lines must not stand 400px tall.\n */\nexport type PeekCardHeight = \"fit\" | \"fixed\" | \"content\";\nexport type PeekCardDensity = \"compact\" | \"comfortable\";\n/** `surface`: the card is its own frame (border, radius, shadow). `bare`: a host panel already is. */\nexport type PeekCardFrame = \"surface\" | \"bare\";\n\n/**\n * Every size, in px. `md` portrait is the reference (the agent picker's 340 × 420 peek). Landscape\n * sizes are the same family turned on its side: wide enough for a main column and an aside.\n */\nexport const PEEK_CARD_SIZES: Record<\n PeekCardOrientation,\n Record<PeekCardSize, { width: number; height: number; minHeight: number }>\n> = {\n portrait: {\n xs: { width: 240, height: 300, minHeight: 200 },\n sm: { width: 280, height: 360, minHeight: 240 },\n md: { width: 340, height: 420, minHeight: 280 },\n lg: { width: 400, height: 520, minHeight: 340 },\n xl: { width: 480, height: 620, minHeight: 400 },\n },\n landscape: {\n xs: { width: 360, height: 200, minHeight: 160 },\n sm: { width: 440, height: 260, minHeight: 200 },\n md: { width: 520, height: 320, minHeight: 240 },\n lg: { width: 640, height: 400, minHeight: 300 },\n xl: { width: 760, height: 480, minHeight: 360 },\n },\n};\n\nexport interface PeekCardContextValue {\n size: PeekCardSize;\n orientation: PeekCardOrientation;\n density: PeekCardDensity;\n /** Set by `PeekWindow`: the header becomes the drag handle and gains a close button. */\n window: { onClose: () => void; dragHandle: React.HTMLAttributes<HTMLElement>; titleId: string } | null;\n /** The body is a shimmer: the footer's actions are disabled until it arrives. */\n loading: boolean;\n /** Set inside a phone's bottom drawer: one scroll for title and body, 44px actions. */\n sheet: { footer: \"pinned\" | \"inline\" } | null;\n}\n\nexport const PeekCardContext = React.createContext<PeekCardContextValue>({\n size: \"md\",\n orientation: \"portrait\",\n density: \"comfortable\",\n window: null,\n loading: false,\n sheet: null,\n});\n\nexport const PeekSheetContext = React.createContext<PeekCardContextValue[\"sheet\"]>(null);\n\nexport const PeekWindowContext = React.createContext<PeekCardContextValue[\"window\"]>(null);\n\nexport function usePeekCard(): PeekCardContextValue {\n return React.useContext(PeekCardContext);\n}\n\n/**\n * THE RECORD DOORS — a closed list the package owns. A caller names a door by `kind`; the glyph and\n * the tooltip come from here, so no caller can draw a strange icon, write its own label, or add a\n * door that repeats a fixed one (Copy, Open in new tab, Settings are never in this list). A new kind\n * is a change to this package, reviewed once, never a call-site invention.\n *\n * ONE named exception, `action` (2026-10-18): a VERB the record offers that no fixed kind names\n * (\"Start support session\", \"Message\"). The caller names it with a short `label` and a Lucide `icon`\n * — the footer still owns placement, size, the three-door ceiling and the More overflow, so an action\n * door can never become a call-site button. It is a record verb, never a link that repeats Open.\n */\nexport type PeekDoorKind = \"peek\" | \"chat\" | \"edit\" | \"download\" | \"duplicate\" | \"action\";\n\n/** One choice in a door's menu. `tone: \"danger\"` is a choice that removes or silences. */\nexport interface PeekDoorMenuItem {\n key: string;\n label: string;\n onSelect: () => void;\n tone?: \"danger\";\n}\n\n/** A run of a door's menu: an optional small heading over its items; groups are split by a hairline. */\nexport interface PeekDoorMenuGroup {\n label?: string;\n items: readonly PeekDoorMenuItem[];\n}\n\ninterface PeekDoorCommon {\n onClick?: (event: React.MouseEvent | Event) => void;\n /** A door that goes somewhere: a link (`newTab` opens it in a new tab). */\n href?: string;\n newTab?: boolean;\n /** Its work is running (a duplicate being made): the door waits. */\n busy?: boolean;\n}\n\n/** A fixed door: its glyph and label come from `PEEK_DOORS`. */\nexport interface PeekKindDoor extends PeekDoorCommon {\n kind: Exclude<PeekDoorKind, \"action\">;\n}\n\n/** A record verb no fixed kind names. `id` keeps two action doors apart; `label` ≤ 3 words. */\nexport interface PeekActionDoor extends PeekDoorCommon {\n kind: \"action\";\n id: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n /**\n * The verb has choices (\"Later\" → 1 hour · Tomorrow): the door opens this menu instead of running\n * `onClick`. The menu holds a hover peek open while it is in use. Never in the More overflow — a\n * menu door that does not fit is a design error the footer says in the console.\n */\n menu?: readonly PeekDoorMenuGroup[];\n}\n\nexport type PeekDoor = PeekKindDoor | PeekActionDoor;\n\n/** At most three record doors. More than that is a menu, not a peek. */\nexport type PeekDoors =\n | readonly []\n | readonly [PeekDoor]\n | readonly [PeekDoor, PeekDoor]\n | readonly [PeekDoor, PeekDoor, PeekDoor];\n\nexport const PEEK_MAX_RECORD_DOORS = 3;\n\nexport const PEEK_DOORS: Record<PeekDoorKind, { icon: React.ComponentType<{ className?: string }>; label: string; inMenu?: true }> = {\n peek: { icon: RocketGlyph, label: \"Sneak peek\" },\n chat: { icon: MessageCircleGlyph, label: \"Open in chat\" },\n edit: { icon: PencilIcon, label: \"Edit\" },\n download: { icon: DownloadIcon, label: \"Download\" },\n // Never a glyph beside Copy (Arman, 2026-10-14): it always lives in More.\n duplicate: { icon: CopyPlusGlyph, label: \"Duplicate\", inMenu: true },\n // The stand-in only: an `action` door always carries its own label and icon (`peekDoorFace`).\n action: { icon: RocketGlyph, label: \"Run\" },\n};\n\n/** The glyph and label a door is drawn with: the fixed kind's, or an action door's own. */\nexport function peekDoorFace(door: PeekDoor): { icon: React.ComponentType<{ className?: string }>; label: string; inMenu?: true } | null {\n if (door.kind === \"action\") return door.label.trim() ? { icon: door.icon, label: door.label.trim() } : null;\n return PEEK_DOORS[door.kind] ?? null;\n}\n\n/** What makes two doors the same door: the kind, or an action door's own id. */\nexport function peekDoorKey(door: PeekDoor): string {\n return door.kind === \"action\" ? `action:${door.id}` : door.kind;\n}\n\n/** Door slots per size (fixed doors included) — the stand-in only until the footer has measured itself. */\nexport const PEEK_CARD_FOOTER_SLOTS: Record<PeekCardSize, number> = { xs: 3, sm: 4, md: 5, lg: 6, xl: 7 };\n/**\n * A menu opened from inside a hover peek (More, Copy) portals outside the card, so the pointer\n * \"leaves\" the card to use it. The host holds the peek open while any such menu is open.\n */\nexport const PeekHoldContext = React.createContext<(open: boolean) => void>(() => {});\n\n/**\n * Hold the peek open while `open` — through an effect, so a menu that unmounts while open (the row\n * re-measured, the card closed) releases its hold too and the peek can never stick open.\n */\nexport function usePeekHoldWhile(open: boolean) {\n const hold = React.useContext(PeekHoldContext);\n React.useEffect(() => {\n if (!open) return;\n hold(true);\n return () => hold(false);\n }, [open, hold]);\n}\n\nexport function usePeekHold(): [boolean, (open: boolean) => void] {\n const count = React.useRef(0);\n const [held, setHeld] = React.useState(false);\n const hold = React.useCallback((open: boolean) => {\n count.current = Math.max(0, count.current + (open ? 1 : -1));\n setHeld(count.current > 0);\n }, []);\n return [held, hold];\n}\n\n","\"use client\";\n\n// The peek's door glyphs — aliases of the one glyph home (./icons) — and Alchemy's own mark. Components only, so\n// an edit here hot-swaps in place (React Fast Refresh) and keeps the page's state.\n\nimport { CopyPlusIcon, MessageCircleIcon, RocketIcon } from \"./icons\";\nimport { ALCHEMY_GLYPH_PATHS, ALCHEMY_GLYPH_VIEWBOX } from \"./content-transfer/icon\";\n\nexport const RocketGlyph = RocketIcon;\nexport const MessageCircleGlyph = MessageCircleIcon;\nexport const CopyPlusGlyph = CopyPlusIcon;\nexport function AlchemyGlyph({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox={ALCHEMY_GLYPH_VIEWBOX.portal} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n {ALCHEMY_GLYPH_PATHS.portal.map((d) => (\n <path key={d} d={d} />\n ))}\n </svg>\n );\n}\n\n","\"use client\";\n\n/**\n * PeekCard — THE peek: the small framed card that shows one record at a glance.\n *\n * Lifted from the agent picker's hover peek (`AgentDetailCard`, @ai-matrx/agents), the card Arman\n * named as the bar every other one misses (2026-10-14). Its anatomy is the contract, and a caller\n * cannot change it — only fill its slots:\n *\n * ┌──────────────────────────────┐\n * │ [leading] Title (wraps) [★] │ PeekCardHeader — the strongest line; never truncated\n * │ ──────────────────────────── │ inset hairline (drawn by the card, never by a caller)\n * │ ▢ icon row │ PeekCardBody — scrolls on its own; rows, sections,\n * │ LABEL │ tags, a callout; landscape adds an aside column\n * │ running text │\n * │ ──────────────────────────── │\n * │ ⚙ [ Primary ] ⋯ (doors) ⧉ ↗ │ PeekCardFooter — settings, one primary, ≤3 record doors, Copy, Open\n * └──────────────────────────────┘\n *\n * What a caller picks is a NAMED option, never a class: `size` (xs–xl), `orientation`\n * (portrait / landscape), `height` (fit / fixed), `density`, `frame` (surface / bare). The host\n * that opens it is picked the same way: `PeekHoverCard` (hover), `PeekPopover` (click) or\n * `PeekWindow` (a floating, draggable peek with no window chrome — the title row IS the handle).\n * There is no `className` on the card or its slots: a peek that looks different is a new named\n * option here, released, never a call-site restyle.\n */\n\nimport * as HoverCardPrimitive from \"@radix-ui/react-hover-card\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { openOutbound } from \"@ai-matrx/kit/outbound\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\nimport { BottomSheet } from \"./bottom-sheet\";\nimport { cn } from \"./cn\";\nimport { Button } from \"./controls/controls\";\nimport { useMatrxDataTableHost, useMatrxTableRowAlchemy } from \"./table-host/host\";\nimport { MatrxTableRowAlchemyProvider } from \"./table-host/RowAlchemyLauncher\";\nimport type { MatrxDataTableRecordControls } from \"./data-table/types\";\nimport { clampRectToViewport, DRAG_IGNORE_SELECTOR, readViewport, useDragMove } from \"./window-drag\";\nimport { FloatingLayer, useEscapeLayer, useFloatingLayerZIndex } from \"./floating-layer\";\nimport { HOVER_CARD_CLOSE_DELAY_MS, HOVER_CARD_OPEN_DELAY_FLOOR_MS, HOVER_CARD_OPEN_DELAY_MS } from \"./hover-card\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from \"./dropdown-menu\";\nimport { ExternalLinkIcon, Loader2Icon, MoreHorizontalIcon, SettingsIcon, StarIcon, XIcon } from \"./icons\";\nimport {\n PEEK_CARD_FOOTER_SLOTS,\n PEEK_CARD_SIZES,\n PEEK_DOORS,\n peekDoorFace,\n peekDoorKey,\n PEEK_MAX_RECORD_DOORS,\n PeekCardContext,\n PeekHoldContext,\n PeekSheetContext,\n PeekWindowContext,\n usePeekCard,\n usePeekHold,\n usePeekHoldWhile,\n type PeekCardContextValue,\n type PeekCardDensity,\n type PeekCardFrame,\n type PeekCardHeight,\n type PeekCardOrientation,\n type PeekCardSize,\n type PeekDoor,\n type PeekDoorKind,\n type PeekDoorMenuGroup,\n type PeekDoors,\n} from \"./peek-model\";\nimport type { PeekGlyph, PeekTone } from \"./peek-record\";\nimport { AlchemyGlyph } from \"./peek-glyphs\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\nimport { Skeleton } from \"./skeleton\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\n/** Small cards are compact unless asked otherwise; the reference size and up breathe. */\nfunction defaultDensity(size: PeekCardSize): PeekCardDensity {\n return size === \"xs\" || size === \"sm\" ? \"compact\" : \"comfortable\";\n}\n\nconst PAD = {\n compact: { x: \"px-3\", header: \"pt-3 pb-2\", body: \"py-2 gap-2\", rule: \"mx-2\" },\n comfortable: { x: \"px-4\", header: \"pt-4 pb-3\", body: \"py-3 gap-3\", rule: \"mx-3\" },\n} as const;\n\n// ── the card ─────────────────────────────────────────────────────────────────\n\nexport interface PeekCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"className\" | \"style\" | \"children\"> {\n size?: PeekCardSize;\n orientation?: PeekCardOrientation;\n height?: PeekCardHeight;\n density?: PeekCardDensity;\n frame?: PeekCardFrame;\n /** Draws the card's own shimmer in place of its body (header and footer keep their place). */\n loading?: boolean;\n /** Header, body, footer — in that order. */\n children: React.ReactNode;\n}\n\n/** Set on a peek host's content: how tall the card may be where the popper put it. */\nconst PEEK_ROOM_VAR = \"--matrx-peek-room\";\n\nexport const PeekCard = React.forwardRef<HTMLDivElement, PeekCardProps>((allProps, ref) => {\n const {\n size = \"md\",\n orientation = \"portrait\",\n height = \"fit\",\n density,\n frame = \"surface\",\n loading = false,\n children,\n ...props\n } = allProps;\n const windowCtx = React.useContext(PeekWindowContext);\n const sheet = React.useContext(PeekSheetContext);\n // A phone's drawer is always portrait and roomy, whatever the desktop card asked for.\n const resolvedOrientation = sheet ? \"portrait\" : orientation;\n const resolvedDensity = sheet ? \"comfortable\" : (density ?? defaultDensity(size));\n const box = PEEK_CARD_SIZES[orientation][size];\n const value: PeekCardContextValue = {\n size,\n orientation: resolvedOrientation,\n density: resolvedDensity,\n window: windowCtx,\n loading,\n sheet,\n };\n const parts = React.Children.toArray(children);\n const body = loading\n ? parts.map((child) =>\n React.isValidElement(child) && child.type === PeekCardBody ? <PeekCardBodySkeleton key=\"peek-body-skeleton\" /> : child,\n )\n : parts;\n if (sheet) {\n // One scroll for the title row and the body; the footer pinned below it or inline at its end.\n const isFooter = (child: React.ReactNode) => React.isValidElement(child) && child.type === PeekCardFooter;\n const footer = body.filter(isFooter);\n const rest = body.filter((child) => !isFooter(child));\n return (\n <PeekCardContext.Provider value={value}>\n <div ref={ref} data-matrx-peek-card=\"\" data-presentation=\"sheet\" aria-busy={loading || undefined} className=\"flex min-h-0 flex-1 flex-col text-foreground\" {...props}>\n <div data-matrx-peek-scroller=\"\" className=\"matrx-peek-scroll min-h-0 flex-1 overflow-y-auto\">\n <div className=\"flex flex-col\">\n {rest}\n {sheet.footer === \"inline\" ? footer : null}\n </div>\n </div>\n {sheet.footer === \"pinned\" ? footer : null}\n </div>\n </PeekCardContext.Provider>\n );\n }\n return (\n <PeekCardContext.Provider value={value}>\n <div\n ref={ref}\n data-matrx-peek-card=\"\"\n data-size={size}\n data-orientation={orientation}\n data-density={resolvedDensity}\n data-frame={frame}\n aria-busy={loading || undefined}\n className={cn(\n \"flex min-h-0 flex-col overflow-hidden text-popover-foreground outline-none\",\n frame === \"surface\" && \"rounded-md border border-border bg-popover shadow-md\",\n frame === \"bare\" && \"h-full w-full\",\n )}\n style={\n frame === \"bare\"\n ? undefined\n : {\n width: box.width,\n maxWidth: \"calc(100vw - 16px)\",\n // Loading holds the full height so the card does not jump when the body arrives.\n // `fit` grows with its content between the size's floor and ceiling, so a bigger\n // size never draws smaller than a smaller one.\n // Every height is capped by the room the host left (`--matrx-peek-room`, set by the hover\n // and click hosts from the popper's available height), so a card that cannot fit above or\n // below its trigger shrinks and scrolls inside instead of leaving the screen.\n ...(height === \"content\"\n ? { maxHeight: `min(${box.height}px, var(${PEEK_ROOM_VAR}, 100vh))` }\n : height === \"fixed\" || loading\n ? { height: `min(${box.height}px, var(${PEEK_ROOM_VAR}, 100vh))` }\n : {\n minHeight: `min(${box.minHeight}px, var(${PEEK_ROOM_VAR}, 100vh))`,\n maxHeight: `min(${box.height}px, var(${PEEK_ROOM_VAR}, 100vh))`,\n }),\n }\n }\n {...props}\n >\n {body}\n </div>\n </PeekCardContext.Provider>\n );\n});\nPeekCard.displayName = \"PeekCard\";\n\n/** The inset hairline between the card's three parts. Drawn by the parts, never by a caller. */\nfunction PeekRule({ vertical = false }: { vertical?: boolean }) {\n const { density } = usePeekCard();\n if (vertical) return <div aria-hidden className={cn(\"w-px shrink-0 bg-border\", density === \"compact\" ? \"my-2\" : \"my-3\")} />;\n return <div aria-hidden className={cn(\"h-px shrink-0 bg-border\", PAD[density].rule)} />;\n}\n\n// ── header ───────────────────────────────────────────────────────────────────\n\nexport interface PeekCardHeaderProps {\n /** The record's full name — the card's strongest line. Wraps; never truncates. */\n title: React.ReactNode;\n /** One short line under the title (a kind, an owner, a status word). */\n subtitle?: React.ReactNode;\n /** A glyph or avatar before the title, drawn in a 32px tile. */\n leading?: React.ReactNode;\n /** Controls at the right edge (a favorite star, a menu). */\n trailing?: React.ReactNode;\n /** A favorite's own line under the title, in the favorite's gold (\"Pinned to favorites\"). */\n pinned?: string;\n /** The record's id line (THE id component), under the subtitle. */\n id?: React.ReactNode;\n}\n\nexport function PeekCardHeader({ title, subtitle, leading, trailing, pinned, id }: PeekCardHeaderProps) {\n const { density, window } = usePeekCard();\n const pad = PAD[density];\n return (\n <>\n <div\n data-matrx-peek-header=\"\"\n {...(window?.dragHandle ?? {})}\n className={cn(\"flex shrink-0 items-start gap-3\", pad.x, pad.header, window && \"touch-none select-none\")}\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n {/* The leading glyph rides the title's first line, never a column of its own: a\n wrapped title runs back under it, and the subtitle starts at its left edge. */}\n <h3 id={window?.titleId} className=\"matrx-peek-title break-words\">\n {leading ? (\n <span aria-hidden className=\"relative top-[2px] mr-1.5 inline-flex size-4 items-center justify-center align-top text-muted-foreground [&_svg]:size-4\">\n {leading}\n </span>\n ) : null}\n {title}\n </h3>\n {pinned ? <p className=\"type-meta truncate text-[var(--favorite)]\">{pinned}</p> : null}\n {subtitle ? <p className=\"type-meta truncate text-muted-foreground\">{subtitle}</p> : null}\n {id ? <div className=\"flex min-w-0\" data-peek-no-drag=\"\">{id}</div> : null}\n </div>\n {trailing || window ? (\n <div className=\"flex shrink-0 items-center gap-1\" data-peek-no-drag=\"\">\n {trailing}\n {window ? (\n <Button type=\"button\" variant=\"quiet\" aria-label=\"Close\" title=\"Close\" icon={<XIcon className=\"size-3.5\" />} onClick={window.onClose} />\n ) : null}\n </div>\n ) : null}\n </div>\n <PeekRule />\n </>\n );\n}\n\nexport interface PeekCardFavoriteProps {\n on: boolean;\n onToggle: () => void;\n}\n\n/** The favorite star the reference card carries: 14px, amber and filled when on, no box. */\nexport function PeekCardFavorite({ on, onToggle }: PeekCardFavoriteProps) {\n const { loading } = usePeekCard();\n const label = on ? \"Remove from favorites\" : \"Add to favorites\";\n return (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={label}\n title={label}\n pressed={on}\n icon={<StarIcon className={cn(\"size-3.5\", on && \"fill-current\")} />}\n disabled={loading}\n onClick={(event) => {\n event.stopPropagation();\n onToggle();\n }}\n className=\"shrink-0\"\n >\n </Button>\n );\n}\n\n// ── body ─────────────────────────────────────────────────────────────────────\n\nexport interface PeekCardBodyProps {\n children: React.ReactNode;\n /**\n * A second column of supporting facts. Landscape: beside the body, past a hairline.\n * Portrait: under it, in the same scroll.\n */\n aside?: React.ReactNode;\n}\n\nexport function PeekCardBody({ children, aside }: PeekCardBodyProps) {\n const { density, orientation, sheet } = usePeekCard();\n const pad = PAD[density];\n if (sheet) {\n // The drawer scrolls as one; the body is just its share of the content.\n return (\n <div data-matrx-peek-body=\"\" className={cn(\"flex flex-col\", pad.x, pad.body)}>\n {children}\n {aside}\n </div>\n );\n }\n const column = (content: React.ReactNode, extra?: string) => (\n <div className={cn(\"flex min-h-0 min-w-0 flex-col matrx-peek-scroll overflow-y-auto\", pad.x, pad.body, extra)}>{content}</div>\n );\n if (orientation === \"landscape\" && aside) {\n return (\n <div data-matrx-peek-body=\"\" className=\"flex min-h-0 flex-1 flex-row\">\n {column(children, \"flex-[3]\")}\n <PeekRule vertical />\n {column(aside, \"flex-[2]\")}\n </div>\n );\n }\n return (\n <div data-matrx-peek-body=\"\" className={cn(\"flex min-h-0 flex-1 flex-col matrx-peek-scroll overflow-y-auto\", pad.x, pad.body)}>\n {children}\n {aside}\n </div>\n );\n}\n\nfunction PeekCardBodySkeleton() {\n const { density } = usePeekCard();\n const pad = PAD[density];\n return (\n <div data-matrx-peek-body=\"\" className={cn(\"flex min-h-0 flex-1 flex-col\", pad.x, pad.body)}>\n <Skeleton shape=\"line\" width=\"1/3\" motion=\"shimmer\" />\n <Skeleton shape=\"line\" width=\"full\" motion=\"shimmer\" />\n <Skeleton shape=\"line\" width=\"3/4\" motion=\"shimmer\" />\n <Skeleton shape=\"line\" width=\"1/2\" motion=\"shimmer\" />\n </div>\n );\n}\n\nexport interface PeekCardRowProps {\n /** A 14px glyph hung in the row's own margin. */\n icon?: React.ComponentType<{ className?: string }>;\n children: React.ReactNode;\n /** A quieter second line (an email, a date). */\n meta?: React.ReactNode;\n /** `muted`: the whole row is meta (dates, counts). Default `content`. */\n tone?: \"content\" | \"muted\";\n /**\n * A row is one line ending in \"…\" (the full text is its tooltip), so an email or a path never\n * breaks mid-word. `wrap` lets a row run to several lines instead.\n */\n wrap?: boolean;\n}\n\n/** One fact on one line: glyph + text. */\nexport function PeekCardRow({ icon: Icon, children, meta, tone = \"content\", wrap = false }: PeekCardRowProps) {\n const fit = wrap ? \"break-words\" : \"truncate\";\n return (\n <div className={cn(\"flex min-w-0 gap-2\", meta || wrap ? \"items-start\" : \"items-center\")}>\n {Icon ? <Icon className={cn(\"size-3.5 shrink-0 text-muted-foreground\", (meta || wrap) && \"mt-0.5\")} /> : null}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span\n className={cn(fit, tone === \"muted\" ? \"type-meta text-muted-foreground\" : \"type-secondary text-foreground\")}\n title={!wrap && typeof children === \"string\" ? children : undefined}\n >\n {children}\n </span>\n {meta ? (\n <span className={cn(fit, \"type-meta text-muted-foreground\")} title={!wrap && typeof meta === \"string\" ? meta : undefined}>\n {meta}\n </span>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport interface PeekCardSectionProps {\n /** The small capital label over the section; `\"\"` draws no label row. */\n label: string;\n icon?: React.ComponentType<{ className?: string }>;\n /** A status color for the whole section (an error's severity): the label and a left edge take it. */\n tone?: PeekTone;\n children: React.ReactNode;\n}\n\n/** Status ink per tone (text). */\nconst TONE_INK: Record<PeekTone, string> = {\n neutral: \"text-muted-foreground\",\n info: \"text-info-ink\",\n success: \"text-success-ink\",\n warning: \"text-warning-ink\",\n danger: \"text-destructive-ink\",\n};\n/** Status fill per tone (a dot, an edge). */\nconst TONE_FILL: Record<PeekTone, string> = {\n neutral: \"bg-muted-foreground\",\n info: \"bg-info\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n danger: \"bg-destructive\",\n};\nconst TONE_EDGE: Record<PeekTone, string> = {\n neutral: \"border-border\",\n info: \"border-info\",\n success: \"border-success\",\n warning: \"border-warning\",\n danger: \"border-destructive\",\n};\n\n/**\n * A labeled block over its content. A text label alone is small capitals (\"DESCRIPTION\"); a label\n * with a glyph reads as written (\"Tags\") — the reference card's two label styles.\n */\nexport function PeekCardSection({ label, icon: Icon, tone, children }: PeekCardSectionProps) {\n return (\n <section data-tone={tone} className={cn(\"flex min-w-0 flex-col gap-1.5\", tone && \"border-l-2 pl-2\", tone && TONE_EDGE[tone])}>\n {/* An empty label is a section that needs no name (an input preview under a badge that names it). */}\n {label || Icon ? (\n <div className=\"flex items-center gap-1.5\">\n {Icon ? <Icon className={cn(\"size-3.5 shrink-0\", tone ? TONE_INK[tone] : \"text-muted-foreground\")} /> : null}\n {label ? <span className={cn(\"type-label\", !Icon && \"uppercase tracking-wider\", tone && TONE_INK[tone])}>{label}</span> : null}\n </div>\n ) : null}\n {children}\n </section>\n );\n}\n\n// ── rows, code, media ────────────────────────────────────────────────────────\n\n/** A row's own door: the footer door's glyph and label, smaller. */\nconst PEEK_ROW_DOOR =\n \"flex size-6 shrink-0 items-center justify-center rounded text-foreground transition-colors hover:bg-accent hover:text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary\";\nconst PEEK_MAX_ROW_DOORS = 2;\n\nfunction rowDoors(doors: readonly PeekDoor[] | undefined): PeekCardAction[] {\n if (!doors?.length) return [];\n const out: PeekCardAction[] = [];\n for (const door of doors) {\n const known = peekDoorFace(door);\n if (!known || known.inMenu) {\n screamOnce(`[Peek] row door \"${String(door.kind)}\" cannot sit on a row — rows take ${Object.keys(PEEK_DOORS).filter((k) => !PEEK_DOORS[k as PeekDoorKind].inMenu).join(\", \")}`);\n continue;\n }\n if (out.length === PEEK_MAX_ROW_DOORS) {\n screamOnce(`[Peek] more than ${PEEK_MAX_ROW_DOORS} doors on one row — the rest are not drawn`);\n break;\n }\n out.push({ icon: known.icon, label: door.busy ? `${known.label}…` : known.label, onClick: door.onClick, href: door.href, newTab: door.newTab, busy: door.busy });\n }\n return out;\n}\n\nfunction RowDoor({ action }: { action: PeekCardAction }) {\n const { loading } = usePeekCard();\n const { Link } = useMatrxDataTableHost();\n const glyph = <action.icon className=\"size-3.5\" />;\n const stop = (event: React.MouseEvent) => {\n event.stopPropagation();\n action.onClick?.(event);\n };\n if (action.href && !loading) {\n if (!action.newTab && Link) {\n return (\n <span title={action.label} className=\"flex shrink-0\">\n <Link href={action.href} className={PEEK_ROW_DOOR} onClick={stop}>\n {glyph}\n <span className=\"sr-only\">{action.label}</span>\n </Link>\n </span>\n );\n }\n const props = { href: action.href, \"aria-label\": action.label, title: action.label, className: PEEK_ROW_DOOR, onClick: stop };\n return action.newTab ? <OutboundLink {...props}>{glyph}</OutboundLink> : <a {...props}>{glyph}</a>;\n }\n return (\n <Button type=\"button\" variant=\"quiet\" aria-label={action.label} title={action.label} icon={glyph} disabled={loading || action.busy} onClick={stop} />\n );\n}\n\n/** A row's link: a web address is THE outbound door (new tab, referral); an app path stays in the app. */\nfunction RowLink({ href, children }: { href: string; children: React.ReactNode }) {\n const { Link } = useMatrxDataTableHost();\n const className = \"text-primary underline-offset-2 hover:underline\";\n const stop = (event: React.MouseEvent) => event.stopPropagation();\n if (/^https?:\\/\\//i.test(href)) {\n return (\n <OutboundLink href={href} className={className} onClick={stop}>\n {children}\n </OutboundLink>\n );\n }\n if (Link) {\n return (\n <Link href={href} className={className} onClick={stop}>\n {children}\n </Link>\n );\n }\n return (\n <a href={href} className={className} onClick={stop}>\n {children}\n </a>\n );\n}\n\nexport interface PeekCardRowsItem {\n key: string;\n text: React.ReactNode;\n /** The row's plain text, for its tooltip. */\n title: string;\n detail?: string | undefined;\n glyph?: PeekGlyph | undefined;\n tone?: PeekTone | undefined;\n href?: string | undefined;\n status?: { text: string; tone?: PeekTone | undefined; hint?: string | undefined } | undefined;\n doors?: readonly PeekDoor[] | undefined;\n}\n\n/** A section's child rows: [n.][dot][glyph] text / detail ……… [status][doors]. */\nexport function PeekCardRows({ rows, numbered = false, limit }: { rows: readonly PeekCardRowsItem[]; numbered?: boolean; limit?: number | undefined }) {\n const shown = limit && rows.length > limit ? rows.slice(0, limit) : rows;\n const rest = rows.length - shown.length;\n const List = numbered ? \"ol\" : \"ul\";\n return (\n <List data-matrx-peek-rows=\"\" className=\"flex flex-col gap-1\">\n {shown.map((row, i) => {\n const doors = rowDoors(row.doors);\n const lead = row.detail ? \"mt-[5px]\" : \"\";\n return (\n <li key={row.key} className=\"flex min-w-0 items-start gap-2\">\n {numbered ? <span className=\"type-meta w-4 shrink-0 pt-px text-right tabular-nums text-muted-foreground\">{i + 1}</span> : null}\n {row.tone ? <span aria-hidden className={cn(\"mt-[7px] size-1.5 shrink-0 rounded-full\", TONE_FILL[row.tone])} /> : null}\n {row.glyph ? <row.glyph className={cn(\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\", lead)} /> : null}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"type-secondary min-w-0 truncate text-foreground\" title={row.title}>\n {row.href ? <RowLink href={row.href}>{row.text}</RowLink> : row.text}\n </span>\n {row.detail ? <span className=\"type-meta break-words text-muted-foreground\">{row.detail}</span> : null}\n </div>\n {row.status ? (\n <span\n title={row.status.hint}\n className={cn(\"type-meta shrink-0 pt-px font-medium\", TONE_INK[row.status.tone ?? \"neutral\"])}\n >\n {row.status.text}\n </span>\n ) : null}\n {doors.length ? (\n <span className=\"flex shrink-0 items-center gap-0.5\" data-peek-no-drag=\"\">\n {doors.map((action) => (\n <RowDoor key={action.label} action={action} />\n ))}\n </span>\n ) : null}\n </li>\n );\n })}\n {rest > 0 ? <li className=\"type-meta text-muted-foreground\">{`+${rest} more`}</li> : null}\n </List>\n );\n}\n\n/** Code or raw text, monospaced and exactly as written: it scrolls sideways, never wraps. */\nexport function PeekCardCode({ text, language, caption }: { text: string; language?: string | undefined; caption?: string | undefined }) {\n return (\n <figure data-matrx-peek-code=\"\" className=\"flex min-w-0 flex-col overflow-hidden rounded-md border border-border bg-muted\">\n {language || caption ? (\n <figcaption className=\"type-meta flex min-w-0 items-center gap-2 border-b border-border px-2 py-1 text-muted-foreground\">\n {caption ? <span className=\"min-w-0 flex-1 truncate font-mono\" title={caption}>{caption}</span> : <span className=\"flex-1\" />}\n {language ? <span className=\"shrink-0\">{language}</span> : null}\n </figcaption>\n ) : null}\n <pre className=\"matrx-peek-scroll max-h-72 overflow-auto px-2 py-1.5 font-mono text-xs leading-relaxed text-foreground\">\n <code>{text}</code>\n </pre>\n </figure>\n );\n}\n\nconst MEDIA_ASPECT = { \"4:3\": \"aspect-[4/3]\", \"16:9\": \"aspect-video\", \"1:1\": \"aspect-square\" } as const;\n\n/** The picture at the top of the body. `drawn`: the host's own rendering of a stored file. */\nexport function PeekCardMedia({ alt, aspect = \"4:3\", src, drawn }: { alt: string; aspect?: \"4:3\" | \"16:9\" | \"1:1\" | undefined; src?: string | undefined; drawn?: React.ReactNode }) {\n return (\n <div data-matrx-peek-media=\"\" className={cn(\"relative w-full shrink-0 overflow-hidden rounded-md bg-muted\", MEDIA_ASPECT[aspect])}>\n {src ? (\n // Pictures from other sites (a link's preview image) load without telling the site who asked:\n // many hosts refuse a hotlinked image that carries our page as its referrer.\n <img src={src} alt={alt} loading=\"lazy\" referrerPolicy=\"no-referrer\" className=\"absolute inset-0 size-full object-cover\" />\n ) : drawn ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">{drawn}</div>\n ) : (\n // No picture to draw: its name, never a blank box.\n <span className=\"type-meta absolute inset-0 flex items-center justify-center px-3 text-center text-muted-foreground\">{alt}</span>\n )}\n </div>\n );\n}\n\n/** A person's picture on the title line, or their initials. */\nexport function PeekCardAvatar({ initials, src }: { initials: string; src?: string | undefined }) {\n return src ? (\n <img src={src} alt=\"\" referrerPolicy=\"no-referrer\" className=\"size-4 rounded-full object-cover\" />\n ) : (\n <span className=\"type-meta flex size-4 items-center justify-center rounded-full bg-muted font-semibold uppercase leading-none text-muted-foreground\">\n {initials.slice(0, 1)}\n </span>\n );\n}\n\n/** Running text inside a section (a description). */\nexport function PeekCardText({\n children,\n clamp,\n breaks = false,\n}: {\n children: React.ReactNode;\n /** Lines before it ends in \"…\". */\n clamp?: 2 | 3 | 4 | 6;\n /** Keep the text's own line breaks and indents. */\n breaks?: boolean;\n}) {\n return (\n <p\n className={cn(\n \"type-secondary break-words leading-relaxed text-foreground\",\n breaks && \"whitespace-pre-wrap\",\n clamp === 2 && \"line-clamp-2\",\n clamp === 3 && \"line-clamp-3\",\n clamp === 4 && \"line-clamp-4\",\n clamp === 6 && \"line-clamp-6\",\n )}\n >\n {children}\n </p>\n );\n}\n\nexport interface PeekCardTagsProps {\n tags: readonly string[];\n}\n\nexport function PeekCardTags({ tags }: PeekCardTagsProps) {\n if (tags.length === 0) return null;\n return (\n <div className=\"flex flex-wrap gap-1\">\n {tags.map((tag) => (\n <span\n key={tag}\n title={tag}\n className=\"type-meta inline-flex h-5 max-w-full items-center truncate rounded bg-muted px-1.5 font-medium text-muted-foreground\"\n >\n {tag}\n </span>\n ))}\n </div>\n );\n}\n\nexport interface PeekCardCalloutProps {\n icon?: React.ComponentType<{ className?: string }>;\n title: React.ReactNode;\n children?: React.ReactNode;\n}\n\n/**\n * The one tinted block a peek may carry: a fact that changes what the record IS (the agent card's\n * \"runs an ensemble\"). At most one per card — a second one is a section.\n */\nexport function PeekCardCallout({ icon: Icon, title, children }: PeekCardCalloutProps) {\n return (\n <div className=\"flex flex-col gap-1 rounded-md border border-primary/20 bg-primary/5 px-2.5 py-2\">\n <div className=\"flex items-center gap-1.5\">\n {Icon ? <Icon className=\"size-3.5 shrink-0 text-primary\" /> : null}\n <span className=\"type-meta font-medium text-primary\">{title}</span>\n </div>\n {children ? <div className=\"type-secondary text-foreground\">{children}</div> : null}\n </div>\n );\n}\n\n// ── footer ───────────────────────────────────────────────────────────────────\n\n/** A door as the footer draws it (internal: callers name a door by kind, never by glyph or label). */\ninterface PeekCardAction {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n /** Lives in the More menu whatever the room (a door that must never sit beside Copy). */\n inMenu?: boolean | undefined;\n /** Its work is running: drawn disabled, its label says so. */\n busy?: boolean | undefined;\n onClick?: ((event: React.MouseEvent | Event) => void) | undefined;\n href?: string | undefined;\n newTab?: boolean | undefined;\n /** The door opens this menu instead of running (an action door's choices). */\n menu?: readonly PeekDoorMenuGroup[] | undefined;\n}\n\n/** The doors as drawn: known kinds only, each once, at most three — anything else screams in the console. */\nfunction recordDoors(doors: readonly PeekDoor[]): PeekCardAction[] {\n const seen = new Set<string>();\n const out: PeekCardAction[] = [];\n for (const door of doors) {\n const known = peekDoorFace(door);\n if (!known) {\n screamOnce(door.kind === \"action\"\n ? `[PeekCard] action door \"${door.id}\" has no label — an action door names its verb`\n : `[PeekCard] unknown door kind \"${String(door.kind)}\" — add it to PEEK_DOORS in @ai-matrx/design-system`);\n continue;\n }\n const key = peekDoorKey(door);\n if (seen.has(key)) {\n screamOnce(`[PeekCard] door \"${key}\" given twice — each door appears once`);\n continue;\n }\n if (out.length === PEEK_MAX_RECORD_DOORS) {\n screamOnce(`[PeekCard] more than ${PEEK_MAX_RECORD_DOORS} record doors — \"${key}\" and the rest are not drawn`);\n break;\n }\n seen.add(key);\n out.push({\n icon: known.icon,\n label: door.busy ? `${known.label}…` : known.label,\n onClick: door.onClick,\n href: door.href,\n newTab: door.newTab,\n inMenu: known.inMenu,\n busy: door.busy,\n menu: door.kind === \"action\" && door.menu?.length ? door.menu : undefined,\n });\n }\n return out;\n}\n\nexport interface PeekCardFooterProps {\n /** The one main action (e.g. \"Select\"). Portrait: fills the row after settings. Landscape: closes the row, far right. */\n primary?: PeekCardPrimary;\n /**\n * Where the primary stands: `fill` (portrait's default) spreads it across the row from the left;\n * `end` (landscape's default) closes the row at its natural width, the doors grouped before it —\n * the notice footer (\"⏲ 🔕 [Read my site]\").\n */\n primaryAt?: \"fill\" | \"end\";\n /** The record's settings, when it has any: the first door, before the primary. */\n onSettings?: () => void;\n /**\n * Up to three of the record's own doors, by kind (`PEEK_DOORS`), most important first. The footer\n * measures itself and shows as many as fit; the rest go behind \"More\", placed where the room ran\n * out — never cut, never dropped, nothing for a caller to count or style.\n */\n doors?: PeekDoors;\n /**\n * Copy this record: Alchemy's own menu (Raw · Markdown · Formatted · For AI), through the same host\n * port every table row uses. Always second from the right, named \"Copy\".\n */\n copy?: PeekCopy;\n /** The record's own page: always the right-most door, opening in a new tab. */\n openHref?: string;\n}\n\n/** The footer's one main action. `busy` draws the spinner and waits; `disabled` waits without one. */\nexport interface PeekCardPrimary {\n label: string;\n onClick: () => void;\n busy?: boolean;\n disabled?: boolean;\n /** What pressing it will do, when the label alone cannot say. */\n title?: string;\n}\n\n/** On a phone the doors are 44px touch targets; this many fit beside the primary. */\nconst PEEK_SHEET_FOOTER_SLOTS = 4;\n\n/** A door: the glyph alone in full ink, no box; a tint only under the pointer. */\nconst PEEK_DOOR =\n \"flex shrink-0 items-center justify-center rounded-md text-foreground transition-colors hover:bg-accent hover:text-primary disabled:text-disabled-foreground disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary\";\n/** A door with choices: its glyph opens a menu, and the menu holds a hover peek open while in use. */\nfunction MenuDoor({ action, menu, disabled }: { action: PeekCardAction; menu: readonly PeekDoorMenuGroup[]; disabled: boolean }) {\n const { sheet } = usePeekCard();\n const [open, setOpen] = React.useState(false);\n usePeekHoldWhile(open);\n const glyph = sheet ? <action.icon className=\"size-5\" /> : <action.icon className=\"size-3.5\" />;\n return (\n <DropdownMenu modal={false} open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={action.label}\n title={action.label}\n icon={action.busy ? <Loader2Icon className=\"matrx-spin\" /> : glyph}\n className=\"shrink-0\"\n disabled={disabled || action.busy}\n onClick={(event) => event.stopPropagation()}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" data-peek-no-drag=\"\">\n {menu.map((group, i) => (\n <React.Fragment key={`${group.label ?? \"\"}-${i}`}>\n {i > 0 ? <DropdownMenuSeparator /> : null}\n {group.label ? <DropdownMenuLabel>{group.label}</DropdownMenuLabel> : null}\n {group.items.map((item) => (\n <DropdownMenuItem key={item.key} {...(item.tone ? { tone: item.tone } : {})} onSelect={() => item.onSelect()}>\n {item.label}\n </DropdownMenuItem>\n ))}\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction FooterDoor({ action, disabled = false }: { action: PeekCardAction; disabled?: boolean }) {\n const { sheet } = usePeekCard();\n const { Link } = useMatrxDataTableHost();\n if (action.menu) return <MenuDoor action={action} menu={action.menu} disabled={disabled} />;\n const box = sheet ? \"size-11\" : \"size-7\";\n const glyph = <action.icon className={sheet ? \"size-5\" : \"size-3.5\"} />;\n if (action.href && !disabled && !action.newTab && Link) {\n // A same-tab door moves within the app (the host's Link), never a full page load.\n return (\n <span title={action.label} className=\"flex shrink-0\">\n <Link\n href={action.href}\n className={cn(PEEK_DOOR, box)}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick?.(event);\n }}\n >\n {glyph}\n <span className=\"sr-only\">{action.label}</span>\n </Link>\n </span>\n );\n }\n if (action.href && !disabled) {\n const props = {\n href: action.href,\n \"aria-label\": action.label,\n title: action.label,\n className: cn(PEEK_DOOR, box),\n onClick: (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.stopPropagation();\n action.onClick?.(event);\n },\n };\n // A new tab is THE outbound door (our referral rides links to other sites); same tab is a plain link.\n return action.newTab ? <OutboundLink {...props}>{glyph}</OutboundLink> : <a {...props}>{glyph}</a>;\n }\n return (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={action.label}\n title={action.label}\n icon={glyph}\n className=\"shrink-0\"\n disabled={disabled || action.busy}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick?.(event);\n }}\n />\n );\n}\n\nfunction openDoor(action: PeekCardAction, event: Event) {\n action.onClick?.(event);\n if (!action.href) return;\n if (action.newTab) openOutbound(action.href);\n else window.location.assign(action.href);\n}\n\n/** What the Copy door hands Alchemy: the record's data and what it is in a person's words. */\nexport interface PeekCopy {\n /** The content itself (any JSON value, or a getter read on the click). Alchemy derives every format from it. */\n data: unknown;\n /** What it is (\"Agent\", \"Task\") — the For AI tag says it. */\n dataType: string;\n /** The record's name, for Alchemy's menu. */\n label: string;\n /** The record's id: a different record resets Alchemy's preparation. */\n sourceId?: string;\n}\n\n/**\n * Alchemy's palette, mounted where the Copy door opened it (the row menu's own pattern). It lives\n * inside the open popover, so Alchemy itself mounts only when Copy opens — a page of peeks pays for\n * none until someone copies — and it asks to be activated on mount.\n */\nfunction PeekCopyPalette({ onClose, restoreFocus }: { onClose: () => void; restoreFocus: () => void }) {\n const alchemy = useMatrxTableRowAlchemy();\n const target = React.useRef<HTMLDivElement>(null);\n const closeRef = React.useRef(onClose);\n const focusRef = React.useRef(restoreFocus);\n React.useEffect(() => {\n closeRef.current = onClose;\n focusRef.current = restoreFocus;\n }, [onClose, restoreFocus]);\n React.useEffect(() => {\n alchemy?.activate();\n }, [alchemy]);\n const mountMenu = alchemy?.mountMenu;\n const ready = Boolean(alchemy?.ready);\n React.useEffect(() => {\n if (!ready) return;\n mountMenu?.(target.current, () => closeRef.current(), () => focusRef.current());\n return () => mountMenu?.(null);\n }, [mountMenu, ready]);\n return <div ref={target} data-matrx-peek-copy-palette=\"\" aria-label=\"Copy options\" />;\n}\n\nfunction keepPaletteInside(event: { target: EventTarget | null; preventDefault(): void }) {\n if (event.target instanceof Element && event.target.closest(\"[data-matrx-peek-copy-palette]\")) event.preventDefault();\n}\n\n/**\n * The Copy door: Alchemy, bound by the host (`MatrxDataTableHost.CopyControls`) exactly as for a table\n * row. ONE stable button (the first press always opens, focus is never lost); Alchemy mounts inside\n * the open popover only. A host that binds no copy control gets a door that says so, never a live\n * button that opens nothing.\n */\nfunction PeekCopyDoor({ copy, disabled }: { copy: PeekCopy; disabled: boolean }) {\n const { sheet } = usePeekCard();\n const { CopyControls } = useMatrxDataTableHost();\n const button = React.useRef<HTMLButtonElement>(null);\n const [open, setOpen] = React.useState(false);\n usePeekHoldWhile(open);\n const glyph = <AlchemyGlyph className={sheet ? \"size-5\" : \"size-3.5\"} />;\n if (!CopyControls) {\n screamOnce(\"[PeekCard] no copy control is bound: set MatrxDataTableHost.CopyControls (the app binds Alchemy) — the Copy door is disabled\");\n return (\n <Button type=\"button\" variant=\"quiet\" aria-label=\"Copy\" title=\"Copy is not connected here\" icon={glyph} className=\"shrink-0\" disabled data-matrx-peek-copy-door=\"\" />\n );\n }\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen} modal={false}>\n <PopoverPrimitive.Trigger asChild>\n <Button\n ref={button}\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Copy\"\n title=\"Copy\"\n icon={glyph}\n className=\"shrink-0\"\n disabled={disabled}\n data-matrx-peek-copy-door=\"\"\n onClick={(event) => event.stopPropagation()}\n />\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side=\"top\"\n align=\"end\"\n sideOffset={6}\n collisionPadding={8}\n className={cn(\"z-[10002] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md outline-none\", MOTION_POPPER)}\n // Alchemy draws its palette from its own component (outside this popover's React tree), so\n // focus or a press inside the palette is \"outside\" to Radix — it is ours (ItemMenu does the same).\n onFocusOutside={keepPaletteInside}\n onPointerDownOutside={keepPaletteInside}\n onInteractOutside={keepPaletteInside}\n >\n <MatrxTableRowAlchemyProvider\n copy={{ data: copy.data, dataType: copy.dataType, label: copy.label, ...(copy.sourceId ? { sourceId: copy.sourceId } : {}) }}\n placement=\"menu\"\n controls={PEEK_NO_ROW_CONTROLS}\n >\n <PeekCopyPalette onClose={() => setOpen(false)} restoreFocus={() => button.current?.focus()} />\n </MatrxTableRowAlchemyProvider>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n\nconst screamed = new Set<string>();\n/** A misuse is said once per page, not once per render. */\nfunction screamOnce(message: string) {\n if (screamed.has(message)) return;\n screamed.add(message);\n console.error(message);\n}\n\n/** A peek is not a table row: it has no row detail, window or inline edits for Alchemy to offer. */\nconst PEEK_NO_ROW_CONTROLS: MatrxDataTableRecordControls = {\n closeDetail: () => {},\n openDetail: () => {},\n openWindow: () => {},\n closeWindow: () => {},\n hasPendingEdits: false,\n discardPendingEdits: () => {},\n};\n\n/** The primary keeps at least this much of the row (its label never truncates to make room for doors). */\nconst PEEK_PRIMARY_MIN_PX = { card: 72, sheet: 128 } as const;\nconst PEEK_DOOR_GAP_PX = 4;\n\n/**\n * How many of `actions` fit in the row as it is actually drawn. The footer measures itself: the\n * fixed doors and the primary are placed first, the record's doors fill what is left, and the\n * first one that would not fit turns the last free place into \"More\". `null` until measured.\n */\nfunction useDoorsThatFit(\n row: React.RefObject<HTMLDivElement | null>,\n primaryRef: React.RefObject<HTMLButtonElement | null>,\n opts: { doorPx: number; fixedDoors: number; fills: boolean; hasPrimary: boolean; sheet: boolean; actionCount: number },\n): number | null {\n const [fit, setFit] = React.useState<number | null>(null);\n const { doorPx, fixedDoors, fills, hasPrimary, sheet, actionCount } = opts;\n React.useLayoutEffect(() => {\n const el = row.current;\n if (!el) return;\n const measure = () => {\n const style = window.getComputedStyle(el);\n const width = el.clientWidth - parseFloat(style.paddingLeft || \"0\") - parseFloat(style.paddingRight || \"0\");\n if (!(width > 0)) {\n setFit(null);\n return;\n }\n const slot = doorPx + PEEK_DOOR_GAP_PX;\n const primaryPx = !hasPrimary\n ? 0\n : (fills ? PEEK_PRIMARY_MIN_PX[sheet ? \"sheet\" : \"card\"] : (primaryRef.current?.scrollWidth ?? 0)) + 2 * PEEK_DOOR_GAP_PX;\n const room = width - primaryPx - fixedDoors * slot;\n setFit(Math.max(0, Math.floor((room + PEEK_DOOR_GAP_PX) / slot)));\n };\n measure();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n observer?.observe(el);\n return () => observer?.disconnect();\n }, [row, primaryRef, doorPx, fixedDoors, fills, hasPrimary, sheet, actionCount]);\n return fit;\n}\n\nexport function PeekCardFooter({ primary, primaryAt, onSettings, doors = [], copy, openHref }: PeekCardFooterProps) {\n const { density, size, orientation, loading, sheet } = usePeekCard();\n const row = React.useRef<HTMLDivElement | null>(null);\n const primaryRef = React.useRef<HTMLButtonElement | null>(null);\n const settings: PeekCardAction | null = onSettings ? { icon: SettingsIcon, label: \"Settings\", onClick: onSettings } : null;\n const [moreOpen, setMoreOpen] = React.useState(false);\n const actions = recordDoors(doors);\n const open: PeekCardAction | null = openHref ? { icon: ExternalLinkIcon, label: \"Open in new tab\", href: openHref, newTab: true } : null;\n // Menu doors are always drawn, so they hold their places like the fixed doors.\n const fixedDoors = [settings, copy, open].filter(Boolean).length + actions.filter((action) => action.menu).length;\n // Portrait (and a phone): the primary fills the row from the left. Landscape: it closes the row.\n const fills = Boolean(sheet) || (primaryAt ?? (orientation === \"portrait\" ? \"fill\" : \"end\")) === \"fill\";\n const measured = useDoorsThatFit(row, primaryRef, {\n doorPx: sheet ? 44 : 28,\n fixedDoors,\n fills,\n hasPrimary: Boolean(primary),\n sheet: Boolean(sheet),\n actionCount: actions.length,\n });\n // Before the first measurement (and where nothing has layout) the size's slot count stands in.\n const room = measured ?? (sheet ? PEEK_SHEET_FOOTER_SLOTS : PEEK_CARD_FOOTER_SLOTS[size]) - fixedDoors;\n // A door with its own menu is always drawn (a menu inside More is not a menu anyone finds).\n const inline = actions.filter((action) => !action.inMenu && !action.menu);\n const menuOnly = actions.filter((action) => action.inMenu);\n const menuDoors = actions.filter((action) => action.menu);\n // More takes a slot when anything must live there; the rest of the room goes to inline doors.\n const inlineRoom = menuOnly.length ? Math.max(0, room - 1) : room;\n const shown = inline.length <= inlineRoom ? inline : inline.slice(0, Math.max(0, inlineRoom - (menuOnly.length ? 0 : 1)));\n const overflow = [...inline.slice(shown.length), ...menuOnly];\n // A More that stops being drawn (the row re-measured with room for every door) releases its hold.\n usePeekHoldWhile(moreOpen && overflow.length > 0);\n const primaryButton = primary ? (\n <Button\n ref={primaryRef}\n type=\"button\"\n variant=\"primary\"\n className={cn(\"mx-1\", fills && \"flex-1\")}\n style={fills ? { minWidth: PEEK_PRIMARY_MIN_PX[sheet ? \"sheet\" : \"card\"] } : undefined}\n disabled={loading || primary.disabled || primary.busy}\n title={primary.title}\n icon={primary.busy ? <Loader2Icon className=\"matrx-spin\" /> : undefined}\n onClick={primary.onClick}\n >{primary.label}</Button>\n ) : null;\n const more = overflow.length ? (\n <DropdownMenu modal={false} open={moreOpen} onOpenChange={setMoreOpen}>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"quiet\" aria-label=\"More\" title=\"More\" icon={<MoreHorizontalIcon className={sheet ? \"size-5\" : \"size-3.5\"} />} className=\"shrink-0\" disabled={loading} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {overflow.map((action, i) => (\n <DropdownMenuItem key={`${action.label}-${i}`} disabled={Boolean(action.busy)} onSelect={(event) => openDoor(action, event)}>\n <action.icon className=\"size-4\" />\n {action.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null;\n return (\n <>\n {sheet ? <div aria-hidden className=\"h-px shrink-0 bg-border\" /> : <PeekRule />}\n <div\n ref={row}\n data-matrx-peek-footer=\"\"\n className={cn(\n \"flex shrink-0 items-center gap-1 overflow-hidden\",\n sheet ? \"px-4 pt-3\" : density === \"compact\" ? \"px-2 py-1.5\" : \"px-3 py-2\",\n )}\n style={sheet ? { paddingBottom: \"max(12px, env(safe-area-inset-bottom))\" } : undefined}\n >\n {settings ? <FooterDoor action={settings} disabled={loading} /> : null}\n {/* The fixed doors hold the right edge whatever else is in the row. */}\n {fills && primaryButton ? primaryButton : <span className=\"flex-1\" />}\n {/* \"More\" stands exactly where the row ran out of room: right after the primary in\n portrait, at the head of the doors in landscape. */}\n {more}\n {menuDoors.map((action, i) => (\n <FooterDoor key={`menu-${action.label}-${i}`} action={action} disabled={loading} />\n ))}\n {shown.map((action, i) => (\n <FooterDoor key={`${action.label}-${i}`} action={action} disabled={loading} />\n ))}\n {copy ? <PeekCopyDoor copy={copy} disabled={loading} /> : null}\n {open ? <FooterDoor action={open} disabled={loading} /> : null}\n {fills ? null : primaryButton}\n </div>\n </>\n );\n}\n\n// ── hosts ────────────────────────────────────────────────────────────────────\n\n/** `auto`: a floating card on a desktop, a bottom drawer on a phone. */\nexport type PeekPresentation = \"auto\" | \"float\" | \"sheet\";\n/**\n * On a phone the title row scrolls away with the body; the footer either stays `pinned` to the\n * bottom of the drawer (the default — the actions are why a peek is opened) or scrolls in `inline`\n * at the end of the content.\n */\nexport type PeekSheetFooter = \"pinned\" | \"inline\";\n\nexport interface PeekHostProps {\n /** The element that opens the peek (rendered as-is). */\n trigger: React.ReactElement;\n /** The `<PeekCard>` (directly, or inside a component that renders one). */\n children: React.ReactNode;\n /** The record's name, for the drawer's accessible title on a phone. */\n label?: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n presentation?: PeekPresentation;\n sheetFooter?: PeekSheetFooter;\n}\n\n/** Below this share of the screen, the drawer fits its content instead of standing at 70%. */\nconst PEEK_SHEET_SHORT_SHARE = 0.4;\n\n/**\n * The peek as a phone's bottom drawer: at least 70% of the screen unless the record has next to\n * nothing to show, the whole card scrolling as one (title row included), the footer pinned or inline.\n */\nfunction PeekSheet({ open, onOpenChange, label, sheetFooter, children }: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n label: string;\n sheetFooter: PeekSheetFooter;\n children: React.ReactNode;\n}) {\n const body = React.useRef<HTMLDivElement | null>(null);\n const [short, setShort] = React.useState(false);\n React.useLayoutEffect(() => {\n const el = body.current;\n if (!open || !el) return;\n const measure = () => {\n const scroller = el.querySelector<HTMLElement>(\"[data-matrx-peek-scroller]\");\n const footer = el.querySelector<HTMLElement>(\"[data-matrx-peek-footer]\");\n const natural = (scroller?.scrollHeight ?? el.scrollHeight) + (sheetFooter === \"pinned\" ? footer?.offsetHeight ?? 0 : 0);\n setShort(natural < window.innerHeight * PEEK_SHEET_SHORT_SHARE);\n };\n measure();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n const scroller = el.querySelector<HTMLElement>(\"[data-matrx-peek-scroller]\");\n if (observer && scroller?.firstElementChild) observer.observe(scroller.firstElementChild);\n return () => observer?.disconnect();\n }, [open, sheetFooter]);\n return (\n <BottomSheet open={open} onOpenChange={onOpenChange} title={label} surface=\"solid\" {...(short ? {} : { contentClassName: \"min-h-[70dvh]\" })}>\n <PeekSheetContext.Provider value={{ footer: sheetFooter }}>\n <div ref={body} className=\"flex min-h-0 flex-1 flex-col\">\n {children}\n </div>\n </PeekSheetContext.Provider>\n </BottomSheet>\n );\n}\n\nfunction usePeekPresentation(presentation: PeekPresentation): \"float\" | \"sheet\" {\n const isMobile = useIsMobile();\n return presentation === \"auto\" ? (isMobile ? \"sheet\" : \"float\") : presentation;\n}\n\n/** On a phone, the trigger opens the drawer with a tap (a hover never happens on touch). */\nfunction SheetHost({ trigger, children, label = \"Details\", open, onOpenChange, sheetFooter = \"pinned\" }: PeekHostProps) {\n const [own, setOwn] = React.useState(false);\n const isOpen = open ?? own;\n const setOpen = (next: boolean) => {\n setOwn(next);\n onOpenChange?.(next);\n };\n return (\n <>\n <Slot onClick={() => setOpen(true)}>{trigger}</Slot>\n <PeekSheet open={isOpen} onOpenChange={setOpen} label={label} sheetFooter={sheetFooter}>\n {children}\n </PeekSheet>\n </>\n );\n}\n\n/**\n * The peek on hover. Same timing as every hover card (`HoverCard`): a deliberate hover opens it and\n * it waits for the pointer to travel onto it. On a phone it is a tap that opens the bottom drawer.\n */\nexport function PeekHoverCard(props: PeekHostProps) {\n const { trigger, children, side = \"right\", align = \"start\", open, onOpenChange, container, presentation = \"auto\" } = props;\n const resolved = usePortalContainer(container);\n const [hovered, setHovered] = React.useState(false);\n const [held, hold] = usePeekHold();\n if (usePeekPresentation(presentation) === \"sheet\") return <SheetHost {...props} />;\n return (\n <HoverCardPrimitive.Root\n openDelay={Math.max(HOVER_CARD_OPEN_DELAY_MS, HOVER_CARD_OPEN_DELAY_FLOOR_MS)}\n closeDelay={HOVER_CARD_CLOSE_DELAY_MS}\n // A menu the card opened (Copy, More, a door's menu) holds it open while the pointer is in that\n // menu — a caller-controlled peek too, or its own menus close it under the pointer.\n open={(open ?? hovered) || held}\n onOpenChange={(next) => {\n setHovered(next);\n onOpenChange?.(next);\n }}\n >\n <HoverCardPrimitive.Trigger asChild>{trigger}</HoverCardPrimitive.Trigger>\n <HoverCardPrimitive.Portal container={resolved ?? null}>\n <HoverCardPrimitive.Content\n data-matrx-peek-host=\"\"\n side={side}\n align={align}\n sideOffset={8}\n collisionPadding={8}\n style={{ [PEEK_ROOM_VAR]: \"var(--radix-hover-card-content-available-height)\" } as React.CSSProperties}\n className={cn(\"z-[10001] select-text outline-none\", MOTION_POPPER)}\n >\n <PeekHoldContext.Provider value={hold}>{children}</PeekHoldContext.Provider>\n </HoverCardPrimitive.Content>\n </HoverCardPrimitive.Portal>\n </HoverCardPrimitive.Root>\n );\n}\n\n/** The peek on click: a non-modal popover that holds the same card; the bottom drawer on a phone. */\nexport function PeekPopover(props: PeekHostProps) {\n const { trigger, children, side = \"bottom\", align = \"start\", open, onOpenChange, container, presentation = \"auto\" } = props;\n const resolved = usePortalContainer(container);\n if (usePeekPresentation(presentation) === \"sheet\") return <SheetHost {...props} />;\n return (\n <PopoverPrimitive.Root modal={false} {...(open !== undefined ? { open } : {})} {...(onOpenChange ? { onOpenChange } : {})}>\n <PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={resolved ?? null}>\n <PopoverPrimitive.Content\n data-matrx-peek-host=\"\"\n side={side}\n align={align}\n sideOffset={8}\n collisionPadding={8}\n style={{ [PEEK_ROOM_VAR]: \"var(--radix-popover-content-available-height)\" } as React.CSSProperties}\n className={cn(\"z-[10001] outline-none\", MOTION_POPPER)}\n >\n {children}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n\n// ── the floating peek ────────────────────────────────────────────────────────\n\n/** Window panels paint near z-1000; a floating peek sits with them, above the page. */\nconst PEEK_WINDOW_Z = 1100;\nconst EDGE = 8;\n\nexport interface PeekWindowProps {\n open: boolean;\n onClose: () => void;\n /** Where its top-left corner first appears (viewport px). Default: centered. */\n initialPosition?: { x: number; y: number };\n /** The record's name, for the drawer's accessible title on a phone. */\n label?: string;\n /** `auto` (default): a phone gets the bottom drawer, everything else the floating window. */\n presentation?: PeekPresentation;\n sheetFooter?: PeekSheetFooter;\n /** Exactly one `<PeekCard>`; its header becomes the drag handle and gains a close button. */\n children: React.ReactElement<PeekCardProps>;\n}\n\n/**\n * A peek that stays: floating, draggable by its own title row, closed by its own ✕ or Escape. It is\n * the window panel with nothing but the card — no title bar, no window buttons, no tray. On a phone\n * it is the bottom drawer, like every peek.\n */\nexport function PeekWindow({ presentation = \"auto\", label = \"Details\", sheetFooter = \"pinned\", ...props }: PeekWindowProps) {\n if (usePeekPresentation(presentation) === \"sheet\") {\n return (\n <PeekSheet open={props.open} onOpenChange={(next) => !next && props.onClose()} label={label} sheetFooter={sheetFooter}>\n {props.children}\n </PeekSheet>\n );\n }\n return <FloatingPeekWindow {...props} />;\n}\n\nfunction FloatingPeekWindow({ open, onClose, initialPosition, children }: Omit<PeekWindowProps, \"presentation\" | \"label\" | \"sheetFooter\">) {\n const z = useFloatingLayerZIndex(PEEK_WINDOW_Z);\n const titleId = React.useId();\n const ref = React.useRef<HTMLDivElement | null>(null);\n const [element, setElement] = React.useState<HTMLDivElement | null>(null);\n const setRef = React.useCallback((node: HTMLDivElement | null) => {\n ref.current = node;\n setElement(node);\n }, []);\n const [pos, setPos] = React.useState<{ x: number; y: number } | null>(initialPosition ?? null);\n\n /** Keep the whole card on screen (the title row at least reachable). */\n const clamp = React.useCallback((x: number, y: number) => {\n const rect = ref.current?.getBoundingClientRect();\n const kept = clampRectToViewport({ x, y, width: rect?.width ?? 0, height: rect?.height ?? 0 }, readViewport(), { margin: EDGE });\n return { x: kept.x, y: kept.y };\n }, []);\n\n // THE WINDOW DRAG (window-drag.ts): the title row drags it, painted per frame, committed once.\n const drag = useDragMove({\n element,\n ignore: `${DRAG_IGNORE_SELECTOR},[data-peek-no-drag]`,\n constrain: (next) => clampRectToViewport(next, readViewport(), { margin: EDGE }),\n onCommit: (rect) => setPos({ x: rect.x, y: rect.y }),\n });\n\n // On every open: center when no position is known, otherwise pull the last one back on screen.\n React.useLayoutEffect(() => {\n if (!open || !ref.current) return;\n const rect = ref.current.getBoundingClientRect();\n setPos((last) =>\n last\n ? clamp(last.x, last.y)\n : clamp((window.innerWidth - rect.width) / 2, (window.innerHeight - rect.height) / 3),\n );\n }, [open, clamp]);\n\n // A viewport that shrinks never strands the window off screen.\n React.useEffect(() => {\n if (!open) return;\n const onResize = () => setPos((last) => (last ? clamp(last.x, last.y) : last));\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [open, clamp]);\n\n // Escape closes the NEWEST open peek wherever focus is — never one under it, never while a menu\n // it opened is in use (the menu closes first), never while focus sits in some other dialog.\n const closeRef = React.useRef(onClose);\n closeRef.current = onClose;\n // THE Escape stack (floating-layer): the newest open layer of ANY kind owns the key.\n useEscapeLayer(open, (event) => {\n const active = document.activeElement;\n if (active instanceof Element) {\n if (active.closest(\"[data-radix-popper-content-wrapper]\")) return;\n if (!ref.current?.contains(active) && active.closest(\"[role='dialog'], [role='alertdialog']\")) return;\n }\n event.preventDefault();\n closeRef.current();\n });\n\n // Closing hands focus back to whatever opened the window (never strands it on <body>).\n React.useEffect(() => {\n if (!open) return;\n const opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n return () => {\n const lost = !document.activeElement || document.activeElement === document.body || ref.current?.contains(document.activeElement);\n if (lost && opener?.isConnected) opener.focus({ preventScroll: true });\n };\n }, [open]);\n\n // A drag in flight ends with the window (close): no stray listeners, no held cursor.\n const cancelDrag = drag.cancel;\n React.useEffect(() => {\n if (!open) cancelDrag();\n }, [open, cancelDrag]);\n\n if (!open || typeof document === \"undefined\") return null;\n const windowCtx: PeekCardContextValue[\"window\"] = {\n onClose,\n titleId,\n dragHandle: { onPointerDown: drag.onPointerDown, \"data-draggable\": \"\" } as React.HTMLAttributes<HTMLElement>,\n };\n return createPortal(\n <FloatingLayer>\n <div\n ref={setRef}\n role=\"dialog\"\n aria-modal={false}\n aria-labelledby={titleId}\n data-matrx-peek-window=\"\"\n className={MOTION_POPPER}\n style={{\n position: \"fixed\",\n left: pos?.x ?? 0,\n top: pos?.y ?? 0,\n zIndex: z,\n visibility: pos ? \"visible\" : \"hidden\",\n }}\n >\n <PeekWindowContext.Provider value={windowCtx}>{children}</PeekWindowContext.Provider>\n </div>\n </FloatingLayer>,\n document.body,\n );\n}\n","// Social platform marks — Font Awesome 6 brand paths (CC BY 4.0), inlined (policy C19: no icon-library\n// dependency). Generated once from react-icons/fa6; one line per platform.\n\nexport const SOCIAL_BRAND_PATHS = {\n linkedin: { viewBox: \"0 0 448 512\", d: \"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z\" },\n x: { viewBox: \"0 0 512 512\", d: \"M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z\" },\n instagram: { viewBox: \"0 0 448 512\", d: \"M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z\" },\n facebook: { viewBox: \"0 0 512 512\", d: \"M512 256C512 114.6 397.4 0 256 0S0 114.6 0 256C0 376 82.7 476.8 194.2 504.5V334.2H141.4V256h52.8V222.3c0-87.1 39.4-127.5 125-127.5c16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1c-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287V510.1C413.8 494.8 512 386.9 512 256h0z\" },\n youtube: { viewBox: \"0 0 576 512\", d: \"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z\" },\n tiktok: { viewBox: \"0 0 448 512\", d: \"M448,209.91a210.06,210.06,0,0,1-122.77-39.25V349.38A162.55,162.55,0,1,1,185,188.31V278.2a74.62,74.62,0,1,0,52.23,71.18V0l88,0a121.18,121.18,0,0,0,1.86,22.17h0A122.18,122.18,0,0,0,381,102.39a121.43,121.43,0,0,0,67,20.14Z\" },\n github: { viewBox: \"0 0 496 512\", d: \"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z\" },\n pinterest: { viewBox: \"0 0 496 512\", d: \"M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z\" },\n threads: { viewBox: \"0 0 448 512\", d: \"M331.5 235.7c2.2 .9 4.2 1.9 6.3 2.8c29.2 14.1 50.6 35.2 61.8 61.4c15.7 36.5 17.2 95.8-30.3 143.2c-36.2 36.2-80.3 52.5-142.6 53h-.3c-70.2-.5-124.1-24.1-160.4-70.2c-32.3-41-48.9-98.1-49.5-169.6V256v-.2C17 184.3 33.6 127.2 65.9 86.2C102.2 40.1 156.2 16.5 226.4 16h.3c70.3 .5 124.9 24 162.3 69.9c18.4 22.7 32 50 40.6 81.7l-40.4 10.8c-7.1-25.8-17.8-47.8-32.2-65.4c-29.2-35.8-73-54.2-130.5-54.6c-57 .5-100.1 18.8-128.2 54.4C72.1 146.1 58.5 194.3 58 256c.5 61.7 14.1 109.9 40.3 143.3c28 35.6 71.2 53.9 128.2 54.4c51.4-.4 85.4-12.6 113.7-40.9c32.3-32.2 31.7-71.8 21.4-95.9c-6.1-14.2-17.1-26-31.9-34.9c-3.7 26.9-11.8 48.3-24.7 64.8c-17.1 21.8-41.4 33.6-72.7 35.3c-23.6 1.3-46.3-4.4-63.9-16c-20.8-13.8-33-34.8-34.3-59.3c-2.5-48.3 35.7-83 95.2-86.4c21.1-1.2 40.9-.3 59.2 2.8c-2.4-14.8-7.3-26.6-14.6-35.2c-10-11.7-25.6-17.7-46.2-17.8H227c-16.6 0-39 4.6-53.3 26.3l-34.4-23.6c19.2-29.1 50.3-45.1 87.8-45.1h.8c62.6 .4 99.9 39.5 103.7 107.7l-.2 .2zm-156 68.8c1.3 25.1 28.4 36.8 54.6 35.3c25.6-1.4 54.6-11.4 59.5-73.2c-13.2-2.9-27.8-4.4-43.4-4.4c-4.8 0-9.6 .1-14.4 .4c-42.9 2.4-57.2 23.2-56.2 41.8l-.1 .1z\" },\n reddit: { viewBox: \"0 0 512 512\", d: \"M0 256C0 114.6 114.6 0 256 0S512 114.6 512 256s-114.6 256-256 256L37.1 512c-13.7 0-20.5-16.5-10.9-26.2L75 437C28.7 390.7 0 326.7 0 256zM349.6 153.6c23.6 0 42.7-19.1 42.7-42.7s-19.1-42.7-42.7-42.7c-20.6 0-37.8 14.6-41.8 34c-34.5 3.7-61.4 33-61.4 68.4l0 .2c-37.5 1.6-71.8 12.3-99 29.1c-10.1-7.8-22.8-12.5-36.5-12.5c-33 0-59.8 26.8-59.8 59.8c0 24 14.1 44.6 34.4 54.1c2 69.4 77.6 125.2 170.6 125.2s168.7-55.9 170.6-125.3c20.2-9.6 34.1-30.2 34.1-54c0-33-26.8-59.8-59.8-59.8c-13.7 0-26.3 4.6-36.4 12.4c-27.4-17-62.1-27.7-100-29.1l0-.2c0-25.4 18.9-46.5 43.4-49.9l0 0c4.4 18.8 21.3 32.8 41.5 32.8zM177.1 246.9c16.7 0 29.5 17.6 28.5 39.3s-13.5 29.6-30.3 29.6s-31.4-8.8-30.4-30.5s15.4-38.3 32.1-38.3zm190.1 38.3c1 21.7-13.7 30.5-30.4 30.5s-29.3-7.9-30.3-29.6c-1-21.7 11.8-39.3 28.5-39.3s31.2 16.6 32.1 38.3zm-48.1 56.7c-10.3 24.6-34.6 41.9-63 41.9s-52.7-17.3-63-41.9c-1.2-2.9 .8-6.2 3.9-6.5c18.4-1.9 38.3-2.9 59.1-2.9s40.7 1 59.1 2.9c3.1 .3 5.1 3.6 3.9 6.5z\" },\n yelp: { viewBox: \"0 0 384 512\", d: \"M42.9 240.32l99.62 48.61c19.2 9.4 16.2 37.51-4.5 42.71L30.5 358.45a22.79 22.79 0 0 1-28.21-19.6 197.16 197.16 0 0 1 9-85.32 22.8 22.8 0 0 1 31.61-13.21zm44 239.25a199.45 199.45 0 0 0 79.42 32.11A22.78 22.78 0 0 0 192.94 490l3.9-110.82c.7-21.3-25.5-31.91-39.81-16.1l-74.21 82.4a22.82 22.82 0 0 0 4.09 34.09zm145.34-109.92l58.81 94a22.93 22.93 0 0 0 34 5.5 198.36 198.36 0 0 0 52.71-67.61A23 23 0 0 0 364.17 370l-105.42-34.26c-20.31-6.5-37.81 15.8-26.51 33.91zm148.33-132.23a197.44 197.44 0 0 0-50.41-69.31 22.85 22.85 0 0 0-34 4.4l-62 91.92c-11.9 17.7 4.7 40.61 25.2 34.71L366 268.63a23 23 0 0 0 14.61-31.21zM62.11 30.18a22.86 22.86 0 0 0-9.9 32l104.12 180.44c11.7 20.2 42.61 11.9 42.61-11.4V22.88a22.67 22.67 0 0 0-24.5-22.8 320.37 320.37 0 0 0-112.33 30.1z\" },\n google: { viewBox: \"0 0 488 512\", d: \"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z\" },\n} as const satisfies Record<string, { viewBox: string; d: string }>;\n\nexport type SocialBrandMark = keyof typeof SOCIAL_BRAND_PATHS;\n","// The contact values' glyphs — aliases of the one glyph home (../icons, policy C19: no icon library) — and\n// the social platform marks. Every glyph is drawn at the text's own size (`size-[1em]`) by its caller.\n\nimport * as React from \"react\";\n\nimport { AtSignIcon, BadgeCheckIcon, Link2OffIcon, MailIcon, MapPinIcon, MessageSquareIcon, PhoneIcon } from \"../icons\";\nimport { SOCIAL_BRAND_PATHS, type SocialBrandMark } from \"./social-brand-paths\";\n\ntype GlyphProps = { className?: string };\n\n// The lucide glyphs are drawn once, in ../icons; these names are aliases of them.\nexport const MailGlyph = MailIcon;\nexport const PhoneGlyph = PhoneIcon;\nexport const MapPinGlyph = MapPinIcon;\nexport const AtSignGlyph = AtSignIcon;\nexport const MessageSquareGlyph = MessageSquareIcon;\nexport const LinkOffGlyph = Link2OffIcon;\nexport const BadgeCheckGlyph = BadgeCheckIcon;\n\n/** A platform's own mark, filled in the current text color (never tinted with a brand color). */\nexport function SocialMark({ platform, className }: { platform: SocialBrandMark; className?: string }) {\n const mark = SOCIAL_BRAND_PATHS[platform];\n return (\n <svg className={className} viewBox={mark.viewBox} fill=\"currentColor\" aria-hidden>\n <path d={mark.d} />\n </svg>\n );\n}\n\n/** `SocialMark` bound to one platform, as a Peek glyph component. */\nexport function socialGlyph(platform: SocialBrandMark): React.ComponentType<GlyphProps> {\n function Mark({ className }: GlyphProps) {\n return <SocialMark platform={platform} {...(className ? { className } : {})} />;\n }\n Mark.displayName = `SocialMark(${platform})`;\n return Mark;\n}\n","// The contact values' model — every pure rule about an email, a phone number, a postal address, a\n// social profile and a web address: how each is read, normalized, and turned into the real thing it\n// does (compose, call, text, map, search, open). No React, no DOM: the components and any host\n// (a server render, a guard, a test) share exactly these answers.\n\nimport type { SocialBrandMark } from \"./social-brand-paths\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\n\n/** Whether a value is ours to act on. `broken` and `not-us` never render as a link of any kind. */\nexport type ContactValueState = \"ok\" | \"broken\" | \"not-us\";\n\nexport const CONTACT_STATE_LABEL: Record<Exclude<ContactValueState, \"ok\">, string> = {\n broken: \"Broken link\",\n \"not-us\": \"Not us\",\n};\n\n// ── email ────────────────────────────────────────────────────────────────────────────────────────\n\nconst EMAIL = /^[^\\s@<>()[\\]\\\\,;:\"]+@[^\\s@<>()[\\]\\\\,;:\"]+\\.[^\\s@<>()[\\]\\\\,;:\"]{2,}$/;\n\nexport interface ParsedEmail {\n address: string;\n local: string;\n domain: string;\n valid: boolean;\n}\n\n/** `mailto:` and surrounding brackets/space removed; the domain lower-cased, the local part kept. */\nexport function parseEmail(raw: string): ParsedEmail {\n const trimmed = raw.trim().replace(/^mailto:/i, \"\").replace(/^<|>$/g, \"\").split(\"?\")[0]!.trim();\n const at = trimmed.lastIndexOf(\"@\");\n const local = at === -1 ? trimmed : trimmed.slice(0, at);\n const domain = at === -1 ? \"\" : trimmed.slice(at + 1).toLowerCase();\n const address = at === -1 ? trimmed : `${local}@${domain}`;\n return { address, local, domain, valid: EMAIL.test(address) };\n}\n\nexport function mailtoHref(address: string, subject?: string): string {\n return `mailto:${address}${subject ? `?subject=${encodeURIComponent(subject)}` : \"\"}`;\n}\n\n// ── phone ────────────────────────────────────────────────────────────────────────────────────────\n\n/** Calling codes we name a region for. Longest prefix wins; NANP (+1) is resolved by area code. */\nconst CALLING_CODES: Record<string, string> = {\n \"1\": \"United States / Canada\",\n \"7\": \"Russia / Kazakhstan\",\n \"20\": \"Egypt\",\n \"27\": \"South Africa\",\n \"30\": \"Greece\",\n \"31\": \"Netherlands\",\n \"32\": \"Belgium\",\n \"33\": \"France\",\n \"34\": \"Spain\",\n \"36\": \"Hungary\",\n \"39\": \"Italy\",\n \"40\": \"Romania\",\n \"41\": \"Switzerland\",\n \"43\": \"Austria\",\n \"44\": \"United Kingdom\",\n \"45\": \"Denmark\",\n \"46\": \"Sweden\",\n \"47\": \"Norway\",\n \"48\": \"Poland\",\n \"49\": \"Germany\",\n \"51\": \"Peru\",\n \"52\": \"Mexico\",\n \"54\": \"Argentina\",\n \"55\": \"Brazil\",\n \"56\": \"Chile\",\n \"57\": \"Colombia\",\n \"60\": \"Malaysia\",\n \"61\": \"Australia\",\n \"62\": \"Indonesia\",\n \"63\": \"Philippines\",\n \"64\": \"New Zealand\",\n \"65\": \"Singapore\",\n \"66\": \"Thailand\",\n \"81\": \"Japan\",\n \"82\": \"South Korea\",\n \"84\": \"Vietnam\",\n \"86\": \"China\",\n \"90\": \"Turkey\",\n \"91\": \"India\",\n \"92\": \"Pakistan\",\n \"93\": \"Afghanistan\",\n \"94\": \"Sri Lanka\",\n \"98\": \"Iran\",\n \"212\": \"Morocco\",\n \"234\": \"Nigeria\",\n \"254\": \"Kenya\",\n \"351\": \"Portugal\",\n \"353\": \"Ireland\",\n \"358\": \"Finland\",\n \"380\": \"Ukraine\",\n \"420\": \"Czechia\",\n \"852\": \"Hong Kong\",\n \"886\": \"Taiwan\",\n \"971\": \"United Arab Emirates\",\n \"972\": \"Israel\",\n \"966\": \"Saudi Arabia\",\n};\n\n/** Canadian area codes — every other valid NANP area code reads as the United States. */\nconst CANADA_AREA = new Set(\n \"204 226 236 249 250 263 289 306 343 354 365 367 368 382 403 416 418 428 431 437 438 450 468 474 506 514 519 548 579 581 584 587 600 604 613 639 647 672 683 705 709 742 753 778 780 782 807 819 825 867 873 879 902 905\".split(\" \"),\n);\n\nexport interface ParsedPhone {\n /** As written (trimmed). */\n raw: string;\n /** `+15551234567`, or null when the digits cannot make one. */\n e164: string | null;\n /** How a person reads it: `(555) 123-4567` for NANP, `+44 20 7946 0958` style otherwise. */\n display: string;\n /** \"United States\", \"United Kingdom\" … or null when unknown. */\n region: string | null;\n /** An extension (`x123`, `ext. 123`), kept apart from the dialled number. */\n extension: string | null;\n valid: boolean;\n}\n\nfunction regionFor(digits: string): { code: string; region: string } | null {\n for (const len of [3, 2, 1]) {\n const code = digits.slice(0, len);\n const region = CALLING_CODES[code];\n if (region) {\n if (code === \"1\") {\n const area = digits.slice(1, 4);\n return { code, region: CANADA_AREA.has(area) ? \"Canada\" : \"United States\" };\n }\n return { code, region };\n }\n }\n return null;\n}\n\n/** A national number in readable groups: 10 digits 2-4-4 (`20 7946 0958`), 9 digits 3-3-3, else threes. */\nfunction groupNational(n: string): string {\n const cut = (sizes: number[]) => {\n const out: string[] = [];\n let at = 0;\n for (const size of sizes) {\n out.push(n.slice(at, at + size));\n at += size;\n }\n if (at < n.length) out.push(n.slice(at));\n return out.filter(Boolean).join(\" \");\n };\n if (n.length === 10) return cut([2, 4, 4]);\n if (n.length === 9) return cut([3, 3, 3]);\n if (n.length === 11) return cut([3, 4, 4]);\n return n.replace(/(\\d{3})(?=\\d)/g, \"$1 \");\n}\n\n/**\n * Read a phone number. A number without a `+` and of 10 digits (or 11 starting with 1) is taken as\n * North American — the default the platform's people overwhelmingly mean; `defaultCallingCode`\n * overrides it.\n */\nexport function parsePhone(raw: string, defaultCallingCode = \"1\"): ParsedPhone {\n const trimmed = raw.trim().replace(/^tel:/i, \"\");\n const extMatch = trimmed.match(/(?:ext\\.?|x|#)\\s*(\\d{1,6})\\s*$/i);\n const extension = extMatch ? extMatch[1]! : null;\n const body = extMatch ? trimmed.slice(0, extMatch.index) : trimmed;\n const plus = /^\\s*(\\+|00)/.test(body);\n let digits = body.replace(/\\D/g, \"\");\n if (body.trim().startsWith(\"00\")) digits = digits.slice(2);\n let full: string | null = null;\n if (plus) full = digits;\n else if (defaultCallingCode === \"1\" && digits.length === 10) full = `1${digits}`;\n else if (defaultCallingCode === \"1\" && digits.length === 11 && digits.startsWith(\"1\")) full = digits;\n else if (defaultCallingCode !== \"1\" && digits.length >= 6) full = `${defaultCallingCode}${digits.replace(/^0/, \"\")}`;\n const valid = full !== null && full.length >= 8 && full.length <= 15;\n const e164 = valid ? `+${full}` : null;\n const found = valid ? regionFor(full!) : null;\n let display = trimmed;\n if (valid && found?.code === \"1\" && full!.length === 11) {\n display = `(${full!.slice(1, 4)}) ${full!.slice(4, 7)}-${full!.slice(7)}`;\n } else if (valid && found) {\n display = `+${found.code} ${groupNational(full!.slice(found.code.length))}`;\n }\n if (extension && valid) display = `${display} ext. ${extension}`;\n return { raw: trimmed, e164, display, region: found?.region ?? null, extension, valid };\n}\n\nexport function telHref(phone: ParsedPhone): string {\n const number = phone.e164 ?? phone.raw.replace(/[^\\d+]/g, \"\");\n return `tel:${number}${phone.extension ? `,${phone.extension}` : \"\"}`;\n}\n\nexport function smsHref(phone: ParsedPhone): string {\n return `sms:${phone.e164 ?? phone.raw.replace(/[^\\d+]/g, \"\")}`;\n}\n\n// ── address ──────────────────────────────────────────────────────────────────────────────────────\n\n/** A postal address as one string (lines joined) — the form every map and geocoder takes. */\nexport function addressText(address: string | readonly (string | null | undefined)[]): string {\n const parts = typeof address === \"string\" ? address.split(/\\n+/) : address;\n return parts\n .map((p) => (p ?? \"\").trim())\n .filter(Boolean)\n .join(\", \");\n}\n\nexport function mapsHref(address: string): string {\n return `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(address)}`;\n}\n\n/** What a host's address check answered. */\nexport interface AddressValidation {\n /** `verified`: a real place matched. `partial`: something matched, not the whole address. `unknown`: no match. */\n status: \"verified\" | \"partial\" | \"unknown\";\n /** The address as the geocoder writes it. */\n formatted?: string;\n lat?: number;\n lng?: number;\n}\n\n// ── web ──────────────────────────────────────────────────────────────────────────────────────────\n\nexport function webSearchHref(query: string): string {\n return `https://www.google.com/search?q=${encodeURIComponent(query)}`;\n}\n\nexport interface ParsedUrl {\n /** An absolute http(s) URL, or null when the text is not one. */\n href: string | null;\n /** `example.com` (no `www.`). */\n domain: string;\n /** What to show: the domain, plus the path when it says something. */\n display: string;\n}\n\nexport function parseUrl(raw: string): ParsedUrl {\n const trimmed = raw.trim();\n const candidate = /^https?:\\/\\//i.test(trimmed) ? trimmed : /^[\\w-]+(\\.[\\w-]+)+(\\/|$|\\?|#)/.test(trimmed) ? `https://${trimmed}` : null;\n if (!candidate) return { href: null, domain: trimmed, display: trimmed };\n try {\n const url = new URL(candidate);\n const domain = url.hostname.replace(/^www\\./i, \"\").toLowerCase();\n const path = url.pathname.replace(/\\/+$/, \"\");\n return { href: url.toString(), domain, display: path && path !== \"/\" ? `${domain}${path}` : domain };\n } catch {\n return { href: null, domain: trimmed, display: trimmed };\n }\n}\n\n// ── social ───────────────────────────────────────────────────────────────────────────────────────\n\nexport type SocialPlatform = SocialBrandMark | \"other\";\n\ninterface PlatformRule {\n name: string;\n hosts: readonly string[];\n /** The profile address for a bare handle. */\n profile: (handle: string) => string;\n /** The handle in a profile URL's path, or null when the path is not a profile. */\n handleFromPath: (segments: string[]) => string | null;\n /** Shown before the handle (`@`), or \"\" for platforms that name profiles by slug. */\n sigil: \"@\" | \"\";\n}\n\nconst first = (segments: string[]) => segments[0] ?? null;\n\nexport const SOCIAL_PLATFORMS: Record<SocialBrandMark, PlatformRule> = {\n linkedin: {\n name: \"LinkedIn\",\n hosts: [\"linkedin.com\"],\n profile: (h) => `https://www.linkedin.com/in/${h}`,\n handleFromPath: (s) => ([\"in\", \"company\", \"school\"].includes(s[0] ?? \"\") ? s[1] ?? null : null),\n sigil: \"\",\n },\n x: { name: \"X\", hosts: [\"x.com\", \"twitter.com\"], profile: (h) => `https://x.com/${h}`, handleFromPath: first, sigil: \"@\" },\n instagram: { name: \"Instagram\", hosts: [\"instagram.com\"], profile: (h) => `https://www.instagram.com/${h}`, handleFromPath: first, sigil: \"@\" },\n facebook: { name: \"Facebook\", hosts: [\"facebook.com\", \"fb.com\"], profile: (h) => `https://www.facebook.com/${h}`, handleFromPath: first, sigil: \"\" },\n youtube: {\n name: \"YouTube\",\n hosts: [\"youtube.com\", \"youtu.be\"],\n profile: (h) => `https://www.youtube.com/@${h}`,\n handleFromPath: (s) => (s[0]?.startsWith(\"@\") ? s[0].slice(1) : [\"c\", \"channel\", \"user\"].includes(s[0] ?? \"\") ? s[1] ?? null : null),\n sigil: \"@\",\n },\n tiktok: {\n name: \"TikTok\",\n hosts: [\"tiktok.com\"],\n profile: (h) => `https://www.tiktok.com/@${h}`,\n handleFromPath: (s) => (s[0]?.startsWith(\"@\") ? s[0].slice(1) : null),\n sigil: \"@\",\n },\n github: { name: \"GitHub\", hosts: [\"github.com\"], profile: (h) => `https://github.com/${h}`, handleFromPath: first, sigil: \"@\" },\n pinterest: { name: \"Pinterest\", hosts: [\"pinterest.com\"], profile: (h) => `https://www.pinterest.com/${h}`, handleFromPath: first, sigil: \"@\" },\n threads: {\n name: \"Threads\",\n hosts: [\"threads.net\", \"threads.com\"],\n profile: (h) => `https://www.threads.net/@${h}`,\n handleFromPath: (s) => (s[0]?.startsWith(\"@\") ? s[0].slice(1) : null),\n sigil: \"@\",\n },\n reddit: {\n name: \"Reddit\",\n hosts: [\"reddit.com\"],\n profile: (h) => `https://www.reddit.com/user/${h}`,\n handleFromPath: (s) => ([\"u\", \"user\"].includes(s[0] ?? \"\") ? s[1] ?? null : s[0] === \"r\" && s[1] ? `r/${s[1]}` : null),\n sigil: \"\",\n },\n yelp: { name: \"Yelp\", hosts: [\"yelp.com\"], profile: (h) => `https://www.yelp.com/biz/${h}`, handleFromPath: (s) => (s[0] === \"biz\" ? s[1] ?? null : null), sigil: \"\" },\n google: { name: \"Google\", hosts: [\"g.page\", \"business.google.com\"], profile: (h) => `https://g.page/${h}`, handleFromPath: first, sigil: \"\" },\n};\n\nconst PLATFORM_ALIASES: Record<string, SocialBrandMark> = {\n twitter: \"x\",\n \"x.com\": \"x\",\n fb: \"facebook\",\n ig: \"instagram\",\n li: \"linkedin\",\n yt: \"youtube\",\n google_business: \"google\",\n \"google business\": \"google\",\n gbp: \"google\",\n};\n\n/** A platform name as stored anywhere (\"Twitter\", \"linkedin\", \"IG\") → our key, or null. */\nexport function platformKey(name: string | null | undefined): SocialBrandMark | null {\n if (!name) return null;\n const key = name.trim().toLowerCase();\n if (key in SOCIAL_PLATFORMS) return key as SocialBrandMark;\n return PLATFORM_ALIASES[key] ?? null;\n}\n\nexport interface ParsedSocial {\n platform: SocialPlatform;\n /** \"LinkedIn\", \"X\" … or the domain for an unknown site. */\n platformName: string;\n /** The handle without its sigil, or null when only a URL is known. */\n handle: string | null;\n /** What to show: `@handle`, a slug, or the domain + path. */\n display: string;\n /** The profile address, or null when neither a URL nor a known platform gives one. */\n href: string | null;\n}\n\n/**\n * Read a social profile from whatever we hold: a URL, an `@handle`, a bare handle — with the\n * platform named separately or found from the URL's host.\n */\nexport function parseSocial(value: string, platform?: string | null): ParsedSocial {\n const raw = value.trim();\n const named = platformKey(platform);\n const url = parseUrl(raw);\n if (url.href && (/^https?:\\/\\//i.test(raw) || raw.includes(\"/\"))) {\n const host = url.domain;\n const found =\n (Object.keys(SOCIAL_PLATFORMS) as SocialBrandMark[]).find((k) => SOCIAL_PLATFORMS[k].hosts.some((h) => host === h || host.endsWith(`.${h}`))) ?? named;\n if (found) {\n const rule = SOCIAL_PLATFORMS[found];\n const segments = new URL(url.href).pathname.split(\"/\").filter(Boolean).map((s) => decodeURIComponent(s));\n const handle = rule.handleFromPath(segments);\n return {\n platform: found,\n platformName: rule.name,\n handle,\n display: handle ? `${rule.sigil}${handle}` : url.display,\n href: url.href,\n };\n }\n return { platform: \"other\", platformName: host, handle: null, display: url.display, href: url.href };\n }\n const handle = raw.replace(/^@/, \"\");\n if (named) {\n const rule = SOCIAL_PLATFORMS[named];\n return { platform: named, platformName: rule.name, handle, display: `${rule.sigil}${handle}`, href: handle ? rule.profile(handle) : null };\n }\n return { platform: \"other\", platformName: platform?.trim() || \"Profile\", handle, display: `@${handle}`, href: null };\n}\n\n/** 1234 → \"1.2K\", 2_500_000 → \"2.5M\". */\nexport function compactCount(n: number): string {\n if (!Number.isFinite(n)) return String(n);\n return formatCount(n, { style: \"compact\" });\n}\n","\"use client\";\n\n/**\n * CandidateCard — THE card for \"is this one yours?\": a candidate someone found (a profile, a person, a\n * business, a page) with the person's Yes / No / Other decision under it. CandidatePickList — THE pick-one\n * list for the same candidates (\"This one\" per row, \"None of these\", \"More\").\n *\n * WHY THIS EXISTS (one-canonical, 2026-10-21): Smart Add hand-rolled this card five times (anchor cards,\n * the compare dialog, the harder-search stage, the validation stage, the slot rows) and a pick-one list\n * beside them, each with its own avatar, verified mark, count format and answered look.\n *\n * WHAT IT COMPOSES, NEVER REDRAWS:\n * · Avatar (the picture or the platform mark / initials),\n * · DecisionControl (Yes / No / Other + the way out — the one row decision),\n * · Peek (WHERE the candidate came from, on hover — `peek` is a PeekRecord; there is one peek),\n * · RowGroup + Button + EmptyState (the pick-one list's surface, its answers, its empty state).\n * Peek itself is not the card's body: it is the hover card of one record (popover surface, 16px avatar,\n * Copy door, no decision) and has no place for an answer. The candidate's WHO is `CandidateIdentity`, the\n * one place the name / handle / verified mark / followers / bio line is drawn.\n *\n * ANSWERED LOOKS (the same on every surface): Yes = primary ring; No = dashed, muted, name struck;\n * Other / skipped = neutral. \"We think\" glows one answer on the DecisionControl, never answers for a person.\n */\n\nimport * as React from \"react\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\";\nimport { cn } from \"./cn\";\nimport { Button, Chip, DecisionControl, EmptyState, RowGroup, type DecisionControlProps } from \"./controls/index\";\nimport { BadgeCheckIcon, CheckIcon, ChevronDownIcon, ExternalLinkIcon, SearchIcon, XIcon } from \"./icons\";\nimport { PeekHoverCard } from \"./peek-card\";\nimport { Peek } from \"./peek\";\nimport type { PeekRecord } from \"./peek-record\";\n\n/** One candidate: what is known about a profile / person / business / page someone might claim. */\nexport interface Candidate {\n /** Stable key (a row id, a URL). */\n id: string;\n /** Its name — wraps to two lines, never one cut-off word. Absent: the handle stands in. */\n name?: string | null;\n /** The handle or address under the name (\"@mara.lin\", \"marasbakery.com\"). */\n handle?: string | null;\n /** Its picture. Absent or broken: `mark`, then the name's initial. */\n imageUrl?: string | null;\n /**\n * How the picture fills its frame. `cover` (default): a round crop, right for a face. `contain`: the whole picture\n * shown inside a square frame, right for a website logo; the avatar's shape follows (round → rounded square).\n */\n imageFit?: \"cover\" | \"contain\";\n /** A small mark on the avatar's lower-right corner (the platform's logo on the photo, 16px or smaller). */\n badge?: React.ReactNode;\n /** The platform line (\"Instagram\", \"Instagram · Austin\"), its own quiet line between the handle and `detail`. */\n platform?: string | null;\n /** The avatar's fallback when there is no picture — the platform's mark (24px or smaller). */\n mark?: React.ReactNode;\n /** The network says this account is verified: the mark shows. Unverified draws nothing. */\n verified?: boolean;\n /** Followers (or any audience count); shown compact (\"12.4k followers\"). */\n followers?: number | null;\n /** What the count is called. Default \"followers\". */\n followersLabel?: string;\n /** One quiet line of facts (\"Founder · Acme · Austin\"). */\n detail?: string | null;\n /** Its short bio, two lines then \"…\". */\n bio?: string | null;\n /** Its page: an Open link in a new tab. */\n href?: string | null;\n}\n\n/** 12400 → \"12.4k\" (kit's compact count voice). */\nexport function formatAudience(n: number): string {\n return formatCount(n, { style: \"compact\" });\n}\n\nconst initialOf = (c: Candidate) => (c.name ?? c.handle ?? \"?\").replace(/^@/, \"\").trim().charAt(0).toUpperCase() || \"?\";\n\nconst withProtocol = (href: string) => (/^https?:\\/\\//i.test(href) ? href : `https://${href}`);\n\n/** The name a screen reader hears for a candidate (every control names WHICH candidate it acts on). */\nconst titleOf = (c: Candidate) => c.name ?? c.handle ?? \"Unnamed\";\n\n/** Names longer than this are cut at a WORD boundary with an ellipsis (the full name is the hover / focus title). */\nconst NAME_BUDGET = 64;\n\n/** Cut `text` at the last whole word within `max` characters, adding \"…\". Short text is returned untouched. */\nexport function truncateAtWord(text: string, max: number): string {\n if (text.length <= max) return text;\n const cut = text.slice(0, max + 1);\n const space = cut.lastIndexOf(\" \");\n // One unbroken token longer than the budget: nothing to cut between, so cut the token itself.\n const end = space > max * 0.4 ? space : max;\n return `${text.slice(0, end).replace(/[\\s,;:.\\-–—]+$/, \"\")}…`;\n}\n\n/** The Open link: the candidate's page in a new tab. Nothing when it has none. */\nfunction OpenCandidate({ href, name }: { href?: string | null | undefined; name: string }) {\n if (!href) return null;\n return (\n <Button asChild variant=\"quiet\" icon={<ExternalLinkIcon aria-hidden />} aria-label={`Open ${name}`}>\n <OutboundLink href={withProtocol(href)} />\n </Button>\n );\n}\n\nexport interface CandidateIdentityProps {\n candidate: Candidate;\n /** `stage`: the focus stage's larger picture. Default `row`. */\n size?: \"row\" | \"stage\";\n /** Where it came from: drawn by THE peek on hover / press of the identity. */\n peek?: PeekRecord | null | undefined;\n /** The name is struck (a \"No\"). */\n struck?: boolean;\n className?: string;\n}\n\n/** WHO the candidate is: picture, name + verified mark, handle · followers, detail, bio. */\nexport function CandidateIdentity({ candidate: c, size = \"row\", peek, struck, className }: CandidateIdentityProps) {\n const title = titleOf(c);\n const line = [c.name && c.handle ? c.handle : null, c.followers != null ? `${formatAudience(c.followers)} ${c.followersLabel ?? \"followers\"}` : null]\n .filter(Boolean)\n .join(\" · \");\n const contain = c.imageFit === \"contain\";\n const who = (\n <div className={cn(\"flex min-w-0 flex-1 items-start gap-3\", className)} data-candidate-identity=\"\">\n <span className=\"relative shrink-0\" data-candidate-avatar=\"\">\n <Avatar size={size === \"stage\" ? \"lg\" : \"md\"} className={cn(\"border border-border\", contain && \"rounded-lg bg-card\")}>\n {c.imageUrl ? <AvatarImage src={c.imageUrl} alt=\"\" className={contain ? \"object-contain p-0.5\" : \"object-cover\"} data-candidate-fit={contain ? \"contain\" : \"cover\"} /> : null}\n <AvatarFallback className={contain ? \"rounded-lg\" : undefined}>{c.mark ?? initialOf(c)}</AvatarFallback>\n </Avatar>\n {c.badge ? (\n <span className=\"absolute -bottom-1 -right-1 flex size-4 items-center justify-center overflow-hidden rounded-full border border-border bg-card\" data-candidate-badge=\"\">\n {c.badge}\n </span>\n ) : null}\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className={cn(\"type-title line-clamp-2 break-words\", struck && \"line-through\")} data-candidate-name=\"\" title={title}>\n {truncateAtWord(title, NAME_BUDGET)}\n {c.verified ? <BadgeCheckIcon className=\"ml-1 inline size-4 align-text-bottom text-primary\" aria-label=\"Verified\" data-candidate-verified=\"\" /> : null}\n </span>\n {line ? <span className=\"type-secondary truncate text-muted-foreground\" title={line}>{line}</span> : null}\n {c.platform ? <span className=\"type-secondary truncate text-muted-foreground\" title={c.platform} data-candidate-platform=\"\">{c.platform}</span> : null}\n {c.detail ? <span className=\"type-secondary truncate text-muted-foreground\" title={c.detail}>{c.detail}</span> : null}\n {c.bio ? <span className=\"type-secondary line-clamp-2 break-words text-muted-foreground\">{c.bio}</span> : null}\n </div>\n </div>\n );\n if (!peek) return who;\n return (\n <PeekHoverCard side=\"bottom\" align=\"start\" trigger={who}>\n <Peek size=\"sm\" record={peek} />\n </PeekHoverCard>\n );\n}\n\n/** What each surface says about the answer; the look follows from it. */\nexport type CandidateAnswer = DecisionControlProps[\"value\"];\n\nexport interface CandidateCardProps\n extends Pick<\n DecisionControlProps,\n \"value\" | \"onChange\" | \"wayOut\" | \"onWayOut\" | \"wayOutValue\" | \"onClear\" | \"onSkip\" | \"skipped\" | \"skipLabel\" | \"skippedLabel\" | \"labels\" | \"suggested\" | \"shortcuts\" | \"disabled\" | \"yesKinds\" | \"yesKind\" | \"onYesKind\" | \"pickerPlaceholder\"\n > {\n candidate: Candidate;\n /** Where the candidate came from, on hover (THE peek's record). */\n peek?: PeekRecord | null;\n /** `stage`: the focus stage that shows one candidate at a time (bigger picture, 44px answers). Default `card`. */\n size?: \"card\" | \"stage\";\n /** What the decision is about, for the screen reader (\"Is this you?\"). */\n \"aria-label\"?: string;\n /** Placement only (margin, width, a motion wrapper's layout); the card's look is not restyled from outside. */\n className?: string;\n /** The root's id. */\n id?: string;\n /** Content inside the card below the decision (an editor the answer opens, a note). */\n children?: React.ReactNode;\n /** Any `data-*` attribute lands on the root (`data-testid`, a host's hooks). */\n [dataAttribute: `data-${string}`]: string | number | boolean | undefined;\n}\n\n/**\n * One candidate and its decision. The decision is DecisionControl, so every card has the same three\n * words and the same way out; `onSkip` is required (no decision without a way out).\n */\nexport const CandidateCard = React.forwardRef<HTMLElement, CandidateCardProps>(function CandidateCard(\n { candidate, peek, size = \"card\", value, className, id, children, \"aria-label\": ariaLabel, ...rest },\n ref,\n) {\n // `data-*` goes to the root; everything else is the decision's.\n const dataAttrs: Record<string, unknown> = {};\n const decision: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(rest)) (k.startsWith(\"data-\") ? dataAttrs : decision)[k] = v;\n const d = decision as Omit<DecisionControlProps, \"value\" | \"size\" | \"aria-label\">;\n const stage = size === \"stage\";\n const name = titleOf(candidate);\n // A skipped card is undecided on purpose (DecisionControl: \"Skip for now\" leaves the item neither kept nor\n // rejected): Other is NOT pressed; the card says so with its own distinct skipped state.\n const skipped = Boolean(d.skipped) && value !== \"yes\" && value !== \"no\";\n const answer = skipped ? null : value;\n return (\n <article\n {...dataAttrs}\n ref={ref}\n id={id}\n data-candidate-card=\"\"\n data-candidate={candidate.id}\n data-answer={skipped ? \"skipped\" : (value ?? \"open\")}\n aria-label={ariaLabel ? `${ariaLabel} ${name}` : name}\n className={cn(\n \"flex min-w-0 flex-col rounded-xl border bg-card p-4 transition-colors\",\n stage ? \"gap-5\" : \"gap-4\",\n answer === \"yes\" && \"border-primary ring-1 ring-primary\",\n answer === \"no\" && \"border-dashed border-border bg-muted\",\n answer !== \"yes\" && answer !== \"no\" && \"border-border\",\n className,\n )}\n >\n <div className=\"flex min-w-0 items-start gap-2\">\n <CandidateIdentity candidate={candidate} size={stage ? \"stage\" : \"row\"} peek={peek} struck={answer === \"no\"} />\n <OpenCandidate href={candidate.href} name={name} />\n </div>\n <DecisionControl {...d} value={answer} size={stage ? \"stage\" : \"row\"} aria-label={`${ariaLabel ?? \"Is this the one?\"} ${name}`} />\n {skipped ? <Chip label={d.skippedLabel ?? \"Skipped for now\"} className=\"self-start\" data-candidate-skipped=\"\" /> : null}\n {children}\n </article>\n );\n});\n\nexport interface CandidatePickListProps {\n /** The list's question (\"Is one of these you?\"). */\n title: string;\n /** A quiet count or state on the right of the title (\"12 found\"). */\n status?: string | null;\n candidates: readonly Candidate[];\n /** The id picked (\"This one\"), or null. */\n pickedId: string | null;\n /** None of these was pressed (every candidate is out). */\n none?: boolean;\n onPick: (candidate: Candidate) => void;\n onNone: () => void;\n /** More candidates can be loaded: the button shows. */\n onMore?: () => void;\n /** More is loading. */\n busy?: boolean;\n /** Where each candidate came from (hover). */\n peekFor?: (candidate: Candidate) => PeekRecord | null | undefined;\n /**\n * Rows shown before the rest wait behind a control: the caller's `onMore` (More), or, with no `onMore`, the\n * list's own \"Show all N\" that reveals the rest in place. A layout choice of the caller. Default 12.\n */\n limit?: number;\n /** Replaces the empty state when there are no candidates. */\n empty?: React.ReactNode;\n className?: string;\n}\n\n/** \"This one\" per row, then \"None of these\" and \"More\": the pick-one answer. The pick is highlighted; the rest are marked `data-dimmed`, never faded. */\nexport function CandidatePickList({\n title,\n status,\n candidates,\n pickedId,\n none = false,\n onPick,\n onNone,\n onMore,\n busy,\n peekFor,\n limit = 12,\n empty,\n className,\n}: CandidatePickListProps) {\n const [expanded, setExpanded] = React.useState(false);\n const visible = expanded ? candidates.length : limit;\n const shown = candidates.slice(0, visible);\n // Nothing is ever hidden without a way to see it: with no loader the list reveals its own remainder.\n const hidden = candidates.length - shown.length;\n return (\n <div data-candidate-pick-list=\"\" className={cn(\"flex min-w-0 flex-col gap-1.5\", className)}>\n <RowGroup title={status ? `${title} · ${status}` : title} aria-label={title}>\n {shown.length === 0 ? (\n (empty ?? <EmptyState icon={<SearchIcon aria-hidden />} title=\"Nothing found yet\" />)\n ) : (\n shown.map((c) => {\n const on = pickedId === c.id;\n return (\n <div\n key={c.id}\n role=\"group\"\n aria-label={titleOf(c)}\n data-candidate={c.id}\n data-answer={on ? \"yes\" : \"open\"}\n data-dimmed={(pickedId !== null && !on) || none ? \"\" : undefined}\n className={cn(\"flex items-center gap-2 px-3 py-2\", on && \"bg-accent\")}\n >\n <CandidateIdentity candidate={c} peek={peekFor?.(c) ?? null} />\n <OpenCandidate href={c.href} name={titleOf(c)} />\n <Button variant={on ? \"primary\" : \"outline\"} icon={<CheckIcon aria-hidden />} pressed={on} aria-label={`This one: ${titleOf(c)}`} onClick={() => onPick(c)}>\n This one\n </Button>\n </div>\n );\n })\n )}\n <div className=\"flex flex-wrap gap-1.5 px-3 py-2\" data-candidate-way-out=\"\">\n <Button variant={none ? \"primary\" : \"quiet\"} icon={<XIcon aria-hidden />} pressed={none} onClick={onNone}>\n None of these\n </Button>\n {onMore ? (\n <Button variant=\"quiet\" icon={<ChevronDownIcon aria-hidden />} disabled={busy} onClick={onMore}>\n More\n </Button>\n ) : hidden > 0 ? (\n <Button variant=\"quiet\" icon={<ChevronDownIcon aria-hidden />} data-candidate-show-all=\"\" onClick={() => setExpanded(true)}>\n {`Show all ${candidates.length}`}\n </Button>\n ) : null}\n </div>\n </RowGroup>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * MediaOption — THE selectable option row that carries a picture: one whole-row press picks it. The picture\n * (a business photo, a logo) sits in a fixed square, 48px or bigger (the owner, 2026-10-22: \"The images need\n * to be bigger\"), so a row never shifts as the picture loads. AddTile — THE dashed \"add another\" tile: the\n * whole tile is one press target, never a small button floating inside a dashed box.\n *\n * WHY THIS EXISTS (one-canonical, 2026-10-22): the compare picker drew its pick-list rows with a plain\n * Button whose icon slot shrank the picture to 20px and flattened the rating to text, and its add tile as a\n * Button inside a dashed div (only the small button pressed). Both are now one named piece.\n *\n * THE CALLER RENDERS THE PICTURE; THIS PIECE RESERVES ITS SQUARE. Photos should cover-crop and be rounded,\n * logos stay raw (never tinted) — that is the picture component's rule (ItemLogo), not this row's.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { Tile } from \"./controls/surfaces\";\nimport { PlusIcon } from \"./icons\";\n\nexport type MediaOptionSize = 48 | 56 | 64;\n\nexport interface MediaOptionProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"title\"> {\n /** The picture, already sized to `size` by the caller. Decorative: the title names the option. */\n media: React.ReactNode;\n /** The option's name — wraps to two lines. */\n title: React.ReactNode;\n /** Quiet lines under the title (category, address) — one line each, cut with an ellipsis. */\n lines?: readonly React.ReactNode[];\n /** Under the lines: structured facts that are not text (a star rating glyph + number, a count). */\n facts?: React.ReactNode;\n /** The picture square, in px. Default 48 (the floor). */\n size?: MediaOptionSize;\n /** This is the picked option. */\n selected?: boolean;\n}\n\n/** One pickable row: picture, name, quiet lines, facts. The whole row is the button. */\nexport const MediaOption = React.forwardRef<HTMLButtonElement, MediaOptionProps>(function MediaOption(\n { media, title, lines, facts, size = 48, selected, className, type = \"button\", ...props },\n ref,\n) {\n return (\n <Tile\n ref={ref}\n type={type}\n data-media-option=\"\"\n {...(selected !== undefined ? { selected } : {})}\n className={cn(\"w-full min-w-0\", className)}\n variant=\"outline\"\n layout=\"row\"\n icon={<span data-media-option-media=\"\" className=\"flex shrink-0 items-center justify-center overflow-hidden rounded-lg\" style={{ width: size, height: size }} aria-hidden>{media}</span>}\n title={<span className=\"flex min-w-0 flex-col gap-0.5\"><span data-media-option-title=\"\" className=\"type-title line-clamp-2 break-words text-foreground\">{title}</span>{lines?.filter(Boolean).map((line, i) => <span key={i} className=\"type-secondary truncate text-muted-foreground\">{line}</span>)}{facts ? <span className=\"type-meta inline-flex items-center gap-1 text-muted-foreground\">{facts}</span> : null}</span>}\n {...props}\n />\n );\n});\n\nexport interface AddTileProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Replaces the plus glyph. */\n icon?: React.ReactNode;\n}\n\n/** The dashed \"add another\" tile: the whole tile is one button (fills its grid cell). */\nexport const AddTile = React.forwardRef<HTMLButtonElement, AddTileProps>(function AddTile(\n { icon, className, children, type = \"button\", ...props },\n ref,\n) {\n return (\n <Tile\n ref={ref}\n type={type}\n data-add-tile=\"\"\n layout=\"stack\"\n variant=\"outline\"\n dashed\n title={children}\n icon={icon ?? <PlusIcon aria-hidden />}\n className={cn(\"h-full min-h-40 w-full\", className)}\n {...props}\n />\n );\n});\n","\"use client\";\n\n/**\n * AssistPeek — THE assist card: one suggestion the platform offers a person, on THE peek.\n *\n * A composition of the peek's own parts, never a restyle (one UI system):\n *\n * ┌──────────────────────────────────────────────┐\n * │ 💡 Capture Titanium Success's colors… ✕ │ title on one line at the reference widths;\n * │ 90% · Oct 22 │ ✕ is \"Not now\"\n * │ ──────────────────────────────────────────── │\n * │ Reads titaniumsuccess.com for its colors… │ the explanation — the ONE block that wraps\n * │ ↳ Runs now and lands in Identity › Colors │ what the button will do, said before it runs\n * │ [a step the card opened: a note, a reason] │\n * │ ──────────────────────────────────────────── │\n * │ ⏲ 🔕 [Read my site] │ Later · Stop showing (menus) · the verb\n * └──────────────────────────────────────────────┘\n *\n * `xl` portrait (480px) holds a typical assist title (≈50 characters, p75 of live titles) on one line\n * beside its glyph and ✕; the height is the content's (`height=\"content\"`), so a two-line assist is a\n * small card. The card never runs anything by itself: only the verb button does (THE INTENTIONAL-ACTION\n * LAW). Data, persistence and the actions themselves are the host's; this file only draws.\n */\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { Button } from \"./controls/controls\";\nimport { BellOffIcon, ClockIcon, CornerDownRightIcon, LightbulbIcon, XIcon } from \"./icons\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger } from \"./dropdown-menu\";\nimport {\n PeekCard,\n PeekCardBody,\n PeekCardFooter,\n PeekCardHeader,\n PeekCardRow,\n PeekCardRows,\n PeekCardSection,\n PeekCardText,\n PeekHoverCard,\n type PeekCardPrimary,\n type PeekPresentation,\n} from \"./peek-card\";\nimport type { PeekActionDoor, PeekDoorMenuGroup, PeekDoors } from \"./peek-model\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\n/** What the producer saw, so the person can check the claim instead of trusting it. */\nexport interface AssistPeekEvidence {\n /** What it is (\"Search Console\", \"3 pages\"). */\n label: string;\n snippet?: string | undefined;\n items?: readonly string[] | undefined;\n /** The thing the evidence names, reachable (an app path or a web address). */\n href?: string | undefined;\n}\n\nexport interface AssistPeekCardProps {\n /** The assist's full title — the card's strongest line. */\n title: string;\n /** The glyph before the title (the urgency's, or the ambient assist glyph). */\n icon?: React.ComponentType<{ className?: string }> | undefined;\n /** One short line under the title: confidence · date, or the urgency's word. */\n subtitle?: string | undefined;\n /** The explanation: plain text, or the host's rendered markdown. */\n children?: React.ReactNode;\n /** The producer's reasoning, when it gave one. */\n why?: string | undefined;\n evidence?: AssistPeekEvidence | undefined;\n /** The person's own words from an earlier decision, when this assist came back. */\n yourNote?: string | undefined;\n /** What the primary will do, said before it runs. `null`: this app does not know the action. */\n explainer: string | null;\n /** The verb. Disabled on its own when `explainer` is `null`. */\n primary: PeekCardPrimary;\n /** \"Later\" choices (snooze windows). Omitted: no Later door (an assist that is not stored). */\n later?: readonly PeekDoorMenuGroup[] | undefined;\n /** \"Stop showing\" choices (this one, this kind for a while, this kind for good). */\n stopShowing?: readonly PeekDoorMenuGroup[] | undefined;\n /** A Later or Stop showing choice is being saved. */\n deciding?: boolean | undefined;\n /** ✕ — not now. The host decides whether that only closes or also declines. */\n onNotNow: () => void;\n /**\n * What the ✕ says: `not-now` (default — a card opened from a chip) or `dismiss` (a card in the\n * tray, where one press gets rid of it).\n */\n closeAs?: \"not-now\" | \"dismiss\";\n /** A step the card opened in place (a note, a reason, an edit before approving): under the explanation. */\n step?: React.ReactNode;\n}\n\nexport function AssistPeekCard({\n title,\n icon: Icon,\n subtitle,\n children,\n why,\n evidence,\n yourNote,\n explainer,\n primary,\n later,\n stopShowing,\n deciding = false,\n onNotNow,\n closeAs = \"not-now\",\n step,\n}: AssistPeekCardProps) {\n const closeLabel = closeAs === \"dismiss\" ? \"Dismiss\" : \"Not now\";\n const laterDoor: PeekActionDoor | null = later?.length\n ? { kind: \"action\", id: \"later\", label: \"Later\", icon: ClockIcon, menu: later, busy: deciding }\n : null;\n const stopDoor: PeekActionDoor | null = stopShowing?.length\n ? { kind: \"action\", id: \"stop\", label: \"Stop showing\", icon: BellOffIcon, menu: stopShowing, busy: deciding }\n : null;\n const doors: PeekDoors =\n laterDoor && stopDoor ? [laterDoor, stopDoor] : laterDoor ? [laterDoor] : stopDoor ? [stopDoor] : [];\n return (\n <PeekCard size=\"xl\" height=\"content\" data-matrx-assist-peek=\"\" data-matrx-notice-surface=\"\">\n <PeekCardHeader\n title={title}\n leading={Icon ? <Icon /> : undefined}\n subtitle={subtitle}\n trailing={\n <Button type=\"button\" variant=\"quiet\" aria-label={closeLabel} title={closeLabel} icon={<XIcon />} disabled={Boolean(primary.busy) || deciding} onClick={onNotNow} />\n }\n />\n <PeekCardBody>\n {children ? (\n // The explanation is what the person came to read: 14px (the size the host's markdown\n // paragraphs draw at), one step above the card's secondary sections.\n <div data-matrx-assist-body=\"\" className=\"type-value min-w-0 break-words text-foreground\">\n {typeof children === \"string\" ? <p className=\"whitespace-pre-wrap\">{children}</p> : children}\n </div>\n ) : null}\n {why ? (\n <PeekCardSection label=\"Why\">\n <PeekCardText>{why}</PeekCardText>\n </PeekCardSection>\n ) : null}\n {evidence ? <EvidenceSection evidence={evidence} /> : null}\n {yourNote ? (\n <PeekCardSection label=\"Your note\">\n <PeekCardText>{yourNote}</PeekCardText>\n </PeekCardSection>\n ) : null}\n {explainer ? (\n // What pressing the verb will do, hung off a return arrow like a consequence.\n <PeekCardRow icon={CornerDownRightIcon} tone=\"muted\" wrap>\n {explainer}\n </PeekCardRow>\n ) : (\n <PeekCardSection label=\"Not available here\" tone=\"danger\">\n <PeekCardText>This version of the app does not know how to do this.</PeekCardText>\n </PeekCardSection>\n )}\n {step}\n </PeekCardBody>\n <PeekCardFooter\n primaryAt=\"end\"\n primary={{ ...primary, disabled: Boolean(primary.disabled) || explainer === null || deciding }}\n doors={doors}\n />\n </PeekCard>\n );\n}\n\nfunction EvidenceSection({ evidence }: { evidence: AssistPeekEvidence }) {\n const items = evidence.items ?? [];\n return (\n <PeekCardSection label=\"What we saw\">\n <PeekCardRows\n rows={[{ key: \"evidence\", text: evidence.label, title: evidence.label, href: evidence.href }]}\n />\n {evidence.snippet ? <PeekCardText clamp={4} breaks>{evidence.snippet}</PeekCardText> : null}\n {items.length ? (\n <PeekCardRows limit={6} rows={items.map((item, i) => ({ key: `${i}-${item}`, text: item, title: item }))} />\n ) : null}\n </PeekCardSection>\n );\n}\n\n// ── the host: hover to read, press to keep ──────────────────────────────────────────────────────\n\nexport interface AssistPeekHoverProps {\n /** The collapsed assist (a chip). A hover opens the card; a press opens it and keeps it. */\n trigger: React.ReactElement;\n /** The assist's title, for the phone drawer's accessible name. */\n label: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n presentation?: PeekPresentation;\n /** The card, given `close` (after an action, or Not now). */\n children: (close: () => void) => React.ReactNode;\n}\n\n/** A menu the card opened lives in another portal: a press there belongs to the card. */\nfunction inCardMenu(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest(\"[data-radix-menu-content]\") !== null;\n}\n\n/**\n * THE assist host: THE hover peek, plus one rule an assist needs and a record peek does not. A press\n * inside the card (or on the chip) KEEPS it open until a press outside, Escape, or `close` — so a\n * person typing a note or a reason never loses the card by moving the pointer.\n */\nexport function AssistPeekHover({ trigger, label, side = \"top\", align = \"end\", presentation, children }: AssistPeekHoverProps) {\n const [hovered, setHovered] = React.useState(false);\n const [kept, setKept] = React.useState(false);\n const isMobile = useIsMobile();\n // On a phone the card is the bottom drawer: closing the drawer closes it, kept or not.\n const sheet = presentation === \"sheet\" || (presentation !== \"float\" && isMobile);\n const card = React.useRef<HTMLDivElement | null>(null);\n const close = React.useCallback(() => {\n setHovered(false);\n setKept(false);\n }, []);\n\n React.useEffect(() => {\n if (!kept) return;\n const onPress = (event: PointerEvent) => {\n if (card.current?.contains(event.target as Node) || inCardMenu(event.target)) return;\n close();\n };\n const onKey = (event: KeyboardEvent) => {\n // A menu the card opened takes Escape first; the card closes on the next one.\n if (event.key !== \"Escape\" || document.querySelector(\"[data-radix-menu-content]\")) return;\n close();\n };\n document.addEventListener(\"pointerdown\", onPress, true);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"pointerdown\", onPress, true);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [kept, close]);\n\n const keep = () => {\n setHovered(true);\n setKept(true);\n };\n\n return (\n <PeekHoverCard\n trigger={\n <Slot\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n keep();\n }}\n >\n {trigger}\n </Slot>\n }\n label={label}\n side={side}\n align={align}\n open={hovered || kept}\n onOpenChange={(next) => {\n setHovered(next);\n if (!next && (sheet || !kept)) close();\n }}\n {...(presentation ? { presentation } : {})}\n >\n <div ref={card} onPointerDownCapture={keep} onFocusCapture={keep}>\n {children(close)}\n </div>\n </PeekHoverCard>\n );\n}\n\n// ── the tray: a reminder that some are waiting, the cards on engagement ────────────────────────────\n\n/** The tray stays open this long after the pointer leaves it (the HoverCard close delay). */\nconst TRAY_CLOSE_MS = 300;\n/** A deliberate hover opens it (the HoverCard open floor). */\nconst TRAY_OPEN_MS = 500;\n\nexport interface AssistTrayProps {\n /** How many assists wait. The reminder shows the number; nothing renders at 0. */\n count: number;\n /** The cards (`AssistPeekCard` with `closeAs=\"dismiss\"`), most important first. */\n children: React.ReactNode;\n /** The ✕ on the reminder: gets rid of every assist for a while, in one press. */\n quickQuiet: { label: string; onQuiet: () => void };\n /** \"Quiet every assist for…\" choices, and anything else the tray's menu offers. */\n menu?: readonly PeekDoorMenuGroup[];\n /** The door to every assist (a link the host draws, with its own router). */\n allAssists?: React.ReactNode;\n /** The host's drag handle (the dock primitive's `onPointerDown`): the reminder is what moves. */\n onHandlePointerDown?: React.PointerEventHandler<HTMLElement>;\n /**\n * The host's placement marks on the reminder (the app's dock-clearance pass finds, measures and\n * moves THE reminder, never the open stack). The tray draws the two states it writes:\n * `data-assist-dock-pending` hides the reminder until its place has held, `data-assist-dock-yield`\n * fades it and lets the press through to the control beneath.\n */\n reminderAttributes?: Readonly<Record<`data-${string}`, string>>;\n /** Open from outside (a header row on a phone). Uncontrolled when omitted. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * THE assist tray: the floating reminder that assists are waiting — a lightbulb and a number, no\n * titles — and, when the person engages it (a deliberate hover, or a press that keeps it open),\n * the cards themselves stacked above it, each with its own one-press ✕. The reminder's own ✕\n * quiets them all for a while. A press outside or Escape closes the stack.\n */\nexport function AssistTray({ count, children, quickQuiet, menu, allAssists, onHandlePointerDown, reminderAttributes, open: openProp, onOpenChange }: AssistTrayProps) {\n const [hovered, setHovered] = React.useState(false);\n const [keptOwn, setKept] = React.useState(false);\n const kept = openProp ?? keptOwn;\n const open = kept || hovered;\n const box = React.useRef<HTMLDivElement | null>(null);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const clear = () => {\n if (timer.current) clearTimeout(timer.current);\n timer.current = null;\n };\n React.useEffect(() => clear, []);\n const setKeep = React.useCallback(\n (next: boolean) => {\n setKept(next);\n onOpenChange?.(next);\n if (!next) setHovered(false);\n },\n [onOpenChange],\n );\n const enter = () => {\n clear();\n if (!open) timer.current = setTimeout(() => setHovered(true), TRAY_OPEN_MS);\n };\n const leave = () => {\n clear();\n timer.current = setTimeout(() => {\n // A menu the tray opened lives in another portal: the pointer is still \"in\" the tray.\n if (document.querySelector(\"[data-radix-menu-content]\")) return;\n setHovered(false);\n }, TRAY_CLOSE_MS);\n };\n\n React.useEffect(() => {\n if (!kept) return;\n const onPress = (event: PointerEvent) => {\n if (box.current?.contains(event.target as Node) || inCardMenu(event.target)) return;\n setKeep(false);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || document.querySelector(\"[data-radix-menu-content]\")) return;\n setKeep(false);\n };\n document.addEventListener(\"pointerdown\", onPress, true);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"pointerdown\", onPress, true);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [kept, setKeep]);\n\n if (count <= 0) return null;\n const label = `${count} assist${count === 1 ? \"\" : \"s\"}`;\n return (\n <div\n ref={box}\n data-matrx-assist-tray=\"\"\n data-open={open ? \"\" : undefined}\n // The box itself takes no presses (a yielded reminder must let them through); its parts do.\n // Docked in a header slot (the app's clearance pass marks the root), the stack opens DOWN.\n className=\"pointer-events-none flex flex-col items-end gap-2 [:root[data-assist-dock-slot=header]_&]:flex-col-reverse\"\n onMouseEnter={enter}\n onMouseLeave={leave}\n onPointerDownCapture={(event) => {\n // A press on a card keeps the stack (typing a note must never lose it).\n if ((event.target as Element).closest(\"[data-matrx-assist-peek]\")) setKeep(true);\n }}\n >\n {open ? (\n <div data-matrx-assist-tray-stack=\"\" className=\"matrx-peek-scroll pointer-events-auto flex max-h-[min(70dvh,640px)] flex-col items-end gap-2 overflow-y-auto\">\n {/* Each card keeps its whole height: the stack scrolls, a card never shrinks to fit. */}\n {React.Children.map(children, (child) => (child ? <div className=\"shrink-0\">{child}</div> : null))}\n {allAssists || menu?.length ? (\n <div className=\"flex shrink-0 items-center rounded-md border border-border bg-popover shadow-md\">\n {allAssists}\n {menu?.length ? <TrayMenu menu={menu} /> : null}\n </div>\n ) : null}\n </div>\n ) : null}\n <div\n data-matrx-assist-tray-reminder=\"\"\n {...reminderAttributes}\n className=\"group pointer-events-auto flex items-center rounded-md border border-border bg-popover shadow-md transition-opacity data-[assist-dock-pending]:invisible data-[assist-dock-yield]:pointer-events-none data-[assist-dock-yield]:invisible\"\n onPointerDown={onHandlePointerDown}\n >\n <Button\n type=\"button\"\n variant=\"quiet\"\n icon={<LightbulbIcon />}\n glyphTone=\"primary\"\n aria-label={open ? `Hide ${label}` : `Show ${label}`}\n aria-expanded={open}\n title={label}\n onClick={() => setKeep(!kept)}\n >\n {String(count)}\n </Button>\n <Button\n type=\"button\"\n variant=\"quiet\"\n removes\n icon={<XIcon />}\n aria-label={quickQuiet.label}\n title={quickQuiet.label}\n onClick={() => {\n setKeep(false);\n quickQuiet.onQuiet();\n }}\n />\n </div>\n </div>\n );\n}\n\nfunction TrayMenu({ menu }: { menu: readonly PeekDoorMenuGroup[] }) {\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"quiet\" icon={<BellOffIcon />}>\n Quiet\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {menu.map((group, i) => (\n <React.Fragment key={`${group.label ?? \"\"}-${i}`}>\n {group.label ? <DropdownMenuLabel>{group.label}</DropdownMenuLabel> : null}\n {group.items.map((item) => (\n <DropdownMenuItem key={item.key} {...(item.tone ? { tone: item.tone } : {})} onSelect={() => item.onSelect()}>\n {item.label}\n </DropdownMenuItem>\n ))}\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","\"use client\";\n\n/**\n * RadioGroup — single-choice selection (30 host import sites).\n *\n * Ported from matrx-frontend `components/ui/radio-group.tsx`, with the same\n * two corrections the rest of this wave carries:\n *\n * 1. DENSITY IS A PROP (C18) — `size=\"sm|md|lg\"` on the ROOT, read from\n * context by every item, so a group cannot mix control sizes. Matches the\n * `Checkbox` / `Switch` / `Card` shape already shipped in 0.5.0.\n *\n * 2. THE TARGET IS 44px ON COARSE POINTERS. A 16px radio is a mouse control;\n * an invisible pseudo-target expands the hit area without changing layout,\n * so a settings list works with a thumb. (A label wired via `htmlFor` also\n * extends the target — that stays the host's composition choice; this makes\n * the control itself usable on its own.)\n *\n * The indicator is a filled dot rather than Radix's default icon slot, which\n * is what every host variant drew.\n */\n\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type RadioGroupSize = \"sm\" | \"md\" | \"lg\";\n\nconst RadioGroupSizeContext = React.createContext<RadioGroupSize>(\"md\");\n\nconst CONTROL_CLASSES: Record<RadioGroupSize, string> = {\n sm: \"h-3.5 w-3.5\",\n md: \"h-4 w-4\",\n lg: \"h-5 w-5\",\n};\n\nconst DOT_CLASSES: Record<RadioGroupSize, string> = {\n sm: \"h-1 w-1\",\n md: \"h-1.5 w-1.5\",\n lg: \"h-2 w-2\",\n};\n\nexport interface RadioGroupProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> {\n /** Control scale for every item in the group. Default `md`. */\n size?: RadioGroupSize;\n}\n\nconst RadioGroup = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Root>,\n RadioGroupProps\n>(({ className, size = \"md\", ...props }, ref) => (\n <RadioGroupSizeContext.Provider value={size}>\n <RadioGroupPrimitive.Root\n ref={ref}\n data-slot=\"radio-group\"\n className={cn(\"grid gap-2\", className)}\n {...props}\n />\n </RadioGroupSizeContext.Provider>\n));\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nexport interface RadioGroupItemProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> {\n /** Override the group's scale for one item. */\n size?: RadioGroupSize;\n}\n\nconst RadioGroupItem = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Item>,\n RadioGroupItemProps\n>(({ className, size, ...props }, ref) => {\n const groupSize = React.useContext(RadioGroupSizeContext);\n const resolved = size ?? groupSize;\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n className={cn(\n \"relative aspect-square shrink-0 rounded-full border border-primary shadow\",\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary\",\n // Ruling 2 — invisible 44px target on touch, layout untouched.\n \"after:absolute after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2 after:content-['']\",\n \"pointer-coarse:after:h-11 pointer-coarse:after:w-11\",\n CONTROL_CLASSES[resolved],\n className,\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <div\n className={cn(\"rounded-full bg-primary-foreground\", DOT_CLASSES[resolved])}\n />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n\nexport interface RadioListOption<T extends string> {\n value: T;\n label: React.ReactNode;\n /** A short muted fact at the row's end (a count, a size) — never a sentence. */\n hint?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface RadioListProps<T extends string> {\n value: T;\n onChange: (value: T) => void;\n options: readonly RadioListOption<T>[];\n size?: RadioGroupSize;\n className?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * A single-choice LIST: one full-width row per option (the whole row is the target), the radio at\n * the start, the label truncating, an optional hint at the end. Moved from matrx-frontend\n * `components/official/filter-panel` (`RadioSelect`) onto the package's RadioGroup, so keyboard\n * arrows, focus ring and the 44px coarse-pointer target come from the one radio.\n */\nfunction RadioList<T extends string>({\n value,\n onChange,\n options,\n size = \"sm\",\n className,\n \"aria-label\": ariaLabel,\n}: RadioListProps<T>) {\n const baseId = React.useId();\n return (\n <RadioGroup\n value={value}\n onValueChange={(v) => onChange(v as T)}\n size={size}\n aria-label={ariaLabel}\n className={cn(\"flex flex-col gap-0\", className)}\n >\n {options.map((opt, i) => {\n const selected = value === opt.value;\n const id = `${baseId}-${i}`;\n return (\n <label\n key={opt.value}\n htmlFor={id}\n data-selected={selected ? \"\" : undefined}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors\",\n selected\n ? \"bg-primary/10 font-medium text-primary-ink\"\n : \"text-muted-foreground hover:bg-muted hover:text-foreground\",\n opt.disabled && \"cursor-not-allowed text-disabled-foreground\",\n )}\n >\n <RadioGroupItem id={id} value={opt.value} disabled={opt.disabled} />\n <span className=\"flex-1 truncate\">{opt.label}</span>\n {opt.hint != null && opt.hint !== \"\" ? (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">{opt.hint}</span>\n ) : null}\n </label>\n );\n })}\n </RadioGroup>\n );\n}\n\nexport { RadioList };\n","\"use client\";\n\n/**\n * Toggle / ToggleGroup — the pressed-state control and its exclusive or\n * multiple group (10 host import sites between them).\n *\n * Ported from matrx-frontend `components/ui/toggle.tsx` +\n * `components/ui/toggle-group.tsx`. They ship as ONE module because\n * `ToggleGroupItem` reads `toggleVariants` and the group's variant CONTEXT:\n * the two host files were a circular pair held together by an import, and a\n * host copy of a React context is the quiet twin this package has already been\n * bitten by (`useContext` matches by object identity, so two look-alike\n * contexts silently never see each other). One module, one context.\n *\n * `Toggle` is NOT `Switch`. A Switch states a setting (\"notifications: on\")\n * and applies immediately; a Toggle is a pressed button in a toolbar (\"bold\").\n * Reach for `SegmentedControl` when the choice is between labeled options\n * rather than on/off.\n *\n * Density is `size=\"sm|default|lg\"`, declared on the group and inherited by\n * every item, so a toolbar cannot mix button heights.\n */\n\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground\",\n /**\n * A square on/off switch (the conversation sidebar's bucket and mode icons): off is an\n * outlined glyph in muted ink, on is filled primary. On and off never read as two grays.\n */\n switch:\n \"border border-input bg-transparent text-muted-foreground hover:bg-muted hover:text-foreground data-[state=on]:border-primary data-[state=on]:bg-primary data-[state=on]:text-primary-foreground data-[state=on]:hover:bg-primary data-[state=on]:hover:text-primary-foreground\",\n },\n size: {\n default: \"h-9 min-w-9 px-3\",\n sm: \"h-8 min-w-8 px-2\",\n lg: \"h-10 min-w-10 px-3\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ToggleProps\n extends React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root>,\n VariantProps<typeof toggleVariants> {}\n\nconst Toggle = React.forwardRef<\n React.ComponentRef<typeof TogglePrimitive.Root>,\n ToggleProps\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size }), className)}\n {...props}\n />\n));\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants>\n>({ size: \"default\", variant: \"default\" });\n\nexport type ToggleGroupProps = React.ComponentPropsWithoutRef<\n typeof ToggleGroupPrimitive.Root\n> &\n VariantProps<typeof toggleVariants>;\n\nconst ToggleGroup = React.forwardRef<\n React.ComponentRef<typeof ToggleGroupPrimitive.Root>,\n ToggleGroupProps\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n ref={ref}\n data-slot=\"toggle-group\"\n className={cn(\"flex items-center justify-center gap-1\", className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n));\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nexport interface ToggleGroupItemProps\n extends React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item>,\n VariantProps<typeof toggleVariants> {}\n\nconst ToggleGroupItem = React.forwardRef<\n React.ComponentRef<typeof ToggleGroupPrimitive.Item>,\n ToggleGroupItemProps\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext);\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n data-slot=\"toggle-group-item\"\n className={cn(\n toggleVariants({\n variant: context.variant ?? variant,\n size: context.size ?? size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n});\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n\nexport { Toggle, ToggleGroup, ToggleGroupItem, toggleVariants };\n","\"use client\";\n\n/**\n * FloatingDock — a row of round link icons that grow toward the pointer (desktop) and fold into a\n * full-screen menu list (phone). Moved from matrx-frontend `components/official/FloatingDock` +\n * `BalancedFloatingDock` (wave 3, 2026-10-22) and collapsed into ONE dock: the two differed only in\n * how far the icons grow and where the label sits, which are now `growthFactor` and `labelPosition`.\n *\n * - Links draw through `HostLink` (the registered tap-target link), so a host's own link door applies.\n * - Icons are the package's Lucide glyphs; the caller's item icons are theirs.\n * - Motion: the phone menu slides on the panel pair (`PANEL_MOTION_CLASS`, closed stays mounted and\n * `inert`); the pointer magnification is small UI motion on the fast token, a CSS transition on\n * width/height (no spring library) that is off under reduced motion.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { HostLink } from \"./host-link\";\nimport { ChevronRightIcon, PanelTopCloseIcon, PanelTopOpenIcon, XIcon } from \"./icons\";\nimport { Button } from \"./controls/controls\";\nimport { PANEL_MOTION_CLASS } from \"./motion\";\n\nexport interface FloatingDockItem {\n label: string;\n icon: React.ReactNode;\n href: string;\n}\n\nexport interface FloatingDockProps {\n items: FloatingDockItem[];\n className?: string;\n /** How far the icon under the pointer grows: 1 = not at all, 2 = double. */\n growthFactor?: number;\n /** Where the hover label sits: above the icon, beside it (to the right) or below it. */\n labelPosition?: \"top\" | \"side\" | \"bottom\";\n}\n\nconst BASE_SIZE = 40;\nconst BASE_ICON = 20;\nconst REACH = 150;\n/** Size at `distance` px from the pointer: BASE far away, `base * growth` right under it, linear between. */\nexport function dockSize(base: number, growth: number, distance: number): number {\n const near = Math.max(0, 1 - Math.abs(distance) / REACH);\n return base + (base * growth - base) * near;\n}\n\nconst LABEL_CLASS: Record<NonNullable<FloatingDockProps[\"labelPosition\"]>, string> = {\n top: \"bottom-full left-1/2 mb-1 -translate-x-1/2\",\n bottom: \"top-full left-1/2 mt-1 -translate-x-1/2\",\n side: \"left-full top-1/2 ml-2 -translate-y-1/2\",\n};\n\nconst MAGNIFY_MOTION =\n \"duration-(--matrx-motion-duration-fast) ease-(--matrx-motion-ease-panel) motion-reduce:transition-none\";\n\nexport function FloatingDock({\n items,\n className,\n growthFactor = 2,\n labelPosition = \"top\",\n}: FloatingDockProps) {\n // Both render; CSS picks (phone `md:hidden`, desktop `hidden md:flex`) so the server's first paint is\n // right at every width.\n return (\n <div className={cn(\"flex w-auto items-center justify-center bg-background\", className)}>\n <FloatingDockPhone items={items} />\n <FloatingDockDesktop items={items} growthFactor={growthFactor} labelPosition={labelPosition} />\n </div>\n );\n}\n\n/** The balanced preset: icons grow a little less and the label sits beside the icon. */\nexport function BalancedFloatingDock(props: FloatingDockProps) {\n return <FloatingDock growthFactor={1.8} labelPosition=\"side\" {...props} />;\n}\n\nfunction FloatingDockPhone({ items }: { items: FloatingDockItem[] }) {\n const [open, setOpen] = React.useState(false);\n return (\n <div className=\"relative block md:hidden\">\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={open ? \"Close menu\" : \"Open menu\"}\n icon={open ? <PanelTopCloseIcon className=\"h-5 w-5\" /> : <PanelTopOpenIcon className=\"h-5 w-5\" />}\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n />\n {/* Closed stays mounted and inert: the slide needs it there, and it keeps no tab stops. */}\n <div\n data-open={open}\n inert={!open}\n className={cn(\n \"fixed inset-0 z-50 bg-background transition-transform\",\n PANEL_MOTION_CLASS,\n open ? \"translate-y-0\" : \"pointer-events-none -translate-y-full\",\n )}\n >\n <div className=\"flex h-full flex-col\">\n <div className=\"flex items-center justify-between border-b border-border p-4\">\n <h2 className=\"text-lg font-medium\">Menu</h2>\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Close menu\"\n icon={<XIcon className=\"h-6 w-6\" />}\n onClick={() => setOpen(false)}\n />\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {items.map((item) => (\n <HostLink\n key={item.label}\n href={item.href}\n className=\"flex items-center justify-between border-b border-border p-4\"\n onClick={() => setOpen(false)}\n >\n <div className=\"flex items-center space-x-4\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n <div className=\"h-5 w-5 [&>svg]:h-full [&>svg]:w-full\">{item.icon}</div>\n </div>\n <span className=\"font-medium\">{item.label}</span>\n </div>\n <ChevronRightIcon className=\"h-5 w-5 text-muted-foreground\" />\n </HostLink>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction FloatingDockDesktop({\n items,\n growthFactor,\n labelPosition,\n}: {\n items: FloatingDockItem[];\n growthFactor: number;\n labelPosition: NonNullable<FloatingDockProps[\"labelPosition\"]>;\n}) {\n const circles = React.useRef<Array<HTMLDivElement | null>>([]);\n // The pointer's x (viewport) while it is over the dock, else none; each circle's centre at that moment.\n const [pointerX, setPointerX] = React.useState<number | null>(null);\n const [centers, setCenters] = React.useState<number[]>([]);\n\n const measure = (x: number) => {\n setPointerX(x);\n setCenters(\n items.map((_, i) => {\n const b = circles.current[i]?.getBoundingClientRect();\n return b ? b.x + b.width / 2 : Number.POSITIVE_INFINITY;\n }),\n );\n };\n\n return (\n <div\n onMouseMove={(e) => measure(e.clientX)}\n onMouseLeave={() => setPointerX(null)}\n className={cn(\n \"mx-auto hidden h-14 gap-2 rounded-2xl bg-background px-3 py-2 md:flex\",\n labelPosition === \"top\" ? \"items-end\" : \"items-center\",\n )}\n >\n {items.map((item, i) => {\n const distance =\n pointerX === null ? Number.POSITIVE_INFINITY : pointerX - (centers[i] ?? Number.POSITIVE_INFINITY);\n const size = dockSize(BASE_SIZE, growthFactor, distance);\n const icon = dockSize(BASE_ICON, growthFactor, distance);\n const under = Number.isFinite(distance) && Math.abs(distance) < BASE_SIZE / 2;\n return (\n <HostLink key={item.label} href={item.href} aria-label={item.label}>\n <div className=\"relative\">\n <div\n ref={(el) => {\n circles.current[i] = el;\n }}\n style={{ width: size, height: size }}\n className={cn(\n \"relative flex aspect-square items-center justify-center rounded-full bg-muted transition-[width,height]\",\n MAGNIFY_MOTION,\n )}\n >\n <div\n style={{ width: icon, height: icon }}\n className={cn(\n \"flex items-center justify-center transition-[width,height] [&>svg]:h-full [&>svg]:w-full\",\n MAGNIFY_MOTION,\n )}\n >\n {item.icon}\n </div>\n </div>\n <div\n data-shown={under}\n aria-hidden\n className={cn(\n \"type-secondary pointer-events-none absolute z-50 w-fit whitespace-pre rounded-md bg-muted px-2 py-1 text-foreground shadow-sm transition-opacity\",\n MAGNIFY_MOTION,\n under ? \"opacity-100\" : \"opacity-0\",\n LABEL_CLASS[labelPosition],\n )}\n >\n {item.label}\n </div>\n </div>\n </HostLink>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * deferredDialog — a dialog whose BODY loads the first time it opens.\n *\n * The root entry (`@ai-matrx/design-system`) is imported by nearly every screen, so anything it reaches\n * statically lands in every app's first load. A request dialog (manual copy, auth gate, text input, ...)\n * draws nothing until it opens, so the root exports this light wrapper and the body lives in its own\n * entry (`@ai-matrx/design-system/clipboard-fallback-dialog`, ...). A summon overlay render imports the\n * body entry directly and never pays for the wrapper.\n *\n * - closed and never opened: renders nothing and loads nothing;\n * - first open: loads the body (one small chunk) and draws it; until it arrives, nothing (the same\n * frame a closed dialog draws);\n * - after that it stays mounted, so the body's own close animation and state behave exactly as before.\n *\n * Guarded by `src/root-entry-has-no-dialog-bodies.test.ts` (source graph) and\n * `scripts/check-root-has-no-dialog-bodies.mjs` (built dist, run by `pnpm build`).\n */\n\nimport * as React from \"react\";\n\nexport type DeferredDialog<P extends object> = React.FC<P> & {\n /** Start loading the body now (a host may call it on hover or idle). */\n preload: () => Promise<unknown>;\n};\n\nexport function deferredDialog<P extends object>(\n name: string,\n load: () => Promise<React.ComponentType<P>>,\n isOpen: (props: P) => boolean,\n): DeferredDialog<P> {\n let pending: Promise<{ default: React.ComponentType<P> }> | null = null;\n const preload = () => (pending ??= load().then((component) => ({ default: component })));\n const Body = React.lazy(preload) as unknown as React.ComponentType<P>;\n\n function Deferred(props: P) {\n const open = isOpen(props);\n const [opened, setOpened] = React.useState(open);\n if (open && !opened) setOpened(true);\n if (!open && !opened) return null;\n return (\n <React.Suspense fallback={null}>\n <Body {...props} />\n </React.Suspense>\n );\n }\n Deferred.displayName = name;\n return Object.assign(Deferred, { preload });\n}\n","\"use client\";\n\n/**\n * The root entry's request dialogs: each is a `deferredDialog` whose body is its own entry, so the\n * root (in every app's first load) carries none of them. Import a body directly from its entry when\n * you draw it inside something that is already lazy (a summon overlay render):\n *\n * import { ClipboardFallbackDialog } from \"@ai-matrx/design-system/clipboard-fallback-dialog\";\n *\n * Only `import type` from a body file is allowed here; a value import would put the body back in the\n * root (guarded by root-entry-has-no-dialog-bodies.test.ts and check-root-has-no-dialog-bodies.mjs).\n */\n\nimport { deferredDialog } from \"./deferred-dialog\";\nimport type { AuthGateDialogProps } from \"./auth-gate-dialog\";\nimport type { ClipboardFallbackDialogProps } from \"./clipboard-fallback-dialog\";\nimport type { EmailInputDialogProps } from \"./email-input-dialog\";\nimport type { SandboxGateDialogProps } from \"./sandbox-gate-dialog\";\nimport type { ScopeMismatchDialogProps } from \"./scope-mismatch-dialog\";\nimport type { TextInputDialogProps } from \"./text-input-dialog\";\nimport type { ValuePromptsDialogProps } from \"./value-prompts-dialog\";\n\nexport const ClipboardFallbackDialog = deferredDialog<ClipboardFallbackDialogProps>(\n \"ClipboardFallbackDialog\",\n () => import(\"./clipboard-fallback-dialog\").then((m) => m.ClipboardFallbackDialog),\n (p) => p.open,\n);\n\nexport const AuthGateDialog = deferredDialog<AuthGateDialogProps>(\n \"AuthGateDialog\",\n () => import(\"./auth-gate-dialog\").then((m) => m.AuthGateDialog),\n (p) => p.isOpen,\n);\n\nexport const EmailInputDialog = deferredDialog<EmailInputDialogProps>(\n \"EmailInputDialog\",\n () => import(\"./email-input-dialog\").then((m) => m.EmailInputDialog),\n (p) => p.isOpen,\n);\n\nexport const SandboxGateDialog = deferredDialog<SandboxGateDialogProps>(\n \"SandboxGateDialog\",\n () => import(\"./sandbox-gate-dialog\").then((m) => m.SandboxGateDialog),\n (p) => p.open,\n);\n\nexport const ScopeMismatchDialog = deferredDialog<ScopeMismatchDialogProps>(\n \"ScopeMismatchDialog\",\n () => import(\"./scope-mismatch-dialog\").then((m) => m.ScopeMismatchDialog),\n (p) => p.open,\n);\n\nexport const ValuePromptsDialog = deferredDialog<ValuePromptsDialogProps>(\n \"ValuePromptsDialog\",\n () => import(\"./value-prompts-dialog\").then((m) => m.ValuePromptsDialog),\n (p) => p.open,\n);\n\nexport const TextInputDialog = deferredDialog<TextInputDialogProps>(\n \"TextInputDialog\",\n () => import(\"./text-input-dialog\").then((m) => m.TextInputDialog),\n (p) => p.open,\n);\n","\"use client\";\n\n/**\n * `<ClipboardFallbackHost />` — render ONCE near the root (beside `<ConfirmDialogHost />`) so\n * `openClipboardFallback()` from `@ai-matrx/kit/clipboard-fallback-opener` always has a dialog to show.\n * The opener is kit's (pure TS); this is the body: `ClipboardFallbackDialog` for the active request.\n */\nimport { clipboardFallbackOpener } from \"@ai-matrx/kit/clipboard-fallback-opener\";\nimport { useOpenerHost } from \"@ai-matrx/kit/opener-react\";\n\n// The deferred wrapper: mounted at the root, the host must not carry the dialog body into first load.\nimport { ClipboardFallbackDialog } from \"./deferred-dialogs\";\n\nexport function ClipboardFallbackHost() {\n const { open, shown, settle } = useOpenerHost(clipboardFallbackOpener);\n return (\n <ClipboardFallbackDialog\n open={open}\n onOpenChange={(next) => {\n if (!next) settle(undefined);\n }}\n url={shown?.text ?? \"\"}\n {...(shown?.title ? { title: shown.title } : {})}\n {...(shown?.description ? { description: shown.description } : {})}\n />\n );\n}\n","\"use client\";\nimport React, { useState, useEffect, type ReactNode, useCallback, useRef } from \"react\";\nimport { PANEL_MOTION_CLASS } from \"./motion\";\n\n// Define type for the component props\n// Moved from matrx-frontend components/official/FloatingSheet (chat host slots, 2026-10-08).\nexport interface FloatingSheetProps {\n children: ReactNode;\n isOpen: boolean;\n onClose: () => void;\n title?: string | ReactNode;\n description?: string | ReactNode;\n footer?: ReactNode;\n footerContent?: ReactNode; // Alternative to footer for consistency with headerContent\n headerContent?: ReactNode; // Additional content to render in the header\n position?: \"right\" | \"left\" | \"top\" | \"bottom\" | \"center\";\n showCloseButton?: boolean;\n closeOnBackdropClick?: boolean;\n closeOnEsc?: boolean; // Close the sheet when ESC key is pressed\n /**\n * The sheet holds unsent work (a composer draft): Escape and a backdrop\n * click are consumed and the sheet stays open, so a stray key or click\n * never discards it. The close button and the caller's own close still work.\n */\n holdsUnsentWork?: boolean;\n width?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"4xl\" | \"full\";\n height?: \"auto\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"4xl\" | \"full\";\n spacing?: string;\n rounded?: string;\n className?: string;\n contentClassName?: string;\n headerClassName?: string; // Class name for the header\n footerClassName?: string; // Class name for the footer\n backdropClassName?: string; // Class name for the backdrop\n initialFocus?: boolean; // Automatically focus the sheet when opened\n lockScroll?: boolean; // Whether to lock body scroll when opened\n preserveScrollPosition?: boolean; // Preserve scroll position when reopening\n closeButton?: ReactNode; // Custom close button element\n role?: string; // ARIA role (defaults to \"dialog\")\n hasBackdrop?: boolean; // Whether to show a backdrop behind the sheet\n onBackdropClick?: () => void; // Handler for backdrop clicks\n isMobile?: boolean; // Flag to enable mobile-friendly mode\n respectHeader?: boolean; // Whether to position below the app header (default: true)\n}\n\nexport const FloatingSheet: React.FC<FloatingSheetProps> = ({\n children,\n isOpen,\n onClose,\n title = \"Sheet Title\",\n description,\n footer,\n footerContent,\n headerContent,\n position = \"right\",\n showCloseButton = true,\n closeOnBackdropClick = true,\n closeOnEsc = true,\n holdsUnsentWork = false,\n width = \"md\",\n height = \"auto\",\n spacing = \"0\",\n rounded = \"2xl\",\n className = \"\",\n contentClassName = \"\",\n headerClassName = \"\",\n footerClassName = \"\",\n backdropClassName = \"\",\n initialFocus = true,\n lockScroll = true,\n preserveScrollPosition = true,\n closeButton,\n role = \"dialog\",\n hasBackdrop = true,\n onBackdropClick,\n isMobile = false,\n respectHeader = true, // Default to true - sheets should respect the header by default\n}) => {\n // Create a state to track if the component has been initially rendered\n const [hasRendered, setHasRendered] = useState(false);\n // Refs for focusing and scroll preservation\n const sheetRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [scrollPosition, setScrollPosition] = useState(0);\n \n // Handle initial render\n useEffect(() => {\n if (!hasRendered) {\n setHasRendered(true);\n }\n }, []);\n \n // Handle body scroll locking when sheet is open\n useEffect(() => {\n if (!lockScroll) return undefined;\n if (isOpen) {\n // Store current scroll position before locking\n const scrollY = window.scrollY;\n document.body.style.position = \"fixed\";\n document.body.style.width = \"100%\";\n document.body.style.top = `-${scrollY}px`;\n document.body.style.overflow = \"hidden\";\n } else {\n // Restore scroll position after unlocking\n const scrollY = document.body.style.top;\n document.body.style.position = \"\";\n document.body.style.width = \"\";\n document.body.style.top = \"\";\n document.body.style.overflow = \"\";\n if (scrollY) {\n window.scrollTo(0, parseInt(scrollY || \"0\", 10) * -1);\n }\n }\n return () => {\n document.body.style.position = \"\";\n document.body.style.width = \"\";\n document.body.style.top = \"\";\n document.body.style.overflow = \"\";\n };\n }, [isOpen, lockScroll]);\n \n // Handle ESC key press\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // One Escape closes ONE layer: a menu, sheet or dialog open inside\n // this sheet already took it (Radix marks it defaultPrevented).\n if (e.key === \"Escape\" && isOpen && closeOnEsc && !e.defaultPrevented) {\n // Unsent work inside: this layer takes the key and stays.\n if (holdsUnsentWork) {\n e.preventDefault();\n return;\n }\n onClose();\n }\n };\n if (isOpen && closeOnEsc) {\n document.addEventListener(\"keydown\", handleKeyDown);\n }\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen, closeOnEsc, holdsUnsentWork, onClose]);\n \n // Handle focus management for accessibility\n useEffect(() => {\n if (isOpen && initialFocus && sheetRef.current) {\n sheetRef.current.focus();\n }\n }, [isOpen, initialFocus]);\n \n // Handle scroll position preservation\n useEffect(() => {\n if (isOpen && contentRef.current && preserveScrollPosition) {\n contentRef.current.scrollTop = scrollPosition;\n }\n }, [isOpen, preserveScrollPosition, scrollPosition]);\n \n // Save scroll position when closing\n useEffect(() => {\n if (!isOpen && contentRef.current && preserveScrollPosition) {\n setScrollPosition(contentRef.current.scrollTop);\n }\n }, [isOpen, preserveScrollPosition]);\n \n // Function to close the sheet when clicking backdrop\n const handleBackdropClick = useCallback(() => {\n // Unsent work inside: a click outside never discards it.\n if (holdsUnsentWork) return;\n if (onBackdropClick) {\n onBackdropClick();\n } else if (closeOnBackdropClick) {\n onClose();\n }\n }, [closeOnBackdropClick, onClose, onBackdropClick, holdsUnsentWork]);\n \n // Determine max width based on the width prop\n const getWidthClass = () => {\n // For mobile mode, ignore width prop and use full width\n if (isMobile) {\n return \"max-w-full w-full\";\n }\n \n const widthMap: Record<string, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-xl\",\n \"2xl\": \"max-w-2xl\",\n \"3xl\": \"max-w-3xl\",\n \"4xl\": \"max-w-4xl\",\n full: \"max-w-full\",\n };\n \n // For top/bottom positions, use full width by default unless explicitly set\n if ((position === \"top\" || position === \"bottom\") && width === \"md\") {\n return \"max-w-full\";\n }\n \n return widthMap[width] || \"max-w-md\";\n };\n \n // Determine height for top/bottom/center positions\n const getHeightClass = () => {\n // For mobile mode with bottom position, use dvh and account for safe area\n if (isMobile && position === \"bottom\") {\n return \"max-h-[90dvh]\";\n }\n \n // For mobile mode with full screen (other positions), use dvh units\n if (isMobile && position !== \"bottom\") {\n // If respecting header, height is already constrained by top-10 bottom-0\n return respectHeader ? \"\" : \"h-dvh\";\n }\n \n // For right/left positions, height is controlled by top/bottom positioning\n // No explicit height class needed as it stretches between top and bottom\n if (position === \"right\" || position === \"left\") {\n return \"\";\n }\n \n // For top/bottom/center positions, use dvh units\n // When respectHeader is true, available height is 100dvh - 2.5rem (header height)\n const heightMap: Record<string, string> = {\n sm: \"max-h-[20dvh]\",\n md: \"max-h-[40dvh]\",\n lg: \"max-h-[60dvh]\",\n xl: \"max-h-[70dvh]\",\n \"2xl\": \"max-h-[80dvh]\",\n \"3xl\": \"max-h-[85dvh]\",\n \"4xl\": \"max-h-[90dvh]\",\n full: respectHeader ? \"max-h-[calc(100dvh-2.5rem)]\" : \"max-h-dvh\",\n auto: position === \"center\" \n ? (respectHeader ? \"max-h-[calc(85dvh-2.5rem)]\" : \"max-h-[85dvh]\")\n : (respectHeader ? \"max-h-[calc(50dvh-2.5rem)]\" : \"max-h-[50dvh]\"),\n };\n \n return heightMap[height] || heightMap.auto;\n };\n \n // Determine position classes\n const getPositionClasses = () => {\n // For mobile mode, use full screen positioning\n if (isMobile) {\n // For bottom sheet on mobile, position at the bottom with no spacing\n if (position === \"bottom\") {\n return \"inset-x-0 bottom-0\";\n }\n \n // For other positions on mobile, respect header if enabled\n if (respectHeader) {\n return \"inset-x-0 top-10 bottom-0\";\n }\n return \"inset-0\";\n }\n \n // Map spacing values to actual Tailwind classes\n // When respectHeader is true, use top-10 (header height) instead of regular top spacing\n const spacingClasses: Record<string, { top: string; bottom: string; left: string; right: string }> = {\n \"0\": { \n top: respectHeader ? \"top-10\" : \"top-0\", \n bottom: \"bottom-0\", \n left: \"left-0\", \n right: \"right-0\" \n },\n \"1\": { \n top: respectHeader ? \"top-[2.75rem]\" : \"top-1\", \n bottom: \"bottom-1\", \n left: \"left-1\", \n right: \"right-1\" \n },\n \"2\": { \n top: respectHeader ? \"top-[3rem]\" : \"top-2\", \n bottom: \"bottom-2\", \n left: \"left-2\", \n right: \"right-2\" \n },\n \"3\": { \n top: respectHeader ? \"top-[3.25rem]\" : \"top-3\", \n bottom: \"bottom-3\", \n left: \"left-3\", \n right: \"right-3\" \n },\n \"4\": { \n top: respectHeader ? \"top-[3.5rem]\" : \"top-4\", \n bottom: \"bottom-4\", \n left: \"left-4\", \n right: \"right-4\" \n },\n \"5\": { \n top: respectHeader ? \"top-[3.75rem]\" : \"top-5\", \n bottom: \"bottom-5\", \n left: \"left-5\", \n right: \"right-5\" \n },\n \"6\": { \n top: respectHeader ? \"top-[4rem]\" : \"top-6\", \n bottom: \"bottom-6\", \n left: \"left-6\", \n right: \"right-6\" \n },\n \"8\": { \n top: respectHeader ? \"top-[4.5rem]\" : \"top-8\", \n bottom: \"bottom-8\", \n left: \"left-8\", \n right: \"right-8\" \n },\n };\n \n const classes = spacingClasses[spacing] ?? spacingClasses[\"0\"]!;\n \n const positionMap: Record<string, string> = {\n right: `${classes.top} ${classes.bottom} ${classes.right}`,\n left: `${classes.top} ${classes.bottom} ${classes.left}`,\n top: `${classes.top} ${classes.left} ${classes.right}`,\n bottom: `${classes.bottom} ${classes.left} ${classes.right}`,\n center: respectHeader ? \"left-0 right-0 top-10 bottom-0 flex items-center justify-center\" : \"inset-0 flex items-center justify-center\",\n };\n \n return positionMap[position] || `${classes.top} ${classes.bottom} ${classes.right}`;\n };\n \n // Determine transform classes for animations\n const getTransformClass = () => {\n // For mobile mode\n if (isMobile) {\n // For bottom sheet on mobile, slide up from bottom\n if (position === \"bottom\") {\n return isOpen ? \"translate-y-0\" : \"translate-y-full\";\n }\n \n // For other positions on mobile, fade in/out\n return isOpen ? \"opacity-100\" : \"opacity-0\";\n }\n \n const transformMap: Record<string, string> = {\n right: isOpen ? \"translate-x-0\" : \"translate-x-full\",\n left: isOpen ? \"translate-x-0\" : \"-translate-x-full\",\n top: isOpen ? \"translate-y-0\" : \"-translate-y-full\",\n bottom: isOpen ? \"translate-y-0\" : \"translate-y-full\",\n center: isOpen ? \"scale-100 opacity-100\" : \"scale-95 opacity-0\", // Scale + fade for center modal\n };\n \n return transformMap[position] || (isOpen ? \"translate-x-0\" : \"translate-x-full\");\n };\n \n // Determine rounded corners for mobile\n const getRoundedClass = () => {\n if (isMobile) {\n // For bottom sheet, only round the top corners\n if (position === \"bottom\") {\n return \"rounded-t-xl\";\n }\n \n // For full screen on mobile, no rounded corners\n return \"\";\n }\n \n // When spacing is 0 (flush against edges), only round the corners that don't touch edges\n if (spacing === \"0\") {\n const positionRoundedMap: Record<string, string> = {\n \"right\": \"rounded-l-2xl\", // Only round left side\n \"left\": \"rounded-r-2xl\", // Only round right side\n \"top\": \"rounded-b-2xl\", // Only round bottom\n \"bottom\": \"rounded-t-2xl\", // Only round top\n \"center\": \"rounded-2xl\", // Center modals get all corners rounded\n };\n return positionRoundedMap[position] || \"rounded-l-2xl\";\n }\n \n // Map rounded values to actual Tailwind classes for floating sheets (with spacing)\n const roundedMap: Record<string, string> = {\n \"none\": \"rounded-none\",\n \"sm\": \"rounded-sm\",\n \"md\": \"rounded-md\",\n \"lg\": \"rounded-lg\",\n \"xl\": \"rounded-xl\",\n \"2xl\": \"rounded-2xl\",\n \"3xl\": \"rounded-3xl\",\n \"full\": \"rounded-full\",\n };\n \n return roundedMap[rounded] || \"rounded-2xl\";\n };\n \n // Get duration class for animations\n \n const positionClasses = getPositionClasses();\n const widthClass = getWidthClass();\n const heightClass = getHeightClass();\n const transformClass = getTransformClass();\n const roundedClass = getRoundedClass();\n // THE panel motion (motion-standard law) — one pace for every sheet.\n const durationClass = PANEL_MOTION_CLASS;\n \n // Determine if we need to show the header\n const showHeader = title || showCloseButton || headerContent;\n // Determine if we need to show the footer\n const showFooter = footer || footerContent;\n \n // Determine explicit height class for the sheet container\n // For right/left positions with top/bottom positioning, height is implicit\n // For other positions or when height is explicitly set, use the height class\n const getSheetHeightClass = () => {\n // For right/left positions, height is controlled by top/bottom positioning\n if ((position === \"right\" || position === \"left\") && respectHeader) {\n return \"\"; // No explicit height - let top/bottom control it\n }\n \n // For mobile full-screen (not bottom sheet)\n if (isMobile && position !== \"bottom\") {\n return \"h-full\";\n }\n \n // For bottom sheets on mobile or other positions, height is controlled differently\n return \"h-full\";\n };\n \n // Mobile-specific header styles\n const getMobileHeaderClass = () => {\n if (isMobile) {\n return \"sticky top-0 bg-muted z-10 px-4 py-4\";\n }\n return \"px-4 py-3\";\n };\n \n // Mobile-specific footer styles\n const getMobileFooterClass = () => {\n if (isMobile) {\n return \"sticky bottom-0 bg-muted z-10 px-4 py-4 pb-safe mt-auto\";\n }\n return \"px-4 pt-2 pb-6 pb-safe\";\n };\n \n // Content padding - add pb-safe when there's no footer\n const getContentPaddingClass = () => {\n const basePadding = isMobile ? \"px-4 py-4\" : \"\";\n const bottomPadding = showFooter ? \"\" : \"pb-safe\";\n return `${basePadding} ${bottomPadding}`.trim();\n };\n \n // CRITICAL: We always render the sheet regardless of isOpen state\n // This ensures state is preserved inside sheet contents\n return (\n <>\n {/* Backdrop - Only shown when open, respects header if enabled */}\n {isOpen && hasBackdrop && (\n <div\n className={`fixed ${respectHeader ? \"left-0 right-0 top-10 bottom-0\" : \"inset-0\"} bg-[var(--matrx-overlay-scrim-soft)] z-40 ${isMobile ? \"backdrop-blur-sm\" : \"\"} transition-opacity ${durationClass} ${backdropClassName}`}\n onClick={handleBackdropClick}\n aria-hidden=\"true\"\n data-testid=\"floating-sheet-backdrop\"\n />\n )}\n \n {/* Sheet - Always rendered but display and position controlled by CSS */}\n <div\n ref={sheetRef}\n className={`fixed ${positionClasses} z-50 ${\n isMobile || position === \"center\" ? \"\" : \"w-full\"\n } ${widthClass} ${heightClass} ${roundedClass} bg-textured shadow-xl transition-[transform,translate,scale,opacity] ${durationClass} ${transformClass} ${\n isOpen ? \"pointer-events-auto\" : \"pointer-events-none\"\n } ${getSheetHeightClass()} outline-none ${className}`}\n role={role}\n aria-modal={isOpen}\n aria-hidden={!isOpen}\n inert={!isOpen}\n aria-labelledby=\"sheet-title\"\n tabIndex={-1}\n data-testid=\"floating-sheet\"\n >\n <div className=\"flex flex-col h-full overflow-hidden\">\n {/* Header - Only show if title exists or showCloseButton is true or headerContent exists */}\n {showHeader && (\n <div\n className={`flex items-center justify-between border-b border-border ${getMobileHeaderClass()} ${headerClassName}`}\n >\n <div className=\"flex-1 min-w-0\">\n {typeof title === \"string\" ? (\n <h2 id=\"sheet-title\" className={`${isMobile ? \"text-xl\" : \"text-lg\"} font-semibold text-foreground`}>\n {title}\n </h2>\n ) : (\n <div id=\"sheet-title\">{title}</div>\n )}\n {description &&\n (typeof description === \"string\" ? (\n <p className=\"type-body text-muted-foreground mt-1\">{description}</p>\n ) : (\n <div className=\"mt-1\">{description}</div>\n ))}\n </div>\n {headerContent && <div className=\"ml-4 flex items-center\">{headerContent}</div>}\n {showCloseButton && (\n <button\n onClick={onClose}\n className={`ml-4 rounded-full ${isMobile ? \"p-2\" : \"p-1.5\"} text-muted-foreground hover:text-foreground bg-transparent hover:bg-accent focus:outline-none focus:ring-2 focus:ring-ring`}\n aria-label=\"Close\"\n data-testid=\"floating-sheet-close\"\n >\n {closeButton || (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={`${isMobile ? \"h-6 w-6\" : \"h-5 w-5\"}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n )}\n </button>\n )}\n </div>\n )}\n \n {/* Content area */}\n <div \n ref={contentRef} \n className={`flex-1 overflow-y-auto ${getContentPaddingClass()} ${contentClassName}`} \n data-testid=\"floating-sheet-content\"\n >\n {children}\n </div>\n \n {/* Footer - Only render if provided */}\n {showFooter && (\n <div\n className={`border-t border-border ${getMobileFooterClass()} ${footerClassName}`}\n data-testid=\"floating-sheet-footer\"\n >\n {footer || footerContent}\n </div>\n )}\n </div>\n </div>\n </>\n );\n};\n\nexport default FloatingSheet;\n","\"use client\";\n\n// SimpleTooltip / AdvancedTooltip — moved whole from rich-content/utils/lifted + matrx-frontend components/matrx/Tooltip (one implementation, 2026-10-21).\nimport React from \"react\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\n\ntype SimpleTooltipProps = {\n children: React.ReactNode;\n text?: string;\n};\n\ntype AdvancedTooltipProps = {\n children: React.ReactNode;\n text?: string;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"center\" | \"start\" | \"end\";\n delayDuration?: number;\n className?: string;\n sideOffset?: number;\n contentClassName?: string;\n disabled?: boolean;\n variant?: \"default\" | \"error\" | \"warning\" | \"success\";\n};\n\nexport const SimpleTooltip = ({ children, text }: SimpleTooltipProps) => {\n if (!text) return children;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent>\n <p>{text}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n\nexport const AdvancedTooltip = ({\n children,\n text,\n side = \"top\",\n align = \"center\",\n delayDuration = 200,\n className = \"\",\n sideOffset = 4,\n contentClassName = \"\",\n disabled = false,\n variant = \"default\",\n}: AdvancedTooltipProps) => {\n if (!text || disabled) return children;\n\n const variantStyles = {\n default: 'bg-popover text-popover-foreground',\n error: 'bg-destructive text-destructive-foreground',\n warning: 'bg-warning text-warning-foreground',\n success: 'bg-success text-success-foreground',\n };\n\n const baseContentClasses =\n \"rounded-md px-3 py-1.5 text-sm shadow-md\";\n\n return (\n <Tooltip delayDuration={delayDuration}>\n <TooltipTrigger asChild className={className}>\n {children}\n </TooltipTrigger>\n <TooltipContent\n side={side}\n align={align}\n sideOffset={sideOffset}\n className={`${baseContentClasses} ${variantStyles[variant]} ${contentClassName}`}\n >\n <p /* rich-content-exempt: tooltip or title text, plain by design */ className=\"leading-none whitespace-pre-wrap\">{text}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n","\"use client\";\n\n// Moved whole from rich-content/utils/lifted + matrx-frontend components/ui/loading-spinner (one implementation, 2026-10-21).\n\nimport React from 'react';\nimport { cn } from './cn';\nimport { Loader2Icon, PlusIcon, WorkflowIcon } from './icons';\n\n// Animation styles (inline to avoid external CSS dependency)\nconst animationStyles = `\n @keyframes pulseWave {\n 0% { opacity: 0.3; transform: scale(0.8); }\n 50% { opacity: 1; transform: scale(1); }\n 100% { opacity: 0.3; transform: scale(0.8); }\n }\n \n @keyframes bounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-5px); }\n }\n \n @keyframes neuronPulse {\n 0% { transform: scale(0.8); opacity: 0.3; }\n 40% { transform: scale(1.4); opacity: 1; }\n 80% { transform: scale(0.8); opacity: 0.3; }\n 100% { transform: scale(0.8); opacity: 0.3; }\n }\n \n @keyframes brainWavePulse {\n 0% { transform: scale(0.8); opacity: 0; }\n 20% { opacity: 0.2; }\n 50% { transform: scale(1.5); opacity: 0; }\n 100% { transform: scale(1.8); opacity: 0; }\n }\n \n .loading-pulse-1 { animation: pulseWave 1.5s infinite ease-in-out; animation-delay: 0s; }\n .loading-pulse-2 { animation: pulseWave 1.5s infinite ease-in-out; animation-delay: 0.3s; }\n .loading-pulse-3 { animation: pulseWave 1.5s infinite ease-in-out; animation-delay: 0.6s; }\n \n .loading-bounce-1 { animation: bounce 1s infinite ease-in-out; animation-delay: 0s; }\n .loading-bounce-2 { animation: bounce 1s infinite ease-in-out; animation-delay: 0.2s; }\n .loading-bounce-3 { animation: bounce 1s infinite ease-in-out; animation-delay: 0.4s; }\n .loading-bounce-4 { animation: bounce 1s infinite ease-in-out; animation-delay: 0.6s; }\n \n .loading-neuron-1 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 0s; }\n .loading-neuron-2 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 0.4s; }\n .loading-neuron-3 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 0.8s; }\n .loading-neuron-4 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 1.2s; }\n .loading-neuron-5 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 1.6s; }\n \n .loading-brain-pulse-1 { animation: brainWavePulse 2s infinite ease-in-out; animation-delay: 0s; }\n .loading-brain-pulse-2 { animation: brainWavePulse 2s infinite ease-in-out; animation-delay: 0.5s; }\n`;\n\ntype LoadingVariant = 'dots' | 'bars' | 'brain' | 'minimal' | 'workflow';\ntype LoadingSize = 'sm' | 'md' | 'lg';\n\ninterface LoadingSpinnerProps {\n variant?: LoadingVariant;\n size?: LoadingSize;\n message?: string;\n className?: string;\n showMessage?: boolean;\n // Workflow variant specific props\n fullscreen?: boolean;\n overlay?: boolean;\n title?: string;\n subtitle?: string;\n showProgressSteps?: boolean;\n}\n\nconst LoadingSpinner: React.FC<LoadingSpinnerProps> = ({\n variant = 'dots',\n size = 'md',\n message,\n className = \"\",\n showMessage = true,\n fullscreen = false,\n overlay = false,\n title,\n subtitle,\n showProgressSteps = true\n}) => {\n // Inject styles\n React.useEffect(() => {\n const styleId = 'loading-spinner-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = animationStyles;\n document.head.appendChild(style);\n }\n }, []);\n\n const getSizeClasses = () => {\n switch (size) {\n case 'sm': return { container: 'gap-2', dot: 'w-1.5 h-1.5', bar: 'w-0.5 h-2', text: 'text-xs' };\n case 'lg': return { container: 'gap-4', dot: 'w-2.5 h-2.5', bar: 'w-1.5 h-4', text: 'text-base' };\n default: return { container: 'gap-3', dot: 'w-2 h-2', bar: 'w-1 h-2.5', text: 'text-sm' };\n }\n };\n\n const sizeClasses = getSizeClasses();\n\n const renderDots = () => (\n <div className={cn(\"flex items-center\", sizeClasses.container)}>\n <div className={cn(sizeClasses.dot, \"bg-primary dark:bg-primary-foreground rounded-full loading-pulse-1\")}></div>\n <div className={cn(sizeClasses.dot, \"bg-primary dark:bg-primary-foreground rounded-full loading-pulse-2\")}></div>\n <div className={cn(sizeClasses.dot, \"bg-primary dark:bg-primary-foreground rounded-full loading-pulse-3\")}></div>\n </div>\n );\n\n const renderBars = () => (\n <div className={cn(\"flex items-center\", sizeClasses.container)}>\n <div className={cn(sizeClasses.bar, \"bg-primary dark:bg-primary-foreground rounded-sm loading-bounce-1\")}></div>\n <div className={cn(sizeClasses.bar, \"bg-primary dark:bg-primary-foreground rounded-sm loading-bounce-2\")}></div>\n <div className={cn(sizeClasses.bar, \"bg-primary dark:bg-primary-foreground rounded-sm loading-bounce-3\")}></div>\n <div className={cn(sizeClasses.bar, \"bg-primary dark:bg-primary-foreground rounded-sm loading-bounce-4\")}></div>\n </div>\n );\n\n const renderBrain = () => (\n <div className=\"relative w-6 h-6 flex items-center justify-center\">\n {/* Brain icon */}\n <div className=\"absolute\">\n <svg \n width=\"24\" \n height=\"24\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n className=\"w-5 h-5 text-primary dark:text-primary-foreground\"\n >\n <path \n d=\"M12 4C9.5 4 7.5 5.5 7.5 8C7.5 9 7.5 9.5 7 10.5C6.5 11.5 6 12 6 13.5C6 15.5 7.5 17 9.5 17C10.5 17 11 16.5 12 16.5C13 16.5 13.5 17 14.5 17C16.5 17 18 15.5 18 13.5C18 12 17.5 11.5 17 10.5C16.5 9.5 16.5 9 16.5 8C16.5 5.5 14.5 4 12 4Z\" \n className=\"stroke-current\"\n fill=\"none\"\n strokeWidth=\"1.5\"\n />\n </svg>\n </div>\n \n {/* Neural connection dots */}\n <div className=\"absolute inset-0\">\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[8px] top-[10px] loading-neuron-1\"></div>\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[12px] top-[8px] loading-neuron-2\"></div>\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[16px] top-[10px] loading-neuron-3\"></div>\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[10px] top-[14px] loading-neuron-4\"></div>\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[14px] top-[14px] loading-neuron-5\"></div>\n </div>\n \n {/* Pulse waves */}\n <div className=\"absolute w-full h-full rounded-full border border-primary/30 dark:border-primary-foreground/30 loading-brain-pulse-1\"></div>\n <div className=\"absolute w-full h-full rounded-full border border-primary/30 dark:border-primary-foreground/30 loading-brain-pulse-2\"></div>\n </div>\n );\n\n const renderMinimal = () => (\n <div className=\"relative\">\n <div className={cn(sizeClasses.dot, \"bg-primary dark:bg-primary-foreground rounded-full loading-pulse-1\")}></div>\n </div>\n );\n\n const renderWorkflow = () => (\n <div className=\"flex flex-col items-center justify-center space-y-6\">\n {/* Icon animation */}\n <div className=\"relative\">\n <div className=\"w-16 h-16 bg-primary/10 dark:bg-primary-foreground/10 rounded-full flex items-center justify-center\">\n <WorkflowIcon className=\"w-8 h-8 text-primary dark:text-primary-foreground\" />\n </div>\n {/* Plus icon animation */}\n <div className=\"absolute -top-1 -right-1 w-6 h-6 bg-primary dark:bg-primary-foreground rounded-full flex items-center justify-center\">\n <PlusIcon className=\"w-3 h-3 text-primary-foreground dark:text-primary\" />\n </div>\n {/* Spinning ring */}\n <div className=\"absolute inset-0 border-2 border-transparent border-t-primary dark:border-t-primary-foreground rounded-full matrx-spin\" />\n </div>\n \n {/* Loading text */}\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold text-foreground flex items-center gap-2 justify-center\">\n <Loader2Icon className=\"w-4 h-4 matrx-spin\" />\n {title || 'Loading Workflow'}\n </h2>\n <p className=\"type-body text-muted-foreground max-w-sm\">\n {subtitle || message || 'Setting up your workflow...'}\n </p>\n </div>\n\n {/* Progress steps */}\n {showProgressSteps && (\n <div className=\"flex items-center gap-2 type-secondary text-muted-foreground\">\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-primary dark:bg-primary-foreground rounded-full matrx-pulse\" />\n <span>Loading</span>\n </div>\n <div className=\"w-4 h-px bg-muted-foreground/30\" />\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-muted-foreground/30 rounded-full\" />\n <span>Initializing</span>\n </div>\n <div className=\"w-4 h-px bg-muted-foreground/30\" />\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-muted-foreground/30 rounded-full\" />\n <span>Ready</span>\n </div>\n </div>\n )}\n </div>\n );\n\n const renderSpinner = () => {\n switch (variant) {\n case 'bars': return renderBars();\n case 'brain': return renderBrain();\n case 'minimal': return renderMinimal();\n case 'workflow': return renderWorkflow();\n default: return renderDots();\n }\n };\n\n const getDefaultMessage = () => {\n switch (variant) {\n case 'brain': return 'Processing...';\n case 'workflow': return 'Loading workflows...';\n default: return 'Loading...';\n }\n };\n\n // For workflow variant with fullscreen/overlay\n if (variant === 'workflow' && (fullscreen || overlay)) {\n return (\n <div className={cn(\n \"flex items-center justify-center bg-background\",\n fullscreen && \"h-dvh w-full\",\n className\n )}>\n {/* Overlay to prevent interactions */}\n {overlay && (\n <div className=\"absolute inset-0 bg-background/80 backdrop-blur-sm z-50\" />\n )}\n \n {/* Loading content */}\n <div className={cn(\n \"flex flex-col items-center justify-center\",\n overlay && \"relative z-50\"\n )}>\n {renderWorkflow()}\n </div>\n </div>\n );\n }\n\n // Default inline layout for other variants\n return (\n <div className={cn(\"flex items-center\", className)}>\n {variant === 'workflow' ? (\n renderWorkflow()\n ) : (\n <>\n {renderSpinner()}\n {showMessage && (\n <span className={cn(\"ml-3 text-muted-foreground\", sizeClasses.text)}>\n {message || getDefaultMessage()}\n </span>\n )}\n </>\n )}\n </div>\n );\n};\n\nexport { LoadingSpinner };","\"use client\";\n\n/** The \"Initializing Matrx...\" dots loader for Suspense fallbacks. */\nimport { LoadingSpinner } from \"./loading-spinner\";\n\nexport function MatrxMiniLoader() {\n return <LoadingSpinner variant=\"dots\" message=\"Initializing Matrx...\" size=\"md\" />;\n}\n","\"use client\";\n\nimport { Loader2Icon } from \"./icons\";\n\ninterface SuspenseLoaderProps {\n /** Size of the spinner */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n /** Whether to center in container */\n centered?: boolean;\n /** Context shown beside the spinner and announced as a live status. */\n message?: string;\n /** Custom className */\n className?: string;\n}\n\nconst sizeClasses = {\n xs: \"h-3 w-3\",\n sm: \"h-4 w-4\",\n md: \"h-6 w-6\",\n lg: \"h-8 w-8\",\n};\n\n/**\n * Minimal loading component for Suspense boundaries\n * Adaptable to any context with simple spinner animation. The spinner is the faded\n * `text-disabled-foreground` token (the app original was muted-foreground at opacity-50; the\n * text-color law forbids opacity on text, so the token carries the faded look).\n */\nexport function SuspenseLoader({\n size = \"sm\",\n centered = true,\n message,\n className = \"\",\n}: SuspenseLoaderProps) {\n const spinner = (\n <Loader2Icon\n className={`${sizeClasses[size]} matrx-spin text-disabled-foreground ${className}`}\n aria-hidden={message ? true : undefined}\n aria-label={message ? undefined : \"Loading\"}\n />\n );\n const content = message ? (\n <span\n className=\"inline-flex items-center gap-2\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {spinner}\n <span>{message}</span>\n </span>\n ) : (\n spinner\n );\n\n if (centered) {\n return (\n <div className=\"flex items-center justify-center w-full h-full min-h-[2rem]\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n","\"use client\";\n\n/**\n * ShimmerText\n *\n * A subtle left-to-right gradient sweep across a line of text — the standard\n * \"the server is working on it\" status look (e.g. \"Processing…\", \"Planning…\",\n * or a server status / interstitial message). Deliberately quiet: no spinner,\n * no progress bar, no layout drama — just the text shimmering in place.\n *\n * Single source of truth. The streaming markdown engine's pre-token state,\n * `AgentStatusIndicator`, and `AgentPlanningIndicator` all render through this\n * so the \"waiting for the server\" treatment is identical everywhere.\n *\n * Font size comes from `className` (callers pass e.g. `text-sm` / `text-[11px]`).\n * The sweep is a Web Animation started here, so no host CSS is required.\n */\n\nimport { cn } from \"./cn\";\nimport { useCallback, useRef } from \"react\";\n\nexport interface ShimmerTextProps {\n text: string;\n className?: string;\n}\n\n/**\n * The shimmer's look as inline style, derived from the label's own text color (`currentColor`): no\n * `hsl()` token wrap (a host whose theme variables are full color values reads that as invalid and\n * paints transparent text), no theme variable at all, and no utility class a host's Tailwind scan must\n * find in this package. Works in any host, whatever its color format.\n */\nexport const SHIMMER_STYLE = {\n backgroundImage:\n \"linear-gradient(90deg, color-mix(in srgb, currentColor 18%, transparent) 0%, currentColor 50%, color-mix(in srgb, currentColor 18%, transparent) 100%)\",\n backgroundSize: \"200% 100%\",\n WebkitBackgroundClip: \"text\",\n backgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n} as const;\n\n/**\n * Drives the left-to-right sweep with the Web Animations API, so the package\n * ships its own motion: no `@keyframes`, no Tailwind `animate-*` entry, no\n * stylesheet import required of the host. Respects reduced motion.\n */\nexport function useShimmerSweep<T extends HTMLElement>(durationMs = 2000) {\n const animationRef = useRef<Animation | null>(null);\n // Callback ref: the sweep (re)starts whenever the element mounts, including\n // elements that appear later (a chip that is conditionally rendered).\n return useCallback(\n (el: T | null) => {\n animationRef.current?.cancel();\n animationRef.current = null;\n if (!el || typeof el.animate !== \"function\") return;\n if (typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches) return;\n animationRef.current = el.animate(\n [{ backgroundPosition: \"0 0\" }, { backgroundPosition: \"-200% 0\" }],\n { duration: durationMs, iterations: Infinity, easing: \"linear\" },\n );\n // Canceling rejects `finished` with an AbortError; nothing awaits it, so mark it handled.\n animationRef.current.finished?.catch(() => {});\n },\n [durationMs],\n );\n}\n\nexport function ShimmerText({ text, className }: ShimmerTextProps) {\n const ref = useShimmerSweep<HTMLSpanElement>();\n return (\n <span\n ref={ref}\n className={cn(\"inline-block\", className)}\n style={SHIMMER_STYLE}\n >\n {text}\n </span>\n );\n}\n","// src/form-theme.ts — THE NAMED LOOKS A FORM MAY TAKE (lane TYPEFORM-DUP, 2026-10-07).\n//\n// A form's owner picks a font, a button and a background from fixed lists. They are OPTIONS, never\n// CSS: the store refuses any other word (`custom.form_theme_options`, which holds these same three\n// lists) and a host draws them only through `formThemeClasses`, so a form looks the same in the\n// builder's preview, on its public link and inside somebody else's site.\n//\n// Every class here is a token class (`bg-primary/5`, `text-primary`, `border-primary`), so light and\n// dark both come out right and the form's accent (the frame sets `--primary`) colors the button.\n\nexport const FORM_FONTS = [\"system\", \"serif\", \"rounded\", \"mono\"] as const;\nexport type FormFont = (typeof FORM_FONTS)[number];\n\nexport const FORM_BUTTON_STYLES = [\"solid\", \"outline\", \"pill\", \"square\"] as const;\nexport type FormButtonStyle = (typeof FORM_BUTTON_STYLES)[number];\n\nexport const FORM_BACKGROUNDS = [\"plain\", \"tinted\", \"muted\", \"picture\"] as const;\nexport type FormBackground = (typeof FORM_BACKGROUNDS)[number];\n\n/** What a person reads in the picker for each option. */\nexport const FORM_THEME_LABELS: {\n font: Record<FormFont, string>;\n button: Record<FormButtonStyle, string>;\n background: Record<FormBackground, string>;\n} = {\n font: { system: \"Clean\", serif: \"Classic\", rounded: \"Friendly\", mono: \"Typewriter\" },\n button: { solid: \"Solid\", outline: \"Outline\", pill: \"Pill\", square: \"Square\" },\n background: { plain: \"Plain\", tinted: \"Tinted\", muted: \"Soft gray\", picture: \"Picture\" },\n};\n\nconst FONT_CLASS: Record<FormFont, string> = {\n system: \"font-sans\",\n serif: \"font-serif\",\n rounded: \"font-sans [font-family:ui-rounded,'SF_Pro_Rounded','Nunito','Quicksand',system-ui,sans-serif]\",\n mono: \"font-mono\",\n};\n\nconst BUTTON_CLASS: Record<FormButtonStyle, string> = {\n solid: \"rounded-md\",\n outline: \"rounded-md border border-primary bg-transparent text-primary hover:bg-primary/10\",\n pill: \"rounded-full px-6\",\n square: \"rounded-none\",\n};\n\nconst BACKGROUND_CLASS: Record<FormBackground, string> = {\n plain: \"bg-background\",\n tinted: \"bg-primary/5\",\n muted: \"bg-muted\",\n picture: \"bg-cover bg-center bg-no-repeat\",\n};\n\nexport interface FormThemeChoice {\n font?: string | null;\n button?: string | null;\n background?: string | null;\n /** The public address of the background picture, as the store resolved it. */\n backgroundUrl?: string | null;\n}\n\nconst pick = <T extends string>(list: readonly T[], word: string | null | undefined, fallback: T): T =>\n word && (list as readonly string[]).includes(word) ? (word as T) : fallback;\n\n/**\n * The classes (and the one style) a form's theme becomes. An unknown word falls back to the first\n * option rather than drawing nothing — the store refuses unknown words on save, so this only meets\n * one from an older or hand-written form.\n */\nexport function formThemeClasses(theme: FormThemeChoice | null | undefined): {\n font: FormFont;\n button: FormButtonStyle;\n background: FormBackground;\n /** On the form's outermost surface. */\n surface: string;\n /** On every button the form draws (Next, Submit, Start). */\n buttonClass: string;\n /** Only for the picture background: the address as a CSS background. */\n surfaceStyle: { backgroundImage?: string };\n} {\n const font = pick(FORM_FONTS, theme?.font, \"system\");\n const button = pick(FORM_BUTTON_STYLES, theme?.button, \"solid\");\n let background = pick(FORM_BACKGROUNDS, theme?.background, \"plain\");\n const url = theme?.backgroundUrl?.trim() || null;\n if (background === \"picture\" && !url) background = \"plain\";\n return {\n font,\n button,\n background,\n surface: `${FONT_CLASS[font]} ${BACKGROUND_CLASS[background]}`,\n buttonClass: BUTTON_CLASS[button],\n surfaceStyle: background === \"picture\" && url ? { backgroundImage: `url(${JSON.stringify(url)})` } : {},\n };\n}\n","\"use client\";\n\n/**\n * FirstUseHint — a one-time coach mark anchored to the control a person should use first.\n *\n * CHAMPION: Apple TipKit's popover tip (iOS 17+/macOS 14+), with the beacon pulse that\n * Intercom/Appcues product tours put on their anchors. What we copy from TipKit:\n * · one short title + one secondary line, beside the thing it explains, with a tiny close;\n * · the tip is INVALIDATED BY THE ACTION it teaches (`.actionPerformed`): the first press on\n * the anchor learns it, no \"Got it\" ceremony;\n * · once learned it never shows again, persisted by the HOST (TipKit's datastore);\n * · eligibility rules (`when`) and no display before the store has loaded, so a person who\n * already learned it never sees a flash.\n * What we add: a soft three-beat pulse on the ONE control it teaches (box-shadow only, so nothing\n * moves) that fades out completely: never a resting ring, never a ring around a whole row. When the\n * anchor is a row of controls (any press in it learns the hint), `pulse` names the one control inside\n * it to pulse and point at. ONE line of copy, the non-obvious fact only (Arman 2026-10-14: a tip that\n * restates what the screen shows is a novel); the dismiss sits centered on that line. Reduced motion:\n * no pulse at all. The bubble floats in a portal, so the page never shifts.\n *\n * Persistence is injected (independence contract): a host wraps the app in\n * `<FirstUseHintProvider store>` backed by its per-person server-synced preferences. Without a\n * provider the hint still works for the session and says so once in the console.\n */\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\n\nimport { IconButton } from \"./icon-button\";\nimport { XIcon } from \"./icons\";\nimport { MOTION_HINT_BEACON } from \"./motion\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"./popover\";\n\n/** Slot budgets (common-docs interface-text-is-layout): a title is one short line, detail ≤60. */\nexport const FIRST_USE_HINT_TITLE_MAX = 32;\nexport const FIRST_USE_HINT_DETAIL_MAX = 60;\n\n/** Where the person's learned hints live. The host backs it with server-synced preferences. */\nexport interface FirstUseHintStore {\n /** False until the person's saved record has loaded; no hint shows before then. */\n ready: boolean;\n /** Ids this person has learned (picked the anchor, closed the hint, or pressed Escape). */\n learned: readonly string[];\n /** Record an id as learned, for good. */\n learn: (id: string) => void;\n}\n\nconst FirstUseHintContext = React.createContext<FirstUseHintStore | null>(null);\n\nexport function FirstUseHintProvider({\n store,\n children,\n}: {\n store: FirstUseHintStore;\n children: React.ReactNode;\n}) {\n return <FirstUseHintContext.Provider value={store}>{children}</FirstUseHintContext.Provider>;\n}\n\n// Session-only fallback when no provider is mounted. Announced once, never silent.\nconst sessionLearned = new Set<string>();\nlet warnedNoProvider = false;\n\n/**\n * Whether hint `id` should show, and `learn()` to retire it. Use it to retire a hint from a\n * press that happens OUTSIDE its anchor (e.g. any row's choice, not only the first one).\n */\nexport function useFirstUseHint(id: string): { visible: boolean; learn: () => void } {\n const store = React.useContext(FirstUseHintContext);\n const [, rerender] = React.useReducer((n: number) => n + 1, 0);\n const [dismissed, setDismissed] = React.useState(false);\n if (!store && !warnedNoProvider) {\n warnedNoProvider = true;\n console.warn(\n \"[FirstUseHint] No <FirstUseHintProvider> mounted: learned hints last only until reload.\",\n );\n }\n const learned = store ? store.learned.includes(id) : sessionLearned.has(id);\n const ready = store ? store.ready : true;\n const learn = React.useCallback(() => {\n setDismissed(true);\n if (store) {\n if (!store.learned.includes(id)) store.learn(id);\n } else {\n sessionLearned.add(id);\n rerender();\n }\n }, [store, id]);\n return { visible: ready && !learned && !dismissed, learn };\n}\n\nexport interface FirstUseHintProps {\n /** Stable, namespaced id (`<feature>.<moment>`, e.g. `smart-add.first-choice`). Never reuse one. */\n id: string;\n /** THE one line, ≤32 characters: the non-obvious fact (\"Unmarked items are kept\"), never what the screen already shows. */\n title: string;\n /** Rarely needed second line, ≤60 characters. Prefer none. */\n detail?: string;\n /**\n * A selector for the ONE control inside the anchor to pulse and point at (e.g. the first answer\n * button of a row). The anchor stays the press area that learns the hint. Default: the anchor itself.\n */\n pulse?: string;\n /** Eligibility (TipKit \"rules\"): the hint shows only while this is true. Default true. */\n when?: boolean;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n /** Wait before it appears, so it lands after the anchor's own entrance. Default 600ms. */\n delayMs?: number;\n /**\n * The beacon ring's shape: `capsule` (default; a row of capsule buttons), `box` (keeps the\n * anchor's own corner radius, for a card or a field) or `none`.\n */\n beacon?: \"capsule\" | \"box\" | \"none\";\n /** The ONE element the hint points at. A press anywhere inside it learns the hint. */\n children: React.ReactElement;\n}\n\nexport function FirstUseHint({\n id,\n title,\n detail,\n when = true,\n side = \"top\",\n align = \"end\",\n delayMs = 600,\n beacon = \"capsule\",\n pulse,\n children,\n}: FirstUseHintProps) {\n const hostRef = React.useRef<HTMLElement | null>(null);\n const { visible, learn } = useFirstUseHint(id);\n const eligible = visible && when;\n const [shown, setShown] = React.useState(false);\n\n React.useEffect(() => {\n if (!eligible) {\n setShown(false);\n return undefined;\n }\n const timer = setTimeout(() => setShown(true), delayMs);\n return () => clearTimeout(timer);\n }, [eligible, delayMs]);\n\n if (process.env.NODE_ENV !== \"production\") {\n if (title.length > FIRST_USE_HINT_TITLE_MAX || (detail?.length ?? 0) > FIRST_USE_HINT_DETAIL_MAX) {\n console.error(\n `[FirstUseHint] \"${id}\" is over budget (title ≤${FIRST_USE_HINT_TITLE_MAX}, detail ≤${FIRST_USE_HINT_DETAIL_MAX} characters).`,\n );\n }\n }\n\n const open = eligible && shown;\n const beaconOn = open && beacon !== \"none\";\n\n // `pulse`: the beacon sits on one control inside the anchor, and the bubble points at it.\n const target = React.useCallback(\n () => (pulse ? (hostRef.current?.querySelector<HTMLElement>(pulse) ?? hostRef.current) : hostRef.current),\n [pulse],\n );\n React.useEffect(() => {\n if (!pulse || !beaconOn) return undefined;\n const el = target();\n if (!el || el === hostRef.current) return undefined;\n el.classList.add(MOTION_HINT_BEACON);\n el.setAttribute(\"data-matrx-hint-beacon\", beacon);\n return () => {\n el.classList.remove(MOTION_HINT_BEACON);\n el.removeAttribute(\"data-matrx-hint-beacon\");\n };\n }, [pulse, beaconOn, beacon, target]);\n const virtualRef = React.useMemo(\n () => ({\n current: {\n getBoundingClientRect: () => target()?.getBoundingClientRect() ?? new DOMRect(),\n },\n }),\n [target],\n );\n\n return (\n <Popover open={open}>\n {pulse ? (\n <>\n <Slot\n ref={hostRef}\n data-matrx-first-use-hint={open ? id : undefined}\n onClickCapture={open ? learn : undefined}\n >\n {children}\n </Slot>\n <PopoverAnchor virtualRef={virtualRef} />\n </>\n ) : (\n <PopoverAnchor\n asChild\n ref={hostRef as React.Ref<HTMLDivElement>}\n data-matrx-first-use-hint={open ? id : undefined}\n data-matrx-hint-beacon={beaconOn ? beacon : undefined}\n className={beaconOn ? MOTION_HINT_BEACON : undefined}\n onClickCapture={open ? learn : undefined}\n >\n {children}\n </PopoverAnchor>\n )}\n <PopoverContent\n side={side}\n align={align}\n sideOffset={8}\n sizing=\"content\"\n padding=\"none\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"first-use-hint\"\n className=\"rounded-full shadow-lg data-[detail]:rounded-xl\"\n data-detail={detail ? \"\" : undefined}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onInteractOutside={(e) => e.preventDefault()}\n onEscapeKeyDown={learn}\n >\n {/* One line: the fact, then the dismiss centered on it (TipKit's inline tip, Linear's coach mark). */}\n <div className=\"flex items-center gap-1 py-0.5 pl-3 pr-0.5\">\n <div className=\"flex min-w-0 flex-col py-1\">\n <span className=\"type-secondary truncate font-medium text-foreground\">{title}</span>\n {detail ? (\n // Two lines at most: on a 375px phone a full 60-character line can wrap once.\n <span className=\"type-secondary line-clamp-2 text-muted-foreground\">{detail}</span>\n ) : null}\n </div>\n <IconButton icon={XIcon} aria-label=\"Dismiss tip\" className=\"shrink-0\" onClick={learn} />\n </div>\n <PopoverPrimitive.Arrow className=\"fill-popover\" width={10} height={5} />\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n/**\n * ReviewChanges — THE review of a delete, restore or move of a record with relationships.\n *\n * It renders the preview `platform.change_records` returns (move-and-archive plan § 8.2, § 9) and\n * nothing else: clients render the preview, never compute it. The host owns the window it sits in\n * (a window panel, never a blocking drawer) and opens every item: each group sample, each warning\n * item and each question's items is a door (`onOpenItem(item, \"peek\" | \"tab\")`), so a person can\n * click and see exactly what is affected before anything happens (Arman, 2026-10-16).\n *\n * Questions are grouped (one per decision kind, never one per record). Each is a DecisionControl\n * with its existing meaning: Yes = the first option, No = the second option or the first way out,\n * Other = the rest, then the generic exit. The suggestion glows and is never chosen for the\n * person; \"Accept suggestions\" answers every unanswered suggested question as the person's own\n * choice. The commit stays off until every question has an answer and nothing is refused.\n *\n * Scope links on a move are an ALARM (Arman, 2026-10-16: \"it's a strange thing that should raise\n * 1000 alarm bells\"): drawn first, in the destructive tone, naming every scope as a door.\n */\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\nimport { Badge, Button } from \"./controls/controls\";\nimport { DecisionControl, type DecisionAnswer, type WayOutItem } from \"./controls/decision-control\";\nimport { RowGroup } from \"./controls/surfaces\";\nimport { ExternalLinkIcon } from \"./icons\";\n\nexport interface ChangeItemRef {\n /** Registry token (`web_brand`, `note`, `scope`, `file`); null when the table has none. */\n type: string | null;\n table?: string;\n id: string;\n title?: string | null;\n organization_id?: string | null;\n}\n\nexport interface ChangeGroup {\n rule_id: string | null;\n type: string | null;\n table?: string;\n noun: string;\n count: number;\n count_is_estimate?: boolean;\n sample: ChangeItemRef[];\n /** `delete` · `follow` · `stay`. */\n action: string;\n decided_automatically?: boolean;\n}\n\nexport interface ChangeOption {\n value: string;\n label: string;\n consequence?: string;\n}\n\nexport interface ChangeQuestion {\n id: string;\n kind: string;\n prompt: string;\n items: { count: number; sample: ChangeItemRef[] };\n options: ChangeOption[];\n suggested: string | null;\n way_out: ChangeOption[];\n}\n\nexport interface ChangeWarning {\n kind: string;\n /** `alarm` (drawn first, destructive) · `refuse` (the commit cannot run) · absent (information). */\n severity?: string;\n message?: string | null;\n noun?: string;\n count?: number | null;\n items?: ChangeItemRef[];\n users?: ChangeItemRef[];\n}\n\nexport interface ChangePreview {\n verb: \"delete\" | \"restore\" | \"move\" | string;\n fingerprint: string;\n plan_id?: string;\n roots: ChangeItemRef[];\n groups: ChangeGroup[];\n questions: ChangeQuestion[];\n warnings: ChangeWarning[];\n total_rows?: number;\n source_organization?: { id: string; name: string | null } | null;\n target_organization?: { id: string; name: string | null } | null;\n mode?: string;\n}\n\n/** Answers keyed by question id (or `question id#row id` for a per-item override). */\nexport type ChangeAnswers = Record<string, string>;\n\nexport interface ReviewChangesProps {\n preview: ChangePreview;\n answers: ChangeAnswers;\n /** null clears the answer (the question is undecided again). */\n onAnswer: (questionId: string, value: string | null) => void;\n /** Every named item is a door: `peek` opens it beside the review, `tab` in a new tab. */\n onOpenItem: (item: ChangeItemRef, how: \"peek\" | \"tab\") => void;\n /**\n * The host's own door for a named item (its canonical reference component with open, new tab and\n * peek). When given it replaces the built-in door everywhere in the review; `onOpenItem` stays the\n * fallback for an item the host returns null for.\n */\n renderItem?: ((item: ChangeItemRef) => React.ReactNode) | undefined;\n onCommit: () => void;\n onCancel: () => void;\n busy?: boolean;\n /** The commit's words; default by verb (Archive / Restore / Move). */\n commitLabel?: string;\n className?: string;\n}\n\nconst SKIP = \"skip\";\n\n/** The questions a person still has to answer. */\nexport function unansweredQuestions(preview: ChangePreview, answers: ChangeAnswers): ChangeQuestion[] {\n return preview.questions.filter((q) => !answers[q.id]);\n}\n\n/** True when nothing blocks the commit: every question answered, no refusal. */\nexport function canCommitChanges(preview: ChangePreview, answers: ChangeAnswers): boolean {\n return unansweredQuestions(preview, answers).length === 0 && !preview.warnings.some((w) => w.severity === \"refuse\");\n}\n\n/** \"Accept suggestions\": every unanswered question that carries a suggestion, answered with it. */\nexport function acceptSuggestions(preview: ChangePreview, answers: ChangeAnswers): ChangeAnswers {\n const next = { ...answers };\n for (const q of preview.questions) if (!next[q.id] && q.suggested) next[q.id] = q.suggested;\n return next;\n}\n\nconst RenderItemContext = React.createContext<ReviewChangesProps[\"renderItem\"]>(undefined);\n\nfunction ItemDoor({ item, onOpenItem }: { item: ChangeItemRef; onOpenItem: ReviewChangesProps[\"onOpenItem\"] }) {\n const renderItem = React.useContext(RenderItemContext);\n const hosted = renderItem ? renderItem(item) : null;\n if (hosted != null) {\n return (\n <span data-change-item={item.id} className=\"inline-flex max-w-full items-center\">\n {hosted}\n </span>\n );\n }\n const title = item.title?.trim() || \"Untitled\";\n return (\n <span data-change-item={item.id} className=\"inline-flex max-w-full items-center gap-0.5\">\n <Button\n type=\"button\"\n variant=\"link\"\n data-clickable=\"\"\n className=\"min-w-0 truncate\"\n onClick={() => onOpenItem(item, \"peek\")}\n >\n {title}\n </Button>\n <Button\n type=\"button\"\n variant=\"quiet\"\n icon={<ExternalLinkIcon />}\n data-clickable=\"\"\n aria-label={`Open ${title} in a new tab`}\n className=\"shrink-0\"\n onClick={() => onOpenItem(item, \"tab\")}\n />\n </span>\n );\n}\n\nfunction Doors({ items, total, onOpenItem }: { items: ChangeItemRef[]; total?: number | null | undefined; onOpenItem: ReviewChangesProps[\"onOpenItem\"] }) {\n if (!items.length) return null;\n const more = (total ?? items.length) - items.length;\n return (\n <span className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1\">\n {items.map((item) => (\n <ItemDoor key={`${item.table ?? item.type}:${item.id}`} item={item} onOpenItem={onOpenItem} />\n ))}\n {more > 0 ? <span className=\"text-xs text-muted-foreground\">+{more} more</span> : null}\n </span>\n );\n}\n\nfunction Row({ title, meta, children }: { title: React.ReactNode; meta?: React.ReactNode; children?: React.ReactNode }) {\n return (\n <div data-change-row=\"\" className=\"flex flex-col gap-1 px-3 py-2\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <span className=\"min-w-0 text-sm text-foreground\">{title}</span>\n {meta ? <span className=\"shrink-0 text-xs text-muted-foreground\">{meta}</span> : null}\n </div>\n {children}\n </div>\n );\n}\n\nfunction Alarm({ warning, onOpenItem }: { warning: ChangeWarning; onOpenItem: ReviewChangesProps[\"onOpenItem\"] }) {\n const items = [...(warning.items ?? []), ...(warning.users ?? [])];\n return (\n <div\n role=\"alert\"\n data-change-warning={warning.kind}\n data-severity={warning.severity}\n className=\"flex flex-col gap-1.5 rounded-group border border-destructive bg-destructive/10 px-3 py-2\"\n >\n <span className=\"text-sm font-medium text-foreground\">{warning.message}</span>\n <Doors items={items} total={warning.count ?? items.length} onOpenItem={onOpenItem} />\n </div>\n );\n}\n\nfunction Question({ question, answer, onAnswer, onOpenItem, disabled }: {\n question: ChangeQuestion;\n answer: string | undefined;\n onAnswer: ReviewChangesProps[\"onAnswer\"];\n onOpenItem: ReviewChangesProps[\"onOpenItem\"];\n disabled?: boolean | undefined;\n}) {\n const yes = question.options[0];\n const noOption = question.options[1] ?? question.way_out.find((w) => w.value !== SKIP);\n const rest: ChangeOption[] = [\n ...question.options.slice(noOption && question.options[1] === noOption ? 2 : 1),\n ...question.way_out.filter((w) => w.value !== SKIP && w !== noOption),\n ];\n const skip = question.way_out.find((w) => w.value === SKIP);\n const value: DecisionAnswer | null =\n !answer ? null : yes && answer === yes.value ? \"yes\" : noOption && answer === noOption.value ? \"no\" : \"other\";\n const suggested: DecisionAnswer | null =\n !question.suggested ? null : yes && question.suggested === yes.value ? \"yes\" : noOption && question.suggested === noOption.value ? \"no\" : \"other\";\n const wayOut: WayOutItem[] = rest.map((o) => ({ value: o.value, label: o.label }));\n const chosen = [...question.options, ...question.way_out].find((o) => o.value === answer);\n return (\n <div data-change-question={question.id} data-kind={question.kind} className=\"flex flex-col gap-1.5 px-3 py-2\">\n <span className=\"text-sm text-foreground\">{question.prompt}</span>\n <Doors items={question.items.sample} total={question.items.count} onOpenItem={onOpenItem} />\n <DecisionControl\n value={value}\n onChange={(v) => {\n const pick = v === \"yes\" ? yes : noOption;\n if (!pick) return;\n onAnswer(question.id, answer === pick.value ? null : pick.value);\n }}\n labels={{ yes: yes?.label ?? \"Yes\", no: noOption?.label ?? \"No\" }}\n wayOut={wayOut}\n wayOutValue={value === \"other\" ? answer ?? null : null}\n onWayOut={(v) => onAnswer(question.id, v)}\n onClear={() => onAnswer(question.id, null)}\n // A question with no \"skip\" answer stays undecided when skipped: the commit waits for it.\n onSkip={() => onAnswer(question.id, skip ? SKIP : null)}\n skipped={answer === SKIP}\n {...(skip ? { skipLabel: skip.label } : {})}\n suggested={suggested}\n disabled={!!disabled}\n aria-label={question.prompt}\n />\n {chosen?.consequence ? <span className=\"text-xs text-muted-foreground\">{chosen.consequence}</span> : null}\n </div>\n );\n}\n\nconst VERB_WORDS: Record<string, { goes: string; commit: string }> = {\n delete: { goes: \"Archived with it\", commit: \"Archive\" },\n restore: { goes: \"Comes back with it\", commit: \"Restore\" },\n move: { goes: \"Moves with it\", commit: \"Move\" },\n};\n\nexport function ReviewChanges({ renderItem, ...props }: ReviewChangesProps) {\n return (\n <RenderItemContext.Provider value={renderItem}>\n <ReviewChangesBody {...props} />\n </RenderItemContext.Provider>\n );\n}\n\nfunction ReviewChangesBody({ preview, answers, onAnswer, onOpenItem, onCommit, onCancel, busy, commitLabel, className }: Omit<ReviewChangesProps, \"renderItem\">) {\n const words = VERB_WORDS[preview.verb] ?? { goes: \"Changes with it\", commit: \"Apply\" };\n const alarms = preview.warnings.filter((w) => w.severity === \"alarm\" || w.severity === \"refuse\");\n const kept = preview.warnings.filter((w) => w.kind === \"kept_in_use\" || w.kind === \"access_loss\");\n const auto = preview.warnings.find((w) => w.kind === \"decided_automatically\");\n const unchecked = preview.warnings.find((w) => w.kind === \"unchecked_embeds\");\n const moving = preview.groups.filter((g) => g.action !== \"stay\");\n const staying = preview.groups.filter((g) => g.action === \"stay\");\n const pending = unansweredQuestions(preview, answers);\n const suggestible = pending.filter((q) => q.suggested);\n const ready = canCommitChanges(preview, answers);\n const target = preview.target_organization?.name;\n\n return (\n <div data-review-changes=\"\" data-verb={preview.verb} className={cn(\"flex min-h-0 flex-col gap-3\", className)}>\n {alarms.map((w, i) => (\n <Alarm key={`${w.kind}:${i}`} warning={w} onOpenItem={onOpenItem} />\n ))}\n\n <RowGroup title={preview.verb === \"move\" && target ? `Moving to ${target}` : undefined}>\n <Row title={<Doors items={preview.roots} onOpenItem={onOpenItem} />} />\n </RowGroup>\n\n {moving.length ? (\n <RowGroup title={words.goes}>\n {moving.map((g) => (\n <Row key={`${g.rule_id ?? \"root\"}:${g.table ?? g.type}`} title={g.noun} meta={`${g.count_is_estimate ? \"about \" : \"\"}${g.count}`}>\n <Doors items={g.sample} total={g.count} onOpenItem={onOpenItem} />\n </Row>\n ))}\n </RowGroup>\n ) : null}\n\n {kept.length || staying.length ? (\n <RowGroup title=\"Stays where it is\">\n {kept.map((w, i) => (\n <Row key={`kept:${i}`} title={w.message ?? w.noun ?? \"Used elsewhere\"} meta={w.count ?? undefined}>\n <Doors items={w.items ?? []} total={w.count} onOpenItem={onOpenItem} />\n </Row>\n ))}\n {staying.map((g) => (\n <Row key={`stay:${g.table ?? g.type}`} title={g.noun} meta={g.count}>\n <Doors items={g.sample} total={g.count} onOpenItem={onOpenItem} />\n </Row>\n ))}\n </RowGroup>\n ) : null}\n\n {preview.questions.length ? (\n <RowGroup title=\"Decide\">\n {preview.questions.map((q) => (\n <Question key={q.id} question={q} answer={answers[q.id]} onAnswer={onAnswer} onOpenItem={onOpenItem} disabled={busy} />\n ))}\n </RowGroup>\n ) : null}\n\n {auto || unchecked ? (\n <div className=\"flex flex-wrap gap-2 px-1\">\n {auto ? <Badge tone=\"neutral\">{`${auto.count ?? \"\"} decided automatically`.trim()}</Badge> : null}\n {unchecked ? <Badge tone=\"neutral\">Links inside text not checked</Badge> : null}\n </div>\n ) : null}\n\n <div data-review-changes-actions=\"\" className=\"flex flex-wrap items-center justify-end gap-2\">\n {suggestible.length ? (\n <Button variant=\"quiet\" disabled={busy} onClick={() => suggestible.forEach((q) => onAnswer(q.id, q.suggested))}>\n Accept suggestions\n </Button>\n ) : null}\n <Button variant=\"outline\" disabled={busy} onClick={onCancel}>\n Cancel\n </Button>\n <Button variant={preview.verb === \"delete\" ? \"danger\" : \"primary\"} disabled={busy || !ready} onClick={onCommit}>\n {commitLabel ?? words.commit}\n </Button>\n </div>\n </div>\n );\n}\n","/**\n * GRID CANVAS — THE ONE x/y/w/h widget grid (champions: Grafana / react-grid-layout\n * for the grid, iOS widgets for sizes). A 12-column desktop and a 4-column phone;\n * a phone with no saved placement reflows from the desktop grid. Fine rows, snap,\n * drag to move, drag the corner to resize, arrow keys to nudge (Shift = resize),\n * and collision push-down with vertical compaction.\n *\n * Rendering is CSS-first: every item carries both breakpoints' placements as CSS\n * variables and a container query picks one, so the server's first frame is the\n * final frame (no measuring, no layout shift). JavaScript measures the container\n * only to know which grid a gesture edits.\n *\n * A gesture never re-renders per pointer event: the dragged item follows the\n * pointer through a CSS transform (one animation frame per move), and the grid\n * re-renders only when the snapped cell changes. `onChange` fires ONCE per\n * gesture or key press with every item's placements for the grid that changed.\n *\n * `fit=\"content\"` (records-ui dashboards and Pages): a row is ONE LINE as tall as its tallest item's\n * content, not a fixed number of px — the Airtable-Interfaces model of ordered blocks with a width each,\n * drawn by this same engine. An item drops where its center is (past a neighbor's middle = after it),\n * resizing changes width only, and arrow keys move it one place in reading order (Shift = width).\n *\n * Inside an item: `[data-grid-drag-handle]` makes only that element start a\n * drag (a header grip); without one the whole item drags. Buttons, links, inputs\n * and `[data-no-drag]` never start a drag (DRAG_IGNORE_SELECTOR).\n */\n\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../cn\";\nimport { DRAG_IGNORE_SELECTOR, startPointerDrag, type PointerDragHandle } from \"../window-drag\";\nimport {\n gridRows,\n insertLines,\n nudgeBox,\n packLines,\n stepLines,\n phoneGrid,\n placeBox,\n placementOf,\n resolveGrid,\n type GridBox,\n type GridPlacement,\n type GridSizeLimits,\n} from \"./layout\";\n\n/** Columns of the desktop grid and of the phone grid. */\nexport const GRID_CANVAS_COLUMNS = { lg: 12, sm: 4 } as const;\n/** A container narrower than this draws the phone grid (matches the CSS container query). */\nexport const GRID_CANVAS_PHONE_MAX_PX = 640;\n/** Default row height in px: fine enough that a widget's height reads as chosen, not stepped. */\nexport const GRID_CANVAS_ROW_PX = 24;\n/** Default gap between items in px. */\nexport const GRID_CANVAS_GAP_PX = 12;\n\nexport type GridBreakpoint = \"lg\" | \"sm\";\n\nexport interface GridCanvasItem extends GridSizeLimits {\n id: string;\n /** The desktop placement (12 columns). */\n lg: GridPlacement;\n /** The phone placement (4 columns); absent = reflowed from `lg`. */\n sm?: GridPlacement | undefined;\n}\n\n/** One item's placements after a change. Only the grid that changed is rewritten. */\nexport interface GridCanvasPlacements {\n id: string;\n lg: GridPlacement;\n sm?: GridPlacement | undefined;\n}\n\nexport interface GridCanvasProps {\n items: readonly GridCanvasItem[];\n /** Draw one item's content. The canvas owns its box; the content fills it. */\n renderItem: (id: string, state: { breakpoint: GridBreakpoint; editing: boolean }) => ReactNode;\n /** Edit mode: drag, resize and keyboard nudge. */\n editable?: boolean;\n /** Once per gesture (or key press): every item, with the edited grid's placements. */\n onChange?: (next: GridCanvasPlacements[], info: { breakpoint: GridBreakpoint; id: string }) => void;\n /** An accessible name per item (\"Tasks widget\"), read with its position. */\n itemLabel?: (id: string) => string;\n rowHeight?: number;\n gap?: number;\n /**\n * \"cells\" (default): every row is `rowHeight` px and an item is exactly its cells.\n * \"content\": every row is one line as tall as its content (h stays 1); vertical moves go line to line,\n * and resizing and Shift+arrows change width only.\n */\n fit?: \"cells\" | \"content\";\n className?: string;\n \"aria-label\"?: string;\n}\n\ninterface Gesture {\n id: string;\n mode: \"move\" | \"resize\";\n breakpoint: GridBreakpoint;\n /** The grid as it was when the gesture began. */\n start: GridBox[];\n /** The last snapped grid shown. */\n current: GridBox[];\n handle: PointerDragHandle;\n}\n\nconst toBox = (item: GridCanvasItem, placement: GridPlacement): GridBox => ({\n id: item.id,\n ...placementOf(placement),\n ...(item.minW !== undefined ? { minW: item.minW } : {}),\n ...(item.minH !== undefined ? { minH: item.minH } : {}),\n ...(item.maxW !== undefined ? { maxW: item.maxW } : {}),\n ...(item.maxH !== undefined ? { maxH: item.maxH } : {}),\n});\n\n/** Both grids, legal and overlap-free, in the items' order. */\nexport function resolveGridCanvas(\n items: readonly GridCanvasItem[],\n fit: \"cells\" | \"content\" = \"cells\",\n): { lg: GridBox[]; sm: GridBox[] } {\n if (fit === \"content\") {\n const { lg: cols, sm: phoneCols } = GRID_CANVAS_COLUMNS;\n const lg = packLines(\n items.map((i) => toBox(i, i.lg)),\n cols,\n );\n // The phone: a saved phone placement where there is one; otherwise the desktop line order, each width\n // scaled to 4 columns (wider than half takes the whole line).\n const sm = packLines(\n items.map((i, n) => {\n if (i.sm) return toBox(i, i.sm);\n const box = lg[n]!;\n const w = Math.ceil((box.w * phoneCols) / cols);\n return { ...box, w: w * 2 > phoneCols ? phoneCols : w };\n }),\n phoneCols,\n );\n return { lg, sm };\n }\n const lg = resolveGrid(\n items.map((i) => toBox(i, i.lg)),\n GRID_CANVAS_COLUMNS.lg,\n );\n const sm = phoneGrid(\n items.map((i, n) => ({ box: lg[n]!, sm: i.sm })),\n GRID_CANVAS_COLUMNS.lg,\n GRID_CANVAS_COLUMNS.sm,\n );\n return { lg, sm };\n}\n\nconst sameGrid = (a: readonly GridBox[], b: readonly GridBox[]) =>\n a.length === b.length && a.every((x, i) => x.x === b[i]!.x && x.y === b[i]!.y && x.w === b[i]!.w && x.h === b[i]!.h);\n\n/** Which grid the container is drawing (mirrors the CSS container query). */\nfunction useBreakpoint(ref: React.RefObject<HTMLElement | null>): GridBreakpoint {\n const [breakpoint, setBreakpoint] = useState<GridBreakpoint>(\"lg\");\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n // Width 0 = not laid out yet (hidden, or a test DOM): keep the desktop grid until it is.\n const read = () => {\n const width = el.getBoundingClientRect().width;\n if (width > 0) setBreakpoint(width < GRID_CANVAS_PHONE_MAX_PX ? \"sm\" : \"lg\");\n };\n read();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(read);\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref]);\n return breakpoint;\n}\n\nexport function GridCanvas({\n items,\n renderItem,\n editable = false,\n onChange,\n itemLabel,\n rowHeight = GRID_CANVAS_ROW_PX,\n gap = GRID_CANVAS_GAP_PX,\n fit = \"cells\",\n className,\n \"aria-label\": ariaLabel,\n}: GridCanvasProps) {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const breakpoint = useBreakpoint(rootRef);\n const resolved = resolveGridCanvas(items, fit);\n const [preview, setPreview] = useState<{ breakpoint: GridBreakpoint; boxes: GridBox[]; id: string; mode: Gesture[\"mode\"] } | null>(null);\n const gesture = useRef<Gesture | null>(null);\n const itemEls = useRef(new Map<string, HTMLElement>());\n const [announcement, setAnnouncement] = useState(\"\");\n\n useEffect(() => () => gesture.current?.handle.cancel(), []);\n\n const grids = {\n lg: preview?.breakpoint === \"lg\" ? preview.boxes : resolved.lg,\n sm: preview?.breakpoint === \"sm\" ? preview.boxes : resolved.sm,\n };\n const cols = GRID_CANVAS_COLUMNS[breakpoint];\n\n const commit = (bp: GridBreakpoint, boxes: GridBox[], id: string) => {\n if (!onChange) return;\n const before = bp === \"lg\" ? resolved.lg : resolved.sm;\n if (sameGrid(before, boxes)) return;\n const next = items.map((item, n) => {\n const lg = bp === \"lg\" ? placementOf(boxes[n]!) : item.lg;\n const sm = bp === \"sm\" ? placementOf(boxes[n]!) : item.sm;\n return sm ? { id: item.id, lg, sm } : { id: item.id, lg };\n });\n onChange(next, { breakpoint: bp, id });\n };\n\n const say = (boxes: readonly GridBox[], id: string) => {\n const box = boxes.find((b) => b.id === id);\n if (box) setAnnouncement(`${itemLabel?.(id) ?? \"Item\"}: column ${box.x + 1}, row ${box.y + 1}, ${box.w} wide, ${box.h} tall`);\n };\n\n const begin = (event: ReactPointerEvent<HTMLElement>, id: string, mode: Gesture[\"mode\"]) => {\n if (!editable || event.button !== 0 || gesture.current) return;\n const root = rootRef.current;\n if (!root) return;\n const bp = breakpoint;\n const start = bp === \"lg\" ? resolved.lg : resolved.sm;\n const box = start.find((b) => b.id === id);\n if (!box) return;\n const colPx = root.getBoundingClientRect().width / GRID_CANVAS_COLUMNS[bp];\n const el = itemEls.current.get(id) ?? null;\n if (mode === \"resize\") event.stopPropagation();\n const lines = fit === \"content\" ? measureLines(start, itemEls.current) : null;\n const startRect = el?.getBoundingClientRect();\n const lineFor = (dy: number): number => {\n if (!lines || !startRect) return box.y + Math.round(dy / rowHeight);\n const center = startRect.top + startRect.height / 2 + dy;\n if (center > lines.bottom) return lines.tops.length;\n let line = 0;\n lines.tops.forEach((top, n) => {\n if (top <= center) line = n;\n });\n return line;\n };\n const handle = startPointerDrag(event, {\n threshold: mode === \"move\" ? 4 : 0,\n cursor: mode === \"move\" ? \"grabbing\" : \"nwse-resize\",\n onStart: () => setPreview({ breakpoint: bp, boxes: start, id, mode }),\n onMove: ({ dx, dy }) => {\n const g = gesture.current;\n if (!g) return;\n if (mode === \"move\" && el) el.style.transform = `translate(${dx}px, ${dy}px)`;\n const next =\n mode === \"move\" && fit === \"content\"\n ? insertLines(g.start, id, lineFor(dy), box.x + box.w / 2 + dx / colPx, GRID_CANVAS_COLUMNS[bp])\n : mode === \"move\"\n ? placeBox(g.start, id, { x: box.x + Math.round(dx / colPx), y: lineFor(dy) }, GRID_CANVAS_COLUMNS[bp])\n : fit === \"content\"\n ? packLines(placeBox(g.start, id, { w: box.w + Math.round(dx / colPx) }, GRID_CANVAS_COLUMNS[bp]), GRID_CANVAS_COLUMNS[bp])\n : placeBox(\n g.start,\n id,\n { w: box.w + Math.round(dx / colPx), h: box.h + Math.round(dy / rowHeight) },\n GRID_CANVAS_COLUMNS[bp],\n );\n if (sameGrid(next, g.current)) return;\n g.current = next;\n setPreview({ breakpoint: bp, boxes: next, id, mode });\n },\n onEnd: (_delta, info) => {\n const g = gesture.current;\n gesture.current = null;\n if (el) el.style.transform = \"\";\n setPreview(null);\n if (!g || !info.started || info.cancelled) return;\n commit(bp, g.current, id);\n say(g.current, id);\n },\n });\n gesture.current = { id, mode, breakpoint: bp, start, current: start, handle };\n };\n\n const onItemPointerDown = (event: ReactPointerEvent<HTMLElement>, id: string) => {\n const target = event.target as Element | null;\n const item = event.currentTarget;\n const handle = item.querySelector(\"[data-grid-drag-handle]\");\n if (handle ? !handle.contains(target) : false) return;\n if (target?.closest(DRAG_IGNORE_SELECTOR) && !target.closest(\"[data-grid-drag-handle]\")) return;\n if (target?.closest(\"[data-grid-resize]\")) return;\n begin(event, id, \"move\");\n };\n\n const onItemKeyDown = (event: ReactKeyboardEvent<HTMLElement>, id: string) => {\n if (!editable || event.target !== event.currentTarget) return;\n const direction = ({ ArrowLeft: \"left\", ArrowRight: \"right\", ArrowUp: \"up\", ArrowDown: \"down\" } as const)[\n event.key as \"ArrowLeft\" | \"ArrowRight\" | \"ArrowUp\" | \"ArrowDown\"\n ];\n if (!direction) return;\n // A content-fit row is as tall as its content: Shift+Up/Down (resize height) means nothing there.\n if (fit === \"content\" && event.shiftKey && (direction === \"up\" || direction === \"down\")) return;\n event.preventDefault();\n const boxes = breakpoint === \"lg\" ? resolved.lg : resolved.sm;\n // A line grid: arrows move one place in reading order; Shift+Left/Right change the width.\n const next =\n fit !== \"content\"\n ? nudgeBox(boxes, id, direction, cols, event.shiftKey)\n : event.shiftKey\n ? packLines(nudgeBox(boxes, id, direction, cols, true), cols)\n : stepLines(boxes, id, direction === \"left\" || direction === \"up\" ? -1 : 1, cols);\n commit(breakpoint, next, id);\n say(next, id);\n };\n\n const rows = { lg: gridRows(grids.lg), sm: gridRows(grids.sm) };\n const active = preview ? preview.boxes.find((b) => b.id === preview.id) : undefined;\n\n return (\n <div\n ref={rootRef}\n className={cn(\"matrx-grid-canvas\", className)}\n data-editing={editable || undefined}\n data-fit={fit === \"content\" ? \"content\" : undefined}\n data-breakpoint={breakpoint}\n aria-label={ariaLabel}\n role={ariaLabel ? \"region\" : undefined}\n style={\n {\n \"--grid-row\": `${rowHeight}px`,\n \"--grid-gap\": `${gap}px`,\n \"--grid-cols-lg\": GRID_CANVAS_COLUMNS.lg,\n \"--grid-cols-sm\": GRID_CANVAS_COLUMNS.sm,\n // One spare row while a gesture runs, so an item can be dragged below the last one.\n \"--grid-rows-lg\": preview?.breakpoint === \"lg\" ? rows.lg + 1 : rows.lg,\n \"--grid-rows-sm\": preview?.breakpoint === \"sm\" ? rows.sm + 1 : rows.sm,\n } as CSSProperties\n }\n >\n <div className=\"matrx-grid-canvas-field\">\n {active && preview ? (\n <div className=\"matrx-grid-canvas-placeholder\" aria-hidden style={placementVars(active, active)} />\n ) : null}\n {items.map((item, n) => {\n const lg = grids.lg[n]!;\n const sm = grids.sm[n]!;\n // While moving, the dragged item stays at its start cell and follows the pointer by transform.\n const moving = preview?.mode === \"move\" && preview.id === item.id && gesture.current;\n const startBox = moving ? gesture.current!.start.find((b) => b.id === item.id)! : null;\n const drawLg = moving && preview!.breakpoint === \"lg\" ? startBox! : lg;\n const drawSm = moving && preview!.breakpoint === \"sm\" ? startBox! : sm;\n const label = itemLabel?.(item.id);\n return (\n <div\n key={item.id}\n ref={(el) => {\n if (el) itemEls.current.set(item.id, el);\n else itemEls.current.delete(item.id);\n }}\n className=\"matrx-grid-canvas-item\"\n data-grid-item={item.id}\n data-dragging={preview?.id === item.id || undefined}\n tabIndex={editable ? 0 : undefined}\n aria-label={editable && label ? `${label}. Arrow keys move, Shift and arrow keys resize.` : undefined}\n style={placementVars(drawLg, drawSm)}\n onPointerDown={editable ? (e) => onItemPointerDown(e, item.id) : undefined}\n onKeyDown={editable ? (e) => onItemKeyDown(e, item.id) : undefined}\n >\n <div className=\"matrx-grid-canvas-content\">{renderItem(item.id, { breakpoint, editing: editable })}</div>\n {editable ? (\n <span\n className=\"matrx-grid-canvas-resize\"\n data-grid-resize\n aria-hidden\n onPointerDown={(e) => begin(e, item.id, \"resize\")}\n />\n ) : null}\n </div>\n );\n })}\n </div>\n <span className=\"matrx-grid-canvas-live\" aria-live=\"polite\">\n {announcement}\n </span>\n </div>\n );\n}\n\nfunction placementVars(lg: GridPlacement, sm: GridPlacement): CSSProperties {\n return {\n \"--gx-lg\": lg.x,\n \"--gy-lg\": lg.y,\n \"--gw-lg\": lg.w,\n \"--gh-lg\": lg.h,\n \"--gx-sm\": sm.x,\n \"--gy-sm\": sm.y,\n \"--gw-sm\": sm.w,\n \"--gh-sm\": sm.h,\n // 1-based grid lines for the content-fit desktop grid (styles.css, `data-fit=\"content\"`).\n \"--gc-lg\": lg.x + 1,\n \"--gr-lg\": lg.y + 1,\n // 1-based grid lines for the phone's flowing layout (styles.css: a phone box grows to its content).\n \"--gc-sm\": sm.x + 1,\n \"--gr-sm\": sm.y + 1,\n } as CSSProperties;\n}\n\n/**\n * Where each line of a content-fit grid sits on screen at the start of a gesture: the top of the line's\n * highest item (px, viewport), and the bottom of the lowest item. Rows are as tall as their content, so\n * the pointer's line is read from the page, never computed from a row height.\n */\nfunction measureLines(boxes: readonly GridBox[], els: ReadonlyMap<string, HTMLElement>): { tops: number[]; bottom: number } {\n const tops: number[] = [];\n let bottom = -Infinity;\n for (const box of boxes) {\n const rect = els.get(box.id)?.getBoundingClientRect();\n if (!rect) continue;\n tops[box.y] = Math.min(tops[box.y] ?? Infinity, rect.top);\n bottom = Math.max(bottom, rect.bottom);\n }\n // A line with no measured item (never after compaction) takes the line above's top.\n for (let n = 0; n < tops.length; n++) if (tops[n] === undefined) tops[n] = n === 0 ? 0 : tops[n - 1]!;\n return { tops, bottom };\n}\n","/**\n * THE GRID CANVAS LAYOUT ENGINE — pure x/y/w/h placement on a column grid\n * (the react-grid-layout / Grafana model, iOS-widget sizes). No React, no DOM.\n *\n * - `resolveGrid` clamp every box into the grid, push overlaps down, then\n * pull everything up (vertical compaction). The ONE function\n * every render and every commit goes through, so a stored\n * layout that overlaps (an old save, a hand edit, an agent)\n * always draws clean.\n * - `placeBox` move or resize one box; boxes it lands on are pushed down\n * (cascading), then the grid compacts.\n * - `reflowGrid` derive a narrower grid (12 → 4 on a phone) from a wider\n * one when no phone placement was saved: reading order kept,\n * widths scaled, first-fit packing.\n * - `nudgeBox` the keyboard verbs (arrow = move one cell, shift = resize).\n */\n\n/** One box on the grid, in grid units (columns across, rows down). */\nexport interface GridPlacement {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** Size limits a box keeps on every grid (in grid units). */\nexport interface GridSizeLimits {\n minW?: number;\n minH?: number;\n maxW?: number;\n maxH?: number;\n}\n\nexport interface GridBox extends GridPlacement, GridSizeLimits {\n id: string;\n}\n\nconst int = (v: number, fallback: number): number => (Number.isFinite(v) ? Math.round(v) : fallback);\n\n/** The two boxes share at least one cell. */\nexport function boxesCollide(a: GridPlacement, b: GridPlacement): boolean {\n return a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h;\n}\n\n/** A box made legal on a `cols`-wide grid: whole units, inside the columns, within its limits. */\nexport function clampBox<B extends GridBox>(box: B, cols: number): B {\n const maxW = Math.max(1, Math.min(cols, box.maxW ?? cols));\n const minW = Math.max(1, Math.min(maxW, box.minW ?? 1));\n const maxH = Math.max(1, box.maxH ?? Number.POSITIVE_INFINITY);\n const minH = Math.max(1, Math.min(maxH, box.minH ?? 1));\n const w = Math.min(maxW, Math.max(minW, int(box.w, minW)));\n const h = Math.min(maxH, Math.max(minH, int(box.h, minH)));\n const x = Math.min(cols - w, Math.max(0, int(box.x, 0)));\n const y = Math.max(0, int(box.y, 0));\n return { ...box, x, y, w, h };\n}\n\n/** Reading order: top to bottom, then left to right; `first` wins a tie. */\nfunction readingOrder<B extends GridBox>(boxes: readonly B[], first?: string): B[] {\n return [...boxes].sort((a, b) => a.y - b.y || (a.id === first ? -1 : b.id === first ? 1 : 0) || a.x - b.x);\n}\n\n/**\n * Pull every box up as far as it goes without overlapping a box placed before it\n * (reading order). Overlaps left by the input are pushed down first.\n */\nexport function compactGrid<B extends GridBox>(boxes: readonly B[], first?: string): B[] {\n const placed: B[] = [];\n for (const box of readingOrder(boxes, first)) {\n let next = { ...box };\n // Up while free…\n while (next.y > 0 && !placed.some((p) => boxesCollide(p, { ...next, y: next.y - 1 }))) next = { ...next, y: next.y - 1 };\n // …and down while it lands on something already placed.\n for (;;) {\n const hit = placed.find((p) => boxesCollide(p, next));\n if (!hit) break;\n next = { ...next, y: hit.y + hit.h };\n }\n placed.push(next);\n }\n const byId = new Map(placed.map((b) => [b.id, b]));\n return boxes.map((b) => byId.get(b.id)!);\n}\n\n/** Every box legal and no two overlapping. Order of the array is kept. */\nexport function resolveGrid<B extends GridBox>(boxes: readonly B[], cols: number, first?: string): B[] {\n return compactGrid(\n boxes.map((b) => clampBox(b, cols)),\n first,\n );\n}\n\n/**\n * Put box `id` at `next` (position and/or size). Boxes it lands on move DOWN out of\n * its way (and push what they land on, in turn); then the grid compacts with the\n * moved box winning ties. A box that is not there leaves the grid as it was.\n */\nexport function placeBox<B extends GridBox>(boxes: readonly B[], id: string, next: Partial<GridPlacement>, cols: number): B[] {\n const at = boxes.findIndex((b) => b.id === id);\n if (at < 0) return [...boxes];\n const moved = clampBox({ ...boxes[at]!, ...next }, cols);\n const out = boxes.map((b, i) => (i === at ? moved : clampBox(b, cols)));\n // Cascade: whatever overlaps a box that was just settled goes below it.\n const queue: B[] = [moved];\n let guard = 0;\n while (queue.length > 0 && guard++ < 10_000) {\n const settled = queue.shift()!;\n for (let i = 0; i < out.length; i++) {\n const other = out[i]!;\n if (other.id === settled.id || other.id === id) continue;\n if (!boxesCollide(other, settled)) continue;\n const pushed = { ...other, y: settled.y + settled.h };\n out[i] = pushed;\n queue.push(pushed);\n }\n }\n return compactGrid(out, id);\n}\n\n/** The keyboard verbs: arrows move one cell; with `resize` they grow or shrink the box instead. */\nexport function nudgeBox<B extends GridBox>(\n boxes: readonly B[],\n id: string,\n direction: \"left\" | \"right\" | \"up\" | \"down\",\n cols: number,\n resize = false,\n): B[] {\n const box = boxes.find((b) => b.id === id);\n if (!box) return [...boxes];\n const dx = direction === \"left\" ? -1 : direction === \"right\" ? 1 : 0;\n const dy = direction === \"up\" ? -1 : direction === \"down\" ? 1 : 0;\n if (resize) return placeBox(boxes, id, { w: box.w + dx, h: box.h + dy }, cols);\n // Moving down past a neighbor: jump below it, or compaction would pull the box straight back.\n if (dy === 1) {\n const below = readingOrder(boxes.filter((b) => b.id !== id && b.y >= box.y + box.h && b.x < box.x + box.w && box.x < b.x + b.w))[0];\n if (below && below.y === box.y + box.h) return placeBox(boxes, id, { y: below.y + below.h }, cols);\n }\n return placeBox(boxes, id, { x: box.x + dx, y: box.y + dy }, cols);\n}\n\n/** Rows the grid occupies (the field's height in rows). */\nexport function gridRows(boxes: readonly GridPlacement[]): number {\n return boxes.reduce((rows, b) => Math.max(rows, b.y + b.h), 0);\n}\n\n/**\n * A narrower grid derived from a wider one (a 4-column phone from a 12-column\n * desktop): reading order kept, each width scaled to the new columns (never\n * below its minimum, never wider than the grid; wider than half the grid takes\n * the whole row, so no dead strip sits beside it), heights kept, then packed\n * first-fit so two small widgets share a row the way iOS packs them.\n */\nexport function reflowGrid<B extends GridBox>(boxes: readonly B[], fromCols: number, toCols: number): B[] {\n const placed: B[] = [];\n let cursorY = 0;\n for (const box of readingOrder(boxes)) {\n // Wider than half the narrow grid takes the whole row: a 3-of-4 widget on a phone left a dead strip\n // beside it that nothing could ever fill (custom-experience lane F, 2026-10-19). Halves still pair.\n // Judged AFTER the box's own minimum: a desktop minimum of 3 lifted a half-width widget to 3 of 4.\n const fitted = clampBox({ ...box, x: 0, y: 0, w: Math.ceil((box.w * toCols) / Math.max(1, fromCols)) }, toCols);\n const scaled = fitted.w * 2 > toCols ? clampBox({ ...fitted, w: toCols }, toCols) : fitted;\n let spot: B | null = null;\n for (let y = cursorY; spot === null; y++) {\n for (let x = 0; x + scaled.w <= toCols; x++) {\n const candidate = { ...scaled, x, y };\n if (!placed.some((p) => boxesCollide(p, candidate))) {\n spot = candidate;\n break;\n }\n }\n }\n placed.push(spot);\n cursorY = spot.y; // never place a later widget above an earlier one\n }\n const byId = new Map(placed.map((b) => [b.id, b]));\n return boxes.map((b) => byId.get(b.id)!);\n}\n\n/**\n * The phone grid for a set of items: their saved phone placements where every\n * item has one; items without one (added on a desktop since) are packed in\n * below; with none saved at all, the whole grid reflows from the desktop one.\n */\nexport function phoneGrid<B extends GridBox>(\n items: readonly { box: B; sm?: GridPlacement | undefined }[],\n fromCols: number,\n toCols: number,\n): B[] {\n const saved = items.filter((i) => i.sm);\n if (saved.length === 0) return resolveGrid(reflowGrid(items.map((i) => i.box), fromCols, toCols), toCols);\n const kept = resolveGrid(\n saved.map((i) => ({ ...i.box, ...i.sm! })),\n toCols,\n );\n const missing = items.filter((i) => !i.sm);\n if (missing.length === 0) return items.map((i) => kept.find((k) => k.id === i.box.id)!);\n const floor = gridRows(kept);\n const extra = reflowGrid(\n missing.map((i) => i.box),\n fromCols,\n toCols,\n ).map((b) => ({ ...b, y: b.y + floor }));\n const all = [...kept, ...extra];\n return items.map((i) => all.find((b) => b.id === i.box.id)!);\n}\n\n/** Strip a box to its placement (what is stored). */\nexport function placementOf(box: GridPlacement): GridPlacement {\n return { x: box.x, y: box.y, w: box.w, h: box.h };\n}\n\n/** The same placement, cell for cell. */\nexport function samePlacement(a: GridPlacement | undefined, b: GridPlacement | undefined): boolean {\n if (!a || !b) return a === b;\n return a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n}\n\n/**\n * LINES (a content-fit grid): the boxes in reading order, flowed left to right and wrapped, each one line\n * tall. Nothing can sit at a gap or overlap, so an ordered list with a width per item (records-ui blocks,\n * Airtable Interfaces) round-trips exactly: `order` is reading order, `w` is the width.\n */\nexport function packLines<B extends GridBox>(boxes: readonly B[], cols: number): B[] {\n const placed = new Map<string, B>();\n let x = 0;\n let y = 0;\n for (const box of readingOrder(boxes)) {\n const w = clampBox({ ...box, x: 0, y: 0 }, cols).w;\n if (x > 0 && x + w > cols) {\n x = 0;\n y += 1;\n }\n placed.set(box.id, { ...box, x, y, w, h: 1 });\n x += w;\n }\n return boxes.map((b) => placed.get(b.id)!);\n}\n\n/** One step in reading order for a line grid: `by` -1 = one place earlier, +1 = one later; then re-packed. */\nexport function stepLines<B extends GridBox>(boxes: readonly B[], id: string, by: -1 | 1, cols: number): B[] {\n const order = readingOrder(packLines(boxes, cols));\n const at = order.findIndex((b) => b.id === id);\n const to = at + by;\n if (at < 0 || to < 0 || to >= order.length) return packLines(boxes, cols);\n [order[at], order[to]] = [order[to]!, order[at]!];\n // Re-number in the new order so packLines reads it back exactly.\n const renumbered = order.map((b, n) => ({ ...b, x: 0, y: n }));\n const packed = packLines(renumbered, cols);\n const byId = new Map(packed.map((b) => [b.id, b]));\n return boxes.map((b) => byId.get(b.id)!);\n}\n\n/**\n * A line grid's drop: the dragged box goes where its CENTER is — on `line`, at column `col` (fractional) —\n * among the others' centers, then everything re-packs. Past the middle of a neighbor = after it, the way a\n * sortable list reads a drop.\n */\nexport function insertLines<B extends GridBox>(boxes: readonly B[], id: string, line: number, col: number, cols: number): B[] {\n const packed = packLines(boxes, cols);\n const key = (b: B) => (b.id === id ? line * (cols + 1) + col : b.y * (cols + 1) + b.x + b.w / 2);\n const order = [...packed].sort((a, b) => key(a) - key(b));\n const renumbered = order.map((b, n) => ({ ...b, x: 0, y: n }));\n const byId = new Map(packLines(renumbered, cols).map((b) => [b.id, b]));\n return boxes.map((b) => byId.get(b.id)!);\n}\n"],"mappings":"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","names":["React","jsx","Badge","cva","React","jsx","jsxs","cva","React","jsx","React","jsx","useState","jsx","jsxs","useState","useRef","useState","jsx","jsxs","actions","useRef","useState","React","jsx","React","jsx","jsxs","jsx","jsxs","React","jsx","cva","React","jsx","jsxs","open","cva","React","jsx","Switch","useState","jsx","jsxs","useState","React","jsx","React","jsx","React","jsx","React","copyText","openOutbound","React","OutboundLink","React","jsx","HoverCardPrimitive","Slot","React","OutboundLink","Fragment","jsx","jsxs","window","Button","OutboundLink","List","actions","scroller","Slot","Fragment","jsx","jsxs","OutboundLink","Button","jsx","handle","Fragment","jsx","jsxs","Button","copyText","openOutbound","React","formatCount","OutboundLink","jsx","jsxs","formatCount","Button","OutboundLink","CandidateCard","React","jsx","jsxs","MediaOption","AddTile","React","Slot","jsx","jsxs","Button","Slot","React","jsx","jsxs","jsx","jsxs","cva","React","jsx","cva","React","jsx","jsxs","Button","React","jsx","jsx","useState","useEffect","useCallback","useRef","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","React","Fragment","jsx","jsxs","React","sizeClasses","jsx","jsx","jsxs","useCallback","useRef","jsx","PopoverPrimitive","Slot","React","Fragment","jsx","jsxs","Slot","React","jsx","jsxs","Button","pick","useEffect","useLayoutEffect","useRef","useState","first","jsx","jsxs","lg","sm","useState","useLayoutEffect","useRef","useEffect"]}
1
+ {"version":3,"sources":["../src/accordion.tsx","../src/badge.tsx","../src/pill-guard.ts","../src/alert.tsx","../src/read-state/use-read.ts","../src/avatar.tsx","../src/card.tsx","../src/creatable-picker.tsx","../src/overflow-toolbar.tsx","../src/progress.tsx","../src/scroll-area.tsx","../src/score-ring.tsx","../src/separator.tsx","../src/sidebar.tsx","../src/switch.tsx","../src/tabbed-bottom-sheet.tsx","../src/tabs.tsx","../src/scroll-fade.tsx","../src/hover-card.tsx","../src/contact-values/contact-values.tsx","../src/peek.tsx","../src/peek-record.ts","../src/peek-model.ts","../src/peek-glyphs.tsx","../src/peek-card.tsx","../src/contact-values/social-brand-paths.ts","../src/contact-values/glyphs.tsx","../src/contact-values/model.ts","../src/candidate-card.tsx","../src/media-option.tsx","../src/assist-peek.tsx","../src/radio-group.tsx","../src/toggle.tsx","../src/floating-dock.tsx","../src/deferred-dialog.tsx","../src/deferred-dialogs.tsx","../src/clipboard-fallback-host.tsx","../src/floating-sheet.tsx","../src/simple-tooltip.tsx","../src/loading-spinner.tsx","../src/mini-loader.tsx","../src/suspense-loader.tsx","../src/shimmer-text.tsx","../src/form-theme.ts","../src/first-use-hint.tsx","../src/review-changes.tsx","../src/grid-canvas/grid-canvas.tsx","../src/grid-canvas/layout.ts"],"sourcesContent":["\"use client\";\n\n/**\n * Accordion — the last primitive the fleet was still standing in for.\n *\n * The census that motivated this file (2026-09-07, census row 19c): the growth\n * waves collapsed Card, Table, Alert, Avatar, Progress, Collapsible, Checkbox,\n * Slider and RadioGroup into this package, but Accordion existed nowhere in\n * it — so `aidream/apps/workflow-studio`'s DB-authored component scope was\n * still handing agent-authored components four dependency-free `<div>`s named\n * Accordion / AccordionItem / AccordionTrigger / AccordionContent. A DB-\n * authored component that asked for an accordion got four stacked divs: every\n * section permanently open, no trigger, no keyboard, no ARIA. That is the\n * \"dead-looking screen\" failure, not a styling nit.\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. The matrx-frontend\n * original carried a wrapper that deferred rendering until after hydration on\n * the theory that \"Radix generates dynamic aria-controls ids that differ\n * between SSR and client\". That is false — Radix ids come from React's\n * SSR-stable `useId` — and the gate deleted every accordion HEADER (and any\n * defaultValue-open item) from SSR and the first client paint. Same reasoning,\n * same verdict, as `collapsible.tsx`.\n *\n * Density is a PROP, exactly as on Card and Table: declared once on the root,\n * read from context by every trigger and panel, so an accordion cannot end up\n * with a `p-4` header above a `p-2` body.\n *\n * sm → py-2 trigger, pb-2 content (dense panels, inspector sidebars)\n * md → p-4 trigger, pb-4 content (reading surfaces; the default)\n *\n * The open/close height transition is package-owned CSS\n * (`.matrx-accordion-content` in `styles.css`, keyed off Radix's\n * `--radix-accordion-content-height`). It is NOT the Tailwind\n * `animate-accordion-down` utility the matrx-frontend fork used: that name\n * only exists in a host `tailwind.config.js`, so a fresh consumer got a\n * component that jumped open with no animation and no error — the exact\n * silent-host-contract failure C26 (the styling contract) exists to stop.\n *\n * Color is tokens only.\n */\n\nimport * as AccordionPrimitive from \"@radix-ui/react-accordion\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { RadixChevronDownIcon } from \"./icons\";\n\nexport type AccordionSize = \"sm\" | \"md\";\n\nconst ACCORDION_SIZES: Record<\n AccordionSize,\n { trigger: string; content: string }\n> = {\n sm: { trigger: \"py-2 text-sm\", content: \"pb-2\" },\n md: { trigger: \"p-4 text-sm\", content: \"px-4 pb-4\" },\n};\n\nconst AccordionSizeContext = React.createContext<AccordionSize>(\"md\");\n\n/** The density the nearest enclosing `<Accordion>` declared. `md` outside one. */\nexport function useAccordionSize(): AccordionSize {\n return React.useContext(AccordionSizeContext);\n}\n\ntype AccordionRootProps = React.ComponentPropsWithoutRef<\n typeof AccordionPrimitive.Root\n> & {\n /** Density for this accordion and every section inside it. Default `md`. */\n size?: AccordionSize;\n};\n\nexport type AccordionProps = AccordionRootProps;\n\nconst Accordion = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Root>,\n AccordionRootProps\n>(({ size = \"md\", ...props }, ref) => (\n <AccordionSizeContext.Provider value={size}>\n <AccordionPrimitive.Root ref={ref} data-slot=\"accordion\" data-size={size} {...props} />\n </AccordionSizeContext.Provider>\n));\nAccordion.displayName = \"Accordion\";\n\nconst AccordionItem = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Item>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Item>\n>(({ className, ...props }, ref) => (\n <AccordionPrimitive.Item\n ref={ref}\n data-slot=\"accordion-item\"\n // A single-item accordion is a disclosure, not a list — the divider under\n // it would be a line under nothing.\n className={cn(\"[&:not(:only-child)]:border-b\", className)}\n {...props}\n />\n));\nAccordionItem.displayName = \"AccordionItem\";\n\nexport interface AccordionTriggerProps\n extends React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Trigger> {\n /**\n * Controls rendered on the trigger row, before the chevron (a count badge, a\n * status pill). They live INSIDE the button, so keep them non-interactive —\n * a nested button is invalid HTML and swallows the toggle.\n */\n rightElements?: React.ReactNode;\n}\n\nconst AccordionTrigger = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Trigger>,\n AccordionTriggerProps\n>(({ className, children, rightElements, ...props }, ref) => {\n const size = useAccordionSize();\n return (\n <AccordionPrimitive.Header className=\"flex w-full\">\n <AccordionPrimitive.Trigger\n ref={ref}\n data-slot=\"accordion-trigger\"\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded-md text-left font-medium transition-all\",\n \"hover:bg-accent/50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:opacity-50\",\n \"[&[data-state=open]>[data-slot=accordion-trigger-end]>svg]:rotate-180\",\n ACCORDION_SIZES[size].trigger,\n className,\n )}\n {...props}\n >\n {children}\n <span\n data-slot=\"accordion-trigger-end\"\n className=\"flex shrink-0 items-center gap-2\"\n >\n {rightElements}\n <RadixChevronDownIcon className=\"size-4 shrink-0 text-muted-foreground transition-transform duration-200\" />\n </span>\n </AccordionPrimitive.Trigger>\n </AccordionPrimitive.Header>\n );\n});\nAccordionTrigger.displayName = \"AccordionTrigger\";\n\nconst AccordionContent = React.forwardRef<\n React.ComponentRef<typeof AccordionPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof AccordionPrimitive.Content>\n>(({ className, children, ...props }, ref) => {\n const size = useAccordionSize();\n return (\n <AccordionPrimitive.Content\n ref={ref}\n data-slot=\"accordion-content\"\n className=\"matrx-accordion-content overflow-hidden text-sm\"\n {...props}\n >\n <div className={cn(ACCORDION_SIZES[size].content, className)}>{children}</div>\n </AccordionPrimitive.Content>\n );\n});\nAccordionContent.displayName = \"AccordionContent\";\n\nexport { Accordion, AccordionContent, AccordionItem, AccordionTrigger };\n","import { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\n// THE PILL CLAMP (owner, 2026-10-04). A badge holds a short label. Its text is\n// one line, ellipsised, inside a 16rem box, and a string label becomes the\n// tooltip — so a value that turns out to be a sentence (\"140 cards - 1 section\n// could not be covered …\") can never stretch a capsule across the page or wrap\n// it to two lines. A value that IS a sentence belongs in a list row, not here.\n// The dev pill guard (`enablePillGuard`) screams at any capsule that still\n// renders wider than its budget or on two lines.\nexport const badgeVariants = cva(\n \"inline-flex min-w-0 max-w-[16rem] items-center gap-1 whitespace-nowrap rounded-md border px-2 py-0.5 text-[11px] font-medium transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-0 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"border-transparent bg-primary/15 text-primary-ink\",\n secondary: \"border-transparent bg-secondary text-secondary-foreground\",\n destructive: \"border-transparent bg-destructive/15 text-destructive-ink\",\n outline: \"border-border text-foreground\",\n success: \"border-transparent bg-success/15 text-success-ink\",\n warning: \"border-transparent bg-warning/15 text-warning-ink\",\n info: \"border-info/30 bg-info/15 text-info-ink\",\n error: \"border-transparent bg-destructive/15 text-destructive-ink\",\n neutral: \"border-border bg-muted text-muted-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLSpanElement>,\n VariantProps<typeof badgeVariants> {}\n\n/** The plain text a badge's children spell, when they are only text. */\nfunction textOf(children: React.ReactNode): string | null {\n const parts: string[] = [];\n let onlyText = true;\n React.Children.forEach(children, (c) => {\n if (typeof c === \"string\" || typeof c === \"number\") parts.push(String(c));\n else if (c != null && typeof c !== \"boolean\") onlyText = false;\n });\n const text = parts.join(\"\").trim();\n return onlyText && text ? text : null;\n}\n\nexport function Badge({ className, variant, children, title, ...props }: BadgeProps) {\n // Text children are wrapped so they — not the icons beside them — truncate:\n // `text-overflow` never reaches the anonymous text boxes of a flex container.\n // A RUN of adjacent text children (`{label}: {n} override{s}` is five of\n // them in JSX) is ONE span: wrapped one by one, each piece was its own\n // flex item with its own `gap-1` and its own ellipsis, so a long pill\n // clipped mid-word at uneven widths (\"5 override s\"). It clamps whole.\n const clamped: React.ReactNode[] = [];\n let run = \"\";\n const flush = () => {\n if (run === \"\") return;\n clamped.push(\n <span key={`t${clamped.length}`} data-slot=\"badge-text\" className=\"min-w-0 truncate\">\n {run}\n </span>,\n );\n run = \"\";\n };\n for (const c of React.Children.toArray(children)) {\n if (typeof c === \"string\" || typeof c === \"number\") run += String(c);\n else {\n flush();\n clamped.push(c);\n }\n }\n flush();\n return (\n <span\n data-slot=\"badge\"\n title={title ?? textOf(children) ?? undefined}\n className={cn(badgeVariants({ variant }), className)}\n {...props}\n >\n {clamped}\n </span>\n );\n}\n","\"use client\";\n\nimport { layoutScale } from \"./layout-scale\";\n\n// THE PILL GUARD — development builds only (owner, 2026-10-04).\n//\n// A pill / chip / badge / capsule holds a SHORT label. The defect it exists for:\n// \"Also made from\" drew each related item as a rounded-full link holding a\n// sentence, up to 24rem wide — a quarter of the page per capsule, impossible to\n// read. Badge now clamps itself (badge.tsx), but a hand-rolled capsule anywhere\n// in a host is invisible to that. So, like the tap-target guard, this measures\n// what actually rendered: every capsule on the page (a Badge, anything marked\n// `data-matrx-pill`, and any `rounded-full` a/button/span/div carrying text) is\n// checked after layout settles, and one that is wider than the budget or wraps\n// to a second line gets a dashed red outline and ONE console error naming it.\n//\n// OFF until the host turns it on with `enablePillGuard()` from code the HOST\n// compiles in development (matrx-frontend: components/icons/tap-target-setup.ts).\n// Never gate on `process.env.NODE_ENV` in here — this package's build inlines it.\n//\n// Opt-out for a capsule that is deliberately wide (a full-width segmented bar):\n// `data-matrx-pill=\"off\"` on it.\n\n/** A capsule wider than this is a sentence in a button. The static twin\n * (matrx-frontend check:ui-drift `unclamped-text-pill`) uses the same budget. */\nexport const PILL_MAX_WIDTH_PX = 320;\n\n/** A pill wider than its own label by more than this was STRETCHED by its\n * parent (a grid cell's default `justify-items: stretch`, a `w-full`, a\n * `flex-1`): the label sits at one end of an empty capsule (2026-10-04,\n * /education/overview at 375px — every metric pill filled its grid column). */\nexport const PILL_STRETCH_TOLERANCE_PX = 8;\n// A pill that runs past its container or the viewport is flagged too (0.61.11:\n// \"206 Flashcard Stu…\" ran off a 375px screen once the pills stopped stretching).\n\nconst SELECTOR = [\n '[data-slot=\"badge\"]',\n \"[data-matrx-pill]\",\n \"a.rounded-full\",\n \"button.rounded-full\",\n \"span.rounded-full\",\n \"div.rounded-full\",\n].join(\",\");\n\nconst SLOT = Symbol.for(\"@ai-matrx/design-system:pill-guard\");\ntype GlobalWithSlot = typeof globalThis & { [SLOT]?: () => void };\n\nfunction px(v: string | null | undefined): number {\n const n = Number.parseFloat(v ?? \"\");\n return Number.isFinite(n) ? n : 0;\n}\n\nfunction describe(el: Element): string {\n const t = (el.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n return t.length > 60 ? `${t.slice(0, 57)}…` : t;\n}\n\n/**\n * The text nodes that draw the capsule's own label: every descendant text node\n * except those inside an out-of-flow child (`position: absolute | fixed`), a\n * hidden one, or an interactive child (a tab, a button, a link). An\n * out-of-flow child sits ON the capsule, not in its line; a capsule whose text\n * all lives in interactive children is a TRACK (a tab bar, a mode switcher) and\n * each child is a pill the guard judges by itself.\n */\nconst INTERACTIVE = 'a[href],button,[role=\"tab\"],[role=\"button\"],[role=\"radio\"],[role=\"link\"],[role=\"menuitem\"],[role=\"option\"]';\n\nfunction ownTextNodes(el: HTMLElement, view: Window & typeof globalThis): Text[] {\n const out: Text[] = [];\n const walker = el.ownerDocument.createTreeWalker(el, 4 /* NodeFilter.SHOW_TEXT */);\n for (let n = walker.nextNode(); n; n = walker.nextNode()) {\n let offFlow = false;\n for (let p = n.parentElement; p && p !== el; p = p.parentElement) {\n const pcs = view.getComputedStyle(p);\n if (\n pcs.position === \"absolute\" ||\n pcs.position === \"fixed\" ||\n pcs.display === \"none\" ||\n p.matches(INTERACTIVE)\n ) {\n offFlow = true;\n break;\n }\n }\n if (!offFlow) out.push(n as Text);\n }\n return out;\n}\n\n/**\n * A PROGRESS TRACK IS NOT A PILL (2026-10-05): a `rounded-full` bar that fills to a percentage — it\n * says so with `role=\"progressbar\"` / `aria-valuenow`, or it clips (`overflow: hidden`) a direct\n * child whose inline width is a percentage — is a gauge. It may hold an icon or a \"60%\" label and\n * is as wide as its row by design; a width budget and a stretch test do not apply to it.\n */\nexport function isProgressTrack(el: HTMLElement): boolean {\n if (el.getAttribute(\"role\") === \"progressbar\" || el.hasAttribute(\"aria-valuenow\")) return true;\n if (el.closest('[role=\"progressbar\"]') === el.parentElement && el.parentElement?.getAttribute(\"role\") === \"progressbar\") return true;\n const view = el.ownerDocument.defaultView;\n const clips = el.style.overflow === \"hidden\" || el.className.split(/\\s+/).includes(\"overflow-hidden\") || view?.getComputedStyle(el).overflow === \"hidden\";\n if (!clips) return false;\n return Array.from(el.children).some((c) => /%$/.test((c as HTMLElement).style?.width ?? \"\"));\n}\n\n/**\n * Why this capsule breaks the pill budget, or null. Pure: reads layout only.\n * `maxWidth` defaults to PILL_MAX_WIDTH_PX.\n */\nexport function findPillViolation(el: HTMLElement, maxWidth = PILL_MAX_WIDTH_PX): string | null {\n if (el.getAttribute(\"data-matrx-pill\") === \"off\") return null;\n if (isProgressTrack(el)) return null;\n const view = el.ownerDocument.defaultView;\n if (!view) return null;\n // Only the capsule's OWN text is its label. A count badge pinned to an icon\n // disc (`absolute -top-1`) is a separate pill the guard checks by itself; the\n // disc holding it is still an icon disc, not a two-line label.\n const own = ownTextNodes(el, view);\n if (!own.some((t) => (t.textContent ?? \"\").trim())) return null; // an icon disc or an avatar, not a label\n const rect = el.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) return null;\n const cs = view.getComputedStyle(el);\n if (cs.display === \"none\" || cs.visibility === \"hidden\") return null;\n // Every distance below is judged in LAYOUT pixels (see layout-scale.ts): a pill inside a\n // zoomed tile is the same pill.\n const scale = layoutScale(el);\n const width = rect.width / scale;\n if (width > maxWidth + 0.5) {\n return `pill is ${Math.round(width)}px wide (budget ${maxWidth}px) holding \"${describe(el)}\" — a pill holds a short label: clamp it (Badge, or truncate + max-w + title) or render a list row.`;\n }\n const past = overflowPast(el, rect, view, scale);\n if (past) {\n return `pill overflows ${past.what} by ${Math.round(past.by)}px holding \"${describe(el)}\" — a pill never runs past its row or the page gutter: let the row wrap and give the pill max-w-full with a truncating label.`;\n }\n const lines = lineCount(el, own, cs, rect.height);\n if (lines > 1) {\n return `pill wraps to ${lines} lines holding \"${describe(el)}\" — a pill is one line: clamp it (Badge, or truncate + max-w + title) or render a list row.`;\n }\n // A CIRCLE IS NOT A CAPSULE (2026-10-04, /bring-your-work step numbers): a fixed round marker\n // holding a digit or initials (`size-6 rounded-full`) is as wide as it is tall by design — its\n // empty sides are the circle, never a parent stretching it.\n if (Math.abs(width - rect.height / scale) < 1) return null;\n const slack = stretchSlack(el, own, cs, width, view, scale);\n if (slack !== null && slack > PILL_STRETCH_TOLERANCE_PX) {\n return `pill is stretched: ${Math.round(slack)}px of empty capsule beside \"${describe(el)}\" — a pill hugs its label; stop the parent stretching it (a grid cell: justify-self-start; drop w-full / flex-1), or render a full-width tappable item as a row, never a pill.`;\n }\n return null;\n}\n\n/**\n * How far the capsule runs past its parent's box or the viewport, or null.\n * A pill inside a sideways track (an ancestor that scrolls horizontally, with\n * more content to its right) is off-screen by design and is not judged. A pill is judged against its\n * parent, its nearest clipping ancestor (overflow hidden/auto/scroll/clip), and the viewport\n * but the viewport only for the part the clippers leave drawn, never inside a transformed\n * (panned/zoomed) ancestor, and never when it is wholly off screen. A parent with no box (display:\n * contents, or no layout engine) is skipped; the viewport is still checked.\n */\nfunction overflowPast(\n el: HTMLElement,\n rect: DOMRect,\n view: Window & typeof globalThis,\n scale = 1,\n): { what: string; by: number } | null {\n // A sideways TRACK: an ancestor that scrolls horizontally. A pill beyond its\n // edge is off-screen by design, so it is not judged. A scroller that ALSO\n // scrolls vertically (a table body, a page) exempts it too, but only when\n // something else extends the scroll width further right than the pill does:\n // computed overflow cannot tell a table scroller from a page whose\n // overflow-x is merely `auto`, and when the pill itself is the right-most\n // thing it is the pill that makes the page scroll sideways (the 0.61.12 miss).\n for (let p = el.parentElement; p; p = p.parentElement) {\n const ox = view.getComputedStyle(p).overflowX;\n if ((ox === \"auto\" || ox === \"scroll\") && p.scrollWidth > p.clientWidth + 1) {\n if (p.scrollHeight <= p.clientHeight + 1) return null;\n const contentRight = rect.right - p.getBoundingClientRect().left + p.scrollLeft;\n if (contentRight < p.scrollWidth - 4) return null;\n }\n }\n // A pinned capsule (a count badge at `absolute -top-1 -right-1`) sits ON\n // its parent's corner by design: only the viewport judges it.\n const pinned = [\"absolute\", \"fixed\"].includes(view.getComputedStyle(el).position);\n const parent = el.parentElement;\n if (parent && !pinned) {\n const pr = parent.getBoundingClientRect();\n if (pr.width > 0) {\n const by = Math.max(rect.right - pr.right, pr.left - rect.left) / scale;\n if (by > 0.5) return { what: \"its container\", by };\n }\n }\n // The nearest CLIPPING ancestor (overflow hidden/auto/scroll/clip) is the\n // box the pill must fit. It is judged when it is not the parent already\n // judged above.\n let clip: HTMLElement | null = null;\n let transformed = false;\n // A transformed layer BETWEEN the pill and its clip is a pan/zoom world inside\n // a viewport (a chart, a canvas): panning carries the pill past the clip by\n // design, so there only a pill wider than the clip — one no pan can ever show\n // whole — is an overflow.\n let pannedInsideClip = false;\n const root = el.ownerDocument.documentElement;\n for (let p = el.parentElement; p && p !== root; p = p.parentElement) {\n const pcs = view.getComputedStyle(p);\n if (!clip && pcs.overflowX !== \"visible\" && pcs.overflowX !== \"\") clip = p;\n if (\n (pcs.transform && pcs.transform !== \"none\") ||\n (pcs.translate && pcs.translate !== \"none\") ||\n (pcs.scale && pcs.scale !== \"none\") ||\n (pcs.rotate && pcs.rotate !== \"none\")\n ) {\n transformed = true;\n if (!clip) pannedInsideClip = true;\n }\n }\n if (clip && !pinned && clip !== parent) {\n const cr = clip.getBoundingClientRect();\n if (cr.width > 0) {\n const by = pannedInsideClip\n ? (rect.width - cr.width) / scale\n : Math.max(rect.right - cr.right, cr.left - rect.left) / scale;\n if (by > 0.5) return { what: \"its clipping container\", by };\n }\n }\n // Where the pill is actually drawn: its box cut by every clipping ancestor.\n let left = rect.left;\n let right = rect.right;\n let top = rect.top;\n let bottom = rect.bottom;\n for (let p = el.parentElement; p && p !== root; p = p.parentElement) {\n const pcs = view.getComputedStyle(p);\n if (pcs.overflowX === \"visible\" && pcs.overflowY === \"visible\") continue;\n const cr = p.getBoundingClientRect();\n if (cr.width === 0 && cr.height === 0) continue;\n if (pcs.overflowX !== \"visible\") {\n left = Math.max(left, cr.left);\n right = Math.min(right, cr.right);\n }\n if (pcs.overflowY !== \"visible\") {\n top = Math.max(top, cr.top);\n bottom = Math.min(bottom, cr.bottom);\n }\n }\n const vw = root.clientWidth || view.innerWidth;\n const vh = root.clientHeight || view.innerHeight;\n // A transformed ancestor (a panned/zoomed canvas tile) places the pill by\n // design; a pill whose drawn part is entirely off screen is not on the page\n // right now. Neither is a layout defect of the pill.\n if (transformed) return null;\n if (vw > 0 && (right <= left || right <= 0 || left >= vw)) return null;\n if (vh > 0 && (bottom <= top || bottom <= 0 || top >= vh)) return null;\n if (vw > 0) {\n const by = Math.max(right - vw, -left);\n if (by > 0.5) return { what: \"the viewport\", by };\n }\n return null;\n}\n\n/**\n * How much wider the capsule's content box is than the ink it holds (its own\n * text runs plus its in-flow glyphs and images), or null when the engine\n * reports no line boxes (jsdom) — never guessed. A label wider than its box\n * (truncated) gives a negative slack: not stretched.\n */\nfunction stretchSlack(\n el: HTMLElement,\n own: Text[],\n cs: CSSStyleDeclaration,\n width: number,\n view: Window & typeof globalThis,\n scale = 1,\n): number | null {\n const range = el.ownerDocument.createRange?.();\n if (!range || typeof range.getClientRects !== \"function\") return null;\n let left = Infinity;\n let right = -Infinity;\n const take = (r: DOMRect | DOMRectReadOnly) => {\n if (r.width <= 0 || r.height <= 0) return;\n left = Math.min(left, r.left);\n right = Math.max(right, r.right);\n };\n for (const node of own) {\n if (!(node.textContent ?? \"\").trim()) continue;\n range.selectNodeContents(node);\n Array.from(range.getClientRects()).forEach(take);\n }\n range.detach?.();\n if (!Number.isFinite(left)) return null; // no measured text: not this check's question\n // Ink is text, glyphs, images, a remove button and any in-flow mark that says so (`data-matrx-pill-ink`: a status\n // dot before the label). A dot left out of the ink read as 12px of \"empty capsule\" beside it.\n // A chip's own remove button (\"Wilhelm Achterberg ×\") is ink too: its × is a child button's text,\n // not the chip's, and measured as empty capsule every removable chip read as stretched.\n el.querySelectorAll(\"svg, img, button, [role='button'], [data-matrx-pill-ink]\").forEach((g) => {\n for (let p: Element | null = g; p && p !== el; p = p.parentElement) {\n const pcs = view.getComputedStyle(p);\n if (pcs.position === \"absolute\" || pcs.position === \"fixed\" || pcs.display === \"none\") return;\n }\n take(g.getBoundingClientRect());\n });\n // A painted mark with no text of its own (a `bg-success` status dot) is ink by its fill, marked or not:\n // \"Live · Set active\" and \"Coming Soon\" read as 10–12px of empty capsule beside their dots (2026-10-18).\n el.querySelectorAll(\"span, i, div\").forEach((g) => {\n if ((g.textContent ?? \"\").trim() || g.querySelector(\"*\")) return;\n const gcs = view.getComputedStyle(g);\n if (gcs.position === \"absolute\" || gcs.position === \"fixed\" || gcs.display === \"none\") return;\n if (paintsNothing(gcs.backgroundColor)) return;\n take(g.getBoundingClientRect());\n });\n const inner = width - px(cs.paddingLeft) - px(cs.paddingRight) - px(cs.borderLeftWidth) - px(cs.borderRightWidth);\n return inner - (right - left) / scale;\n}\n\n/** A computed color with zero alpha (`transparent`, `rgba(… 0)`, `rgb(… / 0)`) paints nothing. */\nfunction paintsNothing(color: string): boolean {\n return !color || color === \"transparent\" || /^\\w+\\((?:[^,/)]*,){3}\\s*0(?:\\.0*)?%?\\s*\\)$|\\/\\s*0(?:\\.0*)?%?\\s*\\)$/.test(color);\n}\n\n/**\n * How many text lines the capsule draws. Measured from the text's own line\n * boxes when the engine reports them (a real browser); otherwise estimated\n * from the content height. Line boxes, not height, so a count badge drawn in a\n * box taller than its `leading-none` line (a 16px \"99+\" dot) is not \"2 lines\".\n */\nfunction lineCount(el: HTMLElement, own: Text[], cs: CSSStyleDeclaration, height: number): number {\n const range = el.ownerDocument.createRange?.();\n if (range && typeof range.getClientRects === \"function\") {\n // Text line boxes only: a range over the whole element also returns the\n // boxes of its glyph <svg> and of every positioned child, which are not lines.\n const rects: DOMRect[] = [];\n for (const node of own) {\n if (!(node.textContent ?? \"\").trim()) continue;\n range.selectNodeContents(node);\n rects.push(...Array.from(range.getClientRects()).filter((r) => r.width > 0 && r.height > 0));\n }\n range.detach?.();\n if (rects.length) {\n const mids: number[] = [];\n for (const r of rects) {\n const mid = r.top + r.height / 2;\n if (!mids.some((m) => Math.abs(m - mid) < r.height / 2)) mids.push(mid);\n }\n return mids.length;\n }\n }\n const fontSize = px(cs.fontSize) || 12;\n const lineHeight = Math.max(px(cs.lineHeight), fontSize * 1.25);\n const inner = height - px(cs.paddingTop) - px(cs.paddingBottom) - px(cs.borderTopWidth) - px(cs.borderBottomWidth);\n return inner > lineHeight * 1.5 ? Math.round(inner / lineHeight) : 1;\n}\n\n// The destructive token, so the mark reads as an error in both themes.\nconst OUTLINE = \"2px dashed hsl(var(--destructive))\";\n\n/**\n * Turn the development pill guard on. Returns the function that turns it off.\n * Idempotent: a second call keeps the first install.\n */\nexport function enablePillGuard(options: { maxWidth?: number; root?: Document } = {}): () => void {\n const g = globalThis as GlobalWithSlot;\n if (g[SLOT]) return g[SLOT]!;\n const doc = options.root ?? (typeof document === \"undefined\" ? null : document);\n const view = doc?.defaultView;\n if (!doc || !view) return () => {};\n const maxWidth = options.maxWidth ?? PILL_MAX_WIDTH_PX;\n const marked = new Map<HTMLElement, string>(); // el → its own outline before we painted\n const reported = new Set<string>();\n let timer: ReturnType<typeof setTimeout> | null = null;\n let observer: MutationObserver | null = null;\n\n const scan = () => {\n timer = null;\n observer?.disconnect(); // our own attribute writes must not re-trigger a scan\n for (const [el, before] of marked) {\n if (!el.isConnected || !findPillViolation(el, maxWidth)) {\n el.style.outline = before;\n el.removeAttribute(\"data-matrx-pill-violation\");\n marked.delete(el);\n }\n }\n doc.querySelectorAll<HTMLElement>(SELECTOR).forEach((el) => {\n const reason = findPillViolation(el, maxWidth);\n if (!reason) return;\n if (!marked.has(el)) marked.set(el, el.style.outline);\n el.style.outline = OUTLINE;\n el.style.outlineOffset = \"1px\";\n el.setAttribute(\"data-matrx-pill-violation\", reason);\n if (!reported.has(reason)) {\n reported.add(reason);\n console.error(`[pill-guard] ${reason}`, el);\n }\n });\n observe();\n };\n const schedule = () => {\n if (timer) clearTimeout(timer);\n timer = setTimeout(scan, 400);\n };\n const observe = () => {\n if (!doc.body) return;\n observer ??= new view.MutationObserver(schedule);\n observer.observe(doc.body, { childList: true, subtree: true, characterData: true });\n };\n view.addEventListener(\"resize\", schedule);\n observe();\n schedule();\n\n const off = () => {\n observer?.disconnect();\n view.removeEventListener(\"resize\", schedule);\n if (timer) clearTimeout(timer);\n for (const [el, before] of marked) {\n el.style.outline = before;\n el.removeAttribute(\"data-matrx-pill-violation\");\n }\n marked.clear();\n delete g[SLOT];\n };\n g[SLOT] = off;\n return off;\n}\n","\"use client\";\n\n/**\n * Alert — the inline status banner (76 host import sites).\n *\n * Ported from matrx-frontend `components/ui/alert.tsx`. That copy shipped two\n * variants, `default` and `destructive`, so every \"this is a warning\" and\n * \"this succeeded\" banner in the fleet was hand-rolled: an amber or emerald\n * `<div>` carrying literal palette classes and a hand-written dark-mode twin,\n * written once per surface. The census that opened this wave found dozens of those\n * across four repos.\n *\n * So the variant set is the token vocabulary this package already declares —\n * `default | destructive | warning | success | info` — and none of them\n * hardcode a color (C26). A host that wants a different amber changes\n * `--warning`; it never writes another banner.\n *\n * `Alert` is a plain `role=\"alert\"` region, NOT a toast: it stays on the page,\n * it is not dismissed on a timer, and a screen reader announces it where it\n * sits. Transient notifications are the host's toast system.\n */\n\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\nimport { ErrorActions, type ErrorActionsInput } from \"./error-box\";\n\nimport { cn } from \"./cn\";\n\nconst alertVariants = cva(\n \"relative w-full rounded-lg border px-4 py-3 text-sm [&>svg+div]:translate-y-[-3px] [&>svg]:absolute [&>svg]:left-4 [&>svg]:top-4 [&>svg~*]:pl-7\",\n {\n variants: {\n variant: {\n default: \"bg-background text-foreground [&>svg]:text-foreground\",\n destructive:\n \"border-destructive/50 bg-destructive/5 text-destructive-ink dark:border-destructive [&>svg]:text-destructive-ink\",\n warning:\n \"border-warning/50 bg-warning/5 text-warning-ink dark:border-warning [&>svg]:text-warning-ink\",\n success:\n \"border-success/50 bg-success/5 text-success-ink dark:border-success [&>svg]:text-success-ink\",\n info: \"border-info/50 bg-info/5 text-info-ink dark:border-info [&>svg]:text-info-ink\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n },\n);\n\nexport interface AlertProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof alertVariants> {\n /**\n * The error's facts for the host's error actions (destructive only): the raw\n * error, the operation, the records. Without it the host reads the words\n * from the rendered Alert.\n */\n errorFacts?: ErrorActionsInput | undefined;\n}\n\nconst Alert = React.forwardRef<HTMLDivElement, AlertProps>(\n ({ className, variant, children, errorFacts, ...props }, ref) => (\n <div\n ref={ref}\n role=\"alert\"\n data-slot=\"alert\"\n data-variant={variant ?? \"default\"}\n className={cn(alertVariants({ variant }), className)}\n {...props}\n >\n {children}\n {/* A destructive Alert is an error on screen: the host's error actions\n (ErrorActionsProvider) ride it. The words are the Alert's own, so the\n host reads them from the rendered box. */}\n {variant === \"destructive\" ? (\n <ErrorActions origin=\"design-system/Alert\" {...errorFacts} />\n ) : null}\n </div>\n ),\n);\nAlert.displayName = \"Alert\";\n\nconst AlertTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h5\n ref={ref}\n data-slot=\"alert-title\"\n className={cn(\"mb-1 font-medium leading-none tracking-tight\", className)}\n {...props}\n />\n));\nAlertTitle.displayName = \"AlertTitle\";\n\nconst AlertDescription = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"alert-description\"\n className={cn(\"text-sm [&_p]:leading-relaxed\", className)}\n {...props}\n />\n));\nAlertDescription.displayName = \"AlertDescription\";\n\nexport { Alert, AlertDescription, AlertTitle, alertVariants };\n","\"use client\";\n\n/**\n * THE hand-rolled read, done once (RC-B12 round 12). Components that fetched\n * in a `useEffect` with `const [loading, setLoading] = useState(true)` and a\n * `catch { console.error(…) }` left their list at `[]` when the read failed —\n * and the empty view then said \"No items yet\". `useRead` owns the three\n * states, so a failure is always a status the view can gate on:\n *\n * const read = useRead(() => listThings(orgId), [orgId]);\n * <ReadGate status={read.status} error={read.error} onRetry={read.retry}\n * what=\"your things\" isEmpty={!read.data?.length} empty={<p>No things yet.</p>}>\n * <ThingList things={read.data ?? []} />\n * </ReadGate>\n *\n * - status: \"loading\" while a read is in flight (earlier data stays visible),\n * \"error\" when the latest read failed, \"ready\" when it succeeded (or when the\n * read is disabled — nothing was asked, so nothing is claimed).\n * - retry(): run the read again.\n * - setData(): local edits after a create/delete, without a re-read.\n * Late answers from a superseded read are dropped.\n */\nimport { useEffect, useEffectEvent, useState } from \"react\";\nimport type { ReadStatus } from \"./read-gate\";\n\nexport interface ReadResult<T> {\n data: T | undefined;\n status: ReadStatus;\n error: unknown;\n isLoading: boolean;\n isError: boolean;\n /** A read has succeeded at least once — its value is known (stale-while-error for counts and rows). */\n hasData: boolean;\n retry: () => void;\n setData: (next: T | ((prev: T | undefined) => T)) => void;\n}\n\nexport function useRead<T>(\n read: () => Promise<T>,\n /** What the read depends on — serializable values (ids, filters). A change re-reads. */\n deps: readonly unknown[],\n options: { enabled?: boolean; initialData?: T } = {},\n): ReadResult<T> {\n const { enabled = true, initialData } = options;\n const [data, setDataState] = useState<T | undefined>(initialData);\n const [attempt, setAttempt] = useState(0);\n // Status is DERIVED from which read last settled (the react-hooks lint\n // forbids setting state synchronously inside the effect): a read is in\n // flight exactly while the latest settled key is not the current key.\n const [settled, setSettled] = useState<{ key: string; ok: boolean; error: unknown } | null>(null);\n const [everSucceeded, setEverSucceeded] = useState(false);\n const runRead = useEffectEvent(() => read());\n const fetchKey = JSON.stringify([attempt, ...deps]);\n\n useEffect(() => {\n if (!enabled) return undefined;\n let superseded = false;\n let promise: Promise<T>;\n try {\n promise = Promise.resolve(runRead());\n } catch (err) {\n promise = Promise.reject(err);\n }\n promise.then(\n (result) => {\n if (superseded) return;\n setDataState(result);\n setEverSucceeded(true);\n setSettled({ key: fetchKey, ok: true, error: null });\n },\n (err: unknown) => {\n if (superseded) return;\n setSettled({ key: fetchKey, ok: false, error: err ?? new Error(\"The read failed\") });\n },\n );\n return () => {\n // deps changed, retry, or unmount: this run's answer is no longer wanted.\n superseded = true;\n };\n }, [enabled, fetchKey]);\n\n const status: ReadStatus = !enabled\n ? \"ready\"\n : settled?.key !== fetchKey\n ? \"loading\"\n : settled.ok\n ? \"ready\"\n : \"error\";\n const error = status === \"error\" ? settled?.error : null;\n\n const retry = () => setAttempt((n) => n + 1);\n const setData = (next: T | ((prev: T | undefined) => T)) => {\n setDataState((prev) => (typeof next === \"function\" ? (next as (p: T | undefined) => T)(prev) : next));\n };\n\n return { data, status, error, isLoading: status === \"loading\", isError: status === \"error\", hasData: everSucceeded, retry, setData };\n}\n","\"use client\";\n\n/**\n * Avatar — Radix avatar with the package's token vocabulary.\n *\n * The forks differed only in the root's fixed size (matrx-frontend `h-10 w-10`,\n * dashboard `h-9 w-9`) and in whether the fallback carried type styling. Both\n * are settled here as props rather than copies: `size` picks the box, and the\n * fallback always carries the muted type treatment (dashboard's version — a\n * fallback renders initials, and unstyled initials inherit whatever the row\n * was using, which is how the two hosts' avatars stopped matching).\n */\n\nimport * as AvatarPrimitive from \"@radix-ui/react-avatar\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type AvatarSize = \"xs\" | \"sm\" | \"md\" | \"lg\";\n\nconst AVATAR_SIZES: Record<AvatarSize, string> = {\n // xs: the 16px author mark inside a dense line (a comment-thread reply row).\n xs: \"h-4 w-4 text-[9px]\",\n sm: \"h-8 w-8 text-[11px]\",\n md: \"h-9 w-9 text-xs\",\n lg: \"h-10 w-10 text-sm\",\n};\n\nexport interface AvatarProps\n extends React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Root> {\n /** Box size. Default `lg` (the h-10 box matrx-frontend has always shipped). */\n size?: AvatarSize;\n}\n\nconst Avatar = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Root>,\n AvatarProps\n>(({ className, size = \"lg\", ...props }, ref) => (\n <AvatarPrimitive.Root\n ref={ref}\n data-slot=\"avatar\"\n className={cn(\n \"relative flex shrink-0 overflow-hidden rounded-full\",\n AVATAR_SIZES[size],\n className,\n )}\n {...props}\n />\n));\nAvatar.displayName = AvatarPrimitive.Root.displayName;\n\nconst AvatarImage = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Image>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Image>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Image\n ref={ref}\n data-slot=\"avatar-image\"\n className={cn(\"aspect-square h-full w-full\", className)}\n {...props}\n />\n));\nAvatarImage.displayName = AvatarPrimitive.Image.displayName;\n\nconst AvatarFallback = React.forwardRef<\n React.ComponentRef<typeof AvatarPrimitive.Fallback>,\n React.ComponentPropsWithoutRef<typeof AvatarPrimitive.Fallback>\n>(({ className, ...props }, ref) => (\n <AvatarPrimitive.Fallback\n ref={ref}\n data-slot=\"avatar-fallback\"\n className={cn(\n \"flex h-full w-full items-center justify-center rounded-full bg-muted font-medium text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nAvatarFallback.displayName = AvatarPrimitive.Fallback.displayName;\n\nexport { Avatar, AvatarFallback, AvatarImage };\n","\"use client\";\n\n/**\n * Card — the surface every host had already forked, four different ways.\n *\n * The census that motivated this file (2026-09-07): matrx-frontend padded its\n * sections `p-2`, matrx-extend `p-4`, aidream/apps/dashboard `p-6`, and\n * matrx-games ran a Base-UI-generation card of its own. The STRUCTURE was\n * identical in all of them — a bordered, tokenised surface with header /\n * title / description / content / footer slots. Only the density differed.\n *\n * So density is a PROP, not a fork. `size` is declared once on `<Card>` and\n * every section reads it from context, which means a host cannot end up with a\n * `p-6` header above a `p-2` body — the failure mode that made the forks drift\n * in the first place. A host that wants its historical density binds the size\n * once at its import site; nothing else moves.\n *\n * sm → p-2, rounded-xl, `shadow` (matrx-frontend's density)\n * md → p-4, rounded-lg, `shadow-sm` (matrx-extend's density; the default)\n * lg → p-6, rounded-lg, `shadow-sm` (dashboard's density)\n *\n * Color is tokens only (`bg-card` / `text-card-foreground` / `border`), so a\n * host re-themes cards by redefining tokens, never by editing this file.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type CardSize = \"sm\" | \"md\" | \"lg\";\n\ninterface CardSizeSpec {\n root: string;\n pad: string;\n padTopless: string;\n}\n\nconst CARD_SIZES: Record<CardSize, CardSizeSpec> = {\n sm: {\n root: \"rounded-xl border bg-card text-card-foreground shadow\",\n pad: \"p-2\",\n padTopless: \"p-2 pt-0\",\n },\n md: {\n root: \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n pad: \"p-4\",\n padTopless: \"p-4 pt-0\",\n },\n lg: {\n root: \"rounded-lg border bg-card text-card-foreground shadow-sm\",\n pad: \"p-6\",\n padTopless: \"p-6 pt-0\",\n },\n};\n\nconst CardSizeContext = React.createContext<CardSize>(\"md\");\n\n/** The size the nearest enclosing `<Card>` declared. `md` outside one. */\nexport function useCardSize(): CardSize {\n return React.useContext(CardSizeContext);\n}\n\nexport interface CardProps extends React.HTMLAttributes<HTMLDivElement> {\n /** Density for this card and every section inside it. Default `md`. */\n size?: CardSize;\n}\n\nconst Card = React.forwardRef<HTMLDivElement, CardProps>(\n ({ className, size = \"md\", ...props }, ref) => (\n <CardSizeContext.Provider value={size}>\n <div\n ref={ref}\n data-slot=\"card\"\n data-size={size}\n className={cn(CARD_SIZES[size].root, className)}\n {...props}\n />\n </CardSizeContext.Provider>\n ),\n);\nCard.displayName = \"Card\";\n\nconst CardHeader = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n ref={ref}\n data-slot=\"card-header\"\n className={cn(\n \"flex flex-col space-y-1.5 rounded-t-[inherit]\",\n CARD_SIZES[size].pad,\n className,\n )}\n {...props}\n />\n );\n});\nCardHeader.displayName = \"CardHeader\";\n\nconst CardTitle = React.forwardRef<\n HTMLHeadingElement,\n React.HTMLAttributes<HTMLHeadingElement>\n>(({ className, ...props }, ref) => (\n <h3\n ref={ref}\n data-slot=\"card-title\"\n className={cn(\"font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nCardTitle.displayName = \"CardTitle\";\n\nconst CardDescription = React.forwardRef<\n HTMLParagraphElement,\n React.HTMLAttributes<HTMLParagraphElement>\n>(({ className, ...props }, ref) => (\n <p\n ref={ref}\n data-slot=\"card-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nCardDescription.displayName = \"CardDescription\";\n\n/**\n * Trailing control slot for a header (a menu button, a status pill). Absent\n * from every fork except matrx-games', which is why headers elsewhere grew\n * one-off absolute wrappers. Positions itself against the header's row.\n */\nconst CardAction = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => (\n <div\n ref={ref}\n data-slot=\"card-action\"\n className={cn(\"ml-auto self-start\", className)}\n {...props}\n />\n));\nCardAction.displayName = \"CardAction\";\n\n/** The space between a card body's stacked children (0.68.22): 8 / 12 / 16 / 24px. */\nexport type CardGap = \"sm\" | \"md\" | \"lg\" | \"xl\";\nconst CARD_GAP_CLASS: Record<CardGap, string> = {\n sm: \"space-y-2\",\n md: \"space-y-3\",\n lg: \"space-y-4\",\n xl: \"space-y-6\",\n};\n\nexport interface CardContentProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * STACK SPACING, named (0.68.22): the body's children stack with this much space between\n * them — never a pasted `space-y-3`. Omit for no stack spacing.\n */\n gap?: CardGap;\n /**\n * `default`: the card's density padding (no top pad under a header). `none`: the content\n * runs edge to edge (a table, a list with its own row padding, an image).\n */\n padding?: \"default\" | \"none\";\n}\n\nconst CardContent = React.forwardRef<HTMLDivElement, CardContentProps>(\n ({ className, gap, padding = \"default\", ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n ref={ref}\n data-slot=\"card-content\"\n data-gap={gap}\n className={cn(\n padding === \"none\" ? \"p-0\" : CARD_SIZES[size].padTopless,\n gap && CARD_GAP_CLASS[gap],\n className,\n )}\n {...props}\n />\n );\n },\n);\nCardContent.displayName = \"CardContent\";\n\nconst CardFooter = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, ...props }, ref) => {\n const size = useCardSize();\n return (\n <div\n ref={ref}\n data-slot=\"card-footer\"\n className={cn(\n \"flex items-center rounded-b-[inherit]\",\n CARD_SIZES[size].padTopless,\n className,\n )}\n {...props}\n />\n );\n});\nCardFooter.displayName = \"CardFooter\";\n\nexport {\n Card,\n CardAction,\n CardContent,\n CardDescription,\n CardFooter,\n CardHeader,\n CardTitle,\n};\n","\"use client\";\n\n/**\n * CreatablePicker — ported verbatim from matrx-frontend\n * `components/ui/creatable-picker.tsx`.\n *\n * P23 — EVERY PICKER TAKES NEW INPUT.\n *\n * Arman, 2026-08-23: \"We have to annihilate the UIs that offer options but\n * don't allow custom entry because those are the ones that lose the platform\n * the best users… the moment I went in to assign a tier, I got a pop up that\n * forced me to choose from the shitty options I had in front of me. So instead\n * of our system getting significantly better because I took the initiative to\n * add something, our system was too arrogant and cocky and didn't want my\n * opinion. … It's the lazy coding agent who builds a popover with a drop down,\n * but is too lazy to include an add feature.\"\n *\n * THIS COMPONENT IS THE ANSWER, and it is the ONLY shape a keyword-system\n * choice control may take. Type-ahead over the existing options, and whatever\n * you typed that matched nothing is offered back as \"Create «what you typed»\".\n * One click turns it into a real row through the feature's ONE write path and\n * selects it — never a second creation path, never a \"go somewhere else first\".\n *\n * P11 — THE ONE EXCEPTION, AND IT IS NEVER A DEAD END. A platform-shared\n * vocabulary (traffic classes, the platform dimensions every tenant shares) is\n * governed centrally, so this control does not pretend it can widen it. It SAYS\n * so and offers the door instead: `lockedNote` + `lockedAction` render a\n * footer that takes the person to \"make this your own dimension\".\n *\n * It knows nothing about any vocabulary. The caller supplies the options and\n * ONE `onCreate` that writes through whatever the canonical path for that\n * vocabulary already is — this component must never grow a write path of its\n * own, or it becomes the second one.\n *\n * SoR: common-docs/systems/marketing/seo/seo-keywords/keyword-system-decisions.md\n * (P23, P11) + value-system.md § THE ASSIGNMENT LAYER.\n *\n * Seam inversions (the only changes from the origin):\n * - Popover/Command come from this package's own primitives (which route\n * portals through the `PortalContainerProvider` seam).\n * - The lucide icons become package-inlined SVGs (C19); `LucideIcon` in the\n * `footerActions` contract becomes the structural `PickerIcon`.\n */\n\nimport { SelectChevron } from \"./select\";\nimport {\n useRef,\n useState,\n type ComponentType,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"./cn\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n} from \"./command\";\nimport { ExternalLinkIcon, Loader2Icon, LockIcon, CheckIcon, PlusIcon } from \"./icons\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"./popover\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\n\n/** Structural stand-in for the host's `LucideIcon` in `footerActions`. */\nexport type PickerIcon = ComponentType<{ className?: string }>;\n\n/**\n * \"Add a offering…\" is the kind of small wrongness that makes a product feel\n * unfinished, and the noun is caller-supplied so the article has to be derived.\n */\nfunction article(noun: string): string {\n return /^[aeiou]/i.test(noun.trim()) ? `an ${noun}` : `a ${noun}`;\n}\n\nexport interface CreatableOption {\n value: string;\n label: string;\n /** Right-aligned detail — a count, a description, \"yours\". */\n hint?: string;\n /** Rendered instead of the plain label (a band chip, a colored pill). */\n render?: ReactNode;\n /** Extra words the type-ahead should match on. */\n keywords?: string;\n /**\n * The heading this option files under. Options keep the caller's order; a\n * group is opened the first time an option names it. Omit on every option\n * for a single ungrouped list.\n *\n * THE CATALOG IS NOT A WALL (Arman, 2026-08-24, on being shown offerings\n * that were not his): a set that legitimately holds more than this tenant's\n * own rows says so with a heading instead of hiding the rest.\n */\n group?: string;\n}\n\nexport interface CreatablePickerProps {\n value: string | null;\n options: CreatableOption[];\n onSelect: (value: string) => void;\n placeholder: string;\n searchPlaceholder?: string;\n /** The noun in \"Add a level…\" / \"Create «x»\". Always a person's word. */\n noun: string;\n /**\n * Turns typed text into a real row and returns the option value to select.\n * Return null when the caller handled it another way (opened a dialog that\n * needs more than a name — a level needs a threshold).\n */\n onCreate?: (typed: string) => Promise<string | null>;\n /**\n * Creating this noun needs more than a name, so the picker hands the typed\n * text to the caller's dialog instead of writing anything itself.\n */\n onCreateRequiresMore?: (typed: string) => void;\n disabled?: boolean;\n loading?: boolean;\n className?: string;\n triggerClassName?: string;\n emptyLabel?: string;\n ariaLabel?: string;\n /** P11: a sentence saying this vocabulary is platform-governed. */\n lockedNote?: string;\n /** P11: the door out of that refusal — never leave them with only \"no\". */\n lockedAction?: { label: string; onSelect: () => void };\n /**\n * Rendered inside the create footer, above the create button — for the one\n * extra choice a vocabulary needs at creation time (a category's parent,\n * say). It is a SLOT, not a second write path: whatever it collects is read\n * by the caller's own `onCreate`. A function receives what the person typed,\n * so a slot can offer matching suggestions (e.g. a shared catalog) instead\n * of a fixed block.\n */\n createExtra?: ReactNode | ((typed: string) => ReactNode);\n /**\n * THE MANAGE DOOR. Arman, 2026-08-24: \"where we have 'add' we should also\n * have a 'manage' button that opens that thing in a new tab.\" A control that\n * names a vocabulary must also be able to reach the place that vocabulary is\n * governed — otherwise the person who wants to rename, re-parent, or retire\n * an option has to go hunting for a screen they may not know exists.\n *\n * It opens in a NEW TAB on purpose: nobody loses the row they were editing\n * in order to go look at the catalog.\n */\n manageAction?: { label: string; href: string };\n /**\n * Doors to a DIFFERENT answer than this vocabulary can give. The offering\n * picker's \"this isn't something we offer\" lives here, because that ruling\n * is a traffic class, not an offering — and sending someone to look for\n * another column on their own is the dead end this slot exists to close.\n */\n footerActions?: Array<{\n label: string;\n icon?: PickerIcon;\n onSelect: () => void;\n /** A sentence under the door saying what it does, when it needs one. */\n note?: string;\n }>;\n /**\n * What the TRIGGER shows for the current selection, when the caller wants\n * something other than the option row's own `render`. A dense table cell\n * needs one compact line (\"Data Destruction Services · ITAD\"); the list row\n * it came from is indented and annotated. Same selection, two jobs.\n */\n renderSelected?: ReactNode;\n size?: \"sm\" | \"md\";\n}\n\nexport function CreatablePicker({\n value,\n options,\n onSelect,\n placeholder,\n searchPlaceholder,\n noun,\n onCreate,\n onCreateRequiresMore,\n disabled,\n loading,\n className,\n triggerClassName,\n emptyLabel = \"No match.\",\n ariaLabel,\n lockedNote,\n lockedAction,\n createExtra,\n manageAction,\n footerActions,\n renderSelected,\n size = \"sm\",\n}: CreatablePickerProps) {\n const [open, setOpen] = useState(false);\n const [query, setQuery] = useState(\"\");\n const [busy, setBusy] = useState(false);\n /**\n * THE FOOTER IS NEVER A DEAD CLICK. Arman, 2026-08-24: \"one of the options is\n * to allow you to add. When I click add offering, however, nothing happens.\"\n * He was right, and the cause was here, not in the popover: with nothing\n * typed, `create(\"\")` fell straight out of `if (!name) return` and the\n * button ate the click in silence. A control whose whole purpose is P23 may\n * not be the control that ignores you — so an empty \"Add…\" now puts the\n * cursor in the box and SAYS what it wants.\n */\n const inputRef = useRef<HTMLInputElement>(null);\n const [needsName, setNeedsName] = useState(false);\n\n const selected = options.find((option) => option.value === value) ?? null;\n\n // Caller order is the order. A heading opens the first time an option names\n // it, so a tree stays in tree order inside its own heading.\n const groups: Array<{ heading?: string; options: CreatableOption[] }> = [];\n for (const option of options) {\n const last = groups[groups.length - 1];\n if (last && last.heading === option.group) last.options.push(option);\n else\n groups.push(\n option.group === undefined\n ? { options: [option] }\n : { heading: option.group, options: [option] },\n );\n }\n\n const typed = query.trim();\n const exactMatch = options.some(\n (option) => option.label.toLowerCase() === typed.toLowerCase(),\n );\n const canCreate = Boolean(onCreate ?? onCreateRequiresMore) && !lockedNote;\n\n const close = () => {\n setOpen(false);\n setQuery(\"\");\n setNeedsName(false);\n };\n\n const create = async (text: string) => {\n const name = text.trim();\n if (busy) return;\n // `onCreateRequiresMore` opens a dialog that asks for the name itself, so\n // a blank click there is legitimate — it opens the dialog empty. Only the\n // write-it-now path needs a name before it can do anything.\n if (onCreateRequiresMore) {\n close();\n onCreateRequiresMore(name);\n return;\n }\n if (!onCreate) return;\n if (!name) {\n setNeedsName(true);\n inputRef.current?.focus();\n return;\n }\n setBusy(true);\n try {\n const next = await onCreate(name);\n if (next) onSelect(next);\n close();\n } finally {\n setBusy(false);\n }\n };\n\n return (\n <Popover open={open} onOpenChange={(next) => (next ? setOpen(true) : close())}>\n <PopoverTrigger asChild disabled={disabled}>\n <button\n type=\"button\"\n aria-label={ariaLabel ?? placeholder}\n className={cn(\n \"flex w-full items-center justify-between gap-2 rounded-md border border-input bg-transparent px-3 text-left shadow-xs transition-colors\",\n \"hover:border-primary/50 focus:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n size === \"sm\" ? \"h-8 text-xs\" : \"h-9 text-sm\",\n className,\n triggerClassName,\n )}\n >\n <span className=\"min-w-0 flex-1 truncate\">\n {selected ? (\n (renderSelected ?? selected.render ?? selected.label)\n ) : (\n <span className=\"text-muted-foreground\">\n {loading ? \"Loading…\" : placeholder}\n </span>\n )}\n </span>\n <SelectChevron size=\"sm\" />\n </button>\n </PopoverTrigger>\n <PopoverContent sizing=\"content\" align=\"start\" className=\"p-0\">\n <Command\n filter={(itemValue, search, keywords) => {\n const haystack = `${itemValue} ${keywords?.join(\" \") ?? \"\"}`.toLowerCase();\n return haystack.includes(search.toLowerCase()) ? 1 : 0;\n }}\n >\n <CommandInput\n ref={inputRef}\n value={query}\n onValueChange={(next) => {\n setQuery(next);\n if (next.trim()) setNeedsName(false);\n }}\n placeholder={searchPlaceholder ?? `Search or add ${article(noun)}…`}\n />\n <CommandList>\n <CommandEmpty>{emptyLabel}</CommandEmpty>\n {groups.map((group) => (\n <CommandGroup\n key={group.heading ?? \"__ungrouped__\"}\n {...(group.heading === undefined\n ? {}\n : { heading: group.heading })}\n >\n {group.options.map((option) => (\n <CommandItem\n key={option.value}\n value={option.label}\n {...(option.keywords\n ? { keywords: [option.keywords] }\n : {})}\n onSelect={() => {\n onSelect(option.value);\n close();\n }}\n className=\"gap-2 text-xs\"\n >\n <CheckIcon\n className={cn(\n \"size-3.5 shrink-0\",\n option.value === value ? \"opacity-100\" : \"opacity-0\",\n )}\n />\n <span className=\"min-w-0 flex-1 truncate\">\n {option.render ?? option.label}\n </span>\n {option.hint ? (\n <span className=\"shrink-0 text-[10px] text-muted-foreground\">\n {option.hint}\n </span>\n ) : null}\n </CommandItem>\n ))}\n </CommandGroup>\n ))}\n </CommandList>\n\n {/* The \"+ Add\" footer sits OUTSIDE CommandList so the search can\n never hide the one thing the person came here to do (P23). */}\n {canCreate ? (\n <div className=\"space-y-1 border-t border-border p-1\">\n {createExtra && typed && !exactMatch ? (\n <div className=\"px-1 pt-0.5\">\n {typeof createExtra === \"function\"\n ? createExtra(typed)\n : createExtra}\n </div>\n ) : null}\n <button\n type=\"button\"\n disabled={busy}\n onClick={() => void create(typed)}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground disabled:opacity-50\"\n >\n {busy ? (\n <Loader2Icon className=\"size-3.5 shrink-0 matrx-spin\" />\n ) : (\n <PlusIcon className=\"size-3.5 shrink-0\" />\n )}\n <span className=\"min-w-0 truncate\">\n {typed && !exactMatch\n ? `Create “${typed}”`\n : `Add ${article(noun)}…`}\n </span>\n </button>\n {needsName ? (\n <p className=\"px-2 pb-0.5 text-[11px] leading-snug text-muted-foreground\">\n Type the name of the {noun} you want to add — then this\n creates it.\n </p>\n ) : null}\n </div>\n ) : null}\n\n {/* THE DOORS. Everything this control names must be reachable from\n it: the place the vocabulary is governed, and the other answer\n when this vocabulary is the wrong one to be answering with. */}\n {footerActions?.length || manageAction ? (\n <div className=\"space-y-0.5 border-t border-border p-1\">\n {footerActions?.map((action) => {\n const Icon = action.icon;\n return (\n <div key={action.label}>\n <button\n type=\"button\"\n onClick={() => {\n close();\n action.onSelect();\n }}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n {Icon ? <Icon className=\"size-3.5 shrink-0\" /> : null}\n <span className=\"min-w-0 truncate\">{action.label}</span>\n </button>\n {action.note ? (\n <p className=\"px-2 pb-1 text-[10px] leading-snug text-muted-foreground\">\n {action.note}\n </p>\n ) : null}\n </div>\n );\n })}\n {manageAction ? (\n <OutboundLink\n href={manageAction.href}\n onClick={close}\n className=\"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-xs text-muted-foreground transition-colors hover:bg-accent hover:text-foreground\"\n >\n <ExternalLinkIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{manageAction.label}</span>\n </OutboundLink>\n ) : null}\n </div>\n ) : null}\n\n {/* P11 — shared vocabulary. Say it, then hand them the door. */}\n {lockedNote ? (\n <div className=\"space-y-1 border-t border-border p-2\">\n <p className=\"flex gap-1.5 text-[11px] leading-snug text-muted-foreground\">\n <LockIcon className=\"mt-px size-3 shrink-0\" />\n <span>{lockedNote}</span>\n </p>\n {lockedAction ? (\n <button\n type=\"button\"\n onClick={() => {\n close();\n lockedAction.onSelect();\n }}\n className=\"flex w-full items-center gap-2 rounded-sm px-1 py-1 text-left text-xs font-medium text-primary-ink transition-colors hover:bg-accent\"\n >\n <PlusIcon className=\"size-3.5 shrink-0\" />\n <span className=\"min-w-0 truncate\">{lockedAction.label}</span>\n </button>\n ) : null}\n </div>\n ) : null}\n </Command>\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n\n/**\n * OverflowToolbar — a horizontal row of consistent, compact action buttons\n * that collapses the buttons that don't fit into a single \"more\" (…) menu.\n * Ported verbatim from matrx-frontend\n * `components/official/toolbar/OverflowToolbar.tsx` (S20).\n *\n * ┌───────────────────────────────────────────────┐\n * │ [leading] [Btn] [Btn] [Btn] [ … ] │\n * └───────────────────────────────────────────────┘\n *\n * Design rules (the primitive enforces them so callers can't drift):\n * - Every button is the same height (h-7), padding, text size, icon size.\n * - `hideLabel` renders an icon-only button with a tooltip — use it for\n * \"obvious\" actions (Find, Source, …).\n * - `tone: \"primary\"` colors a button without changing its size, so the\n * primary action is NOT visually larger than the rest.\n * - When the row is too narrow, the LAST actions collapse into the overflow\n * menu first. Order your actions most-important-first.\n *\n * Measurement is done with a hidden \"ghost\" row (always renders every action\n * + the kebab) read via a ResizeObserver, so the visible row never reflows\n * mid-frame.\n *\n * Seam inversions (host-shaped chrome becomes injected):\n * - `icon: LucideIcon` → the structural `ToolbarIcon`\n * (`ComponentType<{ className?: string }>`) — any SVG component fits.\n * - The host Tooltip wrapper → `renderTooltip` prop. Without it, icon-only\n * buttons render bare (they always carry `aria-label`); hosts inject their\n * tooltip system for the original hover behavior.\n * - The host ItemMenu overflow menu → `renderOverflowMenu` prop (required):\n * the host receives the collapsed actions plus the ready-made kebab trigger\n * and renders them with its own menu system.\n */\n\nimport React, { useLayoutEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"./cn\";\nimport { Loader2Icon, MoreHorizontalIcon } from \"./icons\";\n\nexport type ToolbarActionTone = \"default\" | \"primary\" | \"destructive\";\n\n/** Structural icon contract (a lucide icon satisfies it, so does any SVG component). */\nexport type ToolbarIcon = React.ComponentType<{ className?: string }>;\n\nexport interface ToolbarAction {\n id: string;\n label: string;\n icon: ToolbarIcon;\n /** Click handler. Ignored when `href` is set. */\n onSelect?: () => void;\n /** Renders an anchor instead of a button. */\n href?: string;\n target?: \"_blank\";\n disabled?: boolean;\n /** Swaps the icon for a spinner and (optionally) shows `runningLabel`. */\n running?: boolean;\n runningLabel?: string;\n tone?: ToolbarActionTone;\n /** Icon-only button (tooltip carries the label). For obvious actions. */\n hideLabel?: boolean;\n /** Drop the action entirely. */\n hidden?: boolean;\n}\n\nexport interface OverflowToolbarProps {\n actions: ToolbarAction[];\n /**\n * Optional element pinned at the start of the row — never collapsed, never\n * measured into the action budget except as a fixed prefix (e.g. a surface\n * switcher / context chip cluster).\n */\n leading?: React.ReactNode;\n /** Accessible label for the overflow trigger. */\n overflowAriaLabel?: string;\n className?: string;\n /**\n * Injected overflow-menu seam: render the collapsed actions with the host's\n * menu system, using `trigger` (the ready-made kebab button) as the menu\n * trigger element.\n */\n renderOverflowMenu: (args: {\n actions: ToolbarAction[];\n trigger: React.ReactNode;\n }) => React.ReactNode;\n /**\n * Injected tooltip seam for icon-only buttons (their label lives nowhere\n * else on screen). Omitted → the bare control renders (aria-label intact).\n */\n renderTooltip?: (control: React.ReactElement, label: string) => React.ReactNode;\n}\n\nconst GAP_PX = 6; // gap-1.5\n\n// ── Button ──────────────────────────────────────────────────────────────────\n\nconst TONE: Record<ToolbarActionTone, string> = {\n default: \"border border-border bg-background hover:bg-accent text-foreground\",\n primary: \"bg-primary text-primary-foreground hover:bg-primary/90\",\n destructive:\n \"border border-destructive/40 text-destructive-ink hover:bg-destructive/10\",\n};\n\nfunction ToolbarButton({\n action,\n enableTooltip = false,\n renderTooltip,\n}: {\n action: ToolbarAction;\n /** Wrap icon-only buttons in a styled tooltip. Off for the ghost row. */\n enableTooltip?: boolean;\n renderTooltip?:\n | ((control: React.ReactElement, label: string) => React.ReactNode)\n | undefined;\n}) {\n const tone = action.tone ?? \"default\";\n const Icon = action.running ? Loader2Icon : action.icon;\n const showLabel =\n !action.hideLabel || (action.running && action.runningLabel);\n const text =\n action.running && action.runningLabel ? action.runningLabel : action.label;\n\n const className = cn(\n \"inline-flex items-center gap-1 h-7 rounded-md text-[11px] font-medium transition-colors whitespace-nowrap\",\n \"disabled:opacity-50\",\n action.hideLabel && !action.running ? \"w-7 justify-center px-0\" : \"px-2\",\n TONE[tone],\n );\n\n const inner = (\n <>\n <Icon\n className={cn(\"w-3.5 h-3.5 shrink-0\", action.running && \"matrx-spin\")}\n />\n {showLabel && <span>{text}</span>}\n </>\n );\n\n const control =\n action.href && !action.disabled ? (\n <a\n href={action.href}\n target={action.target}\n rel={action.target === \"_blank\" ? \"noopener noreferrer\" : undefined}\n className={className}\n aria-label={action.label}\n >\n {inner}\n </a>\n ) : (\n <button\n type=\"button\"\n onClick={action.onSelect}\n disabled={action.disabled}\n className={className}\n aria-label={action.label}\n >\n {inner}\n </button>\n );\n\n // Icon-only buttons need a styled tooltip to be discoverable — the label\n // lives nowhere else on screen. Labeled buttons are self-describing.\n if (enableTooltip && action.hideLabel && renderTooltip) {\n return <>{renderTooltip(control, action.label)}</>;\n }\n\n return control;\n}\n\nfunction OverflowTrigger({ ariaLabel }: { ariaLabel: string }) {\n return (\n <button\n type=\"button\"\n aria-label={ariaLabel}\n aria-haspopup=\"menu\"\n title=\"More actions\"\n className={cn(\n \"inline-flex items-center justify-center h-7 w-7 rounded-md transition-colors\",\n \"border border-border bg-background hover:bg-accent text-foreground\",\n )}\n >\n <MoreHorizontalIcon className=\"w-3.5 h-3.5\" />\n </button>\n );\n}\n\n// ── Toolbar ───────────────────────────────────────────────────────────────\n\nexport function OverflowToolbar({\n actions,\n leading,\n overflowAriaLabel = \"More actions\",\n className,\n renderOverflowMenu,\n renderTooltip,\n}: OverflowToolbarProps) {\n const visibleActions = useMemo(\n () => actions.filter((a) => !a.hidden),\n [actions],\n );\n\n const containerRef = useRef<HTMLDivElement>(null);\n const ghostRef = useRef<HTMLDivElement>(null);\n // The leading slot renders ONCE (in the visible row) — it may host a\n // stateful/data-fetching component, so we never duplicate it into the ghost.\n // Its width is read directly off this ref instead.\n const leadingRef = useRef<HTMLSpanElement>(null);\n const [visibleCount, setVisibleCount] = useState(visibleActions.length);\n\n // Re-measure whenever the rendered text/state of any action changes (label,\n // icon-only mode, or running label all change a button's width).\n const signature = visibleActions\n .map(\n (a) =>\n `${a.id}:${a.hideLabel ? 1 : 0}:${a.running ? 1 : 0}:${a.runningLabel ?? \"\"}:${a.label}`,\n )\n .join(\"|\");\n\n useLayoutEffect(() => {\n const container = containerRef.current;\n const ghost = ghostRef.current;\n if (!container || !ghost) return undefined;\n\n const compute = () => {\n const available = container.clientWidth;\n const n = visibleActions.length;\n const children = Array.from(ghost.children) as HTMLElement[];\n const hasLeading = leading != null;\n const leadingW = hasLeading ? (leadingRef.current?.offsetWidth ?? 0) : 0;\n const itemW = (i: number) => children[i]?.offsetWidth ?? 0;\n const kebabW = children[n]?.offsetWidth ?? 28;\n\n // Width consumed by the always-present leading slot.\n const base = leadingW + (hasLeading && n > 0 ? GAP_PX : 0);\n\n // Does everything fit with no kebab?\n let totalAll = base;\n for (let i = 0; i < n; i++) totalAll += itemW(i) + (i > 0 ? GAP_PX : 0);\n if (totalAll <= available) {\n setVisibleCount(n);\n return;\n }\n\n // Otherwise fit as many as possible while reserving room for the kebab.\n let used = base;\n let count = 0;\n for (let i = 0; i < n; i++) {\n const add = itemW(i) + (count > 0 ? GAP_PX : 0);\n if (used + add + GAP_PX + kebabW <= available) {\n used += add;\n count += 1;\n } else break;\n }\n setVisibleCount(count);\n };\n\n compute();\n const ro = new ResizeObserver(compute);\n ro.observe(container);\n return () => ro.disconnect();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [signature, leading != null]);\n\n const shown = visibleActions.slice(0, visibleCount);\n const hidden = visibleActions.slice(visibleCount);\n\n return (\n <div ref={containerRef} className={cn(\"relative min-w-0\", className)}>\n {/* Ghost measuring row — every action button + kebab, never visible.\n The leading slot is intentionally NOT duplicated here (it may be a\n stateful/fetching component); its width is read off `leadingRef`. */}\n <div\n ref={ghostRef}\n aria-hidden\n className=\"pointer-events-none absolute left-0 top-0 flex items-center gap-1.5 opacity-0\"\n >\n {visibleActions.map((a) => (\n <ToolbarButton key={a.id} action={a} />\n ))}\n <OverflowTrigger ariaLabel={overflowAriaLabel} />\n </div>\n\n {/* Visible row — right-aligned cluster that collapses overflow. */}\n <div className=\"flex items-center justify-end gap-1.5\">\n {leading != null && (\n <span ref={leadingRef} className=\"shrink-0\">\n {leading}\n </span>\n )}\n {shown.map((a) => (\n <ToolbarButton\n key={a.id}\n action={a}\n enableTooltip\n renderTooltip={renderTooltip}\n />\n ))}\n {hidden.length > 0 &&\n renderOverflowMenu({\n actions: hidden,\n trigger: <OverflowTrigger ariaLabel={overflowAriaLabel} />,\n })}\n </div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Progress — a determinate bar.\n *\n * THE INDETERMINATE CASE IS NOT SILENT. Radix treats `value={null}` (or an\n * omitted value) as indeterminate, and the shadcn fork every host copied\n * computed `translateX(-${100 - (value || 0)}%)`, which turns an unknown value\n * into a confident, wrong \"0%\" — a bar that says the work has not started when\n * the truth is that nobody knows. Here an indeterminate bar renders a moving\n * sweep and carries `data-state=\"indeterminate\"`, so it LOOKS different from\n * stalled-at-zero.\n *\n * `tone` maps the fill onto the semantic status tokens, rather than leaving a\n * host to reach for a raw palette utility on a failing bar.\n */\n\nimport * as ProgressPrimitive from \"@radix-ui/react-progress\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type ProgressTone = \"default\" | \"success\" | \"warning\" | \"destructive\";\n\nconst PROGRESS_TONES: Record<ProgressTone, string> = {\n default: \"bg-primary\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n destructive: \"bg-destructive\",\n};\n\nexport interface ProgressProps\n extends React.ComponentPropsWithoutRef<typeof ProgressPrimitive.Root> {\n /** Fill color, from the semantic status tokens. Default `default`. */\n tone?: ProgressTone;\n /** Classes for the moving fill. */\n indicatorClassName?: string;\n}\n\nconst Progress = React.forwardRef<\n React.ComponentRef<typeof ProgressPrimitive.Root>,\n ProgressProps\n>(({ className, tone = \"default\", indicatorClassName, ...props }, ref) => {\n const { value, max } = props;\n const ceiling = max ?? 100;\n const isIndeterminate = value === null || value === undefined;\n const pct = isIndeterminate\n ? 0\n : Math.min(100, Math.max(0, (value / ceiling) * 100));\n\n return (\n <ProgressPrimitive.Root\n ref={ref}\n data-slot=\"progress\"\n className={cn(\n \"relative h-2 w-full overflow-hidden rounded-full bg-primary/20\",\n className,\n )}\n {...props}\n >\n <ProgressPrimitive.Indicator\n data-slot=\"progress-indicator\"\n className={cn(\n \"h-full flex-1 transition-all\",\n PROGRESS_TONES[tone],\n // The sweep sets its own width (package layer); a `w-full` utility\n // here would outrank it and paint a solid bar.\n isIndeterminate ? \"matrx-progress-indeterminate\" : \"w-full\",\n indicatorClassName,\n )}\n style={\n isIndeterminate ? undefined : { transform: `translateX(-${100 - pct}%)` }\n }\n />\n </ProgressPrimitive.Root>\n );\n});\nProgress.displayName = ProgressPrimitive.Root.displayName;\n\nexport { Progress };\n","\"use client\";\n\n/**\n * ScrollArea — Radix scroll area with a custom, token-colored scrollbar.\n *\n * Every fork was the same component; what they could not share was the\n * VIEWPORT. Radix renders an internal `display: table` div inside the\n * viewport, and workflow-studio's fork had to reach through it\n * (`[&>div]:!block [&>div]:min-w-0`) so long content wraps instead of forcing\n * the table cell wider than its container. That is the exact reason a host\n * forks: a class it cannot pass. So the viewport is addressable here —\n * `viewportClassName` and `viewportRef` — and nobody needs a copy to style it.\n *\n * `viewportRef` also unlocks the thing hosts hand-rolled around this\n * component: programmatic scrolling (scroll-to-bottom on a new message,\n * restoring a position) needs the scrolling element, and the Root's ref is not\n * it.\n *\n * A `max-h-*` on the Root reaches the viewport (`max-h-[inherit]`): `h-full` of an auto-height\n * Root is auto, so without it the viewport grew to its content, the Root clipped it, and a\n * capped list could not be scrolled.\n *\n * The thumb reads `bg-border`; a host that wants workflow-studio's dimmer\n * thumb passes `scrollBarClassName`.\n */\n\nimport * as ScrollAreaPrimitive from \"@radix-ui/react-scroll-area\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport interface ScrollAreaProps\n extends React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root> {\n /** Classes for the scrolling viewport (not the Root). */\n viewportClassName?: string;\n /** Ref to the scrolling element — the one `scrollTop` lives on. */\n viewportRef?: React.Ref<HTMLDivElement>;\n /** Classes for the vertical scrollbar this component renders. */\n scrollBarClassName?: string;\n /** Scrollbar orientation to render. Default `vertical`. */\n orientation?: \"vertical\" | \"horizontal\";\n}\n\nconst ScrollArea = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.Root>,\n ScrollAreaProps\n>(\n (\n {\n className,\n children,\n viewportClassName,\n viewportRef,\n scrollBarClassName,\n orientation = \"vertical\",\n ...props\n },\n ref,\n ) => (\n <ScrollAreaPrimitive.Root\n ref={ref}\n data-slot=\"scroll-area\"\n className={cn(\"relative overflow-hidden\", className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport\n ref={viewportRef}\n data-slot=\"scroll-area-viewport\"\n className={cn(\"h-full w-full max-h-[inherit] rounded-[inherit]\", viewportClassName)}\n >\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar orientation={orientation} className={scrollBarClassName} />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n ),\n);\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\nconst ScrollBar = React.forwardRef<\n React.ComponentRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>\n>(({ className, orientation = \"vertical\", ...props }, ref) => (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n data-slot=\"scroll-area-scrollbar\"\n orientation={orientation}\n className={cn(\n \"flex touch-none select-none transition-colors\",\n orientation === \"vertical\" &&\n \"h-full w-2.5 border-l border-l-transparent p-[1px]\",\n orientation === \"horizontal\" &&\n \"h-2.5 flex-col border-t border-t-transparent p-[1px]\",\n className,\n )}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className=\"relative flex-1 rounded-full bg-border\"\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n));\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar };\n","\"use client\";\n\n/**\n * ScoreRing — SVG progress ring + the shared score→color threshold semantics.\n * Ported verbatim from matrx-frontend `components/official/ScoreRing.tsx`\n * (S18). The thresholds ARE the product: green at/above `good`, orange\n * at/above `warning`, red below, muted for null. No seams.\n */\n\nimport { cn } from \"./cn\";\n\nexport interface ScoreThresholds {\n /** Scores at or above this value are green. */\n good: number;\n /** Scores at or above this value (but below good) are orange. */\n warning: number;\n}\n\nexport const DEFAULT_SCORE_THRESHOLDS: ScoreThresholds = {\n good: 75,\n warning: 50,\n};\n\n/** Semantic score color shared by ring and accent consumers. */\nexport function scoreRingColorClasses(\n pct: number | null,\n thresholds: ScoreThresholds = DEFAULT_SCORE_THRESHOLDS,\n): string {\n if (pct === null) return \"text-muted-foreground\";\n if (pct >= thresholds.good) return \"text-success-ink\";\n if (pct >= thresholds.warning) return \"text-warning-ink\";\n return \"text-destructive-ink\";\n}\n\n/** Solid-background twin of `scoreRingColorClasses`. */\nexport function scoreAccentBgClasses(\n pct: number | null,\n thresholds: ScoreThresholds = DEFAULT_SCORE_THRESHOLDS,\n): string {\n if (pct === null) return \"bg-muted-foreground/30\";\n if (pct >= thresholds.good) return \"bg-success\";\n if (pct >= thresholds.warning) return \"bg-warning\";\n return \"bg-destructive\";\n}\n\nexport interface ScoreRingProps {\n pct: number | null;\n size?: number;\n strokeWidth?: number;\n label?: string;\n valueClassName?: string;\n className?: string;\n thresholds?: ScoreThresholds;\n /** Visible suffix; study keeps `%`, while Lighthouse convention omits it. */\n suffix?: string;\n}\n\n/**\n * Shared SVG score ring. `pct` is 0–100; threshold semantics are supplied by\n * the domain (for example Lighthouse uses 90/50 while study uses 75/50).\n */\nexport function ScoreRing({\n pct,\n size = 112,\n strokeWidth = 8,\n label,\n valueClassName,\n className,\n thresholds = DEFAULT_SCORE_THRESHOLDS,\n suffix = \"%\",\n}: ScoreRingProps) {\n const radius = 50 - strokeWidth / 2;\n const circumference = 2 * Math.PI * radius;\n const boundedPct = pct === null ? 0 : Math.max(0, Math.min(100, pct));\n const dashOffset = circumference * (1 - boundedPct / 100);\n\n return (\n <div\n className={cn(\n \"relative flex shrink-0 items-center justify-center\",\n className,\n )}\n style={{ width: size, height: size }}\n role=\"img\"\n aria-label={`${label ?? \"Score\"}: ${pct === null ? \"not available\" : `${pct} out of 100`}`}\n >\n <svg viewBox=\"0 0 100 100\" className=\"h-full w-full -rotate-90\">\n <circle\n cx=\"50\"\n cy=\"50\"\n r={radius}\n className=\"stroke-muted\"\n strokeWidth={strokeWidth}\n fill=\"none\"\n />\n {pct !== null ? (\n <circle\n cx=\"50\"\n cy=\"50\"\n r={radius}\n className={cn(\n \"transition-[stroke-dashoffset] duration-700 ease-out\",\n scoreRingColorClasses(pct, thresholds),\n )}\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n fill=\"none\"\n strokeDasharray={circumference}\n strokeDashoffset={dashOffset}\n />\n ) : null}\n </svg>\n <div className=\"absolute flex flex-col items-center justify-center\">\n <span\n className={cn(\n \"font-bold tabular-nums text-foreground\",\n valueClassName ?? \"text-2xl\",\n )}\n >\n {pct === null ? \"—\" : `${pct}${suffix}`}\n </span>\n {label ? (\n <span className=\"max-w-[74px] truncate text-[9px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {label}\n </span>\n ) : null}\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport * as SeparatorPrimitive from \"@radix-ui/react-separator\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport const Separator = React.forwardRef<\n React.ComponentRef<typeof SeparatorPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof SeparatorPrimitive.Root>\n>(({ className, orientation = \"horizontal\", decorative = true, ...props }, ref) => (\n <SeparatorPrimitive.Root\n ref={ref}\n decorative={decorative}\n orientation={orientation}\n className={cn(\n \"shrink-0 bg-border\",\n orientation === \"horizontal\" ? \"h-px w-full\" : \"h-full w-px\",\n className,\n )}\n {...props}\n />\n));\nSeparator.displayName = SeparatorPrimitive.Root.displayName;\n","\"use client\";\n\n/**\n * Sidebar — ported from shadcn/ui `apps/v4/registry/new-york-v4/ui/sidebar.tsx`\n * (MIT, Copyright (c) 2023 shadcn). Behavior-verbatim; only coupling seams changed:\n *\n * - Imports resolve to this package's own Button, Input, Separator, Sheet, Skeleton,\n * Tooltip and `useIsMobile`; the toggle glyph is the package-inlined `PanelLeftIcon` (C19).\n * - Tokens use the AI Matrx vocabulary (`--sidebar-background`, `--sidebar-foreground`,\n * `--sidebar-accent`, `--sidebar-border`, `--sidebar-ring`, …), defaulted in tokens.css.\n * - No persistence (C10): the original wrote a cookie on every toggle. A host that keeps the\n * state passes `open` / `onOpenChange` and stores it where its own state lives.\n * - The keyboard shortcut is a prop (`keyboardShortcut`, default \"b\"; `null` turns it off for\n * hosts that own their accelerators, such as a desktop app menu).\n * - Collapse timing is a knob: `--sidebar-duration` / `--sidebar-easing` on the provider,\n * defined from THE panel motion (`--matrx-motion-duration-panel` / `--matrx-motion-ease-panel`,\n * 0.56.0 — the motion standard), never shadcn's 200ms linear.\n */\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { Button } from \"./button\";\nimport { cn } from \"./cn\";\nimport { PanelLeftIcon } from \"./icons\";\nimport { Input } from \"./input\";\nimport { Separator } from \"./separator\";\nimport { Sheet, SheetContent, SheetDescription, SheetHeader, SheetTitle } from \"./sheet\";\nimport { Skeleton } from \"./skeleton\";\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from \"./tooltip\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\nconst SIDEBAR_WIDTH = \"16rem\";\nconst SIDEBAR_WIDTH_MOBILE = \"18rem\";\nconst SIDEBAR_WIDTH_ICON = \"3rem\";\nconst SIDEBAR_KEYBOARD_SHORTCUT = \"b\";\n\ntype SidebarContextProps = {\n state: \"expanded\" | \"collapsed\";\n open: boolean;\n setOpen: (open: boolean) => void;\n openMobile: boolean;\n setOpenMobile: (open: boolean) => void;\n isMobile: boolean;\n toggleSidebar: () => void;\n};\n\nconst SidebarContext = React.createContext<SidebarContextProps | null>(null);\n\nfunction useSidebar() {\n const context = React.useContext(SidebarContext);\n if (!context) {\n throw new Error(\"useSidebar must be used within a SidebarProvider.\");\n }\n\n return context;\n}\n\nfunction SidebarProvider({\n defaultOpen = true,\n open: openProp,\n onOpenChange: setOpenProp,\n keyboardShortcut = SIDEBAR_KEYBOARD_SHORTCUT,\n className,\n style,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** ⌘/Ctrl + this key toggles the sidebar. `null` when the host owns its shortcuts. */\n keyboardShortcut?: string | null;\n}) {\n const isMobile = useIsMobile();\n const [openMobile, setOpenMobile] = React.useState(false);\n\n // This is the internal state of the sidebar.\n // We use openProp and setOpenProp for control from outside the component.\n const [_open, _setOpen] = React.useState(defaultOpen);\n const open = openProp ?? _open;\n const setOpen = React.useCallback(\n (value: boolean | ((value: boolean) => boolean)) => {\n const openState = typeof value === \"function\" ? value(open) : value;\n if (setOpenProp) {\n setOpenProp(openState);\n } else {\n _setOpen(openState);\n }\n },\n [setOpenProp, open],\n );\n\n // Helper to toggle the sidebar.\n const toggleSidebar = React.useCallback(() => {\n return isMobile ? setOpenMobile((open) => !open) : setOpen((open) => !open);\n }, [isMobile, setOpen, setOpenMobile]);\n\n // Adds a keyboard shortcut to toggle the sidebar.\n React.useEffect(() => {\n if (!keyboardShortcut) return;\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === keyboardShortcut && (event.metaKey || event.ctrlKey)) {\n event.preventDefault();\n toggleSidebar();\n }\n };\n\n window.addEventListener(\"keydown\", handleKeyDown);\n return () => window.removeEventListener(\"keydown\", handleKeyDown);\n }, [keyboardShortcut, toggleSidebar]);\n\n // We add a state so that we can do data-state=\"expanded\" or \"collapsed\".\n // This makes it easier to style the sidebar with Tailwind classes.\n const state = open ? \"expanded\" : \"collapsed\";\n\n const contextValue = React.useMemo<SidebarContextProps>(\n () => ({\n state,\n open,\n setOpen,\n isMobile,\n openMobile,\n setOpenMobile,\n toggleSidebar,\n }),\n [state, open, setOpen, isMobile, openMobile, setOpenMobile, toggleSidebar],\n );\n\n return (\n <SidebarContext.Provider value={contextValue}>\n <TooltipProvider delayDuration={0}>\n <div\n data-slot=\"sidebar-wrapper\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH,\n \"--sidebar-width-icon\": SIDEBAR_WIDTH_ICON,\n \"--sidebar-duration\": \"var(--matrx-motion-duration-panel)\",\n \"--sidebar-easing\": \"var(--matrx-motion-ease-panel)\",\n ...style,\n } as React.CSSProperties\n }\n className={cn(\n \"group/sidebar-wrapper flex min-h-svh w-full has-data-[variant=inset]:bg-sidebar-background\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n </TooltipProvider>\n </SidebarContext.Provider>\n );\n}\n\nfunction Sidebar({\n side = \"left\",\n variant = \"sidebar\",\n collapsible = \"offcanvas\",\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\"> & {\n side?: \"left\" | \"right\";\n variant?: \"sidebar\" | \"floating\" | \"inset\";\n collapsible?: \"offcanvas\" | \"icon\" | \"none\";\n}) {\n const { isMobile, state, openMobile, setOpenMobile } = useSidebar();\n\n if (collapsible === \"none\") {\n return (\n <div\n data-slot=\"sidebar\"\n className={cn(\n \"flex h-full w-(--sidebar-width) flex-col bg-sidebar-background text-sidebar-foreground\",\n className,\n )}\n {...props}\n >\n {children}\n </div>\n );\n }\n\n if (isMobile) {\n return (\n // The original spread the desktop container's div props onto the Sheet root, which\n // accepts none of them; the mobile sheet takes only its open state.\n <Sheet open={openMobile} onOpenChange={setOpenMobile}>\n <SheetContent\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar\"\n data-mobile=\"true\"\n className=\"w-(--sidebar-width) bg-sidebar-background p-0 text-sidebar-foreground [&>button]:hidden\"\n style={\n {\n \"--sidebar-width\": SIDEBAR_WIDTH_MOBILE,\n } as React.CSSProperties\n }\n side={side}\n >\n <SheetHeader className=\"sr-only\">\n <SheetTitle>Sidebar</SheetTitle>\n <SheetDescription>Displays the mobile sidebar.</SheetDescription>\n </SheetHeader>\n <div className=\"flex h-full w-full flex-col\">{children}</div>\n </SheetContent>\n </Sheet>\n );\n }\n\n return (\n <div\n className=\"group peer hidden text-sidebar-foreground md:block\"\n data-state={state}\n data-collapsible={state === \"collapsed\" ? collapsible : \"\"}\n data-variant={variant}\n data-side={side}\n data-slot=\"sidebar\"\n >\n {/* This is what handles the sidebar gap on desktop */}\n <div\n data-slot=\"sidebar-gap\"\n className={cn(\n \"relative w-(--sidebar-width) bg-transparent transition-[width] duration-(--sidebar-duration) ease-(--sidebar-easing)\",\n \"group-data-[collapsible=offcanvas]:w-0\",\n \"group-data-[side=right]:rotate-180\",\n variant === \"floating\" || variant === \"inset\"\n ? \"group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4)))]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon)\",\n )}\n />\n <div\n data-slot=\"sidebar-container\"\n className={cn(\n \"fixed inset-y-0 z-10 hidden h-svh w-(--sidebar-width) transition-[left,right,width] duration-(--sidebar-duration) ease-(--sidebar-easing) md:flex\",\n side === \"left\"\n ? \"left-0 group-data-[collapsible=offcanvas]:left-[calc(var(--sidebar-width)*-1)]\"\n : \"right-0 group-data-[collapsible=offcanvas]:right-[calc(var(--sidebar-width)*-1)]\",\n // Adjust the padding for floating and inset variants.\n variant === \"floating\" || variant === \"inset\"\n ? \"p-2 group-data-[collapsible=icon]:w-[calc(var(--sidebar-width-icon)+(--spacing(4))+2px)]\"\n : \"group-data-[collapsible=icon]:w-(--sidebar-width-icon) group-data-[side=left]:border-r group-data-[side=right]:border-l\",\n className,\n )}\n {...props}\n >\n <div\n data-sidebar=\"sidebar\"\n data-slot=\"sidebar-inner\"\n className=\"flex h-full w-full flex-col bg-sidebar-background group-data-[variant=floating]:rounded-lg group-data-[variant=floating]:border group-data-[variant=floating]:border-sidebar-border group-data-[variant=floating]:shadow-sm\"\n >\n {children}\n </div>\n </div>\n </div>\n );\n}\n\nfunction SidebarTrigger({ className, onClick, ...props }: React.ComponentProps<typeof Button>) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <Button\n data-sidebar=\"trigger\"\n data-slot=\"sidebar-trigger\"\n variant=\"ghost\"\n size=\"icon\"\n className={cn(\"size-7\", className)}\n onClick={(event) => {\n onClick?.(event);\n toggleSidebar();\n }}\n {...props}\n >\n <PanelLeftIcon />\n <span className=\"sr-only\">Toggle Sidebar</span>\n </Button>\n );\n}\n\nfunction SidebarRail({ className, ...props }: React.ComponentProps<\"button\">) {\n const { toggleSidebar } = useSidebar();\n\n return (\n <button\n data-sidebar=\"rail\"\n data-slot=\"sidebar-rail\"\n aria-label=\"Toggle Sidebar\"\n tabIndex={-1}\n onClick={toggleSidebar}\n title=\"Toggle Sidebar\"\n className={cn(\n \"absolute inset-y-0 z-20 hidden w-4 -translate-x-1/2 transition-all ease-linear group-data-[side=left]:-right-4 group-data-[side=right]:left-0 after:absolute after:inset-y-0 after:left-1/2 after:w-[2px] hover:after:bg-sidebar-border sm:flex\",\n \"in-data-[side=left]:cursor-w-resize in-data-[side=right]:cursor-e-resize\",\n \"[[data-side=left][data-state=collapsed]_&]:cursor-e-resize [[data-side=right][data-state=collapsed]_&]:cursor-w-resize\",\n \"group-data-[collapsible=offcanvas]:translate-x-0 group-data-[collapsible=offcanvas]:after:left-full hover:group-data-[collapsible=offcanvas]:bg-sidebar-background\",\n \"[[data-side=left][data-collapsible=offcanvas]_&]:-right-2\",\n \"[[data-side=right][data-collapsible=offcanvas]_&]:-left-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInset({ className, ...props }: React.ComponentProps<\"main\">) {\n return (\n <main\n data-slot=\"sidebar-inset\"\n className={cn(\n \"relative flex w-full flex-1 flex-col bg-background\",\n \"md:peer-data-[variant=inset]:m-2 md:peer-data-[variant=inset]:ml-0 md:peer-data-[variant=inset]:rounded-xl md:peer-data-[variant=inset]:shadow-sm md:peer-data-[variant=inset]:peer-data-[state=collapsed]:ml-2\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarInput({ className, ...props }: React.ComponentProps<typeof Input>) {\n return (\n <Input\n data-slot=\"sidebar-input\"\n data-sidebar=\"input\"\n className={cn(\"h-8 w-full bg-background shadow-none\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-header\"\n data-sidebar=\"header\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-footer\"\n data-sidebar=\"footer\"\n className={cn(\"flex flex-col gap-2 p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarSeparator({ className, ...props }: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"sidebar-separator\"\n data-sidebar=\"separator\"\n className={cn(\"mx-2 w-auto bg-sidebar-border\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-content\"\n data-sidebar=\"content\"\n className={cn(\n \"flex min-h-0 flex-1 flex-col gap-2 overflow-auto group-data-[collapsible=icon]:overflow-hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group\"\n data-sidebar=\"group\"\n className={cn(\"relative flex w-full min-w-0 flex-col p-2\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupLabel({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"div\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"div\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-label\"\n data-sidebar=\"group-label\"\n className={cn(\n \"flex h-8 shrink-0 items-center rounded-md px-2 text-xs font-medium text-sidebar-foreground/70 ring-sidebar-ring outline-hidden transition-[margin,opacity] duration-(--sidebar-duration) ease-(--sidebar-easing) focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n \"group-data-[collapsible=icon]:-mt-8 group-data-[collapsible=icon]:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupAction({\n className,\n asChild = false,\n ...props\n}: React.ComponentProps<\"button\"> & { asChild?: boolean }) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-group-action\"\n data-sidebar=\"group-action\"\n className={cn(\n \"absolute top-3.5 right-3 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarGroupContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-group-content\"\n data-sidebar=\"group-content\"\n className={cn(\"w-full text-sm\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenu({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu\"\n data-sidebar=\"menu\"\n className={cn(\"flex w-full min-w-0 flex-col gap-1\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-item\"\n data-sidebar=\"menu-item\"\n className={cn(\"group/menu-item relative [&:has(>[data-sidebar=menu-action])>[data-sidebar=menu-button]]:pr-8\", className)}\n {...props}\n />\n );\n}\n\nconst sidebarMenuButtonVariants = cva(\n \"peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm ring-sidebar-ring outline-hidden transition-[width,height,padding] group-data-[collapsible=icon]:size-8! group-data-[collapsible=icon]:p-2! hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n outline:\n \"bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]\",\n },\n size: {\n default: \"h-8 text-sm\",\n sm: \"h-7 text-xs\",\n lg: \"h-12 text-sm group-data-[collapsible=icon]:p-0!\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nfunction SidebarMenuButton({\n asChild = false,\n isActive = false,\n variant = \"default\",\n size = \"default\",\n tooltip,\n className,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n isActive?: boolean;\n tooltip?: string | React.ComponentProps<typeof TooltipContent>;\n} & VariantProps<typeof sidebarMenuButtonVariants>) {\n const Comp = asChild ? Slot : \"button\";\n const { isMobile, state } = useSidebar();\n\n const button = (\n <Comp\n data-slot=\"sidebar-menu-button\"\n data-sidebar=\"menu-button\"\n data-size={size}\n data-active={isActive}\n className={cn(sidebarMenuButtonVariants({ variant, size }), className)}\n {...props}\n />\n );\n\n if (!tooltip) {\n return button;\n }\n\n if (typeof tooltip === \"string\") {\n tooltip = {\n children: tooltip,\n };\n }\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent\n side=\"right\"\n align=\"center\"\n hidden={state !== \"collapsed\" || isMobile}\n {...tooltip}\n />\n </Tooltip>\n );\n}\n\nfunction SidebarMenuAction({\n className,\n asChild = false,\n showOnHover = false,\n ...props\n}: React.ComponentProps<\"button\"> & {\n asChild?: boolean;\n showOnHover?: boolean;\n}) {\n const Comp = asChild ? Slot : \"button\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-action\"\n data-sidebar=\"menu-action\"\n className={cn(\n \"absolute top-1.5 right-1 flex aspect-square w-5 items-center justify-center rounded-md p-0 text-sidebar-foreground ring-sidebar-ring outline-hidden transition-transform peer-hover/menu-button:text-sidebar-accent-foreground hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 [&>svg]:size-4 [&>svg]:shrink-0\",\n // Increases the hit area of the button on mobile.\n \"after:absolute after:-inset-2 md:after:hidden\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n showOnHover &&\n \"group-focus-within/menu-item:opacity-100 group-hover/menu-item:opacity-100 peer-data-[active=true]/menu-button:text-sidebar-accent-foreground data-[state=open]:opacity-100 md:opacity-0\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuBadge({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"sidebar-menu-badge\"\n data-sidebar=\"menu-badge\"\n className={cn(\n \"pointer-events-none absolute right-1 flex h-5 min-w-5 items-center justify-center rounded-md px-1 text-xs font-medium text-sidebar-foreground tabular-nums select-none\",\n \"peer-hover/menu-button:text-sidebar-accent-foreground peer-data-[active=true]/menu-button:text-sidebar-accent-foreground\",\n \"peer-data-[size=sm]/menu-button:top-1\",\n \"peer-data-[size=default]/menu-button:top-1.5\",\n \"peer-data-[size=lg]/menu-button:top-2.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSkeleton({\n className,\n showIcon = false,\n ...props\n}: React.ComponentProps<\"div\"> & {\n showIcon?: boolean;\n}) {\n // Random width between 50 to 90%.\n const width = React.useMemo(() => {\n return `${Math.floor(Math.random() * 40) + 50}%`;\n }, []);\n\n return (\n <div\n data-slot=\"sidebar-menu-skeleton\"\n data-sidebar=\"menu-skeleton\"\n className={cn(\"flex h-8 items-center gap-2 rounded-md px-2\", className)}\n {...props}\n >\n {showIcon && <Skeleton className=\"size-4 rounded-md\" data-sidebar=\"menu-skeleton-icon\" />}\n <Skeleton\n className=\"h-4 max-w-(--skeleton-width) flex-1\"\n data-sidebar=\"menu-skeleton-text\"\n style={\n {\n \"--skeleton-width\": width,\n } as React.CSSProperties\n }\n />\n </div>\n );\n}\n\nfunction SidebarMenuSub({ className, ...props }: React.ComponentProps<\"ul\">) {\n return (\n <ul\n data-slot=\"sidebar-menu-sub\"\n data-sidebar=\"menu-sub\"\n className={cn(\n \"mx-3.5 flex min-w-0 translate-x-px flex-col gap-1 border-l border-sidebar-border px-2.5 py-0.5\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubItem({ className, ...props }: React.ComponentProps<\"li\">) {\n return (\n <li\n data-slot=\"sidebar-menu-sub-item\"\n data-sidebar=\"menu-sub-item\"\n className={cn(\"group/menu-sub-item relative\", className)}\n {...props}\n />\n );\n}\n\nfunction SidebarMenuSubButton({\n asChild = false,\n size = \"md\",\n isActive = false,\n className,\n ...props\n}: React.ComponentProps<\"a\"> & {\n asChild?: boolean;\n size?: \"sm\" | \"md\";\n isActive?: boolean;\n}) {\n const Comp = asChild ? Slot : \"a\";\n\n return (\n <Comp\n data-slot=\"sidebar-menu-sub-button\"\n data-sidebar=\"menu-sub-button\"\n data-size={size}\n data-active={isActive}\n className={cn(\n \"flex h-7 min-w-0 -translate-x-px items-center gap-2 overflow-hidden rounded-md px-2 text-sidebar-foreground ring-sidebar-ring outline-hidden hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 aria-disabled:pointer-events-none aria-disabled:opacity-50 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0 [&>svg]:text-sidebar-accent-foreground\",\n \"data-[active=true]:bg-sidebar-accent data-[active=true]:text-sidebar-accent-foreground\",\n size === \"sm\" && \"text-xs\",\n size === \"md\" && \"text-sm\",\n \"group-data-[collapsible=icon]:hidden\",\n className,\n )}\n {...props}\n />\n );\n}\n\nexport {\n Sidebar,\n SidebarContent,\n SidebarFooter,\n SidebarGroup,\n SidebarGroupAction,\n SidebarGroupContent,\n SidebarGroupLabel,\n SidebarHeader,\n SidebarInput,\n SidebarInset,\n SidebarMenu,\n SidebarMenuAction,\n SidebarMenuBadge,\n SidebarMenuButton,\n SidebarMenuItem,\n SidebarMenuSkeleton,\n SidebarMenuSub,\n SidebarMenuSubButton,\n SidebarMenuSubItem,\n SidebarProvider,\n SidebarRail,\n SidebarSeparator,\n SidebarTrigger,\n sidebarMenuButtonVariants,\n useSidebar,\n};\n","\"use client\";\n\n/**\n * Switch — Radix switch, one implementation, two sizes.\n *\n * The four forks were the same control with two different tracks: a 16px track\n * with a visible border and an overhanging thumb (matrx-frontend) and a 20px\n * track with a transparent border and an inset thumb (matrx-extend, dashboard,\n * workflow-studio). Both stay reachable through `size`, so no host has to keep\n * a copy to keep its look:\n *\n * sm → h-4 track, bordered, thumb sits proud of the rail\n * md → h-5 track, transparent border, thumb sits inside (the default)\n *\n * The unchecked track reads `bg-input`, the token that exists for exactly this\n * — workflow-studio's fork used `bg-muted`, which is the surface token and\n * makes an off switch disappear into a muted panel.\n */\n\nimport * as SwitchPrimitives from \"@radix-ui/react-switch\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type SwitchSize = \"sm\" | \"md\";\n\nconst SWITCH_SIZES: Record<SwitchSize, { root: string; thumb: string }> = {\n sm: {\n root: \"h-4 w-9 border-border data-[state=unchecked]:bg-input\",\n thumb:\n \"h-4 w-4 border border-primary data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\",\n },\n md: {\n root: \"h-5 w-9 border-transparent data-[state=unchecked]:bg-input\",\n thumb:\n \"h-4 w-4 data-[state=checked]:translate-x-4 data-[state=unchecked]:translate-x-0\",\n },\n};\n\nexport interface SwitchProps\n extends React.ComponentPropsWithoutRef<typeof SwitchPrimitives.Root> {\n /** Track size. Default `md`. */\n size?: SwitchSize;\n}\n\nconst Switch = React.forwardRef<\n React.ComponentRef<typeof SwitchPrimitives.Root>,\n SwitchProps\n>(({ className, size = \"md\", ...props }, ref) => (\n <SwitchPrimitives.Root\n ref={ref}\n data-slot=\"switch\"\n className={cn(\n \"peer inline-flex shrink-0 items-center rounded-full border-2 shadow-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 focus-visible:ring-offset-background disabled:cursor-not-allowed disabled:opacity-50 data-[state=checked]:bg-primary\",\n SWITCH_SIZES[size].root,\n className,\n )}\n {...props}\n >\n <SwitchPrimitives.Thumb\n data-slot=\"switch-thumb\"\n className={cn(\n \"pointer-events-none block rounded-full bg-background shadow-lg ring-0 transition-transform\",\n SWITCH_SIZES[size].thumb,\n )}\n />\n </SwitchPrimitives.Root>\n));\nSwitch.displayName = SwitchPrimitives.Root.displayName;\n\nexport { Switch };\n","\"use client\";\n\n/**\n * TabbedBottomSheet — iOS Settings–style two-level navigation for tabbed menus.\n * Ported verbatim from matrx-frontend\n * `components/official/bottom-sheet/TabbedBottomSheet.tsx` (S19).\n *\n * Level 1: a scrollable list of tabs (icon + label + chevron).\n * Level 2: drill into one tab's content with a back button in the header.\n *\n * Two invariants make this ONE surface instead of a different panel per tab:\n *\n * 1. **Fixed height** (`size=\"full\"`) — the sheet is the same near-full\n * height on the index and inside every tab, and it never resizes as\n * content loads, filters, or expands. An adaptive height here meant the\n * panel grew and shrank under the user's thumb on every keystroke.\n * 2. **One typography scale** (`matrx-mobile-sheet`, host globals.css) —\n * the tab bodies are the same components the desktop window renders at\n * desktop density (11–12px). That is unreadable and untappable on a\n * phone, so the sheet promotes small text to mobile sizes and every\n * field to the 16px that stops iOS focus-zoom. Panels stay density-free;\n * the host decides the density.\n *\n * Seam inversions: `ChevronRight` is the package's inlined SVG (C19); the\n * `matrx-mobile-sheet` and `pb-safe` utility classes are host-owned CSS.\n */\n\nimport { useState, type ComponentType, type ReactNode } from \"react\";\n\nimport { BottomSheet, BottomSheetBody, BottomSheetHeader } from \"./bottom-sheet\";\nimport { ChevronRightIcon } from \"./icons\";\n\n/** What a tab body can do to the sheet that hosts it. */\nexport interface TabbedBottomSheetTabNav {\n /**\n * Leave this tab for the index, keeping the sheet open. A finished pick\n * inside a tab (attach a note) calls this instead of closing the sheet, so\n * the person lands where they can continue (PB-08, 2026-10-01: attaching a\n * note closed the whole sheet with no way back to its other tabs).\n */\n showIndex: () => void;\n}\n\nexport interface TabbedBottomSheetTab {\n id: string;\n label: string;\n icon?: ComponentType<{ className?: string }>;\n /** Optional trailing badge / dot shown on the index row. */\n trailing?: ReactNode;\n /** The tab body, or a render function given the sheet's navigation. */\n content: ReactNode | ((nav: TabbedBottomSheetTabNav) => ReactNode);\n}\n\nexport interface TabbedBottomSheetProps {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n title: string;\n tabs: TabbedBottomSheetTab[];\n /** Start each open inside this tab when it exists; otherwise show the index. */\n initialTabId?: string | null;\n}\n\nexport function TabbedBottomSheet({\n open,\n onOpenChange,\n title,\n tabs,\n initialTabId = null,\n}: TabbedBottomSheetProps) {\n const [selectedTabId, setSelectedTabId] = useState<string | null>(initialTabId);\n\n // Every open starts on its requested tab, or the index. Adjusted during render (the React-docs\n // pattern for state derived from a prop change) rather than in an effect,\n // which would render the previous tab's body for one frame first.\n const [wasOpen, setWasOpen] = useState(open);\n if (open !== wasOpen) {\n setWasOpen(open);\n if (open) setSelectedTabId(initialTabId);\n }\n\n const selectedTab = selectedTabId\n ? tabs.find((tab) => tab.id === selectedTabId)\n : null;\n\n return (\n <BottomSheet\n open={open}\n onOpenChange={onOpenChange}\n title={title}\n size=\"full\"\n >\n <div className=\"matrx-mobile-sheet flex min-h-0 flex-1 flex-col\">\n <BottomSheetHeader\n title={selectedTab ? selectedTab.label : title}\n showBack={!!selectedTab}\n onBack={() => setSelectedTabId(null)}\n />\n {selectedTab ? (\n <div className=\"flex min-h-0 flex-1 flex-col overflow-hidden pb-safe\">\n {typeof selectedTab.content === \"function\"\n ? selectedTab.content({ showIndex: () => setSelectedTabId(null) })\n : selectedTab.content}\n </div>\n ) : (\n <BottomSheetBody>\n <ul className=\"divide-y divide-border\">\n {tabs.map((tab) => {\n const Icon = tab.icon;\n return (\n <li key={tab.id}>\n <button\n type=\"button\"\n onClick={() => setSelectedTabId(tab.id)}\n className=\"flex w-full items-center gap-3 px-4 py-3.5 text-left transition-colors hover:bg-muted/60 active:bg-muted\"\n >\n {Icon ? (\n <Icon className=\"h-5 w-5 shrink-0 text-muted-foreground\" />\n ) : null}\n <span className=\"min-w-0 flex-1 text-base text-foreground\">\n {tab.label}\n </span>\n {tab.trailing}\n <ChevronRightIcon className=\"h-5 w-5 shrink-0 text-muted-foreground\" />\n </button>\n </li>\n );\n })}\n </ul>\n </BottomSheetBody>\n )}\n </div>\n </BottomSheet>\n );\n}\n","\"use client\";\n\n/**\n * Tabs — Radix tabs, carrying two rulings the forks had already paid for.\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no mount gate. A wrapper in\n * matrx-frontend used to defer rendering until after hydration (\"Radix\n * generates dynamic aria-controls ids that differ between SSR and client\").\n * That was false — Radix ids come from React's SSR-stable `useId` — and the\n * gate deleted the ENTIRE tab bar and active panel from SSR and the first\n * client paint.\n *\n * 2. INACTIVE PANELS UNMOUNT — Radix's default, restored in matrx-frontend on\n * 2026-08-15 after a wrapper hardcoded `forceMount`. Every tab panel in that\n * app was live at all times: effects running, fetches firing, subscriptions\n * open, registrations registered — while invisible. Not theoretical: on the\n * agent-apps executions page both tabs' tables registered a runtime provider\n * for the same surface at the same depth, the HIDDEN tab won the tie-break,\n * and agents on the VISIBLE tab were handed the other tab's rows.\n *\n * `forceMount` is OPT-IN. Pass it on the panels that genuinely must survive\n * a switch — an in-flight editor, a scroll position, a live stream that\n * must not be torn down. `data-[state=inactive]:hidden` is applied\n * unconditionally (inert when the panel unmounts), so passing the prop is\n * the whole opt-in.\n *\n * Do NOT reach for `forceMount` to preserve a form draft. Lift that state to\n * the component that owns the `<Tabs>`; the panel is then free to unmount\n * and the draft survives a close/reopen too, which force-mounting never gave\n * you.\n *\n * `TabsTriggerCore` is the trigger WITHOUT the resting muted-foreground\n * treatment, for hosts that color their own inactive tabs. Both triggers\n * otherwise share one class string.\n */\n\nimport * as TabsPrimitive from \"@radix-ui/react-tabs\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nconst Tabs = TabsPrimitive.Root;\n\nconst TABS_TRIGGER_BASE =\n \"inline-flex items-center justify-center whitespace-nowrap rounded-md px-3 py-1 text-sm font-medium ring-offset-background transition-all focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:opacity-50 data-[state=active]:bg-background data-[state=active]:text-foreground data-[state=active]:shadow-sm\";\n\nconst TabsList = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.List>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.List>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.List\n ref={ref}\n data-slot=\"tabs-list\"\n className={cn(\n \"inline-flex h-9 items-center justify-center-safe gap-1 rounded-lg bg-muted p-1 text-muted-foreground\",\n className,\n )}\n {...props}\n />\n));\nTabsList.displayName = TabsPrimitive.List.displayName;\n\nconst TabsTrigger = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n data-slot=\"tabs-trigger\"\n className={cn(\n TABS_TRIGGER_BASE,\n \"text-muted-foreground hover:text-foreground\",\n className,\n )}\n {...props}\n />\n));\nTabsTrigger.displayName = TabsPrimitive.Trigger.displayName;\n\n/** The trigger without the resting muted/hover treatment. */\nconst TabsTriggerCore = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Trigger>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Trigger>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Trigger\n ref={ref}\n data-slot=\"tabs-trigger\"\n className={cn(TABS_TRIGGER_BASE, className)}\n {...props}\n />\n));\nTabsTriggerCore.displayName = TabsPrimitive.Trigger.displayName;\n\nconst TabsContent = React.forwardRef<\n React.ComponentRef<typeof TabsPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof TabsPrimitive.Content>\n>(({ className, ...props }, ref) => (\n <TabsPrimitive.Content\n ref={ref}\n data-slot=\"tabs-content\"\n className={cn(\n \"data-[state=inactive]:hidden\",\n \"mt-2 ring-offset-background focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2\",\n className,\n )}\n {...props}\n />\n));\nTabsContent.displayName = TabsPrimitive.Content.displayName;\n\nexport { Tabs, TabsContent, TabsList, TabsTrigger, TabsTriggerCore };\n","\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\n\n/**\n * ScrollFade — a reusable \"there's more content this way\" affordance.\n *\n * Applies a `mask-image` gradient that fades the content at whichever scroll\n * edge still has hidden content. At the top of the scroll the top edge is crisp;\n * once you scroll down, the top fades and (if more remains) the bottom fades too.\n * Without it, a clipped scroll area reads as \"what you see is all there is\" — the\n * fade tells the user to keep scrolling.\n *\n * Moved whole from @ai-matrx/chat/ui/scroll-fade (one implementation, 2026-10-21); the hook is `useScrollMaskFade` here\n * because `useScrollFade` is the menu's class-driven hook. Two ways to use it:\n * 1. `<ScrollFade className=\"flex-1\">…</ScrollFade>` — owns the scroll container.\n * 2. `const { ref, style } = useScrollMaskFade(); <div ref={ref} style={style} className=\"overflow-y-auto\">`\n * — attach the fade to a scroll element you already render.\n *\n * The fade is dynamic (driven by scroll position + content/size changes), so an\n * area that isn't overflowing shows no fade at all.\n */\n\ntype Orientation = \"vertical\" | \"horizontal\";\n\ninterface Edges {\n start: boolean;\n end: boolean;\n}\n\nconst EDGE_EPSILON = 1; // sub-pixel rounding guard\n\nfunction readEdges(el: HTMLElement, orientation: Orientation): Edges {\n if (orientation === \"horizontal\") {\n return {\n start: el.scrollLeft > EDGE_EPSILON,\n end:\n el.scrollLeft + el.clientWidth < el.scrollWidth - EDGE_EPSILON,\n };\n }\n return {\n start: el.scrollTop > EDGE_EPSILON,\n end: el.scrollTop + el.clientHeight < el.scrollHeight - EDGE_EPSILON,\n };\n}\n\nfunction buildMask(\n edges: Edges,\n orientation: Orientation,\n fade: number,\n): string | undefined {\n // Fully crisp both ends → no mask (avoids a needless compositing layer).\n if (!edges.start && !edges.end) return undefined;\n const dir = orientation === \"horizontal\" ? \"to right\" : \"to bottom\";\n const stops: string[] = [];\n stops.push(edges.start ? \"transparent 0\" : \"#000 0\");\n if (edges.start) stops.push(`#000 ${fade}px`);\n if (edges.end) stops.push(`#000 calc(100% - ${fade}px)`);\n stops.push(edges.end ? \"transparent 100%\" : \"#000 100%\");\n return `linear-gradient(${dir}, ${stops.join(\", \")})`;\n}\n\n/**\n * Attach a dynamic scroll-edge fade to an element you render yourself.\n * Spread the returned `style` onto the scroll container and set its `ref`.\n */\nexport function useScrollMaskFade<T extends HTMLElement = HTMLDivElement>(\n orientation: Orientation = \"vertical\",\n fade = 28,\n) {\n const ref = React.useRef<T>(null);\n const [edges, setEdges] = React.useState<Edges>({ start: false, end: false });\n\n React.useEffect(() => {\n const el = ref.current;\n if (!el) return;\n\n const update = () => {\n const next = readEdges(el, orientation);\n setEdges((prev) =>\n prev.start === next.start && prev.end === next.end ? prev : next,\n );\n };\n\n update();\n el.addEventListener(\"scroll\", update, { passive: true });\n // Content or viewport size changes can flip whether an edge overflows.\n const ro = new ResizeObserver(update);\n ro.observe(el);\n const mo = new MutationObserver(update);\n mo.observe(el, { childList: true, subtree: true, characterData: true });\n\n return () => {\n el.removeEventListener(\"scroll\", update);\n ro.disconnect();\n mo.disconnect();\n };\n }, [orientation]);\n\n const mask = buildMask(edges, orientation, fade);\n const style: React.CSSProperties = mask\n ? { maskImage: mask, WebkitMaskImage: mask }\n : {};\n\n return { ref, style, edges };\n}\n\nexport interface ScrollFadeProps\n extends React.HTMLAttributes<HTMLDivElement> {\n orientation?: Orientation;\n /** Fade depth in px at each active edge. */\n fade?: number;\n}\n\n/** A scroll container that fades its content at overflowing edges. */\nexport const ScrollFade = React.forwardRef<HTMLDivElement, ScrollFadeProps>(\n ({ orientation = \"vertical\", fade = 28, className, style, children, ...props }, forwardedRef) => {\n const { ref: scrollRef, style: maskStyle } = useScrollMaskFade<HTMLDivElement>(\n orientation,\n fade,\n );\n\n // Merge the internal scroll ref with an optional forwarded ref.\n const setRefs = (node: HTMLDivElement | null) => {\n scrollRef.current = node;\n if (typeof forwardedRef === \"function\") forwardedRef(node);\n else if (forwardedRef) forwardedRef.current = node;\n };\n\n return (\n <div\n ref={setRefs}\n className={cn(\n orientation === \"horizontal\"\n ? \"overflow-x-auto\"\n : \"overflow-y-auto\",\n \"overscroll-x-contain\",\n className,\n )}\n style={{ ...maskStyle, ...style }}\n {...props}\n >\n {children}\n </div>\n );\n },\n);\nScrollFade.displayName = \"ScrollFade\";\n","\"use client\";\n\n/**\n * HoverCard — the rich hover surface (16 host import sites).\n *\n * Ported from matrx-frontend `components/ui/hover-card.tsx`, including its\n * recorded ruling:\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate the\n * host wrapper once carried (\"Radix generates dynamic aria-controls ids that\n * differ between SSR and client\") was doubly false here:\n * `@radix-ui/react-hover-card` generates no ids of its own at all, and Radix\n * ids generally come from React's SSR-stable `useId`. The gate was actively\n * harmful — a Trigger wraps ALWAYS-VISIBLE content, so `return null` deleted\n * that subtree from SSR and the first client paint.\n *\n * SEAM INVERSION (new here). The host copy portalled nowhere — it rendered\n * `Content` inline, so a hover card inside an overflow-hidden ancestor was\n * clipped, and one inside a popped-out window-panel could not exist. It now\n * portals through the package's `PortalContainerProvider` seam like every\n * other floating surface in this package, with an explicit `container` prop\n * winning and `document.body` as the fallback. Behavior for a card that was\n * never clipped is unchanged.\n *\n * A HOVER CARD IS NOT A TOOLTIP AND NOT A MENU: it is hover-only and not\n * focusable, so nothing inside it may be the ONLY way to reach an action —\n * touch and keyboard users never open it. Put the action somewhere else too.\n */\n\nimport * as HoverCardPrimitive from \"@radix-ui/react-hover-card\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\n/**\n * ONE HOVER-CARD BEHAVIOR (Arman, 2026-10-14: \"tooltips need to remain long enough to put your\n * mouse over them ... so you can copy/paste them\"). Opens after ~600 ms (a deliberate hover, not\n * a fly-over), and stays open 300 ms after the pointer leaves so it can travel onto the card; the\n * card stays open while hovered and its text is selectable. A call site may ask for a LONGER\n * delay to either, never a shorter one: `openDelay` below 500 and `closeDelay` below 300 are\n * raised to the floor, because a card that slips away before the pointer reaches it is the defect.\n */\nexport const HOVER_CARD_OPEN_DELAY_MS = 600;\nexport const HOVER_CARD_OPEN_DELAY_FLOOR_MS = 500;\nexport const HOVER_CARD_CLOSE_DELAY_MS = 300;\n\nconst HoverCard = ({\n openDelay = HOVER_CARD_OPEN_DELAY_MS,\n closeDelay = HOVER_CARD_CLOSE_DELAY_MS,\n ...props\n}: React.ComponentProps<typeof HoverCardPrimitive.Root>) => (\n <HoverCardPrimitive.Root\n openDelay={Math.max(openDelay, HOVER_CARD_OPEN_DELAY_FLOOR_MS)}\n closeDelay={Math.max(closeDelay, HOVER_CARD_CLOSE_DELAY_MS)}\n {...props}\n />\n);\nHoverCard.displayName = \"HoverCard\";\n\nconst HoverCardTrigger = HoverCardPrimitive.Trigger;\n\nexport interface HoverCardContentProps\n extends React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.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 — a picker re-anchoring while the user\n * types, a measurement pass. It is NOT the reduced-motion switch;\n * `styles.css` already honors `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst HoverCardContent = React.forwardRef<\n React.ComponentRef<typeof HoverCardPrimitive.Content>,\n HoverCardContentProps\n>(\n (\n { className, align = \"center\", sideOffset = 4, container, animated = true, ...props },\n ref,\n ) => {\n const resolved = usePortalContainer(container);\n return (\n <HoverCardPrimitive.Portal container={resolved ?? null}>\n <HoverCardPrimitive.Content\n ref={ref}\n data-slot=\"hover-card-content\"\n align={align}\n sideOffset={sideOffset}\n className={cn(\n \"z-[10001] w-64 select-text rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </HoverCardPrimitive.Portal>\n );\n});\nHoverCardContent.displayName = HoverCardPrimitive.Content.displayName;\n\nexport { HoverCard, HoverCardContent, HoverCardTrigger };\n","\"use client\";\n\n/**\n * THE contact values — one component per kind of value a person reaches someone through: an email,\n * a phone number, a postal address, a social profile, a web address. Every place in every app that\n * shows one of these renders it here, never a hand-built `mailto:`, `tel:` or profile link.\n *\n * Each draws inline at the text's size — its glyph, the value, a copy button that is always there\n * (shown on hover/focus, so nothing ever shifts) — and opens THE Peek on hover (a tap opens the phone\n * drawer). The peek does the real things: compose, call, text, map, validate, search, open the\n * profile with our referral. A value whose `state` is `broken` or `not-us` is never a link of any kind.\n *\n * <EmailValue email=\"ana@solarbright.com\" />\n * <PhoneValue phone=\"949 555 0142\" />\n * <AddressValue address={[\"1 Main St\", \"Irvine, CA 92618\"]} />\n * <SocialHandleValue value=\"https://www.linkedin.com/in/ana-ruiz\" followers={1840} />\n * <UrlValue url=\"solarbright.com\" title=\"SolarBright — home solar\" />\n *\n * Address validation is the host's (it calls a server): mount `ContactValuesHostProvider` once with\n * `validateAddress`. Without one, the peek simply has no Validate action.\n */\n\nimport * as React from \"react\";\n\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport { openOutbound } from \"@ai-matrx/kit/outbound\";\n\nimport { cn } from \"../cn\";\nimport { Button } from \"../controls/controls\";\nimport { Tile } from \"../controls/surfaces\";\nimport { Peek } from \"../peek\";\nimport { PeekHoverCard } from \"../peek-card\";\nimport type { PeekBlock, PeekGlyph, PeekRecord, PeekRow } from \"../peek-record\";\nimport { AtSignGlyph, BadgeCheckGlyph, LinkOffGlyph, MailGlyph, MapPinGlyph, MessageSquareGlyph, PhoneGlyph, socialGlyph } from \"./glyphs\";\nimport { CheckIcon, CopyIcon, GlobeIcon, SearchIcon, UsersIcon } from \"../icons\";\nimport {\n CONTACT_STATE_LABEL,\n addressText,\n compactCount,\n mailtoHref,\n mapsHref,\n parseEmail,\n parsePhone,\n parseSocial,\n parseUrl,\n smsHref,\n telHref,\n webSearchHref,\n type AddressValidation,\n type ContactValueState,\n type ParsedSocial,\n} from \"./model\";\nimport type { SocialBrandMark } from \"./social-brand-paths\";\n\n// ── host port ───────────────────────────────────────────────────────────────────────────────────\n\nexport interface ContactValuesHost {\n /** Check a postal address against a real geocoder (the host's server route). */\n validateAddress?: (address: string) => Promise<AddressValidation>;\n}\n\nconst HostContext = React.createContext<ContactValuesHost>({});\n\nexport function ContactValuesHostProvider({ children, ...host }: ContactValuesHost & { children: React.ReactNode }) {\n const value = React.useMemo(() => host, [host.validateAddress]); // eslint-disable-line react-hooks/exhaustive-deps\n return <HostContext.Provider value={value}>{children}</HostContext.Provider>;\n}\n\nexport function useContactValuesHost(): ContactValuesHost {\n return React.useContext(HostContext);\n}\n\n// ── the inline shell ────────────────────────────────────────────────────────────────────────────\n\nconst markCache = new Map<SocialBrandMark, PeekGlyph>();\nfunction markFor(platform: SocialBrandMark): PeekGlyph {\n let glyph = markCache.get(platform);\n if (!glyph) {\n glyph = socialGlyph(platform);\n markCache.set(platform, glyph);\n }\n return glyph;\n}\n\ninterface ShellProps {\n kind: string;\n glyph?: PeekGlyph;\n text: string;\n copy: string;\n state: ContactValueState;\n record: PeekRecord;\n peek: boolean;\n /** Let the value run to several lines (an address) instead of ending in \"…\". */\n wrap?: boolean;\n}\n\nfunction CopyButton({ text, kind }: { text: string; kind: string }) {\n const [done, setDone] = React.useState(false);\n React.useEffect(() => {\n if (!done) return;\n const t = setTimeout(() => setDone(false), 1200);\n return () => clearTimeout(t);\n }, [done]);\n const Glyph = done ? CheckIcon : CopyIcon;\n return (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={`Copy ${kind}`}\n title={done ? \"Copied\" : `Copy ${kind}`}\n icon={<Glyph className=\"size-[1em]\" />}\n data-matrx-contact-copy=\"\"\n onClick={(event) => {\n event.stopPropagation();\n event.preventDefault();\n void copyText(text).then((ok) => setDone(ok));\n }}\n className=\"shrink-0\"\n />\n );\n}\n\n/** The peek, pinned open by a click and closed by a click outside or Escape; hover opens it too. */\nfunction usePinnedHover() {\n const [hovered, setHovered] = React.useState(false);\n const [held, setHeld] = React.useState(false);\n const [pinned, setPinned] = React.useState(false);\n const trigger = React.useRef<HTMLButtonElement | null>(null);\n React.useEffect(() => {\n if (!pinned) return;\n const onDown = (event: PointerEvent) => {\n const target = event.target as Element | null;\n if (!target) return;\n if (trigger.current?.contains(target) || target.closest(\"[data-matrx-peek-host],[role=menu],[data-radix-popper-content-wrapper]\")) return;\n setPinned(false);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setPinned(false);\n };\n document.addEventListener(\"pointerdown\", onDown, true);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"pointerdown\", onDown, true);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [pinned]);\n return { open: hovered || held || pinned, setHovered, setHeld, setPinned, trigger };\n}\n\nfunction ValueShell({ kind, glyph: Glyph, text, copy, state, record, peek, wrap }: ShellProps) {\n const { open, setHovered, setHeld, setPinned, trigger } = usePinnedHover();\n const off = state !== \"ok\";\n const value = (\n <span className={cn(\"min-w-0\", wrap ? \"whitespace-pre-line break-words\" : \"truncate\", off ? \"text-muted-foreground line-through\" : \"text-foreground\")}>{text}</span>\n );\n const body = (\n <>\n {Glyph ? <Glyph className=\"size-[1em] shrink-0 text-muted-foreground\" /> : null}\n {value}\n {off ? <span className=\"shrink-0 text-muted-foreground no-underline\">{`· ${CONTACT_STATE_LABEL[state as Exclude<ContactValueState, \"ok\">]}`}</span> : null}\n </>\n );\n return (\n <span\n data-matrx-contact-value={kind}\n data-state={state}\n className={cn(\"group/contact inline-flex min-w-0 max-w-full gap-1 align-baseline\", wrap ? \"items-start\" : \"items-center\")}\n >\n {peek ? (\n <PeekHoverCard\n label={text}\n open={open}\n onOpenChange={(next) => {\n setHovered(next);\n if (!next) setPinned(false);\n }}\n trigger={\n <Tile\n ref={trigger}\n type=\"button\"\n dense\n variant=\"quiet\"\n title={body}\n className=\"min-w-0 max-w-full\"\n onClick={() => setPinned((p) => !p)}\n />\n }\n >\n <Peek record={record} size=\"sm\" onHoldChange={setHeld} />\n </PeekHoverCard>\n ) : (\n <span className={cn(\"inline-flex min-w-0 max-w-full gap-1\", wrap ? \"items-start\" : \"items-center\")}>{body}</span>\n )}\n <CopyButton text={copy} kind={kind} />\n </span>\n );\n}\n\nfunction stateCallout(state: ContactValueState): PeekRecord[\"callout\"] | undefined {\n if (state === \"ok\") return undefined;\n return {\n title: CONTACT_STATE_LABEL[state],\n glyph: LinkOffGlyph,\n text: state === \"broken\" ? \"This address no longer answers, so it is not offered as a link.\" : \"Matched by name only — this is someone else, so it is not offered as a link.\",\n };\n}\n\nconst actions = (rows: (PeekRow | null | false | undefined)[]): PeekBlock => ({\n section: \"Actions\",\n rows: rows.filter((r): r is PeekRow => Boolean(r)),\n});\n\nexport interface ContactValueCommonProps {\n /** Whose value it is (\"Ana Ruiz\", \"SolarBright\") — the peek's subtitle. */\n owner?: string;\n /** `broken` / `not-us`: drawn struck through with its reason, never a link. Default `ok`. */\n state?: ContactValueState;\n /** Open the peek on hover/tap. Default true; `false` keeps only the inline value and Copy. */\n peek?: boolean;\n}\n\n// ── email ───────────────────────────────────────────────────────────────────────────────────────\n\nexport interface EmailValueProps extends ContactValueCommonProps {\n email: string;\n}\n\nexport function EmailValue({ email, owner, state = \"ok\", peek = true }: EmailValueProps) {\n const parsed = parseEmail(email);\n const ok = state === \"ok\" && parsed.valid;\n const site = parsed.domain ? parseUrl(parsed.domain) : null;\n const record: PeekRecord = {\n kind: \"Email\",\n id: parsed.address,\n title: parsed.address,\n glyph: MailGlyph,\n ...(owner ? { subtitle: owner } : {}),\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n ...(!parsed.valid && state === \"ok\" ? [{ fact: \"Not a complete email address\", glyph: LinkOffGlyph, muted: true }] : []),\n ...(parsed.domain ? [{ property: \"Domain\", value: parsed.domain, ...(ok && site?.href ? { href: site.href } : {}) }] : []),\n actions([\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(`\"${parsed.address}\"`) },\n ]),\n ],\n ...(ok ? { primary: { label: \"Send email\", onSelect: () => window.location.assign(mailtoHref(parsed.address)) } } : {}),\n copyData: { email: parsed.address, ...(owner ? { owner } : {}) },\n };\n return <ValueShell kind=\"email\" glyph={MailGlyph} text={parsed.address} copy={parsed.address} state={state} record={record} peek={peek} />;\n}\n\n// ── phone ───────────────────────────────────────────────────────────────────────────────────────\n\nexport interface PhoneValueProps extends ContactValueCommonProps {\n phone: string;\n /** The calling code for a number written without `+`. Default \"1\" (North America). */\n defaultCallingCode?: string;\n}\n\nexport function PhoneValue({ phone, owner, state = \"ok\", peek = true, defaultCallingCode = \"1\" }: PhoneValueProps) {\n const parsed = parsePhone(phone, defaultCallingCode);\n const ok = state === \"ok\" && parsed.valid;\n const record: PeekRecord = {\n kind: \"Phone number\",\n id: parsed.e164 ?? parsed.raw,\n title: parsed.display,\n glyph: PhoneGlyph,\n ...(owner ? { subtitle: owner } : {}),\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n ...(!parsed.valid && state === \"ok\" ? [{ fact: \"Not a complete phone number\", glyph: LinkOffGlyph, muted: true }] : []),\n ...(parsed.e164 ? [{ property: \"E.164\", value: parsed.e164 }] : []),\n ...(parsed.region ? [{ property: \"Region\", value: parsed.region }] : []),\n ...(parsed.extension ? [{ property: \"Extension\", value: parsed.extension }] : []),\n actions([\n ok && { text: \"Send a text\", glyph: MessageSquareGlyph, href: smsHref(parsed) },\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(`\"${parsed.display}\"`) },\n ]),\n ],\n ...(ok ? { primary: { label: \"Call\", onSelect: () => window.location.assign(telHref(parsed)) } } : {}),\n copyData: { phone: parsed.e164 ?? parsed.raw, display: parsed.display, ...(parsed.region ? { region: parsed.region } : {}), ...(owner ? { owner } : {}) },\n };\n return <ValueShell kind=\"phone number\" glyph={PhoneGlyph} text={parsed.display} copy={parsed.e164 ?? parsed.raw} state={state} record={record} peek={peek} />;\n}\n\n// ── address ─────────────────────────────────────────────────────────────────────────────────────\n\nexport interface AddressValueProps extends ContactValueCommonProps {\n /** One string (lines split on newlines) or its lines; empty lines are dropped. */\n address: string | readonly (string | null | undefined)[];\n /** Draw each line on its own line. Default: one line, joined with commas. */\n multiline?: boolean;\n}\n\ntype Validation = { phase: \"idle\" } | { phase: \"checking\" } | { phase: \"done\"; result: AddressValidation } | { phase: \"failed\"; error: unknown };\n\nconst VALIDATION_TONE = { verified: \"success\", partial: \"warning\", unknown: \"danger\" } as const;\nconst VALIDATION_TEXT = { verified: \"Verified address\", partial: \"Partly matched\", unknown: \"No match found\" } as const;\n\nexport function AddressValue({ address, owner, state = \"ok\", peek = true, multiline = false }: AddressValueProps) {\n const one = addressText(address);\n const lines = typeof address === \"string\" ? address.split(/\\n+/).map((l) => l.trim()).filter(Boolean) : address.map((l) => (l ?? \"\").trim()).filter(Boolean);\n const { validateAddress } = useContactValuesHost();\n const [validation, setValidation] = React.useState<Validation>({ phase: \"idle\" });\n React.useEffect(() => setValidation({ phase: \"idle\" }), [one]);\n const ok = state === \"ok\" && one.length > 0;\n const validate = React.useCallback(() => {\n if (!validateAddress) return;\n setValidation({ phase: \"checking\" });\n validateAddress(one).then(\n (result) => setValidation({ phase: \"done\", result }),\n (error: unknown) => setValidation({ phase: \"failed\", error }),\n );\n }, [validateAddress, one]);\n const validationBlock: PeekBlock | null =\n validation.phase === \"done\"\n ? {\n section: \"Validation\",\n glyph: BadgeCheckGlyph,\n tone: VALIDATION_TONE[validation.result.status],\n rows: [\n {\n text: VALIDATION_TEXT[validation.result.status],\n tone: VALIDATION_TONE[validation.result.status],\n ...(validation.result.formatted ? { detail: validation.result.formatted } : {}),\n },\n ],\n }\n : validation.phase === \"failed\"\n ? { section: \"Validation\", tone: \"danger\", rows: [{ text: \"Couldn't reach the address check\", tone: \"danger\", detail: validation.error instanceof Error ? validation.error.message : String(validation.error) }] }\n : validation.phase === \"checking\"\n ? { section: \"Validation\", rows: [{ text: \"Checking…\" }] }\n : null;\n const record: PeekRecord = {\n kind: \"Address\",\n id: one,\n title: lines[0] ?? one,\n ...(lines.length > 1 ? { subtitle: lines.slice(1).join(\", \") } : owner ? { subtitle: owner } : {}),\n glyph: MapPinGlyph,\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n ...(owner && lines.length > 1 ? [{ property: \"For\", value: owner }] : []),\n ...(validationBlock ? [validationBlock] : []),\n actions([\n ok && validateAddress && validation.phase !== \"done\" && { text: \"Open in maps\", glyph: MapPinGlyph, href: mapsHref(one) },\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(one) },\n ]),\n ],\n ...(ok && validateAddress && validation.phase !== \"done\"\n ? { primary: { label: validation.phase === \"checking\" ? \"Checking…\" : \"Validate\", onSelect: validate } }\n : ok\n ? { primary: { label: \"Open in maps\", onSelect: () => openOutbound(mapsHref(validation.phase === \"done\" && validation.result.formatted ? validation.result.formatted : one)) } }\n : {}),\n copyData: { address: one, ...(owner ? { owner } : {}), ...(validation.phase === \"done\" ? { validation: validation.result } : {}) },\n };\n return (\n <ValueShell\n kind=\"address\"\n glyph={MapPinGlyph}\n text={multiline ? lines.join(\"\\n\") : one}\n copy={lines.join(\"\\n\")}\n state={state}\n record={record}\n peek={peek}\n {...(multiline ? { wrap: true } : {})}\n />\n );\n}\n\n// ── social ──────────────────────────────────────────────────────────────────────────────────────\n\nexport interface SocialHandleValueProps extends ContactValueCommonProps {\n /** A profile URL, an `@handle` or a bare handle. */\n value: string;\n /** The platform when `value` is a handle (\"linkedin\", \"Twitter\", \"ig\" …). */\n platform?: string | null;\n /** Follower count, when known. */\n followers?: number | null;\n /** The profile's display name, when known. */\n name?: string | null;\n}\n\nfunction socialRecord(parsed: ParsedSocial, props: SocialHandleValueProps, glyph: PeekGlyph): PeekRecord {\n const state = props.state ?? \"ok\";\n const ok = state === \"ok\" && Boolean(parsed.href);\n return {\n kind: \"Social profile\",\n id: parsed.href ?? parsed.display,\n title: props.name || parsed.display,\n subtitle: props.name ? `${parsed.display} · ${parsed.platformName}` : parsed.platformName,\n glyph,\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n { property: \"Platform\", value: parsed.platformName },\n ...(parsed.handle ? [{ property: \"Handle\", value: parsed.display }] : []),\n ...(props.followers != null ? [{ fact: `${compactCount(props.followers)} followers`, glyph: UsersIcon }] : []),\n ...(props.owner ? [{ property: \"For\", value: props.owner }] : []),\n actions([\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(`${parsed.display} ${parsed.platformName}`) },\n ]),\n ],\n ...(ok ? { primary: { label: \"Open profile\", onSelect: () => openOutbound(parsed.href!) } } : {}),\n copyData: { platform: parsed.platformName, handle: parsed.display, ...(parsed.href ? { url: parsed.href } : {}), ...(props.followers != null ? { followers: props.followers } : {}) },\n };\n}\n\nexport function SocialHandleValue(props: SocialHandleValueProps) {\n const { value, platform, state = \"ok\", peek = true } = props;\n const parsed = parseSocial(value, platform);\n const glyph = parsed.platform === \"other\" ? AtSignGlyph : markFor(parsed.platform);\n return (\n <ValueShell\n kind={`${parsed.platformName} handle`}\n glyph={glyph}\n text={parsed.display}\n copy={parsed.handle ? parsed.display : parsed.href ?? parsed.display}\n state={state}\n record={socialRecord(parsed, props, glyph)}\n peek={peek}\n />\n );\n}\n\n// ── url ─────────────────────────────────────────────────────────────────────────────────────────\n\nexport interface UrlValueProps extends ContactValueCommonProps {\n url: string;\n /** The page's title, when known — the peek's title. */\n title?: string | null;\n /** The inline globe. Off when the address already has its own place and the icon only wraps. */\n icon?: boolean;\n}\n\nexport function UrlValue({ url, title, owner, state = \"ok\", peek = true, icon = true }: UrlValueProps) {\n const parsed = parseUrl(url);\n const ok = state === \"ok\" && Boolean(parsed.href);\n const record: PeekRecord = {\n kind: \"Web address\",\n id: parsed.href ?? url,\n title: title || parsed.domain,\n subtitle: title ? parsed.display : owner ?? parsed.display,\n glyph: GlobeIcon,\n ...(stateCallout(state) ? { callout: stateCallout(state)! } : {}),\n body: [\n { property: \"Domain\", value: parsed.domain },\n ...(owner && title ? [{ property: \"For\", value: owner }] : []),\n actions([\n { text: \"Search the web\", glyph: SearchIcon, href: webSearchHref(parsed.domain) },\n ]),\n ],\n ...(ok ? { primary: { label: \"Open\", onSelect: () => openOutbound(parsed.href!) } } : {}),\n copyData: { url: parsed.href ?? url, domain: parsed.domain, ...(title ? { title } : {}) },\n };\n return <ValueShell kind=\"link\" {...(icon ? { glyph: GlobeIcon } : {})} text={parsed.display} copy={parsed.href ?? url} state={state} record={record} peek={peek} />;\n}\n\n// ── one door by type ────────────────────────────────────────────────────────────────────────────\n\nexport type ContactValueType = \"email\" | \"phone\" | \"address\" | \"social\" | \"url\";\n\nexport type ContactValueProps = ContactValueCommonProps & { type: ContactValueType; value: string; platform?: string | null; followers?: number | null; title?: string | null; icon?: boolean };\n\n/** Any contact value by its type — for a renderer that only knows the field's type at run time. */\nexport function ContactValue({ type, value, platform, followers, title, icon, ...common }: ContactValueProps) {\n switch (type) {\n case \"email\":\n return <EmailValue email={value} {...common} />;\n case \"phone\":\n return <PhoneValue phone={value} {...common} />;\n case \"address\":\n return <AddressValue address={value} {...common} />;\n case \"social\":\n return <SocialHandleValue value={value} {...(platform !== undefined ? { platform } : {})} {...(followers !== undefined ? { followers } : {})} {...common} />;\n case \"url\":\n return <UrlValue url={value} {...(title !== undefined ? { title } : {})} {...(icon !== undefined ? { icon } : {})} {...common} />;\n }\n}\n","\"use client\";\n\n/**\n * Peek — THE way to show one record at a glance. One typed record in; the card, its phone drawer and\n * its Copy door all come out of it. A caller describes the RECORD (its name, facts, sections, doors),\n * never the card: there is no JSX slot, no class, no glyph or label for a door, nothing to style. What\n * a record needs that this cannot say becomes a new field here, reviewed once — never a hand-built\n * card beside it.\n *\n * <PeekHoverCard trigger={<button>…</button>}>\n * <Peek record={agentPeekRecord(agent)} />\n * </PeekHoverCard>\n *\n * Copy is on by default: the door hands Alchemy `copyData` (or, absent, the record as drawn), through\n * the same host port every table row uses. A record that must not be copied says `copy: false`.\n */\n\nimport * as React from \"react\";\n\nimport { useMatrxDataTableHost } from \"./table-host/host\";\nimport { RecordId, isRecordUuid } from \"./record-id\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\nimport { Chip, ChipSet, MissingTag, PropertyRow, Switch } from \"./controls/index\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport { CheckIcon, CopyIcon, UploadIcon } from \"./icons\";\nimport { cn } from \"./cn\";\nimport { Button } from \"./button\";\nimport { Button as ControlButton } from \"./controls/controls\";\nimport { ErrorNotice } from \"./error-notice\";\nimport { RefreshCwIcon } from \"./icons\";\nimport {\n isPart,\n isProperty,\n isSection,\n peekRecordData,\n type PeekBlock,\n type PeekEntityRenderer,\n type PeekFact,\n type PeekPart,\n type PeekPartRenderer,\n type PeekProperty,\n type PeekRecord,\n type PeekSection,\n type PeekTone,\n} from \"./peek-record\";\nimport { PeekHoldContext, usePeekHold, type PeekCardDensity, type PeekCardFrame, type PeekCardHeight, type PeekCardOrientation, type PeekCardSize } from \"./peek-model\";\nimport {\n PeekCard,\n PeekCardAvatar,\n PeekCardBody,\n PeekCardCallout,\n PeekCardCode,\n PeekCardMedia,\n PeekCardRows,\n PeekCardFavorite,\n PeekCardFooter,\n PeekCardHeader,\n PeekCardRow,\n PeekCardSection,\n PeekCardTags,\n PeekCardText,\n} from \"./peek-card\";\n\nexport interface PeekProps {\n record: PeekRecord;\n /**\n * A menu the card opened (Copy, More) is open — its pointer is outside the card. A host that closes\n * the card on pointer-leave (a list's hover preview) holds it while this is true. PeekHoverCard\n * already does.\n */\n onHoldChange?: (held: boolean) => void;\n size?: PeekCardSize;\n orientation?: PeekCardOrientation;\n height?: PeekCardHeight;\n density?: PeekCardDensity;\n frame?: PeekCardFrame;\n /** The body is still loading: its shimmer shows and every action waits. */\n loading?: boolean;\n}\n\nconst PeekEntityRendererContext = React.createContext<PeekEntityRenderer | null>(null);\n\n/** The host's (or a package's) identity renderer for the peeks inside it. */\nexport function PeekEntityRendererProvider({ render, children }: { render: PeekEntityRenderer; children: React.ReactNode }) {\n return <PeekEntityRendererContext.Provider value={render}>{children}</PeekEntityRendererContext.Provider>;\n}\n\nconst PeekPartRendererContext = React.createContext<PeekPartRenderer | null>(null);\n\n/** The app's renderer for the parts only it can draw (custom fields, the access notice). */\nexport function PeekPartRendererProvider({ render, children }: { render: PeekPartRenderer; children: React.ReactNode }) {\n return <PeekPartRendererContext.Provider value={render}>{children}</PeekPartRendererContext.Provider>;\n}\n\nconst screamedParts = new Set<string>();\nfunction screamPartOnce(kind: string) {\n if (screamedParts.has(kind)) return;\n screamedParts.add(kind);\n console.error(`[Peek] part \"${kind}\" drawn with no PeekPartRendererProvider above it — the app's own rendering (custom fields, access notice, thumbnails, formatted text) is missing here`);\n}\n\nfunction HostPart({ part }: { part: PeekPart }) {\n const render = React.useContext(PeekPartRendererContext);\n const drawn = render?.(part);\n if (drawn) return <>{drawn}</>;\n if (!render) {\n // The app's parts were never mounted: say so once, instead of custom fields quietly missing.\n screamPartOnce(\"token\" in part ? `${part.part}:${part.token}` : part.part);\n }\n // No renderer: never a blank card where a record could not be read, never lost text.\n if (part.part === \"access\") return <p className=\"type-secondary text-muted-foreground\">Not available</p>;\n if (part.part === \"markdown\") {\n return (\n <PeekCardText breaks {...(part.clamp ? { clamp: part.clamp } : {})}>\n {part.text}\n </PeekCardText>\n );\n }\n return null;\n}\n\n/** The record could not be read: the design system's failed-read notice, never an empty-looking card. */\nfunction Failure({ failure }: { failure: NonNullable<PeekRecord[\"failure\"]> }) {\n const flagOnly = failure.error === true || failure.error == null || failure.error === \"\";\n return (\n <ErrorNotice\n size=\"compact\"\n title={`Couldn't load ${failure.what}`}\n // The caller's sentence (or the flag-only one) is what the person reads; the raw error always rides\n // along, so the copy menu's For-AI payload keeps its code and stack.\n {...(failure.message\n ? { message: failure.message }\n : flagOnly\n ? { message: `The read for ${failure.what} failed, so nothing here is an answer — not \"empty\".` }\n : {})}\n {...(flagOnly ? {} : { error: failure.error })}\n operation={`Load ${failure.what}`}\n {...(failure.onRetry\n ? {\n actions: (\n <Button variant=\"outline\" size=\"sm\" className=\"h-7 gap-1.5 text-xs\" onClick={failure.onRetry}>\n <RefreshCwIcon className=\"h-3.5 w-3.5\" /> Try again\n </Button>\n ),\n }\n : {})}\n />\n );\n}\n\nfunction EntityText({ entity, name }: { entity: NonNullable<PeekFact[\"entity\"]>; name: string }) {\n const render = React.useContext(PeekEntityRendererContext);\n const { EntityRef } = useMatrxDataTableHost();\n const className = \"type-secondary min-w-0 max-w-full truncate text-foreground\";\n const drawn = render?.({ ...entity, name, className });\n if (drawn) return <>{drawn}</>;\n if (EntityRef) {\n return (\n <EntityRef\n token={entity.token}\n id={entity.id}\n className={className}\n {...(entity.newTab ? { openInNewTab: true } : {})}\n {...(entity.showActions ? { alwaysShowActions: true } : {})}\n >\n {name}\n </EntityRef>\n );\n }\n // No renderer and no host door: the name as text — never a blank row.\n return <span className={className}>{name}</span>;\n}\n\n/** A link to a page somewhere else: the record's own text, opened in a new tab. */\nfunction Outbound({ href, children }: { href: string; children: React.ReactNode }) {\n // THE outbound door: our referral rides every link to another site (kit's OutboundLink).\n return (\n <OutboundLink href={href} className=\"break-all text-primary underline-offset-2 hover:underline\" onClick={(event) => event.stopPropagation()}>\n {children}\n </OutboundLink>\n );\n}\n\n/** THE INPUT PREVIEW: the real controls, drawn small and inert — what a person filling it will see. */\nfunction InputPreview({ section }: { section: PeekSection }) {\n const { choices, field, toggle } = section;\n if (!choices && !field && !toggle) return null;\n return (\n <div data-peek-input-preview={choices ? \"choices\" : toggle ? \"toggle\" : field?.drop ? \"drop\" : \"field\"} inert className=\"select-none\">\n {choices ? (\n <ChipSet>\n {choices.options.slice(0, 8).map((option) => (\n <Chip key={option} label={option} pressed={Boolean(choices.picked?.includes(option))} />\n ))}\n {choices.options.length > 8 ? <Chip label={`+${choices.options.length - 8}`} /> : null}\n </ChipSet>\n ) : toggle ? (\n <div className=\"flex items-center gap-2\">\n <Switch checked={toggle.on} tabIndex={-1} aria-hidden />\n <span className=\"type-secondary text-foreground\">{toggle.label ?? (toggle.on ? \"On\" : \"Off\")}</span>\n </div>\n ) : field?.drop ? (\n <div className=\"flex h-9 items-center justify-center gap-1.5 rounded-md border border-dashed border-border bg-background type-meta text-muted-foreground\">\n {field.glyph ? <field.glyph className=\"size-3.5 shrink-0\" /> : <UploadIcon className=\"size-3.5 shrink-0\" />}\n {field.text ?? field.placeholder}\n </div>\n ) : field ? (\n <div\n className={cn(\n \"flex gap-2 rounded-md border border-border bg-background px-2.5 shadow-sm\",\n field.lines === 2 ? \"min-h-12 items-start py-1.5\" : \"h-7 items-center\",\n )}\n >\n {field.glyph ? <field.glyph className={cn(\"size-3.5 shrink-0 text-muted-foreground\", field.lines === 2 && \"mt-0.5\")} /> : null}\n <span className={cn(\"type-secondary min-w-0 flex-1\", field.lines === 2 ? \"line-clamp-2\" : \"truncate\", field.text ? \"text-foreground\" : \"text-muted-foreground\")}>\n {field.text || field.placeholder}\n </span>\n </div>\n ) : null}\n </div>\n );\n}\n\n/** An exact token in a monospace chip; a press copies it and says so for a moment. */\nfunction TokenChip({ token }: { token: string }) {\n const [copied, setCopied] = React.useState(false);\n React.useEffect(() => {\n if (!copied) return;\n const timer = window.setTimeout(() => setCopied(false), 1400);\n return () => window.clearTimeout(timer);\n }, [copied]);\n const Glyph = copied ? CheckIcon : CopyIcon;\n return (\n <ControlButton\n type=\"button\"\n variant=\"quiet\"\n iconEnd={<Glyph className={cn(\"size-3.5 shrink-0\", copied ? \"text-success-ink\" : \"text-muted-foreground group-hover/token:text-foreground\")} />}\n data-peek-token=\"\"\n onClick={(event) => {\n event.stopPropagation();\n void copyText(token).then(setCopied);\n }}\n aria-label={copied ? `Copied ${token}` : `Copy ${token}`}\n title={copied ? \"Copied\" : \"Copy\"}\n className=\"group/token max-w-full self-start font-mono\"\n >\n <span className=\"truncate\">{token}</span>\n </ControlButton>\n );\n}\n\nfunction Property({ block }: { block: PeekProperty }) {\n return (\n <PropertyRow label={block.property}>\n {block.value === \"\" && block.missing ? (\n <MissingTag>{block.missing}</MissingTag>\n ) : (\n <span className=\"break-words\">\n {block.href ? <Outbound href={block.href}>{block.value}</Outbound> : block.value}\n </span>\n )}\n </PropertyRow>\n );\n}\n\nfunction Block({ block }: { block: PeekBlock }) {\n if (isPart(block)) return <HostPart part={block} />;\n if (isProperty(block)) return <Property block={block} />;\n if (isSection(block)) {\n return (\n <PeekCardSection label={block.section} {...(block.glyph ? { icon: block.glyph } : {})} {...(block.tone ? { tone: block.tone } : {})}>\n {block.text && block.markdown ? <HostPart part={{ part: \"markdown\", text: block.text, ...(block.clamp ? { clamp: block.clamp } : {}) }} /> : null}\n {block.text && !block.markdown ? (\n <PeekCardText {...(block.clamp ? { clamp: block.clamp } : {})} {...(block.breaks ? { breaks: true } : {})}>\n {block.text}\n </PeekCardText>\n ) : null}\n {block.tags?.length ? <PeekCardTags tags={block.tags} /> : null}\n {block.items?.length ? <SectionItems items={block.items} {...(block.limit ? { limit: block.limit } : {})} /> : null}\n {block.rows?.length ? (\n <PeekCardRows\n numbered={Boolean(block.numbered)}\n limit={block.limit}\n rows={block.rows.map((row, i) => ({\n key: `${i}:${row.text}`,\n text: row.entity ? <EntityText entity={row.entity} name={row.text} /> : row.text,\n title: row.text,\n detail: row.detail,\n glyph: row.glyph,\n tone: row.tone,\n href: row.entity ? undefined : row.href,\n status: row.status,\n doors: row.doors,\n }))}\n />\n ) : null}\n {block.code ? <PeekCardCode text={block.code.text} language={block.code.language} caption={block.code.caption} /> : null}\n <InputPreview section={block} />\n {block.token ? <TokenChip token={block.token} /> : null}\n {block.links?.length ? (\n <ul className=\"flex flex-col gap-0.5\">\n {block.links.map((link, i) => (\n <li key={`${i}:${link.href}`} className=\"type-secondary min-w-0 truncate\">\n <Outbound href={link.href}>{link.text}</Outbound>\n </li>\n ))}\n </ul>\n ) : null}\n </PeekCardSection>\n );\n }\n if (block.entity) {\n const entity = <EntityText entity={block.entity} name={block.fact} />;\n return (\n <div className=\"flex min-w-0 items-center gap-2\">\n {block.glyph ? <block.glyph className=\"size-3.5 shrink-0 text-muted-foreground\" /> : null}\n <div className=\"flex min-w-0 flex-1\">{entity}</div>\n </div>\n );\n }\n if (block.href) {\n return (\n <div className=\"flex min-w-0 items-start gap-2\">\n {block.glyph ? <block.glyph className=\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\" /> : null}\n <span className=\"type-secondary min-w-0 break-words\">\n <Outbound href={block.href}>{block.fact}</Outbound>\n {block.meta ? <span className=\"type-meta block text-muted-foreground\">{block.meta}</span> : null}\n </span>\n </div>\n );\n }\n return (\n <PeekCardRow\n {...(block.glyph ? { icon: block.glyph } : {})}\n {...(block.meta ? { meta: block.meta } : {})}\n {...(block.muted ? { tone: \"muted\" as const } : {})}\n {...(block.wrap ? { wrap: true } : {})}\n >\n {block.fact}\n </PeekCardRow>\n );\n}\n\nfunction Media({ media }: { media: NonNullable<PeekRecord[\"media\"]> }) {\n const render = React.useContext(PeekPartRendererContext);\n const drawn = !media.src && media.file\n ? render?.({ part: \"media\", token: \"file\", id: media.file.id, name: media.alt, ...(media.file.mimeType ? { mimeType: media.file.mimeType } : {}) })\n : null;\n return <PeekCardMedia alt={media.alt} aspect={media.aspect} src={media.src} drawn={drawn} />;\n}\n\nfunction SectionItems({ items, limit }: { items: readonly string[]; limit?: number }) {\n const shown = limit && items.length > limit ? items.slice(0, limit) : items;\n const rest = items.length - shown.length;\n return (\n <ul className=\"flex flex-col gap-0.5\">\n {shown.map((item, i) => (\n <li key={`${i}:${item}`} className=\"type-secondary break-words text-foreground\">\n {item}\n </li>\n ))}\n {rest > 0 ? <li className=\"type-meta text-muted-foreground\">{`+${rest} more`}</li> : null}\n </ul>\n );\n}\n\nconst blockKey = (block: PeekBlock, index: number) =>\n `${index}:${isPart(block) ? block.part : isProperty(block) ? block.property : isSection(block) ? block.section : block.fact}`;\n\nexport function Peek(props: PeekProps) {\n const parent = React.useContext(PeekHoldContext);\n const [held, hold] = usePeekHold();\n const { onHoldChange } = props;\n React.useEffect(() => {\n onHoldChange?.(held);\n }, [held, onHoldChange]);\n const relay = React.useCallback(\n (open: boolean) => {\n parent(open);\n hold(open);\n },\n [parent, hold],\n );\n return (\n <PeekHoldContext.Provider value={relay}>\n <PeekBody {...props} />\n </PeekHoldContext.Provider>\n );\n}\n\n/** A status subtitle's ink per tone (text tokens only). */\nconst SUBTITLE_INK: Record<PeekTone, string> = {\n neutral: \"text-muted-foreground\",\n info: \"text-info-ink\",\n success: \"text-success-ink\",\n warning: \"text-warning-ink\",\n danger: \"text-destructive-ink\",\n};\n\nfunction PeekBody({ record, size, orientation, height, density, frame, loading }: PeekProps) {\n const hasFooter = Boolean(record.primary || record.onSettings || record.doors?.length || record.href || record.copyData !== false);\n const copyData = record.copyData;\n return (\n <PeekCard\n {...(size ? { size } : {})}\n {...(orientation ? { orientation } : {})}\n {...(height ? { height } : {})}\n {...(density ? { density } : {})}\n {...(frame ? { frame } : {})}\n {...(loading ? { loading } : {})}\n >\n <PeekCardHeader\n title={record.title}\n {...(record.subtitle\n ? {\n subtitle: record.subtitleTone ? (\n <span data-tone={record.subtitleTone} className={cn(\"font-medium\", SUBTITLE_INK[record.subtitleTone])}>\n {record.subtitle}\n </span>\n ) : (\n record.subtitle\n ),\n }\n : {})}\n {...(record.avatar\n ? { leading: <PeekCardAvatar initials={record.avatar.initials} src={record.avatar.src} /> }\n : record.glyph\n ? { leading: <record.glyph /> }\n : {})}\n {...(record.favorite || record.badge\n ? {\n trailing: (\n <>\n {record.badge ? (\n <Chip\n data-peek-badge=\"\"\n label={record.badge.text}\n tone={record.badge.tone ?? \"neutral\"}\n {...(record.badge.glyph ? { icon: <record.badge.glyph /> } : {})}\n />\n ) : null}\n {record.favorite ? <PeekCardFavorite on={record.favorite.on} onToggle={record.favorite.onToggle} /> : null}\n </>\n ),\n }\n : {})}\n {...(record.favorite?.on && record.favorite.pinnedLabel ? { pinned: record.favorite.pinnedLabel } : {})}\n {...((record.showId ?? isRecordUuid(record.id)) ? { id: <RecordId value={record.id} label={record.kind} /> } : {})}\n />\n {record.failure || record.media || record.callout || record.body?.length || record.aside?.length ? (\n <PeekCardBody\n {...(record.aside?.length\n ? { aside: record.aside.map((block, i) => <Block key={blockKey(block, i)} block={block} />) }\n : {})}\n >\n {record.failure ? <Failure failure={record.failure} /> : null}\n {record.media ? <Media media={record.media} /> : null}\n {record.callout ? (\n <PeekCardCallout title={record.callout.title} {...(record.callout.glyph ? { icon: record.callout.glyph } : {})}>\n {record.callout.text || record.callout.lines?.length ? (\n <>\n {record.callout.text}\n {record.callout.lines?.map((line, i) => (\n <div key={`${i}:${line.text}`} className=\"type-meta text-muted-foreground\" {...(line.hint ? { title: line.hint } : {})}>\n {line.text}\n </div>\n ))}\n </>\n ) : null}\n </PeekCardCallout>\n ) : null}\n {record.body?.map((block, i) => <Block key={blockKey(block, i)} block={block} />)}\n </PeekCardBody>\n ) : null}\n {hasFooter ? (\n <PeekCardFooter\n {...(record.primary ? { primary: { label: record.primary.label, onClick: record.primary.onSelect } } : {})}\n {...(record.onSettings ? { onSettings: record.onSettings } : {})}\n {...(record.doors ? { doors: record.doors } : {})}\n {...(record.href ? { openHref: record.href } : {})}\n {...(copyData !== false\n ? {\n copy: {\n data: copyData === undefined ? () => peekRecordData(record) : copyData,\n dataType: record.kind,\n label: record.title,\n sourceId: record.id,\n },\n }\n : {})}\n />\n ) : null}\n </PeekCard>\n );\n}\n","// The peek's RECORD — what a caller hands <Peek> — and the record as Copy hands it to Alchemy. No\n// components here, so peek.tsx hot-swaps in place (React Fast Refresh) on an edit.\n\nimport type * as React from \"react\";\n\nimport type { PeekDoor, PeekDoors } from \"./peek-model\";\n\n/** A glyph component (a Lucide icon, a design-system icon); drawn 14–16px in muted ink. */\nexport type PeekGlyph = React.ComponentType<{ className?: string }>;\n\n/** One fact on one line: an optional glyph, the text, an optional quieter second line. */\nexport interface PeekFact {\n fact: string;\n /**\n * The fact NAMES a record (a model, a person, a project): it opens like every identity in the app.\n * Drawn by the host's identity renderer for that token (`PeekEntityRenderer`), else the table host's\n * `EntityRef` around `fact`, else `fact` as text.\n */\n entity?: {\n token: string;\n id: string;\n offeringId?: string | null;\n /** Opening the record starts a new tab (the peek's context stays where it is). */\n newTab?: boolean;\n /** Its open / peek buttons stay shown, not only on hover. */\n showActions?: boolean;\n };\n glyph?: PeekGlyph;\n /** A quieter second line (an email, a date). */\n meta?: string;\n /** The whole row is meta (dates, counts). */\n muted?: boolean;\n /** Let a long fact run to several lines instead of ending in \"…\". */\n wrap?: boolean;\n /** The fact is a page somewhere else: its text is a link that opens in a new tab. */\n href?: string;\n}\n\n/** A status color, from the design system's semantic tokens. */\nexport type PeekTone = \"neutral\" | \"info\" | \"success\" | \"warning\" | \"danger\";\n\n/**\n * One child of the record in a section's list (a step, a finding, an attached place, a reason).\n * Text first; everything else is optional and drawn in one fixed place on the row.\n */\nexport interface PeekRow {\n text: string;\n /** A quieter line under the text. */\n detail?: string;\n glyph?: PeekGlyph;\n /** A small dot before the text, in this tone (a finding's grade, a step's state). */\n tone?: PeekTone;\n /** The row NAMES a record: drawn like a fact's `entity` (the host's identity renderer, else `EntityRef`). */\n entity?: { token: string; id: string; offeringId?: string | null };\n /** The row's text is a link: a web address opens in a new tab, an app path moves within the app. */\n href?: string;\n /** A short tag at the row's right edge (\"Needs attention\"), its reason as the tooltip. */\n status?: { text: string; tone?: PeekTone; hint?: string };\n /** The row's own doors, by kind (Edit, Sneak peek …), at most two, drawn at its right edge. */\n doors?: readonly PeekDoor[];\n}\n\n/** Code or raw text, drawn monospaced and kept exactly as written (it scrolls, it never wraps). */\nexport interface PeekCode {\n text: string;\n /** The language name shown over it (\"TypeScript\", \"JSON\"). */\n language?: string;\n /** Where it comes from (\"src/app.ts · 12–30\"). */\n caption?: string;\n}\n\n/** A labeled block: running text, tags, a list of child rows, code — or several. */\nexport interface PeekSection {\n section: string;\n glyph?: PeekGlyph;\n /** A status color for the whole section (an error's severity): its label and edge take the tone. */\n tone?: PeekTone;\n text?: string;\n /** Lines before the text ends in \"…\". */\n clamp?: 2 | 3 | 4 | 6;\n /** Keep the text's own line breaks and indents (a note's content, an address) instead of one flowing paragraph. */\n breaks?: boolean;\n /** The text is markdown: the app's formatted-text renderer draws it (part `markdown`); without one, it reads as written. */\n markdown?: boolean;\n tags?: readonly string[];\n /** Short lines under the label (reasons, sources), one per line; past `limit` they end in \"+N more\". */\n items?: readonly string[];\n limit?: number;\n /** Child rows (steps, findings, reasons), each with its own optional status and doors; `limit` applies. */\n rows?: readonly PeekRow[];\n /** Number the rows (a sequence: workflow steps). */\n numbered?: boolean;\n code?: PeekCode;\n /** Pages somewhere else under the label (evidence, sources), one per line, each opening in a new tab. */\n links?: readonly { text: string; href: string }[];\n /**\n * THE INPUT PREVIEW (a form field at a glance, drawn with the real controls, inert): the choices\n * an input offers as chips, the picked ones on — what a person filling it will see.\n */\n choices?: { options: readonly string[]; picked?: readonly string[] };\n /** THE INPUT PREVIEW for a typed value: a sample field showing `text`, else the `placeholder`. */\n field?: PeekFieldPreview;\n /** THE INPUT PREVIEW for an on/off input: the real switch, inert, with its state in words. */\n toggle?: { on: boolean; label?: string };\n /** An exact token (`{{name}}`, an id, a key) in a monospace chip; a press copies it. */\n token?: string;\n}\n\n/** A sample field: one line, two lines (long text), or a drop zone (a file or media input). */\nexport interface PeekFieldPreview {\n text?: string;\n placeholder: string;\n lines?: 1 | 2;\n /** The input's glyph, at the field's leading edge. */\n glyph?: PeekGlyph;\n /** A file / media input: a dashed drop zone instead of a text box. */\n drop?: boolean;\n}\n\n/**\n * A label with its value — the design system's `PropertyRow` (label gray over value black, one left\n * edge). For a record's named attributes: Source, Found by, Certainty. `href`: the value is a page\n * somewhere else and opens in a new tab.\n */\nexport interface PeekProperty {\n property: string;\n value: string;\n href?: string;\n /** An empty value shows this tag (\"None\", \"Empty\") — never a blank row. */\n missing?: string;\n}\n\n/**\n * A part the HOST draws for this record, from what the app knows and this package does not:\n * - `custom-fields` — the organization's own fields for the record (nothing when its table takes none);\n * - `access` — the honest state when the record could not be read (gone, or not shared with this\n * person), in place of a body that would otherwise be blank;\n * - `media` / `markdown` — a stored file's thumbnail; formatted text.\n * Drawn by the renderer `PeekPartRendererProvider` gives; with none, `custom-fields` draws nothing,\n * `access` says \"Not available\", `markdown` shows its text as written, `media` its name.\n */\nexport type PeekPart =\n | { part: \"custom-fields\"; token: string; id: string }\n /** `error`: what the read threw, so the host can say WHY (gone, not shared, offline) rather than guess. */\n | { part: \"access\"; token: string; id: string; error?: unknown }\n /** A stored file's thumbnail. `mimeType` picks image / video frame / type icon; `name` is the file's name. */\n | { part: \"media\"; token: string; id: string; mimeType?: string; name?: string }\n /**\n * Formatted text (markdown) — a section with `markdown: true` hands its text here. `clamp`: the\n * section's line limit — the host draws a short preview of that many lines (inline, a shape as one line).\n */\n | { part: \"markdown\"; text: string; clamp?: 2 | 3 | 4 | 6 };\n\n/**\n * A picture at the top of the card (a file's thumbnail). `src` is an image address; `file` is a stored\n * file the HOST draws (through `PeekPartRendererProvider`, as part `media`). `alt` is always required.\n */\nexport interface PeekMedia {\n alt: string;\n /** Default 4:3. */\n aspect?: \"4:3\" | \"16:9\" | \"1:1\";\n src?: string;\n file?: { id: string; mimeType?: string };\n}\n\nexport type PeekBlock = PeekFact | PeekSection | PeekProperty | PeekPart;\n\nexport interface PeekRecord {\n /** What it is in a person's words (\"Agent\", \"Task\") — Alchemy's For AI tag says it. */\n kind: string;\n /** The record's id. */\n id: string;\n /**\n * Show the id under the name with one-click copy (THE id, `RecordId`). Default: when `id` is a real\n * record id (a UUID). A real id that is not a UUID (a model id, a provider id) says `true`; a\n * made-up key says nothing and stays hidden.\n */\n showId?: boolean;\n /** Its full name — the card's strongest line; wraps, never truncates. */\n title: string;\n /** One short line under the name. */\n subtitle?: string;\n /** The subtitle is a status: it takes this tone's ink (\"Required · no value yet\" in warning). */\n subtitleTone?: PeekTone;\n /** A chip at the header's right edge naming what the record is (\"Dropdown\"), in a status tone. */\n badge?: { text: string; tone?: \"neutral\" | \"primary\" | \"success\" | \"warning\" | \"destructive\" | \"info\"; glyph?: PeekGlyph };\n /** A glyph that rides the title's first line. */\n glyph?: PeekGlyph;\n /** A person's picture (or initials) in the glyph's place, on the title's first line. */\n avatar?: { initials: string; src?: string };\n /** A picture over the body (a file's thumbnail). */\n media?: PeekMedia;\n /** The favorite star; `pinnedLabel` is the gold line under the name while it is on (\"Pinned to favorites\"). */\n favorite?: { on: boolean; onToggle: () => void; pinnedLabel?: string };\n /**\n * The one fact that changes what the record IS (an agent that runs an ensemble). At most one.\n * `lines` are its quieter details, each with an optional hover hint (the full list a line shortens).\n */\n callout?: { title: string; glyph?: PeekGlyph; text?: string; lines?: readonly { text: string; hint?: string }[] };\n /** The body, in reading order. */\n body?: readonly PeekBlock[];\n /** Supporting facts: beside the body in landscape, under it in portrait. */\n aside?: readonly PeekBlock[];\n /**\n * The record could not be read: the body is the design system's failed-read notice (\"Couldn't load\n * {what}\", the error's own sentence and its copy menu, Try again when `onRetry` is given) instead of\n * blocks that would read as an empty record. `message` replaces the error's sentence when the caller\n * knows better why.\n */\n failure?: { what: string; error?: unknown; message?: string; onRetry?: () => void };\n /** The one main action. */\n primary?: { label: string; onSelect: () => void };\n /** The record has settings: the first door. */\n onSettings?: () => void;\n /** Up to three record doors, by kind. */\n doors?: PeekDoors;\n /** The record's own page: the right-most door, in a new tab. */\n href?: string;\n /**\n * What Copy hands Alchemy. Absent: the record as drawn. A getter is read on the click (load the\n * full record only when someone copies it). `false`: this record has no Copy door.\n */\n copyData?: unknown | (() => unknown) | false;\n}\n\nexport const isSection = (block: PeekBlock): block is PeekSection => \"section\" in block;\nexport const isProperty = (block: PeekBlock): block is PeekProperty => \"property\" in block;\nexport const isPart = (block: PeekBlock): block is PeekPart => \"part\" in block;\n\n/** Draws a host part (`PeekPart`). `null`: nothing to draw for it. */\nexport type PeekPartRenderer = (part: PeekPart) => React.ReactNode | null;\n\n/** Draws a named record by token (`ai_model` → the app's model door). `null`: not this renderer's token. */\nexport type PeekEntityRenderer = (entity: { token: string; id: string; name: string; offeringId?: string | null; className: string }) => React.ReactNode | null;\n\n/**\n * The record as drawn — what Copy hands Alchemy when the caller gives nothing richer. It reads like\n * the card: each section under its own name, facts as a plain list, the callout as a note.\n */\nexport function peekRecordData(record: PeekRecord): Record<string, unknown> {\n const out: Record<string, unknown> = { kind: record.kind, id: record.id, name: record.title };\n if (record.subtitle) out[\"subtitle\"] = record.subtitle;\n if (record.badge) out[\"type\"] = record.badge.text;\n if (record.callout) {\n out[\"note\"] = [record.callout.title, record.callout.text, ...(record.callout.lines?.map((line) => line.hint ?? line.text) ?? [])]\n .filter(Boolean)\n .join(\" — \");\n }\n const facts: string[] = [];\n for (const block of [...(record.body ?? []), ...(record.aside ?? [])]) {\n // A host part is drawn from the app's own data; Copy of the record carries what the card states.\n if (isPart(block)) continue;\n if (isProperty(block)) {\n out[block.property] = block.href ? `${block.value} (${block.href})` : block.value;\n } else if (isSection(block)) {\n const parts: Record<string, unknown> = {};\n if (block.text) parts[\"text\"] = block.text;\n if (block.tags?.length) parts[\"tags\"] = [...block.tags];\n if (block.items?.length) parts[\"items\"] = [...block.items];\n if (block.links?.length) parts[\"links\"] = block.links.map((l) => `${l.text} — ${l.href}`);\n if (block.rows?.length) {\n parts[\"rows\"] = block.rows.map((row) =>\n [row.text, row.detail, row.status ? `(${row.status.text})` : null, row.href].filter(Boolean).join(\" — \"),\n );\n }\n if (block.code) parts[\"code\"] = block.code.text;\n if (block.choices) parts[\"choices\"] = [...block.choices.options];\n if (block.field?.text) parts[\"value\"] = block.field.text;\n if (block.toggle) parts[\"on\"] = block.toggle.on;\n if (block.token) parts[\"token\"] = block.token;\n const keys = Object.keys(parts);\n if (keys.length === 1) out[block.section] = parts[keys[0]!];\n else if (keys.length) out[block.section] = parts;\n } else {\n const text = block.meta ? `${block.fact} (${block.meta})` : block.fact;\n facts.push(block.href ? `${text} — ${block.href}` : text);\n }\n }\n if (facts.length) out[\"facts\"] = facts;\n if (record.href) out[\"link\"] = record.href;\n return out;\n}\n\n","// The peek's model: its options, size tables, door list and contexts — everything that is not a\n// component lives here, so the component files hot-swap in place (React Fast Refresh) on an edit.\n\nimport * as React from \"react\";\n\nimport { CopyPlusGlyph, MessageCircleGlyph, RocketGlyph } from \"./peek-glyphs\";\nimport { DownloadIcon, PencilIcon } from \"./icons\";\n\n\nexport type PeekCardSize = \"xs\" | \"sm\" | \"md\" | \"lg\" | \"xl\";\nexport type PeekCardOrientation = \"portrait\" | \"landscape\";\n/**\n * `fit`: the card is as tall as its content, between the size's floor and its height. `fixed`: always\n * that height. `content`: exactly as tall as its content, no floor, capped at the size's height — a\n * notice-shaped peek (an assist, a confirmation) that holds two lines must not stand 400px tall.\n */\nexport type PeekCardHeight = \"fit\" | \"fixed\" | \"content\";\nexport type PeekCardDensity = \"compact\" | \"comfortable\";\n/** `surface`: the card is its own frame (border, radius, shadow). `bare`: a host panel already is. */\nexport type PeekCardFrame = \"surface\" | \"bare\";\n\n/**\n * Every size, in px. `md` portrait is the reference (the agent picker's 340 × 420 peek). Landscape\n * sizes are the same family turned on its side: wide enough for a main column and an aside.\n */\nexport const PEEK_CARD_SIZES: Record<\n PeekCardOrientation,\n Record<PeekCardSize, { width: number; height: number; minHeight: number }>\n> = {\n portrait: {\n xs: { width: 240, height: 300, minHeight: 200 },\n sm: { width: 280, height: 360, minHeight: 240 },\n md: { width: 340, height: 420, minHeight: 280 },\n lg: { width: 400, height: 520, minHeight: 340 },\n xl: { width: 480, height: 620, minHeight: 400 },\n },\n landscape: {\n xs: { width: 360, height: 200, minHeight: 160 },\n sm: { width: 440, height: 260, minHeight: 200 },\n md: { width: 520, height: 320, minHeight: 240 },\n lg: { width: 640, height: 400, minHeight: 300 },\n xl: { width: 760, height: 480, minHeight: 360 },\n },\n};\n\nexport interface PeekCardContextValue {\n size: PeekCardSize;\n orientation: PeekCardOrientation;\n density: PeekCardDensity;\n /** Set by `PeekWindow`: the header becomes the drag handle and gains a close button. */\n window: { onClose: () => void; dragHandle: React.HTMLAttributes<HTMLElement>; titleId: string } | null;\n /** The body is a shimmer: the footer's actions are disabled until it arrives. */\n loading: boolean;\n /** Set inside a phone's bottom drawer: one scroll for title and body, 44px actions. */\n sheet: { footer: \"pinned\" | \"inline\" } | null;\n}\n\nexport const PeekCardContext = React.createContext<PeekCardContextValue>({\n size: \"md\",\n orientation: \"portrait\",\n density: \"comfortable\",\n window: null,\n loading: false,\n sheet: null,\n});\n\nexport const PeekSheetContext = React.createContext<PeekCardContextValue[\"sheet\"]>(null);\n\nexport const PeekWindowContext = React.createContext<PeekCardContextValue[\"window\"]>(null);\n\nexport function usePeekCard(): PeekCardContextValue {\n return React.useContext(PeekCardContext);\n}\n\n/**\n * THE RECORD DOORS — a closed list the package owns. A caller names a door by `kind`; the glyph and\n * the tooltip come from here, so no caller can draw a strange icon, write its own label, or add a\n * door that repeats a fixed one (Copy, Open in new tab, Settings are never in this list). A new kind\n * is a change to this package, reviewed once, never a call-site invention.\n *\n * ONE named exception, `action` (2026-10-18): a VERB the record offers that no fixed kind names\n * (\"Start support session\", \"Message\"). The caller names it with a short `label` and a Lucide `icon`\n * — the footer still owns placement, size, the three-door ceiling and the More overflow, so an action\n * door can never become a call-site button. It is a record verb, never a link that repeats Open.\n */\nexport type PeekDoorKind = \"peek\" | \"chat\" | \"edit\" | \"download\" | \"duplicate\" | \"action\";\n\n/** One choice in a door's menu. `tone: \"danger\"` is a choice that removes or silences. */\nexport interface PeekDoorMenuItem {\n key: string;\n label: string;\n onSelect: () => void;\n tone?: \"danger\";\n}\n\n/** A run of a door's menu: an optional small heading over its items; groups are split by a hairline. */\nexport interface PeekDoorMenuGroup {\n label?: string;\n items: readonly PeekDoorMenuItem[];\n}\n\ninterface PeekDoorCommon {\n onClick?: (event: React.MouseEvent | Event) => void;\n /** A door that goes somewhere: a link (`newTab` opens it in a new tab). */\n href?: string;\n newTab?: boolean;\n /** Its work is running (a duplicate being made): the door waits. */\n busy?: boolean;\n}\n\n/** A fixed door: its glyph and label come from `PEEK_DOORS`. */\nexport interface PeekKindDoor extends PeekDoorCommon {\n kind: Exclude<PeekDoorKind, \"action\">;\n}\n\n/** A record verb no fixed kind names. `id` keeps two action doors apart; `label` ≤ 3 words. */\nexport interface PeekActionDoor extends PeekDoorCommon {\n kind: \"action\";\n id: string;\n label: string;\n icon: React.ComponentType<{ className?: string }>;\n /**\n * The verb has choices (\"Later\" → 1 hour · Tomorrow): the door opens this menu instead of running\n * `onClick`. The menu holds a hover peek open while it is in use. Never in the More overflow — a\n * menu door that does not fit is a design error the footer says in the console.\n */\n menu?: readonly PeekDoorMenuGroup[];\n}\n\nexport type PeekDoor = PeekKindDoor | PeekActionDoor;\n\n/** At most three record doors. More than that is a menu, not a peek. */\nexport type PeekDoors =\n | readonly []\n | readonly [PeekDoor]\n | readonly [PeekDoor, PeekDoor]\n | readonly [PeekDoor, PeekDoor, PeekDoor];\n\nexport const PEEK_MAX_RECORD_DOORS = 3;\n\nexport const PEEK_DOORS: Record<PeekDoorKind, { icon: React.ComponentType<{ className?: string }>; label: string; inMenu?: true }> = {\n peek: { icon: RocketGlyph, label: \"Sneak peek\" },\n chat: { icon: MessageCircleGlyph, label: \"Open in chat\" },\n edit: { icon: PencilIcon, label: \"Edit\" },\n download: { icon: DownloadIcon, label: \"Download\" },\n // Never a glyph beside Copy (Arman, 2026-10-14): it always lives in More.\n duplicate: { icon: CopyPlusGlyph, label: \"Duplicate\", inMenu: true },\n // The stand-in only: an `action` door always carries its own label and icon (`peekDoorFace`).\n action: { icon: RocketGlyph, label: \"Run\" },\n};\n\n/** The glyph and label a door is drawn with: the fixed kind's, or an action door's own. */\nexport function peekDoorFace(door: PeekDoor): { icon: React.ComponentType<{ className?: string }>; label: string; inMenu?: true } | null {\n if (door.kind === \"action\") return door.label.trim() ? { icon: door.icon, label: door.label.trim() } : null;\n return PEEK_DOORS[door.kind] ?? null;\n}\n\n/** What makes two doors the same door: the kind, or an action door's own id. */\nexport function peekDoorKey(door: PeekDoor): string {\n return door.kind === \"action\" ? `action:${door.id}` : door.kind;\n}\n\n/** Door slots per size (fixed doors included) — the stand-in only until the footer has measured itself. */\nexport const PEEK_CARD_FOOTER_SLOTS: Record<PeekCardSize, number> = { xs: 3, sm: 4, md: 5, lg: 6, xl: 7 };\n/**\n * A menu opened from inside a hover peek (More, Copy) portals outside the card, so the pointer\n * \"leaves\" the card to use it. The host holds the peek open while any such menu is open.\n */\nexport const PeekHoldContext = React.createContext<(open: boolean) => void>(() => {});\n\n/**\n * Hold the peek open while `open` — through an effect, so a menu that unmounts while open (the row\n * re-measured, the card closed) releases its hold too and the peek can never stick open.\n */\nexport function usePeekHoldWhile(open: boolean) {\n const hold = React.useContext(PeekHoldContext);\n React.useEffect(() => {\n if (!open) return;\n hold(true);\n return () => hold(false);\n }, [open, hold]);\n}\n\nexport function usePeekHold(): [boolean, (open: boolean) => void] {\n const count = React.useRef(0);\n const [held, setHeld] = React.useState(false);\n const hold = React.useCallback((open: boolean) => {\n count.current = Math.max(0, count.current + (open ? 1 : -1));\n setHeld(count.current > 0);\n }, []);\n return [held, hold];\n}\n\n","\"use client\";\n\n// The peek's door glyphs — aliases of the one glyph home (./icons) — and Alchemy's own mark. Components only, so\n// an edit here hot-swaps in place (React Fast Refresh) and keeps the page's state.\n\nimport { CopyPlusIcon, MessageCircleIcon, RocketIcon } from \"./icons\";\nimport { ALCHEMY_GLYPH_PATHS, ALCHEMY_GLYPH_VIEWBOX } from \"./content-transfer/icon\";\n\nexport const RocketGlyph = RocketIcon;\nexport const MessageCircleGlyph = MessageCircleIcon;\nexport const CopyPlusGlyph = CopyPlusIcon;\nexport function AlchemyGlyph({ className }: { className?: string }) {\n return (\n <svg className={className} viewBox={ALCHEMY_GLYPH_VIEWBOX.portal} fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden>\n {ALCHEMY_GLYPH_PATHS.portal.map((d) => (\n <path key={d} d={d} />\n ))}\n </svg>\n );\n}\n\n","\"use client\";\n\n/**\n * PeekCard — THE peek: the small framed card that shows one record at a glance.\n *\n * Lifted from the agent picker's hover peek (`AgentDetailCard`, @ai-matrx/agents), the card Arman\n * named as the bar every other one misses (2026-10-14). Its anatomy is the contract, and a caller\n * cannot change it — only fill its slots:\n *\n * ┌──────────────────────────────┐\n * │ [leading] Title (wraps) [★] │ PeekCardHeader — the strongest line; never truncated\n * │ ──────────────────────────── │ inset hairline (drawn by the card, never by a caller)\n * │ ▢ icon row │ PeekCardBody — scrolls on its own; rows, sections,\n * │ LABEL │ tags, a callout; landscape adds an aside column\n * │ running text │\n * │ ──────────────────────────── │\n * │ ⚙ [ Primary ] ⋯ (doors) ⧉ ↗ │ PeekCardFooter — settings, one primary, ≤3 record doors, Copy, Open\n * └──────────────────────────────┘\n *\n * What a caller picks is a NAMED option, never a class: `size` (xs–xl), `orientation`\n * (portrait / landscape), `height` (fit / fixed), `density`, `frame` (surface / bare). The host\n * that opens it is picked the same way: `PeekHoverCard` (hover), `PeekPopover` (click) or\n * `PeekWindow` (a floating, draggable peek with no window chrome — the title row IS the handle).\n * There is no `className` on the card or its slots: a peek that looks different is a new named\n * option here, released, never a call-site restyle.\n */\n\nimport * as HoverCardPrimitive from \"@radix-ui/react-hover-card\";\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\nimport { createPortal } from \"react-dom\";\n\nimport { openOutbound } from \"@ai-matrx/kit/outbound\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\nimport { BottomSheet } from \"./bottom-sheet\";\nimport { cn } from \"./cn\";\nimport { Button } from \"./controls/controls\";\nimport { useMatrxDataTableHost, useMatrxTableRowAlchemy } from \"./table-host/host\";\nimport { MatrxTableRowAlchemyProvider } from \"./table-host/RowAlchemyLauncher\";\nimport type { MatrxDataTableRecordControls } from \"./data-table/types\";\nimport { clampRectToViewport, DRAG_IGNORE_SELECTOR, readViewport, useDragMove } from \"./window-drag\";\nimport { FloatingLayer, useEscapeLayer, useFloatingLayerZIndex } from \"./floating-layer\";\nimport { HOVER_CARD_CLOSE_DELAY_MS, HOVER_CARD_OPEN_DELAY_FLOOR_MS, HOVER_CARD_OPEN_DELAY_MS } from \"./hover-card\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuSeparator, DropdownMenuTrigger } from \"./dropdown-menu\";\nimport { ExternalLinkIcon, Loader2Icon, MoreHorizontalIcon, SettingsIcon, StarIcon, XIcon } from \"./icons\";\nimport {\n PEEK_CARD_FOOTER_SLOTS,\n PEEK_CARD_SIZES,\n PEEK_DOORS,\n peekDoorFace,\n peekDoorKey,\n PEEK_MAX_RECORD_DOORS,\n PeekCardContext,\n PeekHoldContext,\n PeekSheetContext,\n PeekWindowContext,\n usePeekCard,\n usePeekHold,\n usePeekHoldWhile,\n type PeekCardContextValue,\n type PeekCardDensity,\n type PeekCardFrame,\n type PeekCardHeight,\n type PeekCardOrientation,\n type PeekCardSize,\n type PeekDoor,\n type PeekDoorKind,\n type PeekDoorMenuGroup,\n type PeekDoors,\n} from \"./peek-model\";\nimport type { PeekGlyph, PeekTone } from \"./peek-record\";\nimport { AlchemyGlyph } from \"./peek-glyphs\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\nimport { Skeleton } from \"./skeleton\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\n/** Small cards are compact unless asked otherwise; the reference size and up breathe. */\nfunction defaultDensity(size: PeekCardSize): PeekCardDensity {\n return size === \"xs\" || size === \"sm\" ? \"compact\" : \"comfortable\";\n}\n\nconst PAD = {\n compact: { x: \"px-3\", header: \"pt-3 pb-2\", body: \"py-2 gap-2\", rule: \"mx-2\" },\n comfortable: { x: \"px-4\", header: \"pt-4 pb-3\", body: \"py-3 gap-3\", rule: \"mx-3\" },\n} as const;\n\n// ── the card ─────────────────────────────────────────────────────────────────\n\nexport interface PeekCardProps extends Omit<React.HTMLAttributes<HTMLDivElement>, \"className\" | \"style\" | \"children\"> {\n size?: PeekCardSize;\n orientation?: PeekCardOrientation;\n height?: PeekCardHeight;\n density?: PeekCardDensity;\n frame?: PeekCardFrame;\n /** Draws the card's own shimmer in place of its body (header and footer keep their place). */\n loading?: boolean;\n /** Header, body, footer — in that order. */\n children: React.ReactNode;\n}\n\n/** Set on a peek host's content: how tall the card may be where the popper put it. */\nconst PEEK_ROOM_VAR = \"--matrx-peek-room\";\n\nexport const PeekCard = React.forwardRef<HTMLDivElement, PeekCardProps>((allProps, ref) => {\n const {\n size = \"md\",\n orientation = \"portrait\",\n height = \"fit\",\n density,\n frame = \"surface\",\n loading = false,\n children,\n ...props\n } = allProps;\n const windowCtx = React.useContext(PeekWindowContext);\n const sheet = React.useContext(PeekSheetContext);\n // A phone's drawer is always portrait and roomy, whatever the desktop card asked for.\n const resolvedOrientation = sheet ? \"portrait\" : orientation;\n const resolvedDensity = sheet ? \"comfortable\" : (density ?? defaultDensity(size));\n const box = PEEK_CARD_SIZES[orientation][size];\n const value: PeekCardContextValue = {\n size,\n orientation: resolvedOrientation,\n density: resolvedDensity,\n window: windowCtx,\n loading,\n sheet,\n };\n const parts = React.Children.toArray(children);\n const body = loading\n ? parts.map((child) =>\n React.isValidElement(child) && child.type === PeekCardBody ? <PeekCardBodySkeleton key=\"peek-body-skeleton\" /> : child,\n )\n : parts;\n if (sheet) {\n // One scroll for the title row and the body; the footer pinned below it or inline at its end.\n const isFooter = (child: React.ReactNode) => React.isValidElement(child) && child.type === PeekCardFooter;\n const footer = body.filter(isFooter);\n const rest = body.filter((child) => !isFooter(child));\n return (\n <PeekCardContext.Provider value={value}>\n <div ref={ref} data-matrx-peek-card=\"\" data-presentation=\"sheet\" aria-busy={loading || undefined} className=\"flex min-h-0 flex-1 flex-col text-foreground\" {...props}>\n <div data-matrx-peek-scroller=\"\" className=\"matrx-peek-scroll min-h-0 flex-1 overflow-y-auto\">\n <div className=\"flex flex-col\">\n {rest}\n {sheet.footer === \"inline\" ? footer : null}\n </div>\n </div>\n {sheet.footer === \"pinned\" ? footer : null}\n </div>\n </PeekCardContext.Provider>\n );\n }\n return (\n <PeekCardContext.Provider value={value}>\n <div\n ref={ref}\n data-matrx-peek-card=\"\"\n data-size={size}\n data-orientation={orientation}\n data-density={resolvedDensity}\n data-frame={frame}\n aria-busy={loading || undefined}\n className={cn(\n \"flex min-h-0 flex-col overflow-hidden text-popover-foreground outline-none\",\n frame === \"surface\" && \"rounded-md border border-border bg-popover shadow-md\",\n frame === \"bare\" && \"h-full w-full\",\n )}\n style={\n frame === \"bare\"\n ? undefined\n : {\n width: box.width,\n maxWidth: \"calc(100vw - 16px)\",\n // Loading holds the full height so the card does not jump when the body arrives.\n // `fit` grows with its content between the size's floor and ceiling, so a bigger\n // size never draws smaller than a smaller one.\n // Every height is capped by the room the host left (`--matrx-peek-room`, set by the hover\n // and click hosts from the popper's available height), so a card that cannot fit above or\n // below its trigger shrinks and scrolls inside instead of leaving the screen.\n ...(height === \"content\"\n ? { maxHeight: `min(${box.height}px, var(${PEEK_ROOM_VAR}, 100vh))` }\n : height === \"fixed\" || loading\n ? { height: `min(${box.height}px, var(${PEEK_ROOM_VAR}, 100vh))` }\n : {\n minHeight: `min(${box.minHeight}px, var(${PEEK_ROOM_VAR}, 100vh))`,\n maxHeight: `min(${box.height}px, var(${PEEK_ROOM_VAR}, 100vh))`,\n }),\n }\n }\n {...props}\n >\n {body}\n </div>\n </PeekCardContext.Provider>\n );\n});\nPeekCard.displayName = \"PeekCard\";\n\n/** The inset hairline between the card's three parts. Drawn by the parts, never by a caller. */\nfunction PeekRule({ vertical = false }: { vertical?: boolean }) {\n const { density } = usePeekCard();\n if (vertical) return <div aria-hidden className={cn(\"w-px shrink-0 bg-border\", density === \"compact\" ? \"my-2\" : \"my-3\")} />;\n return <div aria-hidden className={cn(\"h-px shrink-0 bg-border\", PAD[density].rule)} />;\n}\n\n// ── header ───────────────────────────────────────────────────────────────────\n\nexport interface PeekCardHeaderProps {\n /** The record's full name — the card's strongest line. Wraps; never truncates. */\n title: React.ReactNode;\n /** One short line under the title (a kind, an owner, a status word). */\n subtitle?: React.ReactNode;\n /** A glyph or avatar before the title, drawn in a 32px tile. */\n leading?: React.ReactNode;\n /** Controls at the right edge (a favorite star, a menu). */\n trailing?: React.ReactNode;\n /** A favorite's own line under the title, in the favorite's gold (\"Pinned to favorites\"). */\n pinned?: string;\n /** The record's id line (THE id component), under the subtitle. */\n id?: React.ReactNode;\n}\n\nexport function PeekCardHeader({ title, subtitle, leading, trailing, pinned, id }: PeekCardHeaderProps) {\n const { density, window } = usePeekCard();\n const pad = PAD[density];\n return (\n <>\n <div\n data-matrx-peek-header=\"\"\n {...(window?.dragHandle ?? {})}\n className={cn(\"flex shrink-0 items-start gap-3\", pad.x, pad.header, window && \"touch-none select-none\")}\n >\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n {/* The leading glyph rides the title's first line, never a column of its own: a\n wrapped title runs back under it, and the subtitle starts at its left edge. */}\n <h3 id={window?.titleId} className=\"matrx-peek-title break-words\">\n {leading ? (\n <span aria-hidden className=\"relative top-[2px] mr-1.5 inline-flex size-4 items-center justify-center align-top text-muted-foreground [&_svg]:size-4\">\n {leading}\n </span>\n ) : null}\n {title}\n </h3>\n {pinned ? <p className=\"type-meta truncate text-[var(--favorite)]\">{pinned}</p> : null}\n {subtitle ? <p className=\"type-meta truncate text-muted-foreground\">{subtitle}</p> : null}\n {id ? <div className=\"flex min-w-0\" data-peek-no-drag=\"\">{id}</div> : null}\n </div>\n {trailing || window ? (\n <div className=\"flex shrink-0 items-center gap-1\" data-peek-no-drag=\"\">\n {trailing}\n {window ? (\n <Button type=\"button\" variant=\"quiet\" aria-label=\"Close\" title=\"Close\" icon={<XIcon className=\"size-3.5\" />} onClick={window.onClose} />\n ) : null}\n </div>\n ) : null}\n </div>\n <PeekRule />\n </>\n );\n}\n\nexport interface PeekCardFavoriteProps {\n on: boolean;\n onToggle: () => void;\n}\n\n/** The favorite star the reference card carries: 14px, amber and filled when on, no box. */\nexport function PeekCardFavorite({ on, onToggle }: PeekCardFavoriteProps) {\n const { loading } = usePeekCard();\n const label = on ? \"Remove from favorites\" : \"Add to favorites\";\n return (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={label}\n title={label}\n pressed={on}\n icon={<StarIcon className={cn(\"size-3.5\", on && \"fill-current\")} />}\n disabled={loading}\n onClick={(event) => {\n event.stopPropagation();\n onToggle();\n }}\n className=\"shrink-0\"\n >\n </Button>\n );\n}\n\n// ── body ─────────────────────────────────────────────────────────────────────\n\nexport interface PeekCardBodyProps {\n children: React.ReactNode;\n /**\n * A second column of supporting facts. Landscape: beside the body, past a hairline.\n * Portrait: under it, in the same scroll.\n */\n aside?: React.ReactNode;\n}\n\nexport function PeekCardBody({ children, aside }: PeekCardBodyProps) {\n const { density, orientation, sheet } = usePeekCard();\n const pad = PAD[density];\n if (sheet) {\n // The drawer scrolls as one; the body is just its share of the content.\n return (\n <div data-matrx-peek-body=\"\" className={cn(\"flex flex-col\", pad.x, pad.body)}>\n {children}\n {aside}\n </div>\n );\n }\n const column = (content: React.ReactNode, extra?: string) => (\n <div className={cn(\"flex min-h-0 min-w-0 flex-col matrx-peek-scroll overflow-y-auto\", pad.x, pad.body, extra)}>{content}</div>\n );\n if (orientation === \"landscape\" && aside) {\n return (\n <div data-matrx-peek-body=\"\" className=\"flex min-h-0 flex-1 flex-row\">\n {column(children, \"flex-[3]\")}\n <PeekRule vertical />\n {column(aside, \"flex-[2]\")}\n </div>\n );\n }\n return (\n <div data-matrx-peek-body=\"\" className={cn(\"flex min-h-0 flex-1 flex-col matrx-peek-scroll overflow-y-auto\", pad.x, pad.body)}>\n {children}\n {aside}\n </div>\n );\n}\n\nfunction PeekCardBodySkeleton() {\n const { density } = usePeekCard();\n const pad = PAD[density];\n return (\n <div data-matrx-peek-body=\"\" className={cn(\"flex min-h-0 flex-1 flex-col\", pad.x, pad.body)}>\n <Skeleton shape=\"line\" width=\"1/3\" motion=\"shimmer\" />\n <Skeleton shape=\"line\" width=\"full\" motion=\"shimmer\" />\n <Skeleton shape=\"line\" width=\"3/4\" motion=\"shimmer\" />\n <Skeleton shape=\"line\" width=\"1/2\" motion=\"shimmer\" />\n </div>\n );\n}\n\nexport interface PeekCardRowProps {\n /** A 14px glyph hung in the row's own margin. */\n icon?: React.ComponentType<{ className?: string }>;\n children: React.ReactNode;\n /** A quieter second line (an email, a date). */\n meta?: React.ReactNode;\n /** `muted`: the whole row is meta (dates, counts). Default `content`. */\n tone?: \"content\" | \"muted\";\n /**\n * A row is one line ending in \"…\" (the full text is its tooltip), so an email or a path never\n * breaks mid-word. `wrap` lets a row run to several lines instead.\n */\n wrap?: boolean;\n}\n\n/** One fact on one line: glyph + text. */\nexport function PeekCardRow({ icon: Icon, children, meta, tone = \"content\", wrap = false }: PeekCardRowProps) {\n const fit = wrap ? \"break-words\" : \"truncate\";\n return (\n <div className={cn(\"flex min-w-0 gap-2\", meta || wrap ? \"items-start\" : \"items-center\")}>\n {Icon ? <Icon className={cn(\"size-3.5 shrink-0 text-muted-foreground\", (meta || wrap) && \"mt-0.5\")} /> : null}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span\n className={cn(fit, tone === \"muted\" ? \"type-meta text-muted-foreground\" : \"type-secondary text-foreground\")}\n title={!wrap && typeof children === \"string\" ? children : undefined}\n >\n {children}\n </span>\n {meta ? (\n <span className={cn(fit, \"type-meta text-muted-foreground\")} title={!wrap && typeof meta === \"string\" ? meta : undefined}>\n {meta}\n </span>\n ) : null}\n </div>\n </div>\n );\n}\n\nexport interface PeekCardSectionProps {\n /** The small capital label over the section; `\"\"` draws no label row. */\n label: string;\n icon?: React.ComponentType<{ className?: string }>;\n /** A status color for the whole section (an error's severity): the label and a left edge take it. */\n tone?: PeekTone;\n children: React.ReactNode;\n}\n\n/** Status ink per tone (text). */\nconst TONE_INK: Record<PeekTone, string> = {\n neutral: \"text-muted-foreground\",\n info: \"text-info-ink\",\n success: \"text-success-ink\",\n warning: \"text-warning-ink\",\n danger: \"text-destructive-ink\",\n};\n/** Status fill per tone (a dot, an edge). */\nconst TONE_FILL: Record<PeekTone, string> = {\n neutral: \"bg-muted-foreground\",\n info: \"bg-info\",\n success: \"bg-success\",\n warning: \"bg-warning\",\n danger: \"bg-destructive\",\n};\nconst TONE_EDGE: Record<PeekTone, string> = {\n neutral: \"border-border\",\n info: \"border-info\",\n success: \"border-success\",\n warning: \"border-warning\",\n danger: \"border-destructive\",\n};\n\n/**\n * A labeled block over its content. A text label alone is small capitals (\"DESCRIPTION\"); a label\n * with a glyph reads as written (\"Tags\") — the reference card's two label styles.\n */\nexport function PeekCardSection({ label, icon: Icon, tone, children }: PeekCardSectionProps) {\n return (\n <section data-tone={tone} className={cn(\"flex min-w-0 flex-col gap-1.5\", tone && \"border-l-2 pl-2\", tone && TONE_EDGE[tone])}>\n {/* An empty label is a section that needs no name (an input preview under a badge that names it). */}\n {label || Icon ? (\n <div className=\"flex items-center gap-1.5\">\n {Icon ? <Icon className={cn(\"size-3.5 shrink-0\", tone ? TONE_INK[tone] : \"text-muted-foreground\")} /> : null}\n {label ? <span className={cn(\"type-label\", !Icon && \"uppercase tracking-wider\", tone && TONE_INK[tone])}>{label}</span> : null}\n </div>\n ) : null}\n {children}\n </section>\n );\n}\n\n// ── rows, code, media ────────────────────────────────────────────────────────\n\n/** A row's own door: the footer door's glyph and label, smaller. */\nconst PEEK_ROW_DOOR =\n \"flex size-6 shrink-0 items-center justify-center rounded text-foreground transition-colors hover:bg-accent hover:text-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary\";\nconst PEEK_MAX_ROW_DOORS = 2;\n\nfunction rowDoors(doors: readonly PeekDoor[] | undefined): PeekCardAction[] {\n if (!doors?.length) return [];\n const out: PeekCardAction[] = [];\n for (const door of doors) {\n const known = peekDoorFace(door);\n if (!known || known.inMenu) {\n screamOnce(`[Peek] row door \"${String(door.kind)}\" cannot sit on a row — rows take ${Object.keys(PEEK_DOORS).filter((k) => !PEEK_DOORS[k as PeekDoorKind].inMenu).join(\", \")}`);\n continue;\n }\n if (out.length === PEEK_MAX_ROW_DOORS) {\n screamOnce(`[Peek] more than ${PEEK_MAX_ROW_DOORS} doors on one row — the rest are not drawn`);\n break;\n }\n out.push({ icon: known.icon, label: door.busy ? `${known.label}…` : known.label, onClick: door.onClick, href: door.href, newTab: door.newTab, busy: door.busy });\n }\n return out;\n}\n\nfunction RowDoor({ action }: { action: PeekCardAction }) {\n const { loading } = usePeekCard();\n const { Link } = useMatrxDataTableHost();\n const glyph = <action.icon className=\"size-3.5\" />;\n const stop = (event: React.MouseEvent) => {\n event.stopPropagation();\n action.onClick?.(event);\n };\n if (action.href && !loading) {\n if (!action.newTab && Link) {\n return (\n <span title={action.label} className=\"flex shrink-0\">\n <Link href={action.href} className={PEEK_ROW_DOOR} onClick={stop}>\n {glyph}\n <span className=\"sr-only\">{action.label}</span>\n </Link>\n </span>\n );\n }\n const props = { href: action.href, \"aria-label\": action.label, title: action.label, className: PEEK_ROW_DOOR, onClick: stop };\n return action.newTab ? <OutboundLink {...props}>{glyph}</OutboundLink> : <a {...props}>{glyph}</a>;\n }\n return (\n <Button type=\"button\" variant=\"quiet\" aria-label={action.label} title={action.label} icon={glyph} disabled={loading || action.busy} onClick={stop} />\n );\n}\n\n/** A row's link: a web address is THE outbound door (new tab, referral); an app path stays in the app. */\nfunction RowLink({ href, children }: { href: string; children: React.ReactNode }) {\n const { Link } = useMatrxDataTableHost();\n const className = \"text-primary underline-offset-2 hover:underline\";\n const stop = (event: React.MouseEvent) => event.stopPropagation();\n if (/^https?:\\/\\//i.test(href)) {\n return (\n <OutboundLink href={href} className={className} onClick={stop}>\n {children}\n </OutboundLink>\n );\n }\n if (Link) {\n return (\n <Link href={href} className={className} onClick={stop}>\n {children}\n </Link>\n );\n }\n return (\n <a href={href} className={className} onClick={stop}>\n {children}\n </a>\n );\n}\n\nexport interface PeekCardRowsItem {\n key: string;\n text: React.ReactNode;\n /** The row's plain text, for its tooltip. */\n title: string;\n detail?: string | undefined;\n glyph?: PeekGlyph | undefined;\n tone?: PeekTone | undefined;\n href?: string | undefined;\n status?: { text: string; tone?: PeekTone | undefined; hint?: string | undefined } | undefined;\n doors?: readonly PeekDoor[] | undefined;\n}\n\n/** A section's child rows: [n.][dot][glyph] text / detail ……… [status][doors]. */\nexport function PeekCardRows({ rows, numbered = false, limit }: { rows: readonly PeekCardRowsItem[]; numbered?: boolean; limit?: number | undefined }) {\n const shown = limit && rows.length > limit ? rows.slice(0, limit) : rows;\n const rest = rows.length - shown.length;\n const List = numbered ? \"ol\" : \"ul\";\n return (\n <List data-matrx-peek-rows=\"\" className=\"flex flex-col gap-1\">\n {shown.map((row, i) => {\n const doors = rowDoors(row.doors);\n const lead = row.detail ? \"mt-[5px]\" : \"\";\n return (\n <li key={row.key} className=\"flex min-w-0 items-start gap-2\">\n {numbered ? <span className=\"type-meta w-4 shrink-0 pt-px text-right tabular-nums text-muted-foreground\">{i + 1}</span> : null}\n {row.tone ? <span aria-hidden className={cn(\"mt-[7px] size-1.5 shrink-0 rounded-full\", TONE_FILL[row.tone])} /> : null}\n {row.glyph ? <row.glyph className={cn(\"mt-0.5 size-3.5 shrink-0 text-muted-foreground\", lead)} /> : null}\n <div className=\"flex min-w-0 flex-1 flex-col\">\n <span className=\"type-secondary min-w-0 truncate text-foreground\" title={row.title}>\n {row.href ? <RowLink href={row.href}>{row.text}</RowLink> : row.text}\n </span>\n {row.detail ? <span className=\"type-meta break-words text-muted-foreground\">{row.detail}</span> : null}\n </div>\n {row.status ? (\n <span\n title={row.status.hint}\n className={cn(\"type-meta shrink-0 pt-px font-medium\", TONE_INK[row.status.tone ?? \"neutral\"])}\n >\n {row.status.text}\n </span>\n ) : null}\n {doors.length ? (\n <span className=\"flex shrink-0 items-center gap-0.5\" data-peek-no-drag=\"\">\n {doors.map((action) => (\n <RowDoor key={action.label} action={action} />\n ))}\n </span>\n ) : null}\n </li>\n );\n })}\n {rest > 0 ? <li className=\"type-meta text-muted-foreground\">{`+${rest} more`}</li> : null}\n </List>\n );\n}\n\n/** Code or raw text, monospaced and exactly as written: it scrolls sideways, never wraps. */\nexport function PeekCardCode({ text, language, caption }: { text: string; language?: string | undefined; caption?: string | undefined }) {\n return (\n <figure data-matrx-peek-code=\"\" className=\"flex min-w-0 flex-col overflow-hidden rounded-md border border-border bg-muted\">\n {language || caption ? (\n <figcaption className=\"type-meta flex min-w-0 items-center gap-2 border-b border-border px-2 py-1 text-muted-foreground\">\n {caption ? <span className=\"min-w-0 flex-1 truncate font-mono\" title={caption}>{caption}</span> : <span className=\"flex-1\" />}\n {language ? <span className=\"shrink-0\">{language}</span> : null}\n </figcaption>\n ) : null}\n <pre className=\"matrx-peek-scroll max-h-72 overflow-auto px-2 py-1.5 font-mono text-xs leading-relaxed text-foreground\">\n <code>{text}</code>\n </pre>\n </figure>\n );\n}\n\nconst MEDIA_ASPECT = { \"4:3\": \"aspect-[4/3]\", \"16:9\": \"aspect-video\", \"1:1\": \"aspect-square\" } as const;\n\n/** The picture at the top of the body. `drawn`: the host's own rendering of a stored file. */\nexport function PeekCardMedia({ alt, aspect = \"4:3\", src, drawn }: { alt: string; aspect?: \"4:3\" | \"16:9\" | \"1:1\" | undefined; src?: string | undefined; drawn?: React.ReactNode }) {\n return (\n <div data-matrx-peek-media=\"\" className={cn(\"relative w-full shrink-0 overflow-hidden rounded-md bg-muted\", MEDIA_ASPECT[aspect])}>\n {src ? (\n // Pictures from other sites (a link's preview image) load without telling the site who asked:\n // many hosts refuse a hotlinked image that carries our page as its referrer.\n <img src={src} alt={alt} loading=\"lazy\" referrerPolicy=\"no-referrer\" className=\"absolute inset-0 size-full object-cover\" />\n ) : drawn ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">{drawn}</div>\n ) : (\n // No picture to draw: its name, never a blank box.\n <span className=\"type-meta absolute inset-0 flex items-center justify-center px-3 text-center text-muted-foreground\">{alt}</span>\n )}\n </div>\n );\n}\n\n/** A person's picture on the title line, or their initials. */\nexport function PeekCardAvatar({ initials, src }: { initials: string; src?: string | undefined }) {\n return src ? (\n <img src={src} alt=\"\" referrerPolicy=\"no-referrer\" className=\"size-4 rounded-full object-cover\" />\n ) : (\n <span className=\"type-meta flex size-4 items-center justify-center rounded-full bg-muted font-semibold uppercase leading-none text-muted-foreground\">\n {initials.slice(0, 1)}\n </span>\n );\n}\n\n/** Running text inside a section (a description). */\nexport function PeekCardText({\n children,\n clamp,\n breaks = false,\n}: {\n children: React.ReactNode;\n /** Lines before it ends in \"…\". */\n clamp?: 2 | 3 | 4 | 6;\n /** Keep the text's own line breaks and indents. */\n breaks?: boolean;\n}) {\n return (\n <p\n className={cn(\n \"type-secondary break-words leading-relaxed text-foreground\",\n breaks && \"whitespace-pre-wrap\",\n clamp === 2 && \"line-clamp-2\",\n clamp === 3 && \"line-clamp-3\",\n clamp === 4 && \"line-clamp-4\",\n clamp === 6 && \"line-clamp-6\",\n )}\n >\n {children}\n </p>\n );\n}\n\nexport interface PeekCardTagsProps {\n tags: readonly string[];\n}\n\nexport function PeekCardTags({ tags }: PeekCardTagsProps) {\n if (tags.length === 0) return null;\n return (\n <div className=\"flex flex-wrap gap-1\">\n {tags.map((tag) => (\n <span\n key={tag}\n title={tag}\n className=\"type-meta inline-flex h-5 max-w-full items-center truncate rounded bg-muted px-1.5 font-medium text-muted-foreground\"\n >\n {tag}\n </span>\n ))}\n </div>\n );\n}\n\nexport interface PeekCardCalloutProps {\n icon?: React.ComponentType<{ className?: string }>;\n title: React.ReactNode;\n children?: React.ReactNode;\n}\n\n/**\n * The one tinted block a peek may carry: a fact that changes what the record IS (the agent card's\n * \"runs an ensemble\"). At most one per card — a second one is a section.\n */\nexport function PeekCardCallout({ icon: Icon, title, children }: PeekCardCalloutProps) {\n return (\n <div className=\"flex flex-col gap-1 rounded-md border border-primary/20 bg-primary/5 px-2.5 py-2\">\n <div className=\"flex items-center gap-1.5\">\n {Icon ? <Icon className=\"size-3.5 shrink-0 text-primary\" /> : null}\n <span className=\"type-meta font-medium text-primary\">{title}</span>\n </div>\n {children ? <div className=\"type-secondary text-foreground\">{children}</div> : null}\n </div>\n );\n}\n\n// ── footer ───────────────────────────────────────────────────────────────────\n\n/** A door as the footer draws it (internal: callers name a door by kind, never by glyph or label). */\ninterface PeekCardAction {\n icon: React.ComponentType<{ className?: string }>;\n label: string;\n /** Lives in the More menu whatever the room (a door that must never sit beside Copy). */\n inMenu?: boolean | undefined;\n /** Its work is running: drawn disabled, its label says so. */\n busy?: boolean | undefined;\n onClick?: ((event: React.MouseEvent | Event) => void) | undefined;\n href?: string | undefined;\n newTab?: boolean | undefined;\n /** The door opens this menu instead of running (an action door's choices). */\n menu?: readonly PeekDoorMenuGroup[] | undefined;\n}\n\n/** The doors as drawn: known kinds only, each once, at most three — anything else screams in the console. */\nfunction recordDoors(doors: readonly PeekDoor[]): PeekCardAction[] {\n const seen = new Set<string>();\n const out: PeekCardAction[] = [];\n for (const door of doors) {\n const known = peekDoorFace(door);\n if (!known) {\n screamOnce(door.kind === \"action\"\n ? `[PeekCard] action door \"${door.id}\" has no label — an action door names its verb`\n : `[PeekCard] unknown door kind \"${String(door.kind)}\" — add it to PEEK_DOORS in @ai-matrx/design-system`);\n continue;\n }\n const key = peekDoorKey(door);\n if (seen.has(key)) {\n screamOnce(`[PeekCard] door \"${key}\" given twice — each door appears once`);\n continue;\n }\n if (out.length === PEEK_MAX_RECORD_DOORS) {\n screamOnce(`[PeekCard] more than ${PEEK_MAX_RECORD_DOORS} record doors — \"${key}\" and the rest are not drawn`);\n break;\n }\n seen.add(key);\n out.push({\n icon: known.icon,\n label: door.busy ? `${known.label}…` : known.label,\n onClick: door.onClick,\n href: door.href,\n newTab: door.newTab,\n inMenu: known.inMenu,\n busy: door.busy,\n menu: door.kind === \"action\" && door.menu?.length ? door.menu : undefined,\n });\n }\n return out;\n}\n\nexport interface PeekCardFooterProps {\n /** The one main action (e.g. \"Select\"). Portrait: fills the row after settings. Landscape: closes the row, far right. */\n primary?: PeekCardPrimary;\n /**\n * Where the primary stands: `fill` (portrait's default) spreads it across the row from the left;\n * `end` (landscape's default) closes the row at its natural width, the doors grouped before it —\n * the notice footer (\"⏲ 🔕 [Read my site]\").\n */\n primaryAt?: \"fill\" | \"end\";\n /** The record's settings, when it has any: the first door, before the primary. */\n onSettings?: () => void;\n /**\n * Up to three of the record's own doors, by kind (`PEEK_DOORS`), most important first. The footer\n * measures itself and shows as many as fit; the rest go behind \"More\", placed where the room ran\n * out — never cut, never dropped, nothing for a caller to count or style.\n */\n doors?: PeekDoors;\n /**\n * Copy this record: Alchemy's own menu (Raw · Markdown · Formatted · For AI), through the same host\n * port every table row uses. Always second from the right, named \"Copy\".\n */\n copy?: PeekCopy;\n /** The record's own page: always the right-most door, opening in a new tab. */\n openHref?: string;\n}\n\n/** The footer's one main action. `busy` draws the spinner and waits; `disabled` waits without one. */\nexport interface PeekCardPrimary {\n label: string;\n onClick: () => void;\n busy?: boolean;\n disabled?: boolean;\n /** What pressing it will do, when the label alone cannot say. */\n title?: string;\n}\n\n/** On a phone the doors are 44px touch targets; this many fit beside the primary. */\nconst PEEK_SHEET_FOOTER_SLOTS = 4;\n\n/** A door: the glyph alone in full ink, no box; a tint only under the pointer. */\nconst PEEK_DOOR =\n \"flex shrink-0 items-center justify-center rounded-md text-foreground transition-colors hover:bg-accent hover:text-primary disabled:text-disabled-foreground disabled:hover:bg-transparent focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-primary\";\n/** A door with choices: its glyph opens a menu, and the menu holds a hover peek open while in use. */\nfunction MenuDoor({ action, menu, disabled }: { action: PeekCardAction; menu: readonly PeekDoorMenuGroup[]; disabled: boolean }) {\n const { sheet } = usePeekCard();\n const [open, setOpen] = React.useState(false);\n usePeekHoldWhile(open);\n const glyph = sheet ? <action.icon className=\"size-5\" /> : <action.icon className=\"size-3.5\" />;\n return (\n <DropdownMenu modal={false} open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={action.label}\n title={action.label}\n icon={action.busy ? <Loader2Icon className=\"matrx-spin\" /> : glyph}\n className=\"shrink-0\"\n disabled={disabled || action.busy}\n onClick={(event) => event.stopPropagation()}\n />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" data-peek-no-drag=\"\">\n {menu.map((group, i) => (\n <React.Fragment key={`${group.label ?? \"\"}-${i}`}>\n {i > 0 ? <DropdownMenuSeparator /> : null}\n {group.label ? <DropdownMenuLabel>{group.label}</DropdownMenuLabel> : null}\n {group.items.map((item) => (\n <DropdownMenuItem key={item.key} {...(item.tone ? { tone: item.tone } : {})} onSelect={() => item.onSelect()}>\n {item.label}\n </DropdownMenuItem>\n ))}\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\nfunction FooterDoor({ action, disabled = false }: { action: PeekCardAction; disabled?: boolean }) {\n const { sheet } = usePeekCard();\n const { Link } = useMatrxDataTableHost();\n if (action.menu) return <MenuDoor action={action} menu={action.menu} disabled={disabled} />;\n const box = sheet ? \"size-11\" : \"size-7\";\n const glyph = <action.icon className={sheet ? \"size-5\" : \"size-3.5\"} />;\n if (action.href && !disabled && !action.newTab && Link) {\n // A same-tab door moves within the app (the host's Link), never a full page load.\n return (\n <span title={action.label} className=\"flex shrink-0\">\n <Link\n href={action.href}\n className={cn(PEEK_DOOR, box)}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick?.(event);\n }}\n >\n {glyph}\n <span className=\"sr-only\">{action.label}</span>\n </Link>\n </span>\n );\n }\n if (action.href && !disabled) {\n const props = {\n href: action.href,\n \"aria-label\": action.label,\n title: action.label,\n className: cn(PEEK_DOOR, box),\n onClick: (event: React.MouseEvent<HTMLAnchorElement>) => {\n event.stopPropagation();\n action.onClick?.(event);\n },\n };\n // A new tab is THE outbound door (our referral rides links to other sites); same tab is a plain link.\n return action.newTab ? <OutboundLink {...props}>{glyph}</OutboundLink> : <a {...props}>{glyph}</a>;\n }\n return (\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={action.label}\n title={action.label}\n icon={glyph}\n className=\"shrink-0\"\n disabled={disabled || action.busy}\n onClick={(event) => {\n event.stopPropagation();\n action.onClick?.(event);\n }}\n />\n );\n}\n\nfunction openDoor(action: PeekCardAction, event: Event) {\n action.onClick?.(event);\n if (!action.href) return;\n if (action.newTab) openOutbound(action.href);\n else window.location.assign(action.href);\n}\n\n/** What the Copy door hands Alchemy: the record's data and what it is in a person's words. */\nexport interface PeekCopy {\n /** The content itself (any JSON value, or a getter read on the click). Alchemy derives every format from it. */\n data: unknown;\n /** What it is (\"Agent\", \"Task\") — the For AI tag says it. */\n dataType: string;\n /** The record's name, for Alchemy's menu. */\n label: string;\n /** The record's id: a different record resets Alchemy's preparation. */\n sourceId?: string;\n}\n\n/**\n * Alchemy's palette, mounted where the Copy door opened it (the row menu's own pattern). It lives\n * inside the open popover, so Alchemy itself mounts only when Copy opens — a page of peeks pays for\n * none until someone copies — and it asks to be activated on mount.\n */\nfunction PeekCopyPalette({ onClose, restoreFocus }: { onClose: () => void; restoreFocus: () => void }) {\n const alchemy = useMatrxTableRowAlchemy();\n const target = React.useRef<HTMLDivElement>(null);\n const closeRef = React.useRef(onClose);\n const focusRef = React.useRef(restoreFocus);\n React.useEffect(() => {\n closeRef.current = onClose;\n focusRef.current = restoreFocus;\n }, [onClose, restoreFocus]);\n React.useEffect(() => {\n alchemy?.activate();\n }, [alchemy]);\n const mountMenu = alchemy?.mountMenu;\n const ready = Boolean(alchemy?.ready);\n React.useEffect(() => {\n if (!ready) return;\n mountMenu?.(target.current, () => closeRef.current(), () => focusRef.current());\n return () => mountMenu?.(null);\n }, [mountMenu, ready]);\n return <div ref={target} data-matrx-peek-copy-palette=\"\" aria-label=\"Copy options\" />;\n}\n\nfunction keepPaletteInside(event: { target: EventTarget | null; preventDefault(): void }) {\n if (event.target instanceof Element && event.target.closest(\"[data-matrx-peek-copy-palette]\")) event.preventDefault();\n}\n\n/**\n * The Copy door: Alchemy, bound by the host (`MatrxDataTableHost.CopyControls`) exactly as for a table\n * row. ONE stable button (the first press always opens, focus is never lost); Alchemy mounts inside\n * the open popover only. A host that binds no copy control gets a door that says so, never a live\n * button that opens nothing.\n */\nfunction PeekCopyDoor({ copy, disabled }: { copy: PeekCopy; disabled: boolean }) {\n const { sheet } = usePeekCard();\n const { CopyControls } = useMatrxDataTableHost();\n const button = React.useRef<HTMLButtonElement>(null);\n const [open, setOpen] = React.useState(false);\n usePeekHoldWhile(open);\n const glyph = <AlchemyGlyph className={sheet ? \"size-5\" : \"size-3.5\"} />;\n if (!CopyControls) {\n screamOnce(\"[PeekCard] no copy control is bound: set MatrxDataTableHost.CopyControls (the app binds Alchemy) — the Copy door is disabled\");\n return (\n <Button type=\"button\" variant=\"quiet\" aria-label=\"Copy\" title=\"Copy is not connected here\" icon={glyph} className=\"shrink-0\" disabled data-matrx-peek-copy-door=\"\" />\n );\n }\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen} modal={false}>\n <PopoverPrimitive.Trigger asChild>\n <Button\n ref={button}\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Copy\"\n title=\"Copy\"\n icon={glyph}\n className=\"shrink-0\"\n disabled={disabled}\n data-matrx-peek-copy-door=\"\"\n onClick={(event) => event.stopPropagation()}\n />\n </PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side=\"top\"\n align=\"end\"\n sideOffset={6}\n collisionPadding={8}\n className={cn(\"z-[10002] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-md outline-none\", MOTION_POPPER)}\n // Alchemy draws its palette from its own component (outside this popover's React tree), so\n // focus or a press inside the palette is \"outside\" to Radix — it is ours (ItemMenu does the same).\n onFocusOutside={keepPaletteInside}\n onPointerDownOutside={keepPaletteInside}\n onInteractOutside={keepPaletteInside}\n >\n <MatrxTableRowAlchemyProvider\n copy={{ data: copy.data, dataType: copy.dataType, label: copy.label, ...(copy.sourceId ? { sourceId: copy.sourceId } : {}) }}\n placement=\"menu\"\n controls={PEEK_NO_ROW_CONTROLS}\n >\n <PeekCopyPalette onClose={() => setOpen(false)} restoreFocus={() => button.current?.focus()} />\n </MatrxTableRowAlchemyProvider>\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n\nconst screamed = new Set<string>();\n/** A misuse is said once per page, not once per render. */\nfunction screamOnce(message: string) {\n if (screamed.has(message)) return;\n screamed.add(message);\n console.error(message);\n}\n\n/** A peek is not a table row: it has no row detail, window or inline edits for Alchemy to offer. */\nconst PEEK_NO_ROW_CONTROLS: MatrxDataTableRecordControls = {\n closeDetail: () => {},\n openDetail: () => {},\n openWindow: () => {},\n closeWindow: () => {},\n hasPendingEdits: false,\n discardPendingEdits: () => {},\n};\n\n/** The primary keeps at least this much of the row (its label never truncates to make room for doors). */\nconst PEEK_PRIMARY_MIN_PX = { card: 72, sheet: 128 } as const;\nconst PEEK_DOOR_GAP_PX = 4;\n\n/**\n * How many of `actions` fit in the row as it is actually drawn. The footer measures itself: the\n * fixed doors and the primary are placed first, the record's doors fill what is left, and the\n * first one that would not fit turns the last free place into \"More\". `null` until measured.\n */\nfunction useDoorsThatFit(\n row: React.RefObject<HTMLDivElement | null>,\n primaryRef: React.RefObject<HTMLButtonElement | null>,\n opts: { doorPx: number; fixedDoors: number; fills: boolean; hasPrimary: boolean; sheet: boolean; actionCount: number },\n): number | null {\n const [fit, setFit] = React.useState<number | null>(null);\n const { doorPx, fixedDoors, fills, hasPrimary, sheet, actionCount } = opts;\n React.useLayoutEffect(() => {\n const el = row.current;\n if (!el) return;\n const measure = () => {\n const style = window.getComputedStyle(el);\n const width = el.clientWidth - parseFloat(style.paddingLeft || \"0\") - parseFloat(style.paddingRight || \"0\");\n if (!(width > 0)) {\n setFit(null);\n return;\n }\n const slot = doorPx + PEEK_DOOR_GAP_PX;\n const primaryPx = !hasPrimary\n ? 0\n : (fills ? PEEK_PRIMARY_MIN_PX[sheet ? \"sheet\" : \"card\"] : (primaryRef.current?.scrollWidth ?? 0)) + 2 * PEEK_DOOR_GAP_PX;\n const room = width - primaryPx - fixedDoors * slot;\n setFit(Math.max(0, Math.floor((room + PEEK_DOOR_GAP_PX) / slot)));\n };\n measure();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n observer?.observe(el);\n return () => observer?.disconnect();\n }, [row, primaryRef, doorPx, fixedDoors, fills, hasPrimary, sheet, actionCount]);\n return fit;\n}\n\nexport function PeekCardFooter({ primary, primaryAt, onSettings, doors = [], copy, openHref }: PeekCardFooterProps) {\n const { density, size, orientation, loading, sheet } = usePeekCard();\n const row = React.useRef<HTMLDivElement | null>(null);\n const primaryRef = React.useRef<HTMLButtonElement | null>(null);\n const settings: PeekCardAction | null = onSettings ? { icon: SettingsIcon, label: \"Settings\", onClick: onSettings } : null;\n const [moreOpen, setMoreOpen] = React.useState(false);\n const actions = recordDoors(doors);\n const open: PeekCardAction | null = openHref ? { icon: ExternalLinkIcon, label: \"Open in new tab\", href: openHref, newTab: true } : null;\n // Menu doors are always drawn, so they hold their places like the fixed doors.\n const fixedDoors = [settings, copy, open].filter(Boolean).length + actions.filter((action) => action.menu).length;\n // Portrait (and a phone): the primary fills the row from the left. Landscape: it closes the row.\n const fills = Boolean(sheet) || (primaryAt ?? (orientation === \"portrait\" ? \"fill\" : \"end\")) === \"fill\";\n const measured = useDoorsThatFit(row, primaryRef, {\n doorPx: sheet ? 44 : 28,\n fixedDoors,\n fills,\n hasPrimary: Boolean(primary),\n sheet: Boolean(sheet),\n actionCount: actions.length,\n });\n // Before the first measurement (and where nothing has layout) the size's slot count stands in.\n const room = measured ?? (sheet ? PEEK_SHEET_FOOTER_SLOTS : PEEK_CARD_FOOTER_SLOTS[size]) - fixedDoors;\n // A door with its own menu is always drawn (a menu inside More is not a menu anyone finds).\n const inline = actions.filter((action) => !action.inMenu && !action.menu);\n const menuOnly = actions.filter((action) => action.inMenu);\n const menuDoors = actions.filter((action) => action.menu);\n // More takes a slot when anything must live there; the rest of the room goes to inline doors.\n const inlineRoom = menuOnly.length ? Math.max(0, room - 1) : room;\n const shown = inline.length <= inlineRoom ? inline : inline.slice(0, Math.max(0, inlineRoom - (menuOnly.length ? 0 : 1)));\n const overflow = [...inline.slice(shown.length), ...menuOnly];\n // A More that stops being drawn (the row re-measured with room for every door) releases its hold.\n usePeekHoldWhile(moreOpen && overflow.length > 0);\n const primaryButton = primary ? (\n <Button\n ref={primaryRef}\n type=\"button\"\n variant=\"primary\"\n className={cn(\"mx-1\", fills && \"flex-1\")}\n style={fills ? { minWidth: PEEK_PRIMARY_MIN_PX[sheet ? \"sheet\" : \"card\"] } : undefined}\n disabled={loading || primary.disabled || primary.busy}\n title={primary.title}\n icon={primary.busy ? <Loader2Icon className=\"matrx-spin\" /> : undefined}\n onClick={primary.onClick}\n >{primary.label}</Button>\n ) : null;\n const more = overflow.length ? (\n <DropdownMenu modal={false} open={moreOpen} onOpenChange={setMoreOpen}>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"quiet\" aria-label=\"More\" title=\"More\" icon={<MoreHorizontalIcon className={sheet ? \"size-5\" : \"size-3.5\"} />} className=\"shrink-0\" disabled={loading} />\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {overflow.map((action, i) => (\n <DropdownMenuItem key={`${action.label}-${i}`} disabled={Boolean(action.busy)} onSelect={(event) => openDoor(action, event)}>\n <action.icon className=\"size-4\" />\n {action.label}\n </DropdownMenuItem>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null;\n return (\n <>\n {sheet ? <div aria-hidden className=\"h-px shrink-0 bg-border\" /> : <PeekRule />}\n <div\n ref={row}\n data-matrx-peek-footer=\"\"\n className={cn(\n \"flex shrink-0 items-center gap-1 overflow-hidden\",\n sheet ? \"px-4 pt-3\" : density === \"compact\" ? \"px-2 py-1.5\" : \"px-3 py-2\",\n )}\n style={sheet ? { paddingBottom: \"max(12px, env(safe-area-inset-bottom))\" } : undefined}\n >\n {settings ? <FooterDoor action={settings} disabled={loading} /> : null}\n {/* The fixed doors hold the right edge whatever else is in the row. */}\n {fills && primaryButton ? primaryButton : <span className=\"flex-1\" />}\n {/* \"More\" stands exactly where the row ran out of room: right after the primary in\n portrait, at the head of the doors in landscape. */}\n {more}\n {menuDoors.map((action, i) => (\n <FooterDoor key={`menu-${action.label}-${i}`} action={action} disabled={loading} />\n ))}\n {shown.map((action, i) => (\n <FooterDoor key={`${action.label}-${i}`} action={action} disabled={loading} />\n ))}\n {copy ? <PeekCopyDoor copy={copy} disabled={loading} /> : null}\n {open ? <FooterDoor action={open} disabled={loading} /> : null}\n {fills ? null : primaryButton}\n </div>\n </>\n );\n}\n\n// ── hosts ────────────────────────────────────────────────────────────────────\n\n/** `auto`: a floating card on a desktop, a bottom drawer on a phone. */\nexport type PeekPresentation = \"auto\" | \"float\" | \"sheet\";\n/**\n * On a phone the title row scrolls away with the body; the footer either stays `pinned` to the\n * bottom of the drawer (the default — the actions are why a peek is opened) or scrolls in `inline`\n * at the end of the content.\n */\nexport type PeekSheetFooter = \"pinned\" | \"inline\";\n\nexport interface PeekHostProps {\n /** The element that opens the peek (rendered as-is). */\n trigger: React.ReactElement;\n /** The `<PeekCard>` (directly, or inside a component that renders one). */\n children: React.ReactNode;\n /** The record's name, for the drawer's accessible title on a phone. */\n label?: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n presentation?: PeekPresentation;\n sheetFooter?: PeekSheetFooter;\n}\n\n/** Below this share of the screen, the drawer fits its content instead of standing at 70%. */\nconst PEEK_SHEET_SHORT_SHARE = 0.4;\n\n/**\n * The peek as a phone's bottom drawer: at least 70% of the screen unless the record has next to\n * nothing to show, the whole card scrolling as one (title row included), the footer pinned or inline.\n */\nfunction PeekSheet({ open, onOpenChange, label, sheetFooter, children }: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n label: string;\n sheetFooter: PeekSheetFooter;\n children: React.ReactNode;\n}) {\n const body = React.useRef<HTMLDivElement | null>(null);\n const [short, setShort] = React.useState(false);\n React.useLayoutEffect(() => {\n const el = body.current;\n if (!open || !el) return;\n const measure = () => {\n const scroller = el.querySelector<HTMLElement>(\"[data-matrx-peek-scroller]\");\n const footer = el.querySelector<HTMLElement>(\"[data-matrx-peek-footer]\");\n const natural = (scroller?.scrollHeight ?? el.scrollHeight) + (sheetFooter === \"pinned\" ? footer?.offsetHeight ?? 0 : 0);\n setShort(natural < window.innerHeight * PEEK_SHEET_SHORT_SHARE);\n };\n measure();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n const scroller = el.querySelector<HTMLElement>(\"[data-matrx-peek-scroller]\");\n if (observer && scroller?.firstElementChild) observer.observe(scroller.firstElementChild);\n return () => observer?.disconnect();\n }, [open, sheetFooter]);\n return (\n <BottomSheet open={open} onOpenChange={onOpenChange} title={label} surface=\"solid\" {...(short ? {} : { contentClassName: \"min-h-[70dvh]\" })}>\n <PeekSheetContext.Provider value={{ footer: sheetFooter }}>\n <div ref={body} className=\"flex min-h-0 flex-1 flex-col\">\n {children}\n </div>\n </PeekSheetContext.Provider>\n </BottomSheet>\n );\n}\n\nfunction usePeekPresentation(presentation: PeekPresentation): \"float\" | \"sheet\" {\n const isMobile = useIsMobile();\n return presentation === \"auto\" ? (isMobile ? \"sheet\" : \"float\") : presentation;\n}\n\n/** On a phone, the trigger opens the drawer with a tap (a hover never happens on touch). */\nfunction SheetHost({ trigger, children, label = \"Details\", open, onOpenChange, sheetFooter = \"pinned\" }: PeekHostProps) {\n const [own, setOwn] = React.useState(false);\n const isOpen = open ?? own;\n const setOpen = (next: boolean) => {\n setOwn(next);\n onOpenChange?.(next);\n };\n return (\n <>\n <Slot onClick={() => setOpen(true)}>{trigger}</Slot>\n <PeekSheet open={isOpen} onOpenChange={setOpen} label={label} sheetFooter={sheetFooter}>\n {children}\n </PeekSheet>\n </>\n );\n}\n\n/**\n * The peek on hover. Same timing as every hover card (`HoverCard`): a deliberate hover opens it and\n * it waits for the pointer to travel onto it. On a phone it is a tap that opens the bottom drawer.\n */\nexport function PeekHoverCard(props: PeekHostProps) {\n const { trigger, children, side = \"right\", align = \"start\", open, onOpenChange, container, presentation = \"auto\" } = props;\n const resolved = usePortalContainer(container);\n const [hovered, setHovered] = React.useState(false);\n const [held, hold] = usePeekHold();\n if (usePeekPresentation(presentation) === \"sheet\") return <SheetHost {...props} />;\n return (\n <HoverCardPrimitive.Root\n openDelay={Math.max(HOVER_CARD_OPEN_DELAY_MS, HOVER_CARD_OPEN_DELAY_FLOOR_MS)}\n closeDelay={HOVER_CARD_CLOSE_DELAY_MS}\n // A menu the card opened (Copy, More, a door's menu) holds it open while the pointer is in that\n // menu — a caller-controlled peek too, or its own menus close it under the pointer.\n open={(open ?? hovered) || held}\n onOpenChange={(next) => {\n setHovered(next);\n onOpenChange?.(next);\n }}\n >\n <HoverCardPrimitive.Trigger asChild>{trigger}</HoverCardPrimitive.Trigger>\n <HoverCardPrimitive.Portal container={resolved ?? null}>\n <HoverCardPrimitive.Content\n data-matrx-peek-host=\"\"\n side={side}\n align={align}\n sideOffset={8}\n collisionPadding={8}\n style={{ [PEEK_ROOM_VAR]: \"var(--radix-hover-card-content-available-height)\" } as React.CSSProperties}\n className={cn(\"z-[10001] select-text outline-none\", MOTION_POPPER)}\n >\n <PeekHoldContext.Provider value={hold}>{children}</PeekHoldContext.Provider>\n </HoverCardPrimitive.Content>\n </HoverCardPrimitive.Portal>\n </HoverCardPrimitive.Root>\n );\n}\n\n/** The peek on click: a non-modal popover that holds the same card; the bottom drawer on a phone. */\nexport function PeekPopover(props: PeekHostProps) {\n const { trigger, children, side = \"bottom\", align = \"start\", open, onOpenChange, container, presentation = \"auto\" } = props;\n const resolved = usePortalContainer(container);\n if (usePeekPresentation(presentation) === \"sheet\") return <SheetHost {...props} />;\n return (\n <PopoverPrimitive.Root modal={false} {...(open !== undefined ? { open } : {})} {...(onOpenChange ? { onOpenChange } : {})}>\n <PopoverPrimitive.Trigger asChild>{trigger}</PopoverPrimitive.Trigger>\n <PopoverPrimitive.Portal container={resolved ?? null}>\n <PopoverPrimitive.Content\n data-matrx-peek-host=\"\"\n side={side}\n align={align}\n sideOffset={8}\n collisionPadding={8}\n style={{ [PEEK_ROOM_VAR]: \"var(--radix-popover-content-available-height)\" } as React.CSSProperties}\n className={cn(\"z-[10001] outline-none\", MOTION_POPPER)}\n >\n {children}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n\n// ── the floating peek ────────────────────────────────────────────────────────\n\n/** Window panels paint near z-1000; a floating peek sits with them, above the page. */\nconst PEEK_WINDOW_Z = 1100;\nconst EDGE = 8;\n\nexport interface PeekWindowProps {\n open: boolean;\n onClose: () => void;\n /** Where its top-left corner first appears (viewport px). Default: centered. */\n initialPosition?: { x: number; y: number };\n /** The record's name, for the drawer's accessible title on a phone. */\n label?: string;\n /** `auto` (default): a phone gets the bottom drawer, everything else the floating window. */\n presentation?: PeekPresentation;\n sheetFooter?: PeekSheetFooter;\n /** Exactly one `<PeekCard>`; its header becomes the drag handle and gains a close button. */\n children: React.ReactElement<PeekCardProps>;\n}\n\n/**\n * A peek that stays: floating, draggable by its own title row, closed by its own ✕ or Escape. It is\n * the window panel with nothing but the card — no title bar, no window buttons, no tray. On a phone\n * it is the bottom drawer, like every peek.\n */\nexport function PeekWindow({ presentation = \"auto\", label = \"Details\", sheetFooter = \"pinned\", ...props }: PeekWindowProps) {\n if (usePeekPresentation(presentation) === \"sheet\") {\n return (\n <PeekSheet open={props.open} onOpenChange={(next) => !next && props.onClose()} label={label} sheetFooter={sheetFooter}>\n {props.children}\n </PeekSheet>\n );\n }\n return <FloatingPeekWindow {...props} />;\n}\n\nfunction FloatingPeekWindow({ open, onClose, initialPosition, children }: Omit<PeekWindowProps, \"presentation\" | \"label\" | \"sheetFooter\">) {\n const z = useFloatingLayerZIndex(PEEK_WINDOW_Z);\n const titleId = React.useId();\n const ref = React.useRef<HTMLDivElement | null>(null);\n const [element, setElement] = React.useState<HTMLDivElement | null>(null);\n const setRef = React.useCallback((node: HTMLDivElement | null) => {\n ref.current = node;\n setElement(node);\n }, []);\n const [pos, setPos] = React.useState<{ x: number; y: number } | null>(initialPosition ?? null);\n\n /** Keep the whole card on screen (the title row at least reachable). */\n const clamp = React.useCallback((x: number, y: number) => {\n const rect = ref.current?.getBoundingClientRect();\n const kept = clampRectToViewport({ x, y, width: rect?.width ?? 0, height: rect?.height ?? 0 }, readViewport(), { margin: EDGE });\n return { x: kept.x, y: kept.y };\n }, []);\n\n // THE WINDOW DRAG (window-drag.ts): the title row drags it, painted per frame, committed once.\n const drag = useDragMove({\n element,\n ignore: `${DRAG_IGNORE_SELECTOR},[data-peek-no-drag]`,\n constrain: (next) => clampRectToViewport(next, readViewport(), { margin: EDGE }),\n onCommit: (rect) => setPos({ x: rect.x, y: rect.y }),\n });\n\n // On every open: center when no position is known, otherwise pull the last one back on screen.\n React.useLayoutEffect(() => {\n if (!open || !ref.current) return;\n const rect = ref.current.getBoundingClientRect();\n setPos((last) =>\n last\n ? clamp(last.x, last.y)\n : clamp((window.innerWidth - rect.width) / 2, (window.innerHeight - rect.height) / 3),\n );\n }, [open, clamp]);\n\n // A viewport that shrinks never strands the window off screen.\n React.useEffect(() => {\n if (!open) return;\n const onResize = () => setPos((last) => (last ? clamp(last.x, last.y) : last));\n window.addEventListener(\"resize\", onResize);\n return () => window.removeEventListener(\"resize\", onResize);\n }, [open, clamp]);\n\n // Escape closes the NEWEST open peek wherever focus is — never one under it, never while a menu\n // it opened is in use (the menu closes first), never while focus sits in some other dialog.\n const closeRef = React.useRef(onClose);\n closeRef.current = onClose;\n // THE Escape stack (floating-layer): the newest open layer of ANY kind owns the key.\n useEscapeLayer(open, (event) => {\n const active = document.activeElement;\n if (active instanceof Element) {\n if (active.closest(\"[data-radix-popper-content-wrapper]\")) return;\n if (!ref.current?.contains(active) && active.closest(\"[role='dialog'], [role='alertdialog']\")) return;\n }\n event.preventDefault();\n closeRef.current();\n });\n\n // Closing hands focus back to whatever opened the window (never strands it on <body>).\n React.useEffect(() => {\n if (!open) return;\n const opener = document.activeElement instanceof HTMLElement ? document.activeElement : null;\n return () => {\n const lost = !document.activeElement || document.activeElement === document.body || ref.current?.contains(document.activeElement);\n if (lost && opener?.isConnected) opener.focus({ preventScroll: true });\n };\n }, [open]);\n\n // A drag in flight ends with the window (close): no stray listeners, no held cursor.\n const cancelDrag = drag.cancel;\n React.useEffect(() => {\n if (!open) cancelDrag();\n }, [open, cancelDrag]);\n\n if (!open || typeof document === \"undefined\") return null;\n const windowCtx: PeekCardContextValue[\"window\"] = {\n onClose,\n titleId,\n dragHandle: { onPointerDown: drag.onPointerDown, \"data-draggable\": \"\" } as React.HTMLAttributes<HTMLElement>,\n };\n return createPortal(\n <FloatingLayer>\n <div\n ref={setRef}\n role=\"dialog\"\n aria-modal={false}\n aria-labelledby={titleId}\n data-matrx-peek-window=\"\"\n className={MOTION_POPPER}\n style={{\n position: \"fixed\",\n left: pos?.x ?? 0,\n top: pos?.y ?? 0,\n zIndex: z,\n visibility: pos ? \"visible\" : \"hidden\",\n }}\n >\n <PeekWindowContext.Provider value={windowCtx}>{children}</PeekWindowContext.Provider>\n </div>\n </FloatingLayer>,\n document.body,\n );\n}\n","// Social platform marks — Font Awesome 6 brand paths (CC BY 4.0), inlined (policy C19: no icon-library\n// dependency). Generated once from react-icons/fa6; one line per platform.\n\nexport const SOCIAL_BRAND_PATHS = {\n linkedin: { viewBox: \"0 0 448 512\", d: \"M416 32H31.9C14.3 32 0 46.5 0 64.3v383.4C0 465.5 14.3 480 31.9 480H416c17.6 0 32-14.5 32-32.3V64.3c0-17.8-14.4-32.3-32-32.3zM135.4 416H69V202.2h66.5V416zm-33.2-243c-21.3 0-38.5-17.3-38.5-38.5S80.9 96 102.2 96c21.2 0 38.5 17.3 38.5 38.5 0 21.3-17.2 38.5-38.5 38.5zm282.1 243h-66.4V312c0-24.8-.5-56.7-34.5-56.7-34.6 0-39.9 27-39.9 54.9V416h-66.4V202.2h63.7v29.2h.9c8.9-16.8 30.6-34.5 62.9-34.5 67.2 0 79.7 44.3 79.7 101.9V416z\" },\n x: { viewBox: \"0 0 512 512\", d: \"M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z\" },\n instagram: { viewBox: \"0 0 448 512\", d: \"M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z\" },\n facebook: { viewBox: \"0 0 512 512\", d: \"M512 256C512 114.6 397.4 0 256 0S0 114.6 0 256C0 376 82.7 476.8 194.2 504.5V334.2H141.4V256h52.8V222.3c0-87.1 39.4-127.5 125-127.5c16.2 0 44.2 3.2 55.7 6.4V172c-6-.6-16.5-1-29.6-1c-42 0-58.2 15.9-58.2 57.2V256h83.6l-14.4 78.2H287V510.1C413.8 494.8 512 386.9 512 256h0z\" },\n youtube: { viewBox: \"0 0 576 512\", d: \"M549.655 124.083c-6.281-23.65-24.787-42.276-48.284-48.597C458.781 64 288 64 288 64S117.22 64 74.629 75.486c-23.497 6.322-42.003 24.947-48.284 48.597-11.412 42.867-11.412 132.305-11.412 132.305s0 89.438 11.412 132.305c6.281 23.65 24.787 41.5 48.284 47.821C117.22 448 288 448 288 448s170.78 0 213.371-11.486c23.497-6.321 42.003-24.171 48.284-47.821 11.412-42.867 11.412-132.305 11.412-132.305s0-89.438-11.412-132.305zm-317.51 213.508V175.185l142.739 81.205-142.739 81.201z\" },\n tiktok: { viewBox: \"0 0 448 512\", d: \"M448,209.91a210.06,210.06,0,0,1-122.77-39.25V349.38A162.55,162.55,0,1,1,185,188.31V278.2a74.62,74.62,0,1,0,52.23,71.18V0l88,0a121.18,121.18,0,0,0,1.86,22.17h0A122.18,122.18,0,0,0,381,102.39a121.43,121.43,0,0,0,67,20.14Z\" },\n github: { viewBox: \"0 0 496 512\", d: \"M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z\" },\n pinterest: { viewBox: \"0 0 496 512\", d: \"M496 256c0 137-111 248-248 248-25.6 0-50.2-3.9-73.4-11.1 10.1-16.5 25.2-43.5 30.8-65 3-11.6 15.4-59 15.4-59 8.1 15.4 31.7 28.5 56.8 28.5 74.8 0 128.7-68.8 128.7-154.3 0-81.9-66.9-143.2-152.9-143.2-107 0-163.9 71.8-163.9 150.1 0 36.4 19.4 81.7 50.3 96.1 4.7 2.2 7.2 1.2 8.3-3.3.8-3.4 5-20.3 6.9-28.1.6-2.5.3-4.7-1.7-7.1-10.1-12.5-18.3-35.3-18.3-56.6 0-54.7 41.4-107.6 112-107.6 60.9 0 103.6 41.5 103.6 100.9 0 67.1-33.9 113.6-78 113.6-24.3 0-42.6-20.1-36.7-44.8 7-29.5 20.5-61.3 20.5-82.6 0-19-10.2-34.9-31.4-34.9-24.9 0-44.9 25.7-44.9 60.2 0 22 7.4 36.8 7.4 36.8s-24.5 103.8-29 123.2c-5 21.4-3 51.6-.9 71.2C65.4 450.9 0 361.1 0 256 0 119 111 8 248 8s248 111 248 248z\" },\n threads: { viewBox: \"0 0 448 512\", d: \"M331.5 235.7c2.2 .9 4.2 1.9 6.3 2.8c29.2 14.1 50.6 35.2 61.8 61.4c15.7 36.5 17.2 95.8-30.3 143.2c-36.2 36.2-80.3 52.5-142.6 53h-.3c-70.2-.5-124.1-24.1-160.4-70.2c-32.3-41-48.9-98.1-49.5-169.6V256v-.2C17 184.3 33.6 127.2 65.9 86.2C102.2 40.1 156.2 16.5 226.4 16h.3c70.3 .5 124.9 24 162.3 69.9c18.4 22.7 32 50 40.6 81.7l-40.4 10.8c-7.1-25.8-17.8-47.8-32.2-65.4c-29.2-35.8-73-54.2-130.5-54.6c-57 .5-100.1 18.8-128.2 54.4C72.1 146.1 58.5 194.3 58 256c.5 61.7 14.1 109.9 40.3 143.3c28 35.6 71.2 53.9 128.2 54.4c51.4-.4 85.4-12.6 113.7-40.9c32.3-32.2 31.7-71.8 21.4-95.9c-6.1-14.2-17.1-26-31.9-34.9c-3.7 26.9-11.8 48.3-24.7 64.8c-17.1 21.8-41.4 33.6-72.7 35.3c-23.6 1.3-46.3-4.4-63.9-16c-20.8-13.8-33-34.8-34.3-59.3c-2.5-48.3 35.7-83 95.2-86.4c21.1-1.2 40.9-.3 59.2 2.8c-2.4-14.8-7.3-26.6-14.6-35.2c-10-11.7-25.6-17.7-46.2-17.8H227c-16.6 0-39 4.6-53.3 26.3l-34.4-23.6c19.2-29.1 50.3-45.1 87.8-45.1h.8c62.6 .4 99.9 39.5 103.7 107.7l-.2 .2zm-156 68.8c1.3 25.1 28.4 36.8 54.6 35.3c25.6-1.4 54.6-11.4 59.5-73.2c-13.2-2.9-27.8-4.4-43.4-4.4c-4.8 0-9.6 .1-14.4 .4c-42.9 2.4-57.2 23.2-56.2 41.8l-.1 .1z\" },\n reddit: { viewBox: \"0 0 512 512\", d: \"M0 256C0 114.6 114.6 0 256 0S512 114.6 512 256s-114.6 256-256 256L37.1 512c-13.7 0-20.5-16.5-10.9-26.2L75 437C28.7 390.7 0 326.7 0 256zM349.6 153.6c23.6 0 42.7-19.1 42.7-42.7s-19.1-42.7-42.7-42.7c-20.6 0-37.8 14.6-41.8 34c-34.5 3.7-61.4 33-61.4 68.4l0 .2c-37.5 1.6-71.8 12.3-99 29.1c-10.1-7.8-22.8-12.5-36.5-12.5c-33 0-59.8 26.8-59.8 59.8c0 24 14.1 44.6 34.4 54.1c2 69.4 77.6 125.2 170.6 125.2s168.7-55.9 170.6-125.3c20.2-9.6 34.1-30.2 34.1-54c0-33-26.8-59.8-59.8-59.8c-13.7 0-26.3 4.6-36.4 12.4c-27.4-17-62.1-27.7-100-29.1l0-.2c0-25.4 18.9-46.5 43.4-49.9l0 0c4.4 18.8 21.3 32.8 41.5 32.8zM177.1 246.9c16.7 0 29.5 17.6 28.5 39.3s-13.5 29.6-30.3 29.6s-31.4-8.8-30.4-30.5s15.4-38.3 32.1-38.3zm190.1 38.3c1 21.7-13.7 30.5-30.4 30.5s-29.3-7.9-30.3-29.6c-1-21.7 11.8-39.3 28.5-39.3s31.2 16.6 32.1 38.3zm-48.1 56.7c-10.3 24.6-34.6 41.9-63 41.9s-52.7-17.3-63-41.9c-1.2-2.9 .8-6.2 3.9-6.5c18.4-1.9 38.3-2.9 59.1-2.9s40.7 1 59.1 2.9c3.1 .3 5.1 3.6 3.9 6.5z\" },\n yelp: { viewBox: \"0 0 384 512\", d: \"M42.9 240.32l99.62 48.61c19.2 9.4 16.2 37.51-4.5 42.71L30.5 358.45a22.79 22.79 0 0 1-28.21-19.6 197.16 197.16 0 0 1 9-85.32 22.8 22.8 0 0 1 31.61-13.21zm44 239.25a199.45 199.45 0 0 0 79.42 32.11A22.78 22.78 0 0 0 192.94 490l3.9-110.82c.7-21.3-25.5-31.91-39.81-16.1l-74.21 82.4a22.82 22.82 0 0 0 4.09 34.09zm145.34-109.92l58.81 94a22.93 22.93 0 0 0 34 5.5 198.36 198.36 0 0 0 52.71-67.61A23 23 0 0 0 364.17 370l-105.42-34.26c-20.31-6.5-37.81 15.8-26.51 33.91zm148.33-132.23a197.44 197.44 0 0 0-50.41-69.31 22.85 22.85 0 0 0-34 4.4l-62 91.92c-11.9 17.7 4.7 40.61 25.2 34.71L366 268.63a23 23 0 0 0 14.61-31.21zM62.11 30.18a22.86 22.86 0 0 0-9.9 32l104.12 180.44c11.7 20.2 42.61 11.9 42.61-11.4V22.88a22.67 22.67 0 0 0-24.5-22.8 320.37 320.37 0 0 0-112.33 30.1z\" },\n google: { viewBox: \"0 0 488 512\", d: \"M488 261.8C488 403.3 391.1 504 248 504 110.8 504 0 393.2 0 256S110.8 8 248 8c66.8 0 123 24.5 166.3 64.9l-67.5 64.9C258.5 52.6 94.3 116.6 94.3 256c0 86.5 69.1 156.6 153.7 156.6 98.2 0 135-70.4 140.8-106.9H248v-85.3h236.1c2.3 12.7 3.9 24.9 3.9 41.4z\" },\n} as const satisfies Record<string, { viewBox: string; d: string }>;\n\nexport type SocialBrandMark = keyof typeof SOCIAL_BRAND_PATHS;\n","// The contact values' glyphs — aliases of the one glyph home (../icons, policy C19: no icon library) — and\n// the social platform marks. Every glyph is drawn at the text's own size (`size-[1em]`) by its caller.\n\nimport * as React from \"react\";\n\nimport { AtSignIcon, BadgeCheckIcon, Link2OffIcon, MailIcon, MapPinIcon, MessageSquareIcon, PhoneIcon } from \"../icons\";\nimport { SOCIAL_BRAND_PATHS, type SocialBrandMark } from \"./social-brand-paths\";\n\ntype GlyphProps = { className?: string };\n\n// The lucide glyphs are drawn once, in ../icons; these names are aliases of them.\nexport const MailGlyph = MailIcon;\nexport const PhoneGlyph = PhoneIcon;\nexport const MapPinGlyph = MapPinIcon;\nexport const AtSignGlyph = AtSignIcon;\nexport const MessageSquareGlyph = MessageSquareIcon;\nexport const LinkOffGlyph = Link2OffIcon;\nexport const BadgeCheckGlyph = BadgeCheckIcon;\n\n/** A platform's own mark, filled in the current text color (never tinted with a brand color). */\nexport function SocialMark({ platform, className }: { platform: SocialBrandMark; className?: string }) {\n const mark = SOCIAL_BRAND_PATHS[platform];\n return (\n <svg className={className} viewBox={mark.viewBox} fill=\"currentColor\" aria-hidden>\n <path d={mark.d} />\n </svg>\n );\n}\n\n/** `SocialMark` bound to one platform, as a Peek glyph component. */\nexport function socialGlyph(platform: SocialBrandMark): React.ComponentType<GlyphProps> {\n function Mark({ className }: GlyphProps) {\n return <SocialMark platform={platform} {...(className ? { className } : {})} />;\n }\n Mark.displayName = `SocialMark(${platform})`;\n return Mark;\n}\n","// The contact values' model — every pure rule about an email, a phone number, a postal address, a\n// social profile and a web address: how each is read, normalized, and turned into the real thing it\n// does (compose, call, text, map, search, open). No React, no DOM: the components and any host\n// (a server render, a guard, a test) share exactly these answers.\n\nimport type { SocialBrandMark } from \"./social-brand-paths\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\n\n/** Whether a value is ours to act on. `broken` and `not-us` never render as a link of any kind. */\nexport type ContactValueState = \"ok\" | \"broken\" | \"not-us\";\n\nexport const CONTACT_STATE_LABEL: Record<Exclude<ContactValueState, \"ok\">, string> = {\n broken: \"Broken link\",\n \"not-us\": \"Not us\",\n};\n\n// ── email ────────────────────────────────────────────────────────────────────────────────────────\n\nconst EMAIL = /^[^\\s@<>()[\\]\\\\,;:\"]+@[^\\s@<>()[\\]\\\\,;:\"]+\\.[^\\s@<>()[\\]\\\\,;:\"]{2,}$/;\n\nexport interface ParsedEmail {\n address: string;\n local: string;\n domain: string;\n valid: boolean;\n}\n\n/** `mailto:` and surrounding brackets/space removed; the domain lower-cased, the local part kept. */\nexport function parseEmail(raw: string): ParsedEmail {\n const trimmed = raw.trim().replace(/^mailto:/i, \"\").replace(/^<|>$/g, \"\").split(\"?\")[0]!.trim();\n const at = trimmed.lastIndexOf(\"@\");\n const local = at === -1 ? trimmed : trimmed.slice(0, at);\n const domain = at === -1 ? \"\" : trimmed.slice(at + 1).toLowerCase();\n const address = at === -1 ? trimmed : `${local}@${domain}`;\n return { address, local, domain, valid: EMAIL.test(address) };\n}\n\nexport function mailtoHref(address: string, subject?: string): string {\n return `mailto:${address}${subject ? `?subject=${encodeURIComponent(subject)}` : \"\"}`;\n}\n\n// ── phone ────────────────────────────────────────────────────────────────────────────────────────\n\n/** Calling codes we name a region for. Longest prefix wins; NANP (+1) is resolved by area code. */\nconst CALLING_CODES: Record<string, string> = {\n \"1\": \"United States / Canada\",\n \"7\": \"Russia / Kazakhstan\",\n \"20\": \"Egypt\",\n \"27\": \"South Africa\",\n \"30\": \"Greece\",\n \"31\": \"Netherlands\",\n \"32\": \"Belgium\",\n \"33\": \"France\",\n \"34\": \"Spain\",\n \"36\": \"Hungary\",\n \"39\": \"Italy\",\n \"40\": \"Romania\",\n \"41\": \"Switzerland\",\n \"43\": \"Austria\",\n \"44\": \"United Kingdom\",\n \"45\": \"Denmark\",\n \"46\": \"Sweden\",\n \"47\": \"Norway\",\n \"48\": \"Poland\",\n \"49\": \"Germany\",\n \"51\": \"Peru\",\n \"52\": \"Mexico\",\n \"54\": \"Argentina\",\n \"55\": \"Brazil\",\n \"56\": \"Chile\",\n \"57\": \"Colombia\",\n \"60\": \"Malaysia\",\n \"61\": \"Australia\",\n \"62\": \"Indonesia\",\n \"63\": \"Philippines\",\n \"64\": \"New Zealand\",\n \"65\": \"Singapore\",\n \"66\": \"Thailand\",\n \"81\": \"Japan\",\n \"82\": \"South Korea\",\n \"84\": \"Vietnam\",\n \"86\": \"China\",\n \"90\": \"Turkey\",\n \"91\": \"India\",\n \"92\": \"Pakistan\",\n \"93\": \"Afghanistan\",\n \"94\": \"Sri Lanka\",\n \"98\": \"Iran\",\n \"212\": \"Morocco\",\n \"234\": \"Nigeria\",\n \"254\": \"Kenya\",\n \"351\": \"Portugal\",\n \"353\": \"Ireland\",\n \"358\": \"Finland\",\n \"380\": \"Ukraine\",\n \"420\": \"Czechia\",\n \"852\": \"Hong Kong\",\n \"886\": \"Taiwan\",\n \"971\": \"United Arab Emirates\",\n \"972\": \"Israel\",\n \"966\": \"Saudi Arabia\",\n};\n\n/** Canadian area codes — every other valid NANP area code reads as the United States. */\nconst CANADA_AREA = new Set(\n \"204 226 236 249 250 263 289 306 343 354 365 367 368 382 403 416 418 428 431 437 438 450 468 474 506 514 519 548 579 581 584 587 600 604 613 639 647 672 683 705 709 742 753 778 780 782 807 819 825 867 873 879 902 905\".split(\" \"),\n);\n\nexport interface ParsedPhone {\n /** As written (trimmed). */\n raw: string;\n /** `+15551234567`, or null when the digits cannot make one. */\n e164: string | null;\n /** How a person reads it: `(555) 123-4567` for NANP, `+44 20 7946 0958` style otherwise. */\n display: string;\n /** \"United States\", \"United Kingdom\" … or null when unknown. */\n region: string | null;\n /** An extension (`x123`, `ext. 123`), kept apart from the dialled number. */\n extension: string | null;\n valid: boolean;\n}\n\nfunction regionFor(digits: string): { code: string; region: string } | null {\n for (const len of [3, 2, 1]) {\n const code = digits.slice(0, len);\n const region = CALLING_CODES[code];\n if (region) {\n if (code === \"1\") {\n const area = digits.slice(1, 4);\n return { code, region: CANADA_AREA.has(area) ? \"Canada\" : \"United States\" };\n }\n return { code, region };\n }\n }\n return null;\n}\n\n/** A national number in readable groups: 10 digits 2-4-4 (`20 7946 0958`), 9 digits 3-3-3, else threes. */\nfunction groupNational(n: string): string {\n const cut = (sizes: number[]) => {\n const out: string[] = [];\n let at = 0;\n for (const size of sizes) {\n out.push(n.slice(at, at + size));\n at += size;\n }\n if (at < n.length) out.push(n.slice(at));\n return out.filter(Boolean).join(\" \");\n };\n if (n.length === 10) return cut([2, 4, 4]);\n if (n.length === 9) return cut([3, 3, 3]);\n if (n.length === 11) return cut([3, 4, 4]);\n return n.replace(/(\\d{3})(?=\\d)/g, \"$1 \");\n}\n\n/**\n * Read a phone number. A number without a `+` and of 10 digits (or 11 starting with 1) is taken as\n * North American — the default the platform's people overwhelmingly mean; `defaultCallingCode`\n * overrides it.\n */\nexport function parsePhone(raw: string, defaultCallingCode = \"1\"): ParsedPhone {\n const trimmed = raw.trim().replace(/^tel:/i, \"\");\n const extMatch = trimmed.match(/(?:ext\\.?|x|#)\\s*(\\d{1,6})\\s*$/i);\n const extension = extMatch ? extMatch[1]! : null;\n const body = extMatch ? trimmed.slice(0, extMatch.index) : trimmed;\n const plus = /^\\s*(\\+|00)/.test(body);\n let digits = body.replace(/\\D/g, \"\");\n if (body.trim().startsWith(\"00\")) digits = digits.slice(2);\n let full: string | null = null;\n if (plus) full = digits;\n else if (defaultCallingCode === \"1\" && digits.length === 10) full = `1${digits}`;\n else if (defaultCallingCode === \"1\" && digits.length === 11 && digits.startsWith(\"1\")) full = digits;\n else if (defaultCallingCode !== \"1\" && digits.length >= 6) full = `${defaultCallingCode}${digits.replace(/^0/, \"\")}`;\n const valid = full !== null && full.length >= 8 && full.length <= 15;\n const e164 = valid ? `+${full}` : null;\n const found = valid ? regionFor(full!) : null;\n let display = trimmed;\n if (valid && found?.code === \"1\" && full!.length === 11) {\n display = `(${full!.slice(1, 4)}) ${full!.slice(4, 7)}-${full!.slice(7)}`;\n } else if (valid && found) {\n display = `+${found.code} ${groupNational(full!.slice(found.code.length))}`;\n }\n if (extension && valid) display = `${display} ext. ${extension}`;\n return { raw: trimmed, e164, display, region: found?.region ?? null, extension, valid };\n}\n\nexport function telHref(phone: ParsedPhone): string {\n const number = phone.e164 ?? phone.raw.replace(/[^\\d+]/g, \"\");\n return `tel:${number}${phone.extension ? `,${phone.extension}` : \"\"}`;\n}\n\nexport function smsHref(phone: ParsedPhone): string {\n return `sms:${phone.e164 ?? phone.raw.replace(/[^\\d+]/g, \"\")}`;\n}\n\n// ── address ──────────────────────────────────────────────────────────────────────────────────────\n\n/** A postal address as one string (lines joined) — the form every map and geocoder takes. */\nexport function addressText(address: string | readonly (string | null | undefined)[]): string {\n const parts = typeof address === \"string\" ? address.split(/\\n+/) : address;\n return parts\n .map((p) => (p ?? \"\").trim())\n .filter(Boolean)\n .join(\", \");\n}\n\nexport function mapsHref(address: string): string {\n return `https://www.google.com/maps/search/?api=1&query=${encodeURIComponent(address)}`;\n}\n\n/** What a host's address check answered. */\nexport interface AddressValidation {\n /** `verified`: a real place matched. `partial`: something matched, not the whole address. `unknown`: no match. */\n status: \"verified\" | \"partial\" | \"unknown\";\n /** The address as the geocoder writes it. */\n formatted?: string;\n lat?: number;\n lng?: number;\n}\n\n// ── web ──────────────────────────────────────────────────────────────────────────────────────────\n\nexport function webSearchHref(query: string): string {\n return `https://www.google.com/search?q=${encodeURIComponent(query)}`;\n}\n\nexport interface ParsedUrl {\n /** An absolute http(s) URL, or null when the text is not one. */\n href: string | null;\n /** `example.com` (no `www.`). */\n domain: string;\n /** What to show: the domain, plus the path when it says something. */\n display: string;\n}\n\nexport function parseUrl(raw: string): ParsedUrl {\n const trimmed = raw.trim();\n const candidate = /^https?:\\/\\//i.test(trimmed) ? trimmed : /^[\\w-]+(\\.[\\w-]+)+(\\/|$|\\?|#)/.test(trimmed) ? `https://${trimmed}` : null;\n if (!candidate) return { href: null, domain: trimmed, display: trimmed };\n try {\n const url = new URL(candidate);\n const domain = url.hostname.replace(/^www\\./i, \"\").toLowerCase();\n const path = url.pathname.replace(/\\/+$/, \"\");\n return { href: url.toString(), domain, display: path && path !== \"/\" ? `${domain}${path}` : domain };\n } catch {\n return { href: null, domain: trimmed, display: trimmed };\n }\n}\n\n// ── social ───────────────────────────────────────────────────────────────────────────────────────\n\nexport type SocialPlatform = SocialBrandMark | \"other\";\n\ninterface PlatformRule {\n name: string;\n hosts: readonly string[];\n /** The profile address for a bare handle. */\n profile: (handle: string) => string;\n /** The handle in a profile URL's path, or null when the path is not a profile. */\n handleFromPath: (segments: string[]) => string | null;\n /** Shown before the handle (`@`), or \"\" for platforms that name profiles by slug. */\n sigil: \"@\" | \"\";\n}\n\nconst first = (segments: string[]) => segments[0] ?? null;\n\nexport const SOCIAL_PLATFORMS: Record<SocialBrandMark, PlatformRule> = {\n linkedin: {\n name: \"LinkedIn\",\n hosts: [\"linkedin.com\"],\n profile: (h) => `https://www.linkedin.com/in/${h}`,\n handleFromPath: (s) => ([\"in\", \"company\", \"school\"].includes(s[0] ?? \"\") ? s[1] ?? null : null),\n sigil: \"\",\n },\n x: { name: \"X\", hosts: [\"x.com\", \"twitter.com\"], profile: (h) => `https://x.com/${h}`, handleFromPath: first, sigil: \"@\" },\n instagram: { name: \"Instagram\", hosts: [\"instagram.com\"], profile: (h) => `https://www.instagram.com/${h}`, handleFromPath: first, sigil: \"@\" },\n facebook: { name: \"Facebook\", hosts: [\"facebook.com\", \"fb.com\"], profile: (h) => `https://www.facebook.com/${h}`, handleFromPath: first, sigil: \"\" },\n youtube: {\n name: \"YouTube\",\n hosts: [\"youtube.com\", \"youtu.be\"],\n profile: (h) => `https://www.youtube.com/@${h}`,\n handleFromPath: (s) => (s[0]?.startsWith(\"@\") ? s[0].slice(1) : [\"c\", \"channel\", \"user\"].includes(s[0] ?? \"\") ? s[1] ?? null : null),\n sigil: \"@\",\n },\n tiktok: {\n name: \"TikTok\",\n hosts: [\"tiktok.com\"],\n profile: (h) => `https://www.tiktok.com/@${h}`,\n handleFromPath: (s) => (s[0]?.startsWith(\"@\") ? s[0].slice(1) : null),\n sigil: \"@\",\n },\n github: { name: \"GitHub\", hosts: [\"github.com\"], profile: (h) => `https://github.com/${h}`, handleFromPath: first, sigil: \"@\" },\n pinterest: { name: \"Pinterest\", hosts: [\"pinterest.com\"], profile: (h) => `https://www.pinterest.com/${h}`, handleFromPath: first, sigil: \"@\" },\n threads: {\n name: \"Threads\",\n hosts: [\"threads.net\", \"threads.com\"],\n profile: (h) => `https://www.threads.net/@${h}`,\n handleFromPath: (s) => (s[0]?.startsWith(\"@\") ? s[0].slice(1) : null),\n sigil: \"@\",\n },\n reddit: {\n name: \"Reddit\",\n hosts: [\"reddit.com\"],\n profile: (h) => `https://www.reddit.com/user/${h}`,\n handleFromPath: (s) => ([\"u\", \"user\"].includes(s[0] ?? \"\") ? s[1] ?? null : s[0] === \"r\" && s[1] ? `r/${s[1]}` : null),\n sigil: \"\",\n },\n yelp: { name: \"Yelp\", hosts: [\"yelp.com\"], profile: (h) => `https://www.yelp.com/biz/${h}`, handleFromPath: (s) => (s[0] === \"biz\" ? s[1] ?? null : null), sigil: \"\" },\n google: { name: \"Google\", hosts: [\"g.page\", \"business.google.com\"], profile: (h) => `https://g.page/${h}`, handleFromPath: first, sigil: \"\" },\n};\n\nconst PLATFORM_ALIASES: Record<string, SocialBrandMark> = {\n twitter: \"x\",\n \"x.com\": \"x\",\n fb: \"facebook\",\n ig: \"instagram\",\n li: \"linkedin\",\n yt: \"youtube\",\n google_business: \"google\",\n \"google business\": \"google\",\n gbp: \"google\",\n};\n\n/** A platform name as stored anywhere (\"Twitter\", \"linkedin\", \"IG\") → our key, or null. */\nexport function platformKey(name: string | null | undefined): SocialBrandMark | null {\n if (!name) return null;\n const key = name.trim().toLowerCase();\n if (key in SOCIAL_PLATFORMS) return key as SocialBrandMark;\n return PLATFORM_ALIASES[key] ?? null;\n}\n\nexport interface ParsedSocial {\n platform: SocialPlatform;\n /** \"LinkedIn\", \"X\" … or the domain for an unknown site. */\n platformName: string;\n /** The handle without its sigil, or null when only a URL is known. */\n handle: string | null;\n /** What to show: `@handle`, a slug, or the domain + path. */\n display: string;\n /** The profile address, or null when neither a URL nor a known platform gives one. */\n href: string | null;\n}\n\n/**\n * Read a social profile from whatever we hold: a URL, an `@handle`, a bare handle — with the\n * platform named separately or found from the URL's host.\n */\nexport function parseSocial(value: string, platform?: string | null): ParsedSocial {\n const raw = value.trim();\n const named = platformKey(platform);\n const url = parseUrl(raw);\n if (url.href && (/^https?:\\/\\//i.test(raw) || raw.includes(\"/\"))) {\n const host = url.domain;\n const found =\n (Object.keys(SOCIAL_PLATFORMS) as SocialBrandMark[]).find((k) => SOCIAL_PLATFORMS[k].hosts.some((h) => host === h || host.endsWith(`.${h}`))) ?? named;\n if (found) {\n const rule = SOCIAL_PLATFORMS[found];\n const segments = new URL(url.href).pathname.split(\"/\").filter(Boolean).map((s) => decodeURIComponent(s));\n const handle = rule.handleFromPath(segments);\n return {\n platform: found,\n platformName: rule.name,\n handle,\n display: handle ? `${rule.sigil}${handle}` : url.display,\n href: url.href,\n };\n }\n return { platform: \"other\", platformName: host, handle: null, display: url.display, href: url.href };\n }\n const handle = raw.replace(/^@/, \"\");\n if (named) {\n const rule = SOCIAL_PLATFORMS[named];\n return { platform: named, platformName: rule.name, handle, display: `${rule.sigil}${handle}`, href: handle ? rule.profile(handle) : null };\n }\n return { platform: \"other\", platformName: platform?.trim() || \"Profile\", handle, display: `@${handle}`, href: null };\n}\n\n/** 1234 → \"1.2K\", 2_500_000 → \"2.5M\". */\nexport function compactCount(n: number): string {\n if (!Number.isFinite(n)) return String(n);\n return formatCount(n, { style: \"compact\" });\n}\n","\"use client\";\n\n/**\n * CandidateCard — THE card for \"is this one yours?\": a candidate someone found (a profile, a person, a\n * business, a page) with the person's Yes / No / Other decision under it. CandidatePickList — THE pick-one\n * list for the same candidates (\"This one\" per row, \"None of these\", \"More\").\n *\n * WHY THIS EXISTS (one-canonical, 2026-10-21): Smart Add hand-rolled this card five times (anchor cards,\n * the compare dialog, the harder-search stage, the validation stage, the slot rows) and a pick-one list\n * beside them, each with its own avatar, verified mark, count format and answered look.\n *\n * WHAT IT COMPOSES, NEVER REDRAWS:\n * · Avatar (the picture or the platform mark / initials),\n * · DecisionControl (Yes / No / Other + the way out — the one row decision),\n * · Peek (WHERE the candidate came from, on hover — `peek` is a PeekRecord; there is one peek),\n * · RowGroup + Button + EmptyState (the pick-one list's surface, its answers, its empty state).\n * Peek itself is not the card's body: it is the hover card of one record (popover surface, 16px avatar,\n * Copy door, no decision) and has no place for an answer. The candidate's WHO is `CandidateIdentity`, the\n * one place the name / handle / verified mark / followers / bio line is drawn.\n *\n * ANSWERED LOOKS (the same on every surface): Yes = primary ring; No = dashed, muted, name struck;\n * Other / skipped = neutral. \"We think\" glows one answer on the DecisionControl, never answers for a person.\n */\n\nimport * as React from \"react\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport { OutboundLink } from \"@ai-matrx/kit/outbound-react\";\n\nimport { Avatar, AvatarFallback, AvatarImage } from \"./avatar\";\nimport { cn } from \"./cn\";\nimport { Button, Chip, DecisionControl, EmptyState, RowGroup, type DecisionControlProps } from \"./controls/index\";\nimport { BadgeCheckIcon, CheckIcon, ChevronDownIcon, ExternalLinkIcon, SearchIcon, XIcon } from \"./icons\";\nimport { PeekHoverCard } from \"./peek-card\";\nimport { Peek } from \"./peek\";\nimport type { PeekRecord } from \"./peek-record\";\n\n/** One candidate: what is known about a profile / person / business / page someone might claim. */\nexport interface Candidate {\n /** Stable key (a row id, a URL). */\n id: string;\n /** Its name — wraps to two lines, never one cut-off word. Absent: the handle stands in. */\n name?: string | null;\n /** The handle or address under the name (\"@mara.lin\", \"marasbakery.com\"). */\n handle?: string | null;\n /** Its picture. Absent or broken: `mark`, then the name's initial. */\n imageUrl?: string | null;\n /**\n * How the picture fills its frame. `cover` (default): a round crop, right for a face. `contain`: the whole picture\n * shown inside a square frame, right for a website logo; the avatar's shape follows (round → rounded square).\n */\n imageFit?: \"cover\" | \"contain\";\n /** A small mark on the avatar's lower-right corner (the platform's logo on the photo, 16px or smaller). */\n badge?: React.ReactNode;\n /** The platform line (\"Instagram\", \"Instagram · Austin\"), its own quiet line between the handle and `detail`. */\n platform?: string | null;\n /** The avatar's fallback when there is no picture — the platform's mark (24px or smaller). */\n mark?: React.ReactNode;\n /** The network says this account is verified: the mark shows. Unverified draws nothing. */\n verified?: boolean;\n /** Followers (or any audience count); shown compact (\"12.4k followers\"). */\n followers?: number | null;\n /** What the count is called. Default \"followers\". */\n followersLabel?: string;\n /** One quiet line of facts (\"Founder · Acme · Austin\"). */\n detail?: string | null;\n /** Its short bio, two lines then \"…\". */\n bio?: string | null;\n /** Its page: an Open link in a new tab. */\n href?: string | null;\n}\n\n/** 12400 → \"12.4k\" (kit's compact count voice). */\nexport function formatAudience(n: number): string {\n return formatCount(n, { style: \"compact\" });\n}\n\nconst initialOf = (c: Candidate) => (c.name ?? c.handle ?? \"?\").replace(/^@/, \"\").trim().charAt(0).toUpperCase() || \"?\";\n\nconst withProtocol = (href: string) => (/^https?:\\/\\//i.test(href) ? href : `https://${href}`);\n\n/** The name a screen reader hears for a candidate (every control names WHICH candidate it acts on). */\nconst titleOf = (c: Candidate) => c.name ?? c.handle ?? \"Unnamed\";\n\n/** Names longer than this are cut at a WORD boundary with an ellipsis (the full name is the hover / focus title). */\nconst NAME_BUDGET = 64;\n\n/** Cut `text` at the last whole word within `max` characters, adding \"…\". Short text is returned untouched. */\nexport function truncateAtWord(text: string, max: number): string {\n if (text.length <= max) return text;\n const cut = text.slice(0, max + 1);\n const space = cut.lastIndexOf(\" \");\n // One unbroken token longer than the budget: nothing to cut between, so cut the token itself.\n const end = space > max * 0.4 ? space : max;\n return `${text.slice(0, end).replace(/[\\s,;:.\\-–—]+$/, \"\")}…`;\n}\n\n/** The Open link: the candidate's page in a new tab. Nothing when it has none. */\nfunction OpenCandidate({ href, name }: { href?: string | null | undefined; name: string }) {\n if (!href) return null;\n return (\n <Button asChild variant=\"quiet\" icon={<ExternalLinkIcon aria-hidden />} aria-label={`Open ${name}`}>\n <OutboundLink href={withProtocol(href)} />\n </Button>\n );\n}\n\nexport interface CandidateIdentityProps {\n candidate: Candidate;\n /** `stage`: the focus stage's larger picture. Default `row`. */\n size?: \"row\" | \"stage\";\n /** Where it came from: drawn by THE peek on hover / press of the identity. */\n peek?: PeekRecord | null | undefined;\n /** The name is struck (a \"No\"). */\n struck?: boolean;\n className?: string;\n}\n\n/** WHO the candidate is: picture, name + verified mark, handle · followers, detail, bio. */\nexport function CandidateIdentity({ candidate: c, size = \"row\", peek, struck, className }: CandidateIdentityProps) {\n const title = titleOf(c);\n const line = [c.name && c.handle ? c.handle : null, c.followers != null ? `${formatAudience(c.followers)} ${c.followersLabel ?? \"followers\"}` : null]\n .filter(Boolean)\n .join(\" · \");\n const contain = c.imageFit === \"contain\";\n const who = (\n <div className={cn(\"flex min-w-0 flex-1 items-start gap-3\", className)} data-candidate-identity=\"\">\n <span className=\"relative shrink-0\" data-candidate-avatar=\"\">\n <Avatar size={size === \"stage\" ? \"lg\" : \"md\"} className={cn(\"border border-border\", contain && \"rounded-lg bg-card\")}>\n {c.imageUrl ? <AvatarImage src={c.imageUrl} alt=\"\" className={contain ? \"object-contain p-0.5\" : \"object-cover\"} data-candidate-fit={contain ? \"contain\" : \"cover\"} /> : null}\n <AvatarFallback className={contain ? \"rounded-lg\" : undefined}>{c.mark ?? initialOf(c)}</AvatarFallback>\n </Avatar>\n {c.badge ? (\n <span className=\"absolute -bottom-1 -right-1 flex size-4 items-center justify-center overflow-hidden rounded-full border border-border bg-card\" data-candidate-badge=\"\">\n {c.badge}\n </span>\n ) : null}\n </span>\n <div className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className={cn(\"type-title line-clamp-2 break-words\", struck && \"line-through\")} data-candidate-name=\"\" title={title}>\n {truncateAtWord(title, NAME_BUDGET)}\n {c.verified ? <BadgeCheckIcon className=\"ml-1 inline size-4 align-text-bottom text-primary\" aria-label=\"Verified\" data-candidate-verified=\"\" /> : null}\n </span>\n {line ? <span className=\"type-secondary truncate text-muted-foreground\" title={line}>{line}</span> : null}\n {c.platform ? <span className=\"type-secondary truncate text-muted-foreground\" title={c.platform} data-candidate-platform=\"\">{c.platform}</span> : null}\n {c.detail ? <span className=\"type-secondary truncate text-muted-foreground\" title={c.detail}>{c.detail}</span> : null}\n {c.bio ? <span className=\"type-secondary line-clamp-2 break-words text-muted-foreground\">{c.bio}</span> : null}\n </div>\n </div>\n );\n if (!peek) return who;\n return (\n <PeekHoverCard side=\"bottom\" align=\"start\" trigger={who}>\n <Peek size=\"sm\" record={peek} />\n </PeekHoverCard>\n );\n}\n\n/** What each surface says about the answer; the look follows from it. */\nexport type CandidateAnswer = DecisionControlProps[\"value\"];\n\nexport interface CandidateCardProps\n extends Pick<\n DecisionControlProps,\n \"value\" | \"onChange\" | \"wayOut\" | \"onWayOut\" | \"wayOutValue\" | \"onClear\" | \"onSkip\" | \"skipped\" | \"skipLabel\" | \"skippedLabel\" | \"labels\" | \"suggested\" | \"shortcuts\" | \"disabled\" | \"yesKinds\" | \"yesKind\" | \"onYesKind\" | \"pickerPlaceholder\"\n > {\n candidate: Candidate;\n /** Where the candidate came from, on hover (THE peek's record). */\n peek?: PeekRecord | null;\n /** `stage`: the focus stage that shows one candidate at a time (bigger picture, 44px answers). Default `card`. */\n size?: \"card\" | \"stage\";\n /** What the decision is about, for the screen reader (\"Is this you?\"). */\n \"aria-label\"?: string;\n /** Placement only (margin, width, a motion wrapper's layout); the card's look is not restyled from outside. */\n className?: string;\n /** The root's id. */\n id?: string;\n /** Content inside the card below the decision (an editor the answer opens, a note). */\n children?: React.ReactNode;\n /** Any `data-*` attribute lands on the root (`data-testid`, a host's hooks). */\n [dataAttribute: `data-${string}`]: string | number | boolean | undefined;\n}\n\n/**\n * One candidate and its decision. The decision is DecisionControl, so every card has the same three\n * words and the same way out; `onSkip` is required (no decision without a way out).\n */\nexport const CandidateCard = React.forwardRef<HTMLElement, CandidateCardProps>(function CandidateCard(\n { candidate, peek, size = \"card\", value, className, id, children, \"aria-label\": ariaLabel, ...rest },\n ref,\n) {\n // `data-*` goes to the root; everything else is the decision's.\n const dataAttrs: Record<string, unknown> = {};\n const decision: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(rest)) (k.startsWith(\"data-\") ? dataAttrs : decision)[k] = v;\n const d = decision as Omit<DecisionControlProps, \"value\" | \"size\" | \"aria-label\">;\n const stage = size === \"stage\";\n const name = titleOf(candidate);\n // A skipped card is undecided on purpose (DecisionControl: \"Skip for now\" leaves the item neither kept nor\n // rejected): Other is NOT pressed; the card says so with its own distinct skipped state.\n const skipped = Boolean(d.skipped) && value !== \"yes\" && value !== \"no\";\n const answer = skipped ? null : value;\n return (\n <article\n {...dataAttrs}\n ref={ref}\n id={id}\n data-candidate-card=\"\"\n data-candidate={candidate.id}\n data-answer={skipped ? \"skipped\" : (value ?? \"open\")}\n aria-label={ariaLabel ? `${ariaLabel} ${name}` : name}\n className={cn(\n \"flex min-w-0 flex-col rounded-xl border bg-card p-4 transition-colors\",\n stage ? \"gap-5\" : \"gap-4\",\n answer === \"yes\" && \"border-primary ring-1 ring-primary\",\n answer === \"no\" && \"border-dashed border-border bg-muted\",\n answer !== \"yes\" && answer !== \"no\" && \"border-border\",\n className,\n )}\n >\n <div className=\"flex min-w-0 items-start gap-2\">\n <CandidateIdentity candidate={candidate} size={stage ? \"stage\" : \"row\"} peek={peek} struck={answer === \"no\"} />\n <OpenCandidate href={candidate.href} name={name} />\n </div>\n <DecisionControl {...d} value={answer} size={stage ? \"stage\" : \"row\"} aria-label={`${ariaLabel ?? \"Is this the one?\"} ${name}`} />\n {skipped ? <Chip label={d.skippedLabel ?? \"Skipped for now\"} className=\"self-start\" data-candidate-skipped=\"\" /> : null}\n {children}\n </article>\n );\n});\n\nexport interface CandidatePickListProps {\n /** The list's question (\"Is one of these you?\"). */\n title: string;\n /** A quiet count or state on the right of the title (\"12 found\"). */\n status?: string | null;\n candidates: readonly Candidate[];\n /** The id picked (\"This one\"), or null. */\n pickedId: string | null;\n /** None of these was pressed (every candidate is out). */\n none?: boolean;\n onPick: (candidate: Candidate) => void;\n onNone: () => void;\n /** More candidates can be loaded: the button shows. */\n onMore?: () => void;\n /** More is loading. */\n busy?: boolean;\n /** Where each candidate came from (hover). */\n peekFor?: (candidate: Candidate) => PeekRecord | null | undefined;\n /**\n * Rows shown before the rest wait behind a control: the caller's `onMore` (More), or, with no `onMore`, the\n * list's own \"Show all N\" that reveals the rest in place. A layout choice of the caller. Default 12.\n */\n limit?: number;\n /** Replaces the empty state when there are no candidates. */\n empty?: React.ReactNode;\n className?: string;\n}\n\n/** \"This one\" per row, then \"None of these\" and \"More\": the pick-one answer. The pick is highlighted; the rest are marked `data-dimmed`, never faded. */\nexport function CandidatePickList({\n title,\n status,\n candidates,\n pickedId,\n none = false,\n onPick,\n onNone,\n onMore,\n busy,\n peekFor,\n limit = 12,\n empty,\n className,\n}: CandidatePickListProps) {\n const [expanded, setExpanded] = React.useState(false);\n const visible = expanded ? candidates.length : limit;\n const shown = candidates.slice(0, visible);\n // Nothing is ever hidden without a way to see it: with no loader the list reveals its own remainder.\n const hidden = candidates.length - shown.length;\n return (\n <div data-candidate-pick-list=\"\" className={cn(\"flex min-w-0 flex-col gap-1.5\", className)}>\n <RowGroup title={status ? `${title} · ${status}` : title} aria-label={title}>\n {shown.length === 0 ? (\n (empty ?? <EmptyState icon={<SearchIcon aria-hidden />} title=\"Nothing found yet\" />)\n ) : (\n shown.map((c) => {\n const on = pickedId === c.id;\n return (\n <div\n key={c.id}\n role=\"group\"\n aria-label={titleOf(c)}\n data-candidate={c.id}\n data-answer={on ? \"yes\" : \"open\"}\n data-dimmed={(pickedId !== null && !on) || none ? \"\" : undefined}\n className={cn(\"flex items-center gap-2 px-3 py-2\", on && \"bg-accent\")}\n >\n <CandidateIdentity candidate={c} peek={peekFor?.(c) ?? null} />\n <OpenCandidate href={c.href} name={titleOf(c)} />\n <Button variant={on ? \"primary\" : \"outline\"} icon={<CheckIcon aria-hidden />} pressed={on} aria-label={`This one: ${titleOf(c)}`} onClick={() => onPick(c)}>\n This one\n </Button>\n </div>\n );\n })\n )}\n <div className=\"flex flex-wrap gap-1.5 px-3 py-2\" data-candidate-way-out=\"\">\n <Button variant={none ? \"primary\" : \"quiet\"} icon={<XIcon aria-hidden />} pressed={none} onClick={onNone}>\n None of these\n </Button>\n {onMore ? (\n <Button variant=\"quiet\" icon={<ChevronDownIcon aria-hidden />} disabled={busy} onClick={onMore}>\n More\n </Button>\n ) : hidden > 0 ? (\n <Button variant=\"quiet\" icon={<ChevronDownIcon aria-hidden />} data-candidate-show-all=\"\" onClick={() => setExpanded(true)}>\n {`Show all ${candidates.length}`}\n </Button>\n ) : null}\n </div>\n </RowGroup>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * MediaOption — THE selectable option row that carries a picture: one whole-row press picks it. The picture\n * (a business photo, a logo) sits in a fixed square, 48px or bigger (the owner, 2026-10-22: \"The images need\n * to be bigger\"), so a row never shifts as the picture loads. AddTile — THE dashed \"add another\" tile: the\n * whole tile is one press target, never a small button floating inside a dashed box.\n *\n * WHY THIS EXISTS (one-canonical, 2026-10-22): the compare picker drew its pick-list rows with a plain\n * Button whose icon slot shrank the picture to 20px and flattened the rating to text, and its add tile as a\n * Button inside a dashed div (only the small button pressed). Both are now one named piece.\n *\n * THE CALLER RENDERS THE PICTURE; THIS PIECE RESERVES ITS SQUARE. Photos should cover-crop and be rounded,\n * logos stay raw (never tinted) — that is the picture component's rule (ItemLogo), not this row's.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { Tile } from \"./controls/surfaces\";\nimport { PlusIcon } from \"./icons\";\n\nexport type MediaOptionSize = 48 | 56 | 64;\n\nexport interface MediaOptionProps extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, \"title\"> {\n /** The picture, already sized to `size` by the caller. Decorative: the title names the option. */\n media: React.ReactNode;\n /** The option's name — wraps to two lines. */\n title: React.ReactNode;\n /** Quiet lines under the title (category, address) — one line each, cut with an ellipsis. */\n lines?: readonly React.ReactNode[];\n /** Under the lines: structured facts that are not text (a star rating glyph + number, a count). */\n facts?: React.ReactNode;\n /** The picture square, in px. Default 48 (the floor). */\n size?: MediaOptionSize;\n /** This is the picked option. */\n selected?: boolean;\n}\n\n/** One pickable row: picture, name, quiet lines, facts. The whole row is the button. */\nexport const MediaOption = React.forwardRef<HTMLButtonElement, MediaOptionProps>(function MediaOption(\n { media, title, lines, facts, size = 48, selected, className, type = \"button\", ...props },\n ref,\n) {\n return (\n <Tile\n ref={ref}\n type={type}\n data-media-option=\"\"\n {...(selected !== undefined ? { selected } : {})}\n className={cn(\"w-full min-w-0\", className)}\n variant=\"outline\"\n layout=\"row\"\n icon={<span data-media-option-media=\"\" className=\"flex shrink-0 items-center justify-center overflow-hidden rounded-lg\" style={{ width: size, height: size }} aria-hidden>{media}</span>}\n title={<span className=\"flex min-w-0 flex-col gap-0.5\"><span data-media-option-title=\"\" className=\"type-title line-clamp-2 break-words text-foreground\">{title}</span>{lines?.filter(Boolean).map((line, i) => <span key={i} className=\"type-secondary truncate text-muted-foreground\">{line}</span>)}{facts ? <span className=\"type-meta inline-flex items-center gap-1 text-muted-foreground\">{facts}</span> : null}</span>}\n {...props}\n />\n );\n});\n\nexport interface AddTileProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Replaces the plus glyph. */\n icon?: React.ReactNode;\n}\n\n/** The dashed \"add another\" tile: the whole tile is one button (fills its grid cell). */\nexport const AddTile = React.forwardRef<HTMLButtonElement, AddTileProps>(function AddTile(\n { icon, className, children, type = \"button\", ...props },\n ref,\n) {\n return (\n <Tile\n ref={ref}\n type={type}\n data-add-tile=\"\"\n layout=\"stack\"\n variant=\"outline\"\n dashed\n title={children}\n icon={icon ?? <PlusIcon aria-hidden />}\n className={cn(\"h-full min-h-40 w-full\", className)}\n {...props}\n />\n );\n});\n","\"use client\";\n\n/**\n * AssistPeek — THE assist card: one suggestion the platform offers a person, on THE peek.\n *\n * A composition of the peek's own parts, never a restyle (one UI system):\n *\n * ┌──────────────────────────────────────────────┐\n * │ 💡 Capture Titanium Success's colors… ✕ │ title on one line at the reference widths;\n * │ 90% · Oct 22 │ ✕ is \"Not now\"\n * │ ──────────────────────────────────────────── │\n * │ Reads titaniumsuccess.com for its colors… │ the explanation — the ONE block that wraps\n * │ ↳ Runs now and lands in Identity › Colors │ what the button will do, said before it runs\n * │ [a step the card opened: a note, a reason] │\n * │ ──────────────────────────────────────────── │\n * │ ⏲ 🔕 [Read my site] │ Later · Stop showing (menus) · the verb\n * └──────────────────────────────────────────────┘\n *\n * `xl` portrait (480px) holds a typical assist title (≈50 characters, p75 of live titles) on one line\n * beside its glyph and ✕; the height is the content's (`height=\"content\"`), so a two-line assist is a\n * small card. The card never runs anything by itself: only the verb button does (THE INTENTIONAL-ACTION\n * LAW). Data, persistence and the actions themselves are the host's; this file only draws.\n */\n\nimport * as React from \"react\";\nimport { Slot } from \"@radix-ui/react-slot\";\n\nimport { Button } from \"./controls/controls\";\nimport { BellOffIcon, ClockIcon, CornerDownRightIcon, ExternalLinkIcon, LightbulbIcon, XIcon } from \"./icons\";\nimport { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuLabel, DropdownMenuTrigger } from \"./dropdown-menu\";\nimport {\n PeekCard,\n PeekCardBody,\n PeekCardFooter,\n PeekCardHeader,\n PeekCardRow,\n PeekCardRows,\n PeekCardSection,\n PeekCardText,\n PeekHoverCard,\n type PeekCardPrimary,\n type PeekPresentation,\n} from \"./peek-card\";\nimport type { PeekActionDoor, PeekDoorMenuGroup, PeekDoors } from \"./peek-model\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\n/** What the producer saw, so the person can check the claim instead of trusting it. */\nexport interface AssistPeekEvidence {\n /** What it is (\"Search Console\", \"3 pages\"). */\n label: string;\n snippet?: string | undefined;\n items?: readonly string[] | undefined;\n /** The thing the evidence names, reachable (an app path or a web address). */\n href?: string | undefined;\n}\n\nexport interface AssistPeekCardProps {\n /** The assist's full title — the card's strongest line. */\n title: string;\n /** The glyph before the title (the urgency's, or the ambient assist glyph). */\n icon?: React.ComponentType<{ className?: string }> | undefined;\n /** One short line under the title: confidence · date, or the urgency's word. */\n subtitle?: string | undefined;\n /** The explanation: plain text, or the host's rendered markdown. */\n children?: React.ReactNode;\n /** The producer's reasoning, when it gave one. */\n why?: string | undefined;\n evidence?: AssistPeekEvidence | undefined;\n /** The person's own words from an earlier decision, when this assist came back. */\n yourNote?: string | undefined;\n /** What the primary will do, said before it runs. `null`: this app does not know the action. */\n explainer: string | null;\n /** The verb. Disabled on its own when `explainer` is `null`. */\n primary: PeekCardPrimary;\n /** \"Later\" choices (snooze windows). Omitted: no Later door (an assist that is not stored). */\n later?: readonly PeekDoorMenuGroup[] | undefined;\n /** \"Stop showing\" choices (this one, this kind for a while, this kind for good). */\n stopShowing?: readonly PeekDoorMenuGroup[] | undefined;\n /**\n * This assist in the full list (the host's All assists page, opened on it): a door beside the\n * verb that opens in a new tab.\n */\n openHref?: string | undefined;\n /** A Later or Stop showing choice is being saved. */\n deciding?: boolean | undefined;\n /** ✕ — not now. The host decides whether that only closes or also declines. */\n onNotNow: () => void;\n /**\n * What the ✕ says: `not-now` (default — a card opened from a chip) or `dismiss` (a card in the\n * tray, where one press gets rid of it).\n */\n closeAs?: \"not-now\" | \"dismiss\";\n /** A step the card opened in place (a note, a reason, an edit before approving): under the explanation. */\n step?: React.ReactNode;\n}\n\nexport function AssistPeekCard({\n title,\n icon: Icon,\n subtitle,\n children,\n why,\n evidence,\n yourNote,\n explainer,\n primary,\n later,\n stopShowing,\n deciding = false,\n openHref,\n onNotNow,\n closeAs = \"not-now\",\n step,\n}: AssistPeekCardProps) {\n const closeLabel = closeAs === \"dismiss\" ? \"Dismiss\" : \"Not now\";\n const laterDoor: PeekActionDoor | null = later?.length\n ? { kind: \"action\", id: \"later\", label: \"Later\", icon: ClockIcon, menu: later, busy: deciding }\n : null;\n const stopDoor: PeekActionDoor | null = stopShowing?.length\n ? { kind: \"action\", id: \"stop\", label: \"Stop showing\", icon: BellOffIcon, menu: stopShowing, busy: deciding }\n : null;\n const allDoor: PeekActionDoor | null = openHref\n ? { kind: \"action\", id: \"all\", label: \"Open in All assists\", icon: ExternalLinkIcon, href: openHref, newTab: true }\n : null;\n const present = [laterDoor, stopDoor, allDoor].filter((door): door is PeekActionDoor => door !== null);\n // At most three, and these are exactly three kinds: the tuple is the list as it stands.\n const doors = present as unknown as PeekDoors;\n return (\n <PeekCard size=\"xl\" height=\"content\" data-matrx-assist-peek=\"\" data-matrx-notice-surface=\"\">\n <PeekCardHeader\n title={title}\n leading={Icon ? <Icon /> : undefined}\n subtitle={subtitle}\n trailing={\n <Button type=\"button\" variant=\"quiet\" aria-label={closeLabel} title={closeLabel} icon={<XIcon />} disabled={Boolean(primary.busy) || deciding} onClick={onNotNow} />\n }\n />\n <PeekCardBody>\n {children ? (\n // The explanation is what the person came to read: 14px (the size the host's markdown\n // paragraphs draw at), one step above the card's secondary sections.\n <div data-matrx-assist-body=\"\" className=\"type-value min-w-0 break-words text-foreground\">\n {typeof children === \"string\" ? <p className=\"whitespace-pre-wrap\">{children}</p> : children}\n </div>\n ) : null}\n {why ? (\n <PeekCardSection label=\"Why\">\n <PeekCardText>{why}</PeekCardText>\n </PeekCardSection>\n ) : null}\n {evidence ? <EvidenceSection evidence={evidence} /> : null}\n {yourNote ? (\n <PeekCardSection label=\"Your note\">\n <PeekCardText>{yourNote}</PeekCardText>\n </PeekCardSection>\n ) : null}\n {explainer ? (\n // What pressing the verb will do, hung off a return arrow like a consequence.\n <PeekCardRow icon={CornerDownRightIcon} tone=\"muted\" wrap>\n {explainer}\n </PeekCardRow>\n ) : (\n <PeekCardSection label=\"Not available here\" tone=\"danger\">\n <PeekCardText>This version of the app does not know how to do this.</PeekCardText>\n </PeekCardSection>\n )}\n {step}\n </PeekCardBody>\n <PeekCardFooter\n primaryAt=\"end\"\n primary={{ ...primary, disabled: Boolean(primary.disabled) || explainer === null || deciding }}\n doors={doors}\n />\n </PeekCard>\n );\n}\n\nfunction EvidenceSection({ evidence }: { evidence: AssistPeekEvidence }) {\n const items = evidence.items ?? [];\n return (\n <PeekCardSection label=\"What we saw\">\n <PeekCardRows\n rows={[{ key: \"evidence\", text: evidence.label, title: evidence.label, href: evidence.href }]}\n />\n {evidence.snippet ? <PeekCardText clamp={4} breaks>{evidence.snippet}</PeekCardText> : null}\n {items.length ? (\n <PeekCardRows limit={6} rows={items.map((item, i) => ({ key: `${i}-${item}`, text: item, title: item }))} />\n ) : null}\n </PeekCardSection>\n );\n}\n\n// ── the host: hover to read, press to keep ──────────────────────────────────────────────────────\n\nexport interface AssistPeekHoverProps {\n /** The collapsed assist (a chip). A hover opens the card; a press opens it and keeps it. */\n trigger: React.ReactElement;\n /** The assist's title, for the phone drawer's accessible name. */\n label: string;\n side?: \"top\" | \"right\" | \"bottom\" | \"left\";\n align?: \"start\" | \"center\" | \"end\";\n presentation?: PeekPresentation;\n /** The card, given `close` (after an action, or Not now). */\n children: (close: () => void) => React.ReactNode;\n}\n\n/** A menu the card opened lives in another portal: a press there belongs to the card. */\nfunction inCardMenu(target: EventTarget | null): boolean {\n return target instanceof Element && target.closest(\"[data-radix-menu-content]\") !== null;\n}\n\n/**\n * THE assist host: THE hover peek, plus one rule an assist needs and a record peek does not. A press\n * inside the card (or on the chip) KEEPS it open until a press outside, Escape, or `close` — so a\n * person typing a note or a reason never loses the card by moving the pointer.\n */\nexport function AssistPeekHover({ trigger, label, side = \"top\", align = \"end\", presentation, children }: AssistPeekHoverProps) {\n const [hovered, setHovered] = React.useState(false);\n const [kept, setKept] = React.useState(false);\n const isMobile = useIsMobile();\n // On a phone the card is the bottom drawer: closing the drawer closes it, kept or not.\n const sheet = presentation === \"sheet\" || (presentation !== \"float\" && isMobile);\n const card = React.useRef<HTMLDivElement | null>(null);\n const close = React.useCallback(() => {\n setHovered(false);\n setKept(false);\n }, []);\n\n React.useEffect(() => {\n if (!kept) return;\n const onPress = (event: PointerEvent) => {\n if (card.current?.contains(event.target as Node) || inCardMenu(event.target)) return;\n close();\n };\n const onKey = (event: KeyboardEvent) => {\n // A menu the card opened takes Escape first; the card closes on the next one.\n if (event.key !== \"Escape\" || document.querySelector(\"[data-radix-menu-content]\")) return;\n close();\n };\n document.addEventListener(\"pointerdown\", onPress, true);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"pointerdown\", onPress, true);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [kept, close]);\n\n const keep = () => {\n setHovered(true);\n setKept(true);\n };\n\n return (\n <PeekHoverCard\n trigger={\n <Slot\n onClick={(event: React.MouseEvent) => {\n event.stopPropagation();\n keep();\n }}\n >\n {trigger}\n </Slot>\n }\n label={label}\n side={side}\n align={align}\n open={hovered || kept}\n onOpenChange={(next) => {\n setHovered(next);\n if (!next && (sheet || !kept)) close();\n }}\n {...(presentation ? { presentation } : {})}\n >\n <div ref={card} onPointerDownCapture={keep} onFocusCapture={keep}>\n {children(close)}\n </div>\n </PeekHoverCard>\n );\n}\n\n// ── the tray: a reminder that some are waiting, the cards on engagement ────────────────────────────\n\n/** The tray stays open this long after the pointer leaves it (the HoverCard close delay). */\nconst TRAY_CLOSE_MS = 300;\n/** A deliberate hover opens it (the HoverCard open floor). */\nconst TRAY_OPEN_MS = 500;\n\nexport interface AssistTrayProps {\n /** How many assists wait. The reminder shows the number; nothing renders at 0. */\n count: number;\n /** The cards (`AssistPeekCard` with `closeAs=\"dismiss\"`), most important first. */\n children: React.ReactNode;\n /** The ✕ on the reminder: gets rid of every assist for a while, in one press. */\n quickQuiet: { label: string; onQuiet: () => void };\n /** \"Quiet every assist for…\" choices, and anything else the tray's menu offers. */\n menu?: readonly PeekDoorMenuGroup[];\n /** The door to every assist (a link the host draws, with its own router). */\n allAssists?: React.ReactNode;\n /** The host's drag handle (the dock primitive's `onPointerDown`): the reminder is what moves. */\n onHandlePointerDown?: React.PointerEventHandler<HTMLElement>;\n /**\n * The host's placement marks on the reminder (the app's dock-clearance pass finds, measures and\n * moves THE reminder, never the open stack). The tray draws the two states it writes:\n * `data-assist-dock-pending` hides the reminder until its place has held, `data-assist-dock-yield`\n * fades it and lets the press through to the control beneath.\n */\n reminderAttributes?: Readonly<Record<`data-${string}`, string>>;\n /** Open from outside (a header row on a phone). Uncontrolled when omitted. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n}\n\n/**\n * THE assist tray: the floating reminder that assists are waiting — a lightbulb and a number, no\n * titles — and, when the person engages it (a deliberate hover, or a press that keeps it open),\n * the cards themselves stacked above it, each with its own one-press ✕. The reminder's own ✕\n * quiets them all for a while. A press outside or Escape closes the stack.\n */\nexport function AssistTray({ count, children, quickQuiet, menu, allAssists, onHandlePointerDown, reminderAttributes, open: openProp, onOpenChange }: AssistTrayProps) {\n const [hovered, setHovered] = React.useState(false);\n const [keptOwn, setKept] = React.useState(false);\n const kept = openProp ?? keptOwn;\n const open = kept || hovered;\n const box = React.useRef<HTMLDivElement | null>(null);\n const timer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n const clear = () => {\n if (timer.current) clearTimeout(timer.current);\n timer.current = null;\n };\n React.useEffect(() => clear, []);\n const setKeep = React.useCallback(\n (next: boolean) => {\n setKept(next);\n onOpenChange?.(next);\n if (!next) setHovered(false);\n },\n [onOpenChange],\n );\n const enter = () => {\n clear();\n if (!open) timer.current = setTimeout(() => setHovered(true), TRAY_OPEN_MS);\n };\n const leave = () => {\n clear();\n timer.current = setTimeout(() => {\n // A menu the tray opened lives in another portal: the pointer is still \"in\" the tray.\n if (document.querySelector(\"[data-radix-menu-content]\")) return;\n setHovered(false);\n }, TRAY_CLOSE_MS);\n };\n\n React.useEffect(() => {\n if (!kept) return;\n const onPress = (event: PointerEvent) => {\n if (box.current?.contains(event.target as Node) || inCardMenu(event.target)) return;\n setKeep(false);\n };\n const onKey = (event: KeyboardEvent) => {\n if (event.key !== \"Escape\" || document.querySelector(\"[data-radix-menu-content]\")) return;\n setKeep(false);\n };\n document.addEventListener(\"pointerdown\", onPress, true);\n document.addEventListener(\"keydown\", onKey);\n return () => {\n document.removeEventListener(\"pointerdown\", onPress, true);\n document.removeEventListener(\"keydown\", onKey);\n };\n }, [kept, setKeep]);\n\n if (count <= 0) return null;\n const label = `${count} assist${count === 1 ? \"\" : \"s\"}`;\n return (\n <div\n ref={box}\n data-matrx-assist-tray=\"\"\n data-open={open ? \"\" : undefined}\n // The box itself takes no presses (a yielded reminder must let them through); its parts do.\n // Docked in a header slot (the app's clearance pass marks the root), the stack opens DOWN.\n className=\"pointer-events-none flex flex-col items-end gap-2 [:root[data-assist-dock-slot=header]_&]:flex-col-reverse\"\n onMouseEnter={enter}\n onMouseLeave={leave}\n onPointerDownCapture={(event) => {\n // A press on a card keeps the stack (typing a note must never lose it).\n if ((event.target as Element).closest(\"[data-matrx-assist-peek]\")) setKeep(true);\n }}\n >\n {open ? (\n <div data-matrx-assist-tray-stack=\"\" className=\"matrx-peek-scroll pointer-events-auto flex max-h-[min(70dvh,640px)] flex-col items-end gap-2 overflow-y-auto\">\n {/* Each card keeps its whole height: the stack scrolls, a card never shrinks to fit. */}\n {React.Children.map(children, (child) => (child ? <div className=\"shrink-0\">{child}</div> : null))}\n {allAssists || menu?.length ? (\n <div className=\"flex shrink-0 items-center rounded-md border border-border bg-popover shadow-md\">\n {allAssists}\n {menu?.length ? <TrayMenu menu={menu} /> : null}\n </div>\n ) : null}\n </div>\n ) : null}\n <div\n data-matrx-assist-tray-reminder=\"\"\n {...reminderAttributes}\n className=\"group pointer-events-auto flex items-center rounded-md border border-border bg-popover shadow-md transition-opacity data-[assist-dock-pending]:invisible data-[assist-dock-yield]:pointer-events-none data-[assist-dock-yield]:invisible\"\n onPointerDown={onHandlePointerDown}\n >\n <Button\n type=\"button\"\n variant=\"quiet\"\n icon={<LightbulbIcon />}\n glyphTone=\"primary\"\n aria-label={open ? `Hide ${label}` : `Show ${label}`}\n aria-expanded={open}\n title={label}\n onClick={() => setKeep(!kept)}\n >\n {String(count)}\n </Button>\n <Button\n type=\"button\"\n variant=\"quiet\"\n removes\n icon={<XIcon />}\n aria-label={quickQuiet.label}\n title={quickQuiet.label}\n onClick={() => {\n setKeep(false);\n quickQuiet.onQuiet();\n }}\n />\n </div>\n </div>\n );\n}\n\nfunction TrayMenu({ menu }: { menu: readonly PeekDoorMenuGroup[] }) {\n return (\n <DropdownMenu modal={false}>\n <DropdownMenuTrigger asChild>\n <Button type=\"button\" variant=\"quiet\" icon={<BellOffIcon />}>\n Quiet\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\">\n {menu.map((group, i) => (\n <React.Fragment key={`${group.label ?? \"\"}-${i}`}>\n {group.label ? <DropdownMenuLabel>{group.label}</DropdownMenuLabel> : null}\n {group.items.map((item) => (\n <DropdownMenuItem key={item.key} {...(item.tone ? { tone: item.tone } : {})} onSelect={() => item.onSelect()}>\n {item.label}\n </DropdownMenuItem>\n ))}\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n","\"use client\";\n\n/**\n * RadioGroup — single-choice selection (30 host import sites).\n *\n * Ported from matrx-frontend `components/ui/radio-group.tsx`, with the same\n * two corrections the rest of this wave carries:\n *\n * 1. DENSITY IS A PROP (C18) — `size=\"sm|md|lg\"` on the ROOT, read from\n * context by every item, so a group cannot mix control sizes. Matches the\n * `Checkbox` / `Switch` / `Card` shape already shipped in 0.5.0.\n *\n * 2. THE TARGET IS 44px ON COARSE POINTERS. A 16px radio is a mouse control;\n * an invisible pseudo-target expands the hit area without changing layout,\n * so a settings list works with a thumb. (A label wired via `htmlFor` also\n * extends the target — that stays the host's composition choice; this makes\n * the control itself usable on its own.)\n *\n * The indicator is a filled dot rather than Radix's default icon slot, which\n * is what every host variant drew.\n */\n\nimport * as RadioGroupPrimitive from \"@radix-ui/react-radio-group\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport type RadioGroupSize = \"sm\" | \"md\" | \"lg\";\n\nconst RadioGroupSizeContext = React.createContext<RadioGroupSize>(\"md\");\n\nconst CONTROL_CLASSES: Record<RadioGroupSize, string> = {\n sm: \"h-3.5 w-3.5\",\n md: \"h-4 w-4\",\n lg: \"h-5 w-5\",\n};\n\nconst DOT_CLASSES: Record<RadioGroupSize, string> = {\n sm: \"h-1 w-1\",\n md: \"h-1.5 w-1.5\",\n lg: \"h-2 w-2\",\n};\n\nexport interface RadioGroupProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Root> {\n /** Control scale for every item in the group. Default `md`. */\n size?: RadioGroupSize;\n}\n\nconst RadioGroup = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Root>,\n RadioGroupProps\n>(({ className, size = \"md\", ...props }, ref) => (\n <RadioGroupSizeContext.Provider value={size}>\n <RadioGroupPrimitive.Root\n ref={ref}\n data-slot=\"radio-group\"\n className={cn(\"grid gap-2\", className)}\n {...props}\n />\n </RadioGroupSizeContext.Provider>\n));\nRadioGroup.displayName = RadioGroupPrimitive.Root.displayName;\n\nexport interface RadioGroupItemProps\n extends React.ComponentPropsWithoutRef<typeof RadioGroupPrimitive.Item> {\n /** Override the group's scale for one item. */\n size?: RadioGroupSize;\n}\n\nconst RadioGroupItem = React.forwardRef<\n React.ComponentRef<typeof RadioGroupPrimitive.Item>,\n RadioGroupItemProps\n>(({ className, size, ...props }, ref) => {\n const groupSize = React.useContext(RadioGroupSizeContext);\n const resolved = size ?? groupSize;\n return (\n <RadioGroupPrimitive.Item\n ref={ref}\n data-slot=\"radio-group-item\"\n className={cn(\n \"relative aspect-square shrink-0 rounded-full border border-primary shadow\",\n \"focus:outline-none focus-visible:ring-1 focus-visible:ring-ring\",\n \"disabled:cursor-not-allowed disabled:opacity-50\",\n \"data-[state=checked]:border-primary data-[state=checked]:bg-primary\",\n // Ruling 2 — invisible 44px target on touch, layout untouched.\n \"after:absolute after:left-1/2 after:top-1/2 after:-translate-x-1/2 after:-translate-y-1/2 after:content-['']\",\n \"pointer-coarse:after:h-11 pointer-coarse:after:w-11\",\n CONTROL_CLASSES[resolved],\n className,\n )}\n {...props}\n >\n <RadioGroupPrimitive.Indicator className=\"flex items-center justify-center\">\n <div\n className={cn(\"rounded-full bg-primary-foreground\", DOT_CLASSES[resolved])}\n />\n </RadioGroupPrimitive.Indicator>\n </RadioGroupPrimitive.Item>\n );\n});\nRadioGroupItem.displayName = RadioGroupPrimitive.Item.displayName;\n\nexport { RadioGroup, RadioGroupItem };\n\nexport interface RadioListOption<T extends string> {\n value: T;\n label: React.ReactNode;\n /** A short muted fact at the row's end (a count, a size) — never a sentence. */\n hint?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface RadioListProps<T extends string> {\n value: T;\n onChange: (value: T) => void;\n options: readonly RadioListOption<T>[];\n size?: RadioGroupSize;\n className?: string;\n \"aria-label\"?: string;\n}\n\n/**\n * A single-choice LIST: one full-width row per option (the whole row is the target), the radio at\n * the start, the label truncating, an optional hint at the end. Moved from matrx-frontend\n * `components/official/filter-panel` (`RadioSelect`) onto the package's RadioGroup, so keyboard\n * arrows, focus ring and the 44px coarse-pointer target come from the one radio.\n */\nfunction RadioList<T extends string>({\n value,\n onChange,\n options,\n size = \"sm\",\n className,\n \"aria-label\": ariaLabel,\n}: RadioListProps<T>) {\n const baseId = React.useId();\n return (\n <RadioGroup\n value={value}\n onValueChange={(v) => onChange(v as T)}\n size={size}\n aria-label={ariaLabel}\n className={cn(\"flex flex-col gap-0\", className)}\n >\n {options.map((opt, i) => {\n const selected = value === opt.value;\n const id = `${baseId}-${i}`;\n return (\n <label\n key={opt.value}\n htmlFor={id}\n data-selected={selected ? \"\" : undefined}\n className={cn(\n \"flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-left text-sm transition-colors\",\n selected\n ? \"bg-primary/10 font-medium text-primary-ink\"\n : \"text-muted-foreground hover:bg-muted hover:text-foreground\",\n opt.disabled && \"cursor-not-allowed text-disabled-foreground\",\n )}\n >\n <RadioGroupItem id={id} value={opt.value} disabled={opt.disabled} />\n <span className=\"flex-1 truncate\">{opt.label}</span>\n {opt.hint != null && opt.hint !== \"\" ? (\n <span className=\"shrink-0 text-xs tabular-nums text-muted-foreground\">{opt.hint}</span>\n ) : null}\n </label>\n );\n })}\n </RadioGroup>\n );\n}\n\nexport { RadioList };\n","\"use client\";\n\n/**\n * Toggle / ToggleGroup — the pressed-state control and its exclusive or\n * multiple group (10 host import sites between them).\n *\n * Ported from matrx-frontend `components/ui/toggle.tsx` +\n * `components/ui/toggle-group.tsx`. They ship as ONE module because\n * `ToggleGroupItem` reads `toggleVariants` and the group's variant CONTEXT:\n * the two host files were a circular pair held together by an import, and a\n * host copy of a React context is the quiet twin this package has already been\n * bitten by (`useContext` matches by object identity, so two look-alike\n * contexts silently never see each other). One module, one context.\n *\n * `Toggle` is NOT `Switch`. A Switch states a setting (\"notifications: on\")\n * and applies immediately; a Toggle is a pressed button in a toolbar (\"bold\").\n * Reach for `SegmentedControl` when the choice is between labeled options\n * rather than on/off.\n *\n * Density is `size=\"sm|default|lg\"`, declared on the group and inherited by\n * every item, so a toolbar cannot mix button heights.\n */\n\nimport * as ToggleGroupPrimitive from \"@radix-ui/react-toggle-group\";\nimport * as TogglePrimitive from \"@radix-ui/react-toggle\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium transition-colors hover:bg-muted hover:text-muted-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring disabled:opacity-50 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-transparent\",\n outline:\n \"border border-input bg-transparent shadow-sm hover:bg-accent hover:text-accent-foreground\",\n /**\n * A square on/off switch (the conversation sidebar's bucket and mode icons): off is an\n * outlined glyph in muted ink, on is filled primary. On and off never read as two grays.\n */\n switch:\n \"border border-input bg-transparent text-muted-foreground hover:bg-muted hover:text-foreground data-[state=on]:border-primary data-[state=on]:bg-primary data-[state=on]:text-primary-foreground data-[state=on]:hover:bg-primary data-[state=on]:hover:text-primary-foreground\",\n },\n size: {\n default: \"h-9 min-w-9 px-3\",\n sm: \"h-8 min-w-8 px-2\",\n lg: \"h-10 min-w-10 px-3\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\nexport interface ToggleProps\n extends React.ComponentPropsWithoutRef<typeof TogglePrimitive.Root>,\n VariantProps<typeof toggleVariants> {}\n\nconst Toggle = React.forwardRef<\n React.ComponentRef<typeof TogglePrimitive.Root>,\n ToggleProps\n>(({ className, variant, size, ...props }, ref) => (\n <TogglePrimitive.Root\n ref={ref}\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size }), className)}\n {...props}\n />\n));\nToggle.displayName = TogglePrimitive.Root.displayName;\n\nconst ToggleGroupContext = React.createContext<\n VariantProps<typeof toggleVariants>\n>({ size: \"default\", variant: \"default\" });\n\nexport type ToggleGroupProps = React.ComponentPropsWithoutRef<\n typeof ToggleGroupPrimitive.Root\n> &\n VariantProps<typeof toggleVariants>;\n\nconst ToggleGroup = React.forwardRef<\n React.ComponentRef<typeof ToggleGroupPrimitive.Root>,\n ToggleGroupProps\n>(({ className, variant, size, children, ...props }, ref) => (\n <ToggleGroupPrimitive.Root\n ref={ref}\n data-slot=\"toggle-group\"\n className={cn(\"flex items-center justify-center gap-1\", className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size }}>\n {children}\n </ToggleGroupContext.Provider>\n </ToggleGroupPrimitive.Root>\n));\nToggleGroup.displayName = ToggleGroupPrimitive.Root.displayName;\n\nexport interface ToggleGroupItemProps\n extends React.ComponentPropsWithoutRef<typeof ToggleGroupPrimitive.Item>,\n VariantProps<typeof toggleVariants> {}\n\nconst ToggleGroupItem = React.forwardRef<\n React.ComponentRef<typeof ToggleGroupPrimitive.Item>,\n ToggleGroupItemProps\n>(({ className, children, variant, size, ...props }, ref) => {\n const context = React.useContext(ToggleGroupContext);\n return (\n <ToggleGroupPrimitive.Item\n ref={ref}\n data-slot=\"toggle-group-item\"\n className={cn(\n toggleVariants({\n variant: context.variant ?? variant,\n size: context.size ?? size,\n }),\n className,\n )}\n {...props}\n >\n {children}\n </ToggleGroupPrimitive.Item>\n );\n});\nToggleGroupItem.displayName = ToggleGroupPrimitive.Item.displayName;\n\nexport { Toggle, ToggleGroup, ToggleGroupItem, toggleVariants };\n","\"use client\";\n\n/**\n * FloatingDock — a row of round link icons that grow toward the pointer (desktop) and fold into a\n * full-screen menu list (phone). Moved from matrx-frontend `components/official/FloatingDock` +\n * `BalancedFloatingDock` (wave 3, 2026-10-22) and collapsed into ONE dock: the two differed only in\n * how far the icons grow and where the label sits, which are now `growthFactor` and `labelPosition`.\n *\n * - Links draw through `HostLink` (the registered tap-target link), so a host's own link door applies.\n * - Icons are the package's Lucide glyphs; the caller's item icons are theirs.\n * - Motion: the phone menu slides on the panel pair (`PANEL_MOTION_CLASS`, closed stays mounted and\n * `inert`); the pointer magnification is small UI motion on the fast token, a CSS transition on\n * width/height (no spring library) that is off under reduced motion.\n */\n\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { HostLink } from \"./host-link\";\nimport { ChevronRightIcon, PanelTopCloseIcon, PanelTopOpenIcon, XIcon } from \"./icons\";\nimport { Button } from \"./controls/controls\";\nimport { PANEL_MOTION_CLASS } from \"./motion\";\n\nexport interface FloatingDockItem {\n label: string;\n icon: React.ReactNode;\n href: string;\n}\n\nexport interface FloatingDockProps {\n items: FloatingDockItem[];\n className?: string;\n /** How far the icon under the pointer grows: 1 = not at all, 2 = double. */\n growthFactor?: number;\n /** Where the hover label sits: above the icon, beside it (to the right) or below it. */\n labelPosition?: \"top\" | \"side\" | \"bottom\";\n}\n\nconst BASE_SIZE = 40;\nconst BASE_ICON = 20;\nconst REACH = 150;\n/** Size at `distance` px from the pointer: BASE far away, `base * growth` right under it, linear between. */\nexport function dockSize(base: number, growth: number, distance: number): number {\n const near = Math.max(0, 1 - Math.abs(distance) / REACH);\n return base + (base * growth - base) * near;\n}\n\nconst LABEL_CLASS: Record<NonNullable<FloatingDockProps[\"labelPosition\"]>, string> = {\n top: \"bottom-full left-1/2 mb-1 -translate-x-1/2\",\n bottom: \"top-full left-1/2 mt-1 -translate-x-1/2\",\n side: \"left-full top-1/2 ml-2 -translate-y-1/2\",\n};\n\nconst MAGNIFY_MOTION =\n \"duration-(--matrx-motion-duration-fast) ease-(--matrx-motion-ease-panel) motion-reduce:transition-none\";\n\nexport function FloatingDock({\n items,\n className,\n growthFactor = 2,\n labelPosition = \"top\",\n}: FloatingDockProps) {\n // Both render; CSS picks (phone `md:hidden`, desktop `hidden md:flex`) so the server's first paint is\n // right at every width.\n return (\n <div className={cn(\"flex w-auto items-center justify-center bg-background\", className)}>\n <FloatingDockPhone items={items} />\n <FloatingDockDesktop items={items} growthFactor={growthFactor} labelPosition={labelPosition} />\n </div>\n );\n}\n\n/** The balanced preset: icons grow a little less and the label sits beside the icon. */\nexport function BalancedFloatingDock(props: FloatingDockProps) {\n return <FloatingDock growthFactor={1.8} labelPosition=\"side\" {...props} />;\n}\n\nfunction FloatingDockPhone({ items }: { items: FloatingDockItem[] }) {\n const [open, setOpen] = React.useState(false);\n return (\n <div className=\"relative block md:hidden\">\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label={open ? \"Close menu\" : \"Open menu\"}\n icon={open ? <PanelTopCloseIcon className=\"h-5 w-5\" /> : <PanelTopOpenIcon className=\"h-5 w-5\" />}\n aria-expanded={open}\n onClick={() => setOpen(!open)}\n />\n {/* Closed stays mounted and inert: the slide needs it there, and it keeps no tab stops. */}\n <div\n data-open={open}\n inert={!open}\n className={cn(\n \"fixed inset-0 z-50 bg-background transition-transform\",\n PANEL_MOTION_CLASS,\n open ? \"translate-y-0\" : \"pointer-events-none -translate-y-full\",\n )}\n >\n <div className=\"flex h-full flex-col\">\n <div className=\"flex items-center justify-between border-b border-border p-4\">\n <h2 className=\"text-lg font-medium\">Menu</h2>\n <Button\n type=\"button\"\n variant=\"quiet\"\n aria-label=\"Close menu\"\n icon={<XIcon className=\"h-6 w-6\" />}\n onClick={() => setOpen(false)}\n />\n </div>\n <div className=\"flex-1 overflow-y-auto\">\n {items.map((item) => (\n <HostLink\n key={item.label}\n href={item.href}\n className=\"flex items-center justify-between border-b border-border p-4\"\n onClick={() => setOpen(false)}\n >\n <div className=\"flex items-center space-x-4\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-muted\">\n <div className=\"h-5 w-5 [&>svg]:h-full [&>svg]:w-full\">{item.icon}</div>\n </div>\n <span className=\"font-medium\">{item.label}</span>\n </div>\n <ChevronRightIcon className=\"h-5 w-5 text-muted-foreground\" />\n </HostLink>\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n}\n\nfunction FloatingDockDesktop({\n items,\n growthFactor,\n labelPosition,\n}: {\n items: FloatingDockItem[];\n growthFactor: number;\n labelPosition: NonNullable<FloatingDockProps[\"labelPosition\"]>;\n}) {\n const circles = React.useRef<Array<HTMLDivElement | null>>([]);\n // The pointer's x (viewport) while it is over the dock, else none; each circle's centre at that moment.\n const [pointerX, setPointerX] = React.useState<number | null>(null);\n const [centers, setCenters] = React.useState<number[]>([]);\n\n const measure = (x: number) => {\n setPointerX(x);\n setCenters(\n items.map((_, i) => {\n const b = circles.current[i]?.getBoundingClientRect();\n return b ? b.x + b.width / 2 : Number.POSITIVE_INFINITY;\n }),\n );\n };\n\n return (\n <div\n onMouseMove={(e) => measure(e.clientX)}\n onMouseLeave={() => setPointerX(null)}\n className={cn(\n \"mx-auto hidden h-14 gap-2 rounded-2xl bg-background px-3 py-2 md:flex\",\n labelPosition === \"top\" ? \"items-end\" : \"items-center\",\n )}\n >\n {items.map((item, i) => {\n const distance =\n pointerX === null ? Number.POSITIVE_INFINITY : pointerX - (centers[i] ?? Number.POSITIVE_INFINITY);\n const size = dockSize(BASE_SIZE, growthFactor, distance);\n const icon = dockSize(BASE_ICON, growthFactor, distance);\n const under = Number.isFinite(distance) && Math.abs(distance) < BASE_SIZE / 2;\n return (\n <HostLink key={item.label} href={item.href} aria-label={item.label}>\n <div className=\"relative\">\n <div\n ref={(el) => {\n circles.current[i] = el;\n }}\n style={{ width: size, height: size }}\n className={cn(\n \"relative flex aspect-square items-center justify-center rounded-full bg-muted transition-[width,height]\",\n MAGNIFY_MOTION,\n )}\n >\n <div\n style={{ width: icon, height: icon }}\n className={cn(\n \"flex items-center justify-center transition-[width,height] [&>svg]:h-full [&>svg]:w-full\",\n MAGNIFY_MOTION,\n )}\n >\n {item.icon}\n </div>\n </div>\n <div\n data-shown={under}\n aria-hidden\n className={cn(\n \"type-secondary pointer-events-none absolute z-50 w-fit whitespace-pre rounded-md bg-muted px-2 py-1 text-foreground shadow-sm transition-opacity\",\n MAGNIFY_MOTION,\n under ? \"opacity-100\" : \"opacity-0\",\n LABEL_CLASS[labelPosition],\n )}\n >\n {item.label}\n </div>\n </div>\n </HostLink>\n );\n })}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * deferredDialog — a dialog whose BODY loads the first time it opens.\n *\n * The root entry (`@ai-matrx/design-system`) is imported by nearly every screen, so anything it reaches\n * statically lands in every app's first load. A request dialog (manual copy, auth gate, text input, ...)\n * draws nothing until it opens, so the root exports this light wrapper and the body lives in its own\n * entry (`@ai-matrx/design-system/clipboard-fallback-dialog`, ...). A summon overlay render imports the\n * body entry directly and never pays for the wrapper.\n *\n * - closed and never opened: renders nothing and loads nothing;\n * - first open: loads the body (one small chunk) and draws it; until it arrives, nothing (the same\n * frame a closed dialog draws);\n * - after that it stays mounted, so the body's own close animation and state behave exactly as before.\n *\n * Guarded by `src/root-entry-has-no-dialog-bodies.test.ts` (source graph) and\n * `scripts/check-root-has-no-dialog-bodies.mjs` (built dist, run by `pnpm build`).\n */\n\nimport * as React from \"react\";\n\nexport type DeferredDialog<P extends object> = React.FC<P> & {\n /** Start loading the body now (a host may call it on hover or idle). */\n preload: () => Promise<unknown>;\n};\n\nexport function deferredDialog<P extends object>(\n name: string,\n load: () => Promise<React.ComponentType<P>>,\n isOpen: (props: P) => boolean,\n): DeferredDialog<P> {\n let pending: Promise<{ default: React.ComponentType<P> }> | null = null;\n const preload = () => (pending ??= load().then((component) => ({ default: component })));\n const Body = React.lazy(preload) as unknown as React.ComponentType<P>;\n\n function Deferred(props: P) {\n const open = isOpen(props);\n const [opened, setOpened] = React.useState(open);\n if (open && !opened) setOpened(true);\n if (!open && !opened) return null;\n return (\n <React.Suspense fallback={null}>\n <Body {...props} />\n </React.Suspense>\n );\n }\n Deferred.displayName = name;\n return Object.assign(Deferred, { preload });\n}\n","\"use client\";\n\n/**\n * The root entry's request dialogs: each is a `deferredDialog` whose body is its own entry, so the\n * root (in every app's first load) carries none of them. Import a body directly from its entry when\n * you draw it inside something that is already lazy (a summon overlay render):\n *\n * import { ClipboardFallbackDialog } from \"@ai-matrx/design-system/clipboard-fallback-dialog\";\n *\n * Only `import type` from a body file is allowed here; a value import would put the body back in the\n * root (guarded by root-entry-has-no-dialog-bodies.test.ts and check-root-has-no-dialog-bodies.mjs).\n */\n\nimport { deferredDialog } from \"./deferred-dialog\";\nimport type { AuthGateDialogProps } from \"./auth-gate-dialog\";\nimport type { ClipboardFallbackDialogProps } from \"./clipboard-fallback-dialog\";\nimport type { EmailInputDialogProps } from \"./email-input-dialog\";\nimport type { SandboxGateDialogProps } from \"./sandbox-gate-dialog\";\nimport type { ScopeMismatchDialogProps } from \"./scope-mismatch-dialog\";\nimport type { TextInputDialogProps } from \"./text-input-dialog\";\nimport type { ValuePromptsDialogProps } from \"./value-prompts-dialog\";\n\nexport const ClipboardFallbackDialog = deferredDialog<ClipboardFallbackDialogProps>(\n \"ClipboardFallbackDialog\",\n () => import(\"./clipboard-fallback-dialog\").then((m) => m.ClipboardFallbackDialog),\n (p) => p.open,\n);\n\nexport const AuthGateDialog = deferredDialog<AuthGateDialogProps>(\n \"AuthGateDialog\",\n () => import(\"./auth-gate-dialog\").then((m) => m.AuthGateDialog),\n (p) => p.isOpen,\n);\n\nexport const EmailInputDialog = deferredDialog<EmailInputDialogProps>(\n \"EmailInputDialog\",\n () => import(\"./email-input-dialog\").then((m) => m.EmailInputDialog),\n (p) => p.isOpen,\n);\n\nexport const SandboxGateDialog = deferredDialog<SandboxGateDialogProps>(\n \"SandboxGateDialog\",\n () => import(\"./sandbox-gate-dialog\").then((m) => m.SandboxGateDialog),\n (p) => p.open,\n);\n\nexport const ScopeMismatchDialog = deferredDialog<ScopeMismatchDialogProps>(\n \"ScopeMismatchDialog\",\n () => import(\"./scope-mismatch-dialog\").then((m) => m.ScopeMismatchDialog),\n (p) => p.open,\n);\n\nexport const ValuePromptsDialog = deferredDialog<ValuePromptsDialogProps>(\n \"ValuePromptsDialog\",\n () => import(\"./value-prompts-dialog\").then((m) => m.ValuePromptsDialog),\n (p) => p.open,\n);\n\nexport const TextInputDialog = deferredDialog<TextInputDialogProps>(\n \"TextInputDialog\",\n () => import(\"./text-input-dialog\").then((m) => m.TextInputDialog),\n (p) => p.open,\n);\n","\"use client\";\n\n/**\n * `<ClipboardFallbackHost />` — render ONCE near the root (beside `<ConfirmDialogHost />`) so\n * `openClipboardFallback()` from `@ai-matrx/kit/clipboard-fallback-opener` always has a dialog to show.\n * The opener is kit's (pure TS); this is the body: `ClipboardFallbackDialog` for the active request.\n */\nimport { clipboardFallbackOpener } from \"@ai-matrx/kit/clipboard-fallback-opener\";\nimport { useOpenerHost } from \"@ai-matrx/kit/opener-react\";\n\n// The deferred wrapper: mounted at the root, the host must not carry the dialog body into first load.\nimport { ClipboardFallbackDialog } from \"./deferred-dialogs\";\n\nexport function ClipboardFallbackHost() {\n const { open, shown, settle } = useOpenerHost(clipboardFallbackOpener);\n return (\n <ClipboardFallbackDialog\n open={open}\n onOpenChange={(next) => {\n if (!next) settle(undefined);\n }}\n url={shown?.text ?? \"\"}\n {...(shown?.title ? { title: shown.title } : {})}\n {...(shown?.description ? { description: shown.description } : {})}\n />\n );\n}\n","\"use client\";\nimport React, { useState, useEffect, type ReactNode, useCallback, useRef } from \"react\";\nimport { PANEL_MOTION_CLASS } from \"./motion\";\n\n// Define type for the component props\n// Moved from matrx-frontend components/official/FloatingSheet (chat host slots, 2026-10-08).\nexport interface FloatingSheetProps {\n children: ReactNode;\n isOpen: boolean;\n onClose: () => void;\n title?: string | ReactNode;\n description?: string | ReactNode;\n footer?: ReactNode;\n footerContent?: ReactNode; // Alternative to footer for consistency with headerContent\n headerContent?: ReactNode; // Additional content to render in the header\n position?: \"right\" | \"left\" | \"top\" | \"bottom\" | \"center\";\n showCloseButton?: boolean;\n closeOnBackdropClick?: boolean;\n closeOnEsc?: boolean; // Close the sheet when ESC key is pressed\n /**\n * The sheet holds unsent work (a composer draft): Escape and a backdrop\n * click are consumed and the sheet stays open, so a stray key or click\n * never discards it. The close button and the caller's own close still work.\n */\n holdsUnsentWork?: boolean;\n width?: \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"4xl\" | \"full\";\n height?: \"auto\" | \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\" | \"3xl\" | \"4xl\" | \"full\";\n spacing?: string;\n rounded?: string;\n className?: string;\n contentClassName?: string;\n headerClassName?: string; // Class name for the header\n footerClassName?: string; // Class name for the footer\n backdropClassName?: string; // Class name for the backdrop\n initialFocus?: boolean; // Automatically focus the sheet when opened\n lockScroll?: boolean; // Whether to lock body scroll when opened\n preserveScrollPosition?: boolean; // Preserve scroll position when reopening\n closeButton?: ReactNode; // Custom close button element\n role?: string; // ARIA role (defaults to \"dialog\")\n hasBackdrop?: boolean; // Whether to show a backdrop behind the sheet\n onBackdropClick?: () => void; // Handler for backdrop clicks\n isMobile?: boolean; // Flag to enable mobile-friendly mode\n respectHeader?: boolean; // Whether to position below the app header (default: true)\n}\n\nexport const FloatingSheet: React.FC<FloatingSheetProps> = ({\n children,\n isOpen,\n onClose,\n title = \"Sheet Title\",\n description,\n footer,\n footerContent,\n headerContent,\n position = \"right\",\n showCloseButton = true,\n closeOnBackdropClick = true,\n closeOnEsc = true,\n holdsUnsentWork = false,\n width = \"md\",\n height = \"auto\",\n spacing = \"0\",\n rounded = \"2xl\",\n className = \"\",\n contentClassName = \"\",\n headerClassName = \"\",\n footerClassName = \"\",\n backdropClassName = \"\",\n initialFocus = true,\n lockScroll = true,\n preserveScrollPosition = true,\n closeButton,\n role = \"dialog\",\n hasBackdrop = true,\n onBackdropClick,\n isMobile = false,\n respectHeader = true, // Default to true - sheets should respect the header by default\n}) => {\n // Create a state to track if the component has been initially rendered\n const [hasRendered, setHasRendered] = useState(false);\n // Refs for focusing and scroll preservation\n const sheetRef = useRef<HTMLDivElement>(null);\n const contentRef = useRef<HTMLDivElement>(null);\n const [scrollPosition, setScrollPosition] = useState(0);\n \n // Handle initial render\n useEffect(() => {\n if (!hasRendered) {\n setHasRendered(true);\n }\n }, []);\n \n // Handle body scroll locking when sheet is open\n useEffect(() => {\n if (!lockScroll) return undefined;\n if (isOpen) {\n // Store current scroll position before locking\n const scrollY = window.scrollY;\n document.body.style.position = \"fixed\";\n document.body.style.width = \"100%\";\n document.body.style.top = `-${scrollY}px`;\n document.body.style.overflow = \"hidden\";\n } else {\n // Restore scroll position after unlocking\n const scrollY = document.body.style.top;\n document.body.style.position = \"\";\n document.body.style.width = \"\";\n document.body.style.top = \"\";\n document.body.style.overflow = \"\";\n if (scrollY) {\n window.scrollTo(0, parseInt(scrollY || \"0\", 10) * -1);\n }\n }\n return () => {\n document.body.style.position = \"\";\n document.body.style.width = \"\";\n document.body.style.top = \"\";\n document.body.style.overflow = \"\";\n };\n }, [isOpen, lockScroll]);\n \n // Handle ESC key press\n useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n // One Escape closes ONE layer: a menu, sheet or dialog open inside\n // this sheet already took it (Radix marks it defaultPrevented).\n if (e.key === \"Escape\" && isOpen && closeOnEsc && !e.defaultPrevented) {\n // Unsent work inside: this layer takes the key and stays.\n if (holdsUnsentWork) {\n e.preventDefault();\n return;\n }\n onClose();\n }\n };\n if (isOpen && closeOnEsc) {\n document.addEventListener(\"keydown\", handleKeyDown);\n }\n return () => {\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [isOpen, closeOnEsc, holdsUnsentWork, onClose]);\n \n // Handle focus management for accessibility\n useEffect(() => {\n if (isOpen && initialFocus && sheetRef.current) {\n sheetRef.current.focus();\n }\n }, [isOpen, initialFocus]);\n \n // Handle scroll position preservation\n useEffect(() => {\n if (isOpen && contentRef.current && preserveScrollPosition) {\n contentRef.current.scrollTop = scrollPosition;\n }\n }, [isOpen, preserveScrollPosition, scrollPosition]);\n \n // Save scroll position when closing\n useEffect(() => {\n if (!isOpen && contentRef.current && preserveScrollPosition) {\n setScrollPosition(contentRef.current.scrollTop);\n }\n }, [isOpen, preserveScrollPosition]);\n \n // Function to close the sheet when clicking backdrop\n const handleBackdropClick = useCallback(() => {\n // Unsent work inside: a click outside never discards it.\n if (holdsUnsentWork) return;\n if (onBackdropClick) {\n onBackdropClick();\n } else if (closeOnBackdropClick) {\n onClose();\n }\n }, [closeOnBackdropClick, onClose, onBackdropClick, holdsUnsentWork]);\n \n // Determine max width based on the width prop\n const getWidthClass = () => {\n // For mobile mode, ignore width prop and use full width\n if (isMobile) {\n return \"max-w-full w-full\";\n }\n \n const widthMap: Record<string, string> = {\n sm: \"max-w-sm\",\n md: \"max-w-md\",\n lg: \"max-w-lg\",\n xl: \"max-w-xl\",\n \"2xl\": \"max-w-2xl\",\n \"3xl\": \"max-w-3xl\",\n \"4xl\": \"max-w-4xl\",\n full: \"max-w-full\",\n };\n \n // For top/bottom positions, use full width by default unless explicitly set\n if ((position === \"top\" || position === \"bottom\") && width === \"md\") {\n return \"max-w-full\";\n }\n \n return widthMap[width] || \"max-w-md\";\n };\n \n // Determine height for top/bottom/center positions\n const getHeightClass = () => {\n // For mobile mode with bottom position, use dvh and account for safe area\n if (isMobile && position === \"bottom\") {\n return \"max-h-[90dvh]\";\n }\n \n // For mobile mode with full screen (other positions), use dvh units\n if (isMobile && position !== \"bottom\") {\n // If respecting header, height is already constrained by top-10 bottom-0\n return respectHeader ? \"\" : \"h-dvh\";\n }\n \n // For right/left positions, height is controlled by top/bottom positioning\n // No explicit height class needed as it stretches between top and bottom\n if (position === \"right\" || position === \"left\") {\n return \"\";\n }\n \n // For top/bottom/center positions, use dvh units\n // When respectHeader is true, available height is 100dvh - 2.5rem (header height)\n const heightMap: Record<string, string> = {\n sm: \"max-h-[20dvh]\",\n md: \"max-h-[40dvh]\",\n lg: \"max-h-[60dvh]\",\n xl: \"max-h-[70dvh]\",\n \"2xl\": \"max-h-[80dvh]\",\n \"3xl\": \"max-h-[85dvh]\",\n \"4xl\": \"max-h-[90dvh]\",\n full: respectHeader ? \"max-h-[calc(100dvh-2.5rem)]\" : \"max-h-dvh\",\n auto: position === \"center\" \n ? (respectHeader ? \"max-h-[calc(85dvh-2.5rem)]\" : \"max-h-[85dvh]\")\n : (respectHeader ? \"max-h-[calc(50dvh-2.5rem)]\" : \"max-h-[50dvh]\"),\n };\n \n return heightMap[height] || heightMap.auto;\n };\n \n // Determine position classes\n const getPositionClasses = () => {\n // For mobile mode, use full screen positioning\n if (isMobile) {\n // For bottom sheet on mobile, position at the bottom with no spacing\n if (position === \"bottom\") {\n return \"inset-x-0 bottom-0\";\n }\n \n // For other positions on mobile, respect header if enabled\n if (respectHeader) {\n return \"inset-x-0 top-10 bottom-0\";\n }\n return \"inset-0\";\n }\n \n // Map spacing values to actual Tailwind classes\n // When respectHeader is true, use top-10 (header height) instead of regular top spacing\n const spacingClasses: Record<string, { top: string; bottom: string; left: string; right: string }> = {\n \"0\": { \n top: respectHeader ? \"top-10\" : \"top-0\", \n bottom: \"bottom-0\", \n left: \"left-0\", \n right: \"right-0\" \n },\n \"1\": { \n top: respectHeader ? \"top-[2.75rem]\" : \"top-1\", \n bottom: \"bottom-1\", \n left: \"left-1\", \n right: \"right-1\" \n },\n \"2\": { \n top: respectHeader ? \"top-[3rem]\" : \"top-2\", \n bottom: \"bottom-2\", \n left: \"left-2\", \n right: \"right-2\" \n },\n \"3\": { \n top: respectHeader ? \"top-[3.25rem]\" : \"top-3\", \n bottom: \"bottom-3\", \n left: \"left-3\", \n right: \"right-3\" \n },\n \"4\": { \n top: respectHeader ? \"top-[3.5rem]\" : \"top-4\", \n bottom: \"bottom-4\", \n left: \"left-4\", \n right: \"right-4\" \n },\n \"5\": { \n top: respectHeader ? \"top-[3.75rem]\" : \"top-5\", \n bottom: \"bottom-5\", \n left: \"left-5\", \n right: \"right-5\" \n },\n \"6\": { \n top: respectHeader ? \"top-[4rem]\" : \"top-6\", \n bottom: \"bottom-6\", \n left: \"left-6\", \n right: \"right-6\" \n },\n \"8\": { \n top: respectHeader ? \"top-[4.5rem]\" : \"top-8\", \n bottom: \"bottom-8\", \n left: \"left-8\", \n right: \"right-8\" \n },\n };\n \n const classes = spacingClasses[spacing] ?? spacingClasses[\"0\"]!;\n \n const positionMap: Record<string, string> = {\n right: `${classes.top} ${classes.bottom} ${classes.right}`,\n left: `${classes.top} ${classes.bottom} ${classes.left}`,\n top: `${classes.top} ${classes.left} ${classes.right}`,\n bottom: `${classes.bottom} ${classes.left} ${classes.right}`,\n center: respectHeader ? \"left-0 right-0 top-10 bottom-0 flex items-center justify-center\" : \"inset-0 flex items-center justify-center\",\n };\n \n return positionMap[position] || `${classes.top} ${classes.bottom} ${classes.right}`;\n };\n \n // Determine transform classes for animations\n const getTransformClass = () => {\n // For mobile mode\n if (isMobile) {\n // For bottom sheet on mobile, slide up from bottom\n if (position === \"bottom\") {\n return isOpen ? \"translate-y-0\" : \"translate-y-full\";\n }\n \n // For other positions on mobile, fade in/out\n return isOpen ? \"opacity-100\" : \"opacity-0\";\n }\n \n const transformMap: Record<string, string> = {\n right: isOpen ? \"translate-x-0\" : \"translate-x-full\",\n left: isOpen ? \"translate-x-0\" : \"-translate-x-full\",\n top: isOpen ? \"translate-y-0\" : \"-translate-y-full\",\n bottom: isOpen ? \"translate-y-0\" : \"translate-y-full\",\n center: isOpen ? \"scale-100 opacity-100\" : \"scale-95 opacity-0\", // Scale + fade for center modal\n };\n \n return transformMap[position] || (isOpen ? \"translate-x-0\" : \"translate-x-full\");\n };\n \n // Determine rounded corners for mobile\n const getRoundedClass = () => {\n if (isMobile) {\n // For bottom sheet, only round the top corners\n if (position === \"bottom\") {\n return \"rounded-t-xl\";\n }\n \n // For full screen on mobile, no rounded corners\n return \"\";\n }\n \n // When spacing is 0 (flush against edges), only round the corners that don't touch edges\n if (spacing === \"0\") {\n const positionRoundedMap: Record<string, string> = {\n \"right\": \"rounded-l-2xl\", // Only round left side\n \"left\": \"rounded-r-2xl\", // Only round right side\n \"top\": \"rounded-b-2xl\", // Only round bottom\n \"bottom\": \"rounded-t-2xl\", // Only round top\n \"center\": \"rounded-2xl\", // Center modals get all corners rounded\n };\n return positionRoundedMap[position] || \"rounded-l-2xl\";\n }\n \n // Map rounded values to actual Tailwind classes for floating sheets (with spacing)\n const roundedMap: Record<string, string> = {\n \"none\": \"rounded-none\",\n \"sm\": \"rounded-sm\",\n \"md\": \"rounded-md\",\n \"lg\": \"rounded-lg\",\n \"xl\": \"rounded-xl\",\n \"2xl\": \"rounded-2xl\",\n \"3xl\": \"rounded-3xl\",\n \"full\": \"rounded-full\",\n };\n \n return roundedMap[rounded] || \"rounded-2xl\";\n };\n \n // Get duration class for animations\n \n const positionClasses = getPositionClasses();\n const widthClass = getWidthClass();\n const heightClass = getHeightClass();\n const transformClass = getTransformClass();\n const roundedClass = getRoundedClass();\n // THE panel motion (motion-standard law) — one pace for every sheet.\n const durationClass = PANEL_MOTION_CLASS;\n \n // Determine if we need to show the header\n const showHeader = title || showCloseButton || headerContent;\n // Determine if we need to show the footer\n const showFooter = footer || footerContent;\n \n // Determine explicit height class for the sheet container\n // For right/left positions with top/bottom positioning, height is implicit\n // For other positions or when height is explicitly set, use the height class\n const getSheetHeightClass = () => {\n // For right/left positions, height is controlled by top/bottom positioning\n if ((position === \"right\" || position === \"left\") && respectHeader) {\n return \"\"; // No explicit height - let top/bottom control it\n }\n \n // For mobile full-screen (not bottom sheet)\n if (isMobile && position !== \"bottom\") {\n return \"h-full\";\n }\n \n // For bottom sheets on mobile or other positions, height is controlled differently\n return \"h-full\";\n };\n \n // Mobile-specific header styles\n const getMobileHeaderClass = () => {\n if (isMobile) {\n return \"sticky top-0 bg-muted z-10 px-4 py-4\";\n }\n return \"px-4 py-3\";\n };\n \n // Mobile-specific footer styles\n const getMobileFooterClass = () => {\n if (isMobile) {\n return \"sticky bottom-0 bg-muted z-10 px-4 py-4 pb-safe mt-auto\";\n }\n return \"px-4 pt-2 pb-6 pb-safe\";\n };\n \n // Content padding - add pb-safe when there's no footer\n const getContentPaddingClass = () => {\n const basePadding = isMobile ? \"px-4 py-4\" : \"\";\n const bottomPadding = showFooter ? \"\" : \"pb-safe\";\n return `${basePadding} ${bottomPadding}`.trim();\n };\n \n // CRITICAL: We always render the sheet regardless of isOpen state\n // This ensures state is preserved inside sheet contents\n return (\n <>\n {/* Backdrop - Only shown when open, respects header if enabled */}\n {isOpen && hasBackdrop && (\n <div\n className={`fixed ${respectHeader ? \"left-0 right-0 top-10 bottom-0\" : \"inset-0\"} bg-[var(--matrx-overlay-scrim-soft)] z-40 ${isMobile ? \"backdrop-blur-sm\" : \"\"} transition-opacity ${durationClass} ${backdropClassName}`}\n onClick={handleBackdropClick}\n aria-hidden=\"true\"\n data-testid=\"floating-sheet-backdrop\"\n />\n )}\n \n {/* Sheet - Always rendered but display and position controlled by CSS */}\n <div\n ref={sheetRef}\n className={`fixed ${positionClasses} z-50 ${\n isMobile || position === \"center\" ? \"\" : \"w-full\"\n } ${widthClass} ${heightClass} ${roundedClass} bg-textured shadow-xl transition-[transform,translate,scale,opacity] ${durationClass} ${transformClass} ${\n isOpen ? \"pointer-events-auto\" : \"pointer-events-none\"\n } ${getSheetHeightClass()} outline-none ${className}`}\n role={role}\n aria-modal={isOpen}\n aria-hidden={!isOpen}\n inert={!isOpen}\n aria-labelledby=\"sheet-title\"\n tabIndex={-1}\n data-testid=\"floating-sheet\"\n >\n <div className=\"flex flex-col h-full overflow-hidden\">\n {/* Header - Only show if title exists or showCloseButton is true or headerContent exists */}\n {showHeader && (\n <div\n className={`flex items-center justify-between border-b border-border ${getMobileHeaderClass()} ${headerClassName}`}\n >\n <div className=\"flex-1 min-w-0\">\n {typeof title === \"string\" ? (\n <h2 id=\"sheet-title\" className={`${isMobile ? \"text-xl\" : \"text-lg\"} font-semibold text-foreground`}>\n {title}\n </h2>\n ) : (\n <div id=\"sheet-title\">{title}</div>\n )}\n {description &&\n (typeof description === \"string\" ? (\n <p className=\"type-body text-muted-foreground mt-1\">{description}</p>\n ) : (\n <div className=\"mt-1\">{description}</div>\n ))}\n </div>\n {headerContent && <div className=\"ml-4 flex items-center\">{headerContent}</div>}\n {showCloseButton && (\n <button\n onClick={onClose}\n className={`ml-4 rounded-full ${isMobile ? \"p-2\" : \"p-1.5\"} text-muted-foreground hover:text-foreground bg-transparent hover:bg-accent focus:outline-none focus:ring-2 focus:ring-ring`}\n aria-label=\"Close\"\n data-testid=\"floating-sheet-close\"\n >\n {closeButton || (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className={`${isMobile ? \"h-6 w-6\" : \"h-5 w-5\"}`}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line>\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line>\n </svg>\n )}\n </button>\n )}\n </div>\n )}\n \n {/* Content area */}\n <div \n ref={contentRef} \n className={`flex-1 overflow-y-auto ${getContentPaddingClass()} ${contentClassName}`} \n data-testid=\"floating-sheet-content\"\n >\n {children}\n </div>\n \n {/* Footer - Only render if provided */}\n {showFooter && (\n <div\n className={`border-t border-border ${getMobileFooterClass()} ${footerClassName}`}\n data-testid=\"floating-sheet-footer\"\n >\n {footer || footerContent}\n </div>\n )}\n </div>\n </div>\n </>\n );\n};\n\nexport default FloatingSheet;\n","\"use client\";\n\n// SimpleTooltip / AdvancedTooltip — moved whole from rich-content/utils/lifted + matrx-frontend components/matrx/Tooltip (one implementation, 2026-10-21).\nimport React from \"react\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"./tooltip\";\n\ntype SimpleTooltipProps = {\n children: React.ReactNode;\n text?: string;\n};\n\ntype AdvancedTooltipProps = {\n children: React.ReactNode;\n text?: string;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"center\" | \"start\" | \"end\";\n delayDuration?: number;\n className?: string;\n sideOffset?: number;\n contentClassName?: string;\n disabled?: boolean;\n variant?: \"default\" | \"error\" | \"warning\" | \"success\";\n};\n\nexport const SimpleTooltip = ({ children, text }: SimpleTooltipProps) => {\n if (!text) return children;\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>{children}</TooltipTrigger>\n <TooltipContent>\n <p>{text}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n\nexport const AdvancedTooltip = ({\n children,\n text,\n side = \"top\",\n align = \"center\",\n delayDuration = 200,\n className = \"\",\n sideOffset = 4,\n contentClassName = \"\",\n disabled = false,\n variant = \"default\",\n}: AdvancedTooltipProps) => {\n if (!text || disabled) return children;\n\n const variantStyles = {\n default: 'bg-popover text-popover-foreground',\n error: 'bg-destructive text-destructive-foreground',\n warning: 'bg-warning text-warning-foreground',\n success: 'bg-success text-success-foreground',\n };\n\n const baseContentClasses =\n \"rounded-md px-3 py-1.5 text-sm shadow-md\";\n\n return (\n <Tooltip delayDuration={delayDuration}>\n <TooltipTrigger asChild className={className}>\n {children}\n </TooltipTrigger>\n <TooltipContent\n side={side}\n align={align}\n sideOffset={sideOffset}\n className={`${baseContentClasses} ${variantStyles[variant]} ${contentClassName}`}\n >\n <p /* rich-content-exempt: tooltip or title text, plain by design */ className=\"leading-none whitespace-pre-wrap\">{text}</p>\n </TooltipContent>\n </Tooltip>\n );\n};\n","\"use client\";\n\n// Moved whole from rich-content/utils/lifted + matrx-frontend components/ui/loading-spinner (one implementation, 2026-10-21).\n\nimport React from 'react';\nimport { cn } from './cn';\nimport { Loader2Icon, PlusIcon, WorkflowIcon } from './icons';\n\n// Animation styles (inline to avoid external CSS dependency)\nconst animationStyles = `\n @keyframes pulseWave {\n 0% { opacity: 0.3; transform: scale(0.8); }\n 50% { opacity: 1; transform: scale(1); }\n 100% { opacity: 0.3; transform: scale(0.8); }\n }\n \n @keyframes bounce {\n 0%, 100% { transform: translateY(0); }\n 50% { transform: translateY(-5px); }\n }\n \n @keyframes neuronPulse {\n 0% { transform: scale(0.8); opacity: 0.3; }\n 40% { transform: scale(1.4); opacity: 1; }\n 80% { transform: scale(0.8); opacity: 0.3; }\n 100% { transform: scale(0.8); opacity: 0.3; }\n }\n \n @keyframes brainWavePulse {\n 0% { transform: scale(0.8); opacity: 0; }\n 20% { opacity: 0.2; }\n 50% { transform: scale(1.5); opacity: 0; }\n 100% { transform: scale(1.8); opacity: 0; }\n }\n \n .loading-pulse-1 { animation: pulseWave 1.5s infinite ease-in-out; animation-delay: 0s; }\n .loading-pulse-2 { animation: pulseWave 1.5s infinite ease-in-out; animation-delay: 0.3s; }\n .loading-pulse-3 { animation: pulseWave 1.5s infinite ease-in-out; animation-delay: 0.6s; }\n \n .loading-bounce-1 { animation: bounce 1s infinite ease-in-out; animation-delay: 0s; }\n .loading-bounce-2 { animation: bounce 1s infinite ease-in-out; animation-delay: 0.2s; }\n .loading-bounce-3 { animation: bounce 1s infinite ease-in-out; animation-delay: 0.4s; }\n .loading-bounce-4 { animation: bounce 1s infinite ease-in-out; animation-delay: 0.6s; }\n \n .loading-neuron-1 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 0s; }\n .loading-neuron-2 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 0.4s; }\n .loading-neuron-3 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 0.8s; }\n .loading-neuron-4 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 1.2s; }\n .loading-neuron-5 { animation: neuronPulse 2s infinite ease-in-out; animation-delay: 1.6s; }\n \n .loading-brain-pulse-1 { animation: brainWavePulse 2s infinite ease-in-out; animation-delay: 0s; }\n .loading-brain-pulse-2 { animation: brainWavePulse 2s infinite ease-in-out; animation-delay: 0.5s; }\n`;\n\ntype LoadingVariant = 'dots' | 'bars' | 'brain' | 'minimal' | 'workflow';\ntype LoadingSize = 'sm' | 'md' | 'lg';\n\ninterface LoadingSpinnerProps {\n variant?: LoadingVariant;\n size?: LoadingSize;\n message?: string;\n className?: string;\n showMessage?: boolean;\n // Workflow variant specific props\n fullscreen?: boolean;\n overlay?: boolean;\n title?: string;\n subtitle?: string;\n showProgressSteps?: boolean;\n}\n\nconst LoadingSpinner: React.FC<LoadingSpinnerProps> = ({\n variant = 'dots',\n size = 'md',\n message,\n className = \"\",\n showMessage = true,\n fullscreen = false,\n overlay = false,\n title,\n subtitle,\n showProgressSteps = true\n}) => {\n // Inject styles\n React.useEffect(() => {\n const styleId = 'loading-spinner-styles';\n if (!document.getElementById(styleId)) {\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = animationStyles;\n document.head.appendChild(style);\n }\n }, []);\n\n const getSizeClasses = () => {\n switch (size) {\n case 'sm': return { container: 'gap-2', dot: 'w-1.5 h-1.5', bar: 'w-0.5 h-2', text: 'text-xs' };\n case 'lg': return { container: 'gap-4', dot: 'w-2.5 h-2.5', bar: 'w-1.5 h-4', text: 'text-base' };\n default: return { container: 'gap-3', dot: 'w-2 h-2', bar: 'w-1 h-2.5', text: 'text-sm' };\n }\n };\n\n const sizeClasses = getSizeClasses();\n\n const renderDots = () => (\n <div className={cn(\"flex items-center\", sizeClasses.container)}>\n <div className={cn(sizeClasses.dot, \"bg-primary dark:bg-primary-foreground rounded-full loading-pulse-1\")}></div>\n <div className={cn(sizeClasses.dot, \"bg-primary dark:bg-primary-foreground rounded-full loading-pulse-2\")}></div>\n <div className={cn(sizeClasses.dot, \"bg-primary dark:bg-primary-foreground rounded-full loading-pulse-3\")}></div>\n </div>\n );\n\n const renderBars = () => (\n <div className={cn(\"flex items-center\", sizeClasses.container)}>\n <div className={cn(sizeClasses.bar, \"bg-primary dark:bg-primary-foreground rounded-sm loading-bounce-1\")}></div>\n <div className={cn(sizeClasses.bar, \"bg-primary dark:bg-primary-foreground rounded-sm loading-bounce-2\")}></div>\n <div className={cn(sizeClasses.bar, \"bg-primary dark:bg-primary-foreground rounded-sm loading-bounce-3\")}></div>\n <div className={cn(sizeClasses.bar, \"bg-primary dark:bg-primary-foreground rounded-sm loading-bounce-4\")}></div>\n </div>\n );\n\n const renderBrain = () => (\n <div className=\"relative w-6 h-6 flex items-center justify-center\">\n {/* Brain icon */}\n <div className=\"absolute\">\n <svg \n width=\"24\" \n height=\"24\" \n viewBox=\"0 0 24 24\" \n fill=\"none\" \n className=\"w-5 h-5 text-primary dark:text-primary-foreground\"\n >\n <path \n d=\"M12 4C9.5 4 7.5 5.5 7.5 8C7.5 9 7.5 9.5 7 10.5C6.5 11.5 6 12 6 13.5C6 15.5 7.5 17 9.5 17C10.5 17 11 16.5 12 16.5C13 16.5 13.5 17 14.5 17C16.5 17 18 15.5 18 13.5C18 12 17.5 11.5 17 10.5C16.5 9.5 16.5 9 16.5 8C16.5 5.5 14.5 4 12 4Z\" \n className=\"stroke-current\"\n fill=\"none\"\n strokeWidth=\"1.5\"\n />\n </svg>\n </div>\n \n {/* Neural connection dots */}\n <div className=\"absolute inset-0\">\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[8px] top-[10px] loading-neuron-1\"></div>\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[12px] top-[8px] loading-neuron-2\"></div>\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[16px] top-[10px] loading-neuron-3\"></div>\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[10px] top-[14px] loading-neuron-4\"></div>\n <div className=\"absolute w-1 h-1 bg-primary/60 dark:bg-primary-foreground/60 rounded-full left-[14px] top-[14px] loading-neuron-5\"></div>\n </div>\n \n {/* Pulse waves */}\n <div className=\"absolute w-full h-full rounded-full border border-primary/30 dark:border-primary-foreground/30 loading-brain-pulse-1\"></div>\n <div className=\"absolute w-full h-full rounded-full border border-primary/30 dark:border-primary-foreground/30 loading-brain-pulse-2\"></div>\n </div>\n );\n\n const renderMinimal = () => (\n <div className=\"relative\">\n <div className={cn(sizeClasses.dot, \"bg-primary dark:bg-primary-foreground rounded-full loading-pulse-1\")}></div>\n </div>\n );\n\n const renderWorkflow = () => (\n <div className=\"flex flex-col items-center justify-center space-y-6\">\n {/* Icon animation */}\n <div className=\"relative\">\n <div className=\"w-16 h-16 bg-primary/10 dark:bg-primary-foreground/10 rounded-full flex items-center justify-center\">\n <WorkflowIcon className=\"w-8 h-8 text-primary dark:text-primary-foreground\" />\n </div>\n {/* Plus icon animation */}\n <div className=\"absolute -top-1 -right-1 w-6 h-6 bg-primary dark:bg-primary-foreground rounded-full flex items-center justify-center\">\n <PlusIcon className=\"w-3 h-3 text-primary-foreground dark:text-primary\" />\n </div>\n {/* Spinning ring */}\n <div className=\"absolute inset-0 border-2 border-transparent border-t-primary dark:border-t-primary-foreground rounded-full matrx-spin\" />\n </div>\n \n {/* Loading text */}\n <div className=\"text-center space-y-2\">\n <h2 className=\"text-lg font-semibold text-foreground flex items-center gap-2 justify-center\">\n <Loader2Icon className=\"w-4 h-4 matrx-spin\" />\n {title || 'Loading Workflow'}\n </h2>\n <p className=\"type-body text-muted-foreground max-w-sm\">\n {subtitle || message || 'Setting up your workflow...'}\n </p>\n </div>\n\n {/* Progress steps */}\n {showProgressSteps && (\n <div className=\"flex items-center gap-2 type-secondary text-muted-foreground\">\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-primary dark:bg-primary-foreground rounded-full matrx-pulse\" />\n <span>Loading</span>\n </div>\n <div className=\"w-4 h-px bg-muted-foreground/30\" />\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-muted-foreground/30 rounded-full\" />\n <span>Initializing</span>\n </div>\n <div className=\"w-4 h-px bg-muted-foreground/30\" />\n <div className=\"flex items-center gap-1\">\n <div className=\"w-2 h-2 bg-muted-foreground/30 rounded-full\" />\n <span>Ready</span>\n </div>\n </div>\n )}\n </div>\n );\n\n const renderSpinner = () => {\n switch (variant) {\n case 'bars': return renderBars();\n case 'brain': return renderBrain();\n case 'minimal': return renderMinimal();\n case 'workflow': return renderWorkflow();\n default: return renderDots();\n }\n };\n\n const getDefaultMessage = () => {\n switch (variant) {\n case 'brain': return 'Processing...';\n case 'workflow': return 'Loading workflows...';\n default: return 'Loading...';\n }\n };\n\n // For workflow variant with fullscreen/overlay\n if (variant === 'workflow' && (fullscreen || overlay)) {\n return (\n <div className={cn(\n \"flex items-center justify-center bg-background\",\n fullscreen && \"h-dvh w-full\",\n className\n )}>\n {/* Overlay to prevent interactions */}\n {overlay && (\n <div className=\"absolute inset-0 bg-background/80 backdrop-blur-sm z-50\" />\n )}\n \n {/* Loading content */}\n <div className={cn(\n \"flex flex-col items-center justify-center\",\n overlay && \"relative z-50\"\n )}>\n {renderWorkflow()}\n </div>\n </div>\n );\n }\n\n // Default inline layout for other variants\n return (\n <div className={cn(\"flex items-center\", className)}>\n {variant === 'workflow' ? (\n renderWorkflow()\n ) : (\n <>\n {renderSpinner()}\n {showMessage && (\n <span className={cn(\"ml-3 text-muted-foreground\", sizeClasses.text)}>\n {message || getDefaultMessage()}\n </span>\n )}\n </>\n )}\n </div>\n );\n};\n\nexport { LoadingSpinner };","\"use client\";\n\n/** The \"Initializing Matrx...\" dots loader for Suspense fallbacks. */\nimport { LoadingSpinner } from \"./loading-spinner\";\n\nexport function MatrxMiniLoader() {\n return <LoadingSpinner variant=\"dots\" message=\"Initializing Matrx...\" size=\"md\" />;\n}\n","\"use client\";\n\nimport { Loader2Icon } from \"./icons\";\n\ninterface SuspenseLoaderProps {\n /** Size of the spinner */\n size?: \"xs\" | \"sm\" | \"md\" | \"lg\";\n /** Whether to center in container */\n centered?: boolean;\n /** Context shown beside the spinner and announced as a live status. */\n message?: string;\n /** Custom className */\n className?: string;\n}\n\nconst sizeClasses = {\n xs: \"h-3 w-3\",\n sm: \"h-4 w-4\",\n md: \"h-6 w-6\",\n lg: \"h-8 w-8\",\n};\n\n/**\n * Minimal loading component for Suspense boundaries\n * Adaptable to any context with simple spinner animation. The spinner is the faded\n * `text-disabled-foreground` token (the app original was muted-foreground at opacity-50; the\n * text-color law forbids opacity on text, so the token carries the faded look).\n */\nexport function SuspenseLoader({\n size = \"sm\",\n centered = true,\n message,\n className = \"\",\n}: SuspenseLoaderProps) {\n const spinner = (\n <Loader2Icon\n className={`${sizeClasses[size]} matrx-spin text-disabled-foreground ${className}`}\n aria-hidden={message ? true : undefined}\n aria-label={message ? undefined : \"Loading\"}\n />\n );\n const content = message ? (\n <span\n className=\"inline-flex items-center gap-2\"\n role=\"status\"\n aria-live=\"polite\"\n >\n {spinner}\n <span>{message}</span>\n </span>\n ) : (\n spinner\n );\n\n if (centered) {\n return (\n <div className=\"flex items-center justify-center w-full h-full min-h-[2rem]\">\n {content}\n </div>\n );\n }\n\n return content;\n}\n","\"use client\";\n\n/**\n * ShimmerText\n *\n * A subtle left-to-right gradient sweep across a line of text — the standard\n * \"the server is working on it\" status look (e.g. \"Processing…\", \"Planning…\",\n * or a server status / interstitial message). Deliberately quiet: no spinner,\n * no progress bar, no layout drama — just the text shimmering in place.\n *\n * Single source of truth. The streaming markdown engine's pre-token state,\n * `AgentStatusIndicator`, and `AgentPlanningIndicator` all render through this\n * so the \"waiting for the server\" treatment is identical everywhere.\n *\n * Font size comes from `className` (callers pass e.g. `text-sm` / `text-[11px]`).\n * The sweep is a Web Animation started here, so no host CSS is required.\n */\n\nimport { cn } from \"./cn\";\nimport { useCallback, useRef } from \"react\";\n\nexport interface ShimmerTextProps {\n text: string;\n className?: string;\n}\n\n/**\n * The shimmer's look as inline style, derived from the label's own text color (`currentColor`): no\n * `hsl()` token wrap (a host whose theme variables are full color values reads that as invalid and\n * paints transparent text), no theme variable at all, and no utility class a host's Tailwind scan must\n * find in this package. Works in any host, whatever its color format.\n */\nexport const SHIMMER_STYLE = {\n backgroundImage:\n \"linear-gradient(90deg, color-mix(in srgb, currentColor 18%, transparent) 0%, currentColor 50%, color-mix(in srgb, currentColor 18%, transparent) 100%)\",\n backgroundSize: \"200% 100%\",\n WebkitBackgroundClip: \"text\",\n backgroundClip: \"text\",\n WebkitTextFillColor: \"transparent\",\n} as const;\n\n/**\n * Drives the left-to-right sweep with the Web Animations API, so the package\n * ships its own motion: no `@keyframes`, no Tailwind `animate-*` entry, no\n * stylesheet import required of the host. Respects reduced motion.\n */\nexport function useShimmerSweep<T extends HTMLElement>(durationMs = 2000) {\n const animationRef = useRef<Animation | null>(null);\n // Callback ref: the sweep (re)starts whenever the element mounts, including\n // elements that appear later (a chip that is conditionally rendered).\n return useCallback(\n (el: T | null) => {\n animationRef.current?.cancel();\n animationRef.current = null;\n if (!el || typeof el.animate !== \"function\") return;\n if (typeof window !== \"undefined\" && window.matchMedia?.(\"(prefers-reduced-motion: reduce)\").matches) return;\n animationRef.current = el.animate(\n [{ backgroundPosition: \"0 0\" }, { backgroundPosition: \"-200% 0\" }],\n { duration: durationMs, iterations: Infinity, easing: \"linear\" },\n );\n // Canceling rejects `finished` with an AbortError; nothing awaits it, so mark it handled.\n animationRef.current.finished?.catch(() => {});\n },\n [durationMs],\n );\n}\n\nexport function ShimmerText({ text, className }: ShimmerTextProps) {\n const ref = useShimmerSweep<HTMLSpanElement>();\n return (\n <span\n ref={ref}\n className={cn(\"inline-block\", className)}\n style={SHIMMER_STYLE}\n >\n {text}\n </span>\n );\n}\n","// src/form-theme.ts — THE NAMED LOOKS A FORM MAY TAKE (lane TYPEFORM-DUP, 2026-10-07).\n//\n// A form's owner picks a font, a button and a background from fixed lists. They are OPTIONS, never\n// CSS: the store refuses any other word (`custom.form_theme_options`, which holds these same three\n// lists) and a host draws them only through `formThemeClasses`, so a form looks the same in the\n// builder's preview, on its public link and inside somebody else's site.\n//\n// Every class here is a token class (`bg-primary/5`, `text-primary`, `border-primary`), so light and\n// dark both come out right and the form's accent (the frame sets `--primary`) colors the button.\n\nexport const FORM_FONTS = [\"system\", \"serif\", \"rounded\", \"mono\"] as const;\nexport type FormFont = (typeof FORM_FONTS)[number];\n\nexport const FORM_BUTTON_STYLES = [\"solid\", \"outline\", \"pill\", \"square\"] as const;\nexport type FormButtonStyle = (typeof FORM_BUTTON_STYLES)[number];\n\nexport const FORM_BACKGROUNDS = [\"plain\", \"tinted\", \"muted\", \"picture\"] as const;\nexport type FormBackground = (typeof FORM_BACKGROUNDS)[number];\n\n/** What a person reads in the picker for each option. */\nexport const FORM_THEME_LABELS: {\n font: Record<FormFont, string>;\n button: Record<FormButtonStyle, string>;\n background: Record<FormBackground, string>;\n} = {\n font: { system: \"Clean\", serif: \"Classic\", rounded: \"Friendly\", mono: \"Typewriter\" },\n button: { solid: \"Solid\", outline: \"Outline\", pill: \"Pill\", square: \"Square\" },\n background: { plain: \"Plain\", tinted: \"Tinted\", muted: \"Soft gray\", picture: \"Picture\" },\n};\n\nconst FONT_CLASS: Record<FormFont, string> = {\n system: \"font-sans\",\n serif: \"font-serif\",\n rounded: \"font-sans [font-family:ui-rounded,'SF_Pro_Rounded','Nunito','Quicksand',system-ui,sans-serif]\",\n mono: \"font-mono\",\n};\n\nconst BUTTON_CLASS: Record<FormButtonStyle, string> = {\n solid: \"rounded-md\",\n outline: \"rounded-md border border-primary bg-transparent text-primary hover:bg-primary/10\",\n pill: \"rounded-full px-6\",\n square: \"rounded-none\",\n};\n\nconst BACKGROUND_CLASS: Record<FormBackground, string> = {\n plain: \"bg-background\",\n tinted: \"bg-primary/5\",\n muted: \"bg-muted\",\n picture: \"bg-cover bg-center bg-no-repeat\",\n};\n\nexport interface FormThemeChoice {\n font?: string | null;\n button?: string | null;\n background?: string | null;\n /** The public address of the background picture, as the store resolved it. */\n backgroundUrl?: string | null;\n}\n\nconst pick = <T extends string>(list: readonly T[], word: string | null | undefined, fallback: T): T =>\n word && (list as readonly string[]).includes(word) ? (word as T) : fallback;\n\n/**\n * The classes (and the one style) a form's theme becomes. An unknown word falls back to the first\n * option rather than drawing nothing — the store refuses unknown words on save, so this only meets\n * one from an older or hand-written form.\n */\nexport function formThemeClasses(theme: FormThemeChoice | null | undefined): {\n font: FormFont;\n button: FormButtonStyle;\n background: FormBackground;\n /** On the form's outermost surface. */\n surface: string;\n /** On every button the form draws (Next, Submit, Start). */\n buttonClass: string;\n /** Only for the picture background: the address as a CSS background. */\n surfaceStyle: { backgroundImage?: string };\n} {\n const font = pick(FORM_FONTS, theme?.font, \"system\");\n const button = pick(FORM_BUTTON_STYLES, theme?.button, \"solid\");\n let background = pick(FORM_BACKGROUNDS, theme?.background, \"plain\");\n const url = theme?.backgroundUrl?.trim() || null;\n if (background === \"picture\" && !url) background = \"plain\";\n return {\n font,\n button,\n background,\n surface: `${FONT_CLASS[font]} ${BACKGROUND_CLASS[background]}`,\n buttonClass: BUTTON_CLASS[button],\n surfaceStyle: background === \"picture\" && url ? { backgroundImage: `url(${JSON.stringify(url)})` } : {},\n };\n}\n","\"use client\";\n\n/**\n * FirstUseHint — a one-time coach mark anchored to the control a person should use first.\n *\n * CHAMPION: Apple TipKit's popover tip (iOS 17+/macOS 14+), with the beacon pulse that\n * Intercom/Appcues product tours put on their anchors. What we copy from TipKit:\n * · one short title + one secondary line, beside the thing it explains, with a tiny close;\n * · the tip is INVALIDATED BY THE ACTION it teaches (`.actionPerformed`): the first press on\n * the anchor learns it, no \"Got it\" ceremony;\n * · once learned it never shows again, persisted by the HOST (TipKit's datastore);\n * · eligibility rules (`when`) and no display before the store has loaded, so a person who\n * already learned it never sees a flash.\n * What we add: a soft three-beat pulse on the ONE control it teaches (box-shadow only, so nothing\n * moves) that fades out completely: never a resting ring, never a ring around a whole row. When the\n * anchor is a row of controls (any press in it learns the hint), `pulse` names the one control inside\n * it to pulse and point at. ONE line of copy, the non-obvious fact only (Arman 2026-10-14: a tip that\n * restates what the screen shows is a novel); the dismiss sits centered on that line. Reduced motion:\n * no pulse at all. The bubble floats in a portal, so the page never shifts.\n *\n * Persistence is injected (independence contract): a host wraps the app in\n * `<FirstUseHintProvider store>` backed by its per-person server-synced preferences. Without a\n * provider the hint still works for the session and says so once in the console.\n */\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport { Slot } from \"@radix-ui/react-slot\";\nimport * as React from \"react\";\n\nimport { IconButton } from \"./icon-button\";\nimport { XIcon } from \"./icons\";\nimport { MOTION_HINT_BEACON } from \"./motion\";\nimport { Popover, PopoverAnchor, PopoverContent } from \"./popover\";\n\n/** Slot budgets (common-docs interface-text-is-layout): a title is one short line, detail ≤60. */\nexport const FIRST_USE_HINT_TITLE_MAX = 32;\nexport const FIRST_USE_HINT_DETAIL_MAX = 60;\n\n/** Where the person's learned hints live. The host backs it with server-synced preferences. */\nexport interface FirstUseHintStore {\n /** False until the person's saved record has loaded; no hint shows before then. */\n ready: boolean;\n /** Ids this person has learned (picked the anchor, closed the hint, or pressed Escape). */\n learned: readonly string[];\n /** Record an id as learned, for good. */\n learn: (id: string) => void;\n}\n\nconst FirstUseHintContext = React.createContext<FirstUseHintStore | null>(null);\n\nexport function FirstUseHintProvider({\n store,\n children,\n}: {\n store: FirstUseHintStore;\n children: React.ReactNode;\n}) {\n return <FirstUseHintContext.Provider value={store}>{children}</FirstUseHintContext.Provider>;\n}\n\n// Session-only fallback when no provider is mounted. Announced once, never silent.\nconst sessionLearned = new Set<string>();\nlet warnedNoProvider = false;\n\n/**\n * Whether hint `id` should show, and `learn()` to retire it. Use it to retire a hint from a\n * press that happens OUTSIDE its anchor (e.g. any row's choice, not only the first one).\n */\nexport function useFirstUseHint(id: string): { visible: boolean; learn: () => void } {\n const store = React.useContext(FirstUseHintContext);\n const [, rerender] = React.useReducer((n: number) => n + 1, 0);\n const [dismissed, setDismissed] = React.useState(false);\n if (!store && !warnedNoProvider) {\n warnedNoProvider = true;\n console.warn(\n \"[FirstUseHint] No <FirstUseHintProvider> mounted: learned hints last only until reload.\",\n );\n }\n const learned = store ? store.learned.includes(id) : sessionLearned.has(id);\n const ready = store ? store.ready : true;\n const learn = React.useCallback(() => {\n setDismissed(true);\n if (store) {\n if (!store.learned.includes(id)) store.learn(id);\n } else {\n sessionLearned.add(id);\n rerender();\n }\n }, [store, id]);\n return { visible: ready && !learned && !dismissed, learn };\n}\n\nexport interface FirstUseHintProps {\n /** Stable, namespaced id (`<feature>.<moment>`, e.g. `smart-add.first-choice`). Never reuse one. */\n id: string;\n /** THE one line, ≤32 characters: the non-obvious fact (\"Unmarked items are kept\"), never what the screen already shows. */\n title: string;\n /** Rarely needed second line, ≤60 characters. Prefer none. */\n detail?: string;\n /**\n * A selector for the ONE control inside the anchor to pulse and point at (e.g. the first answer\n * button of a row). The anchor stays the press area that learns the hint. Default: the anchor itself.\n */\n pulse?: string;\n /** Eligibility (TipKit \"rules\"): the hint shows only while this is true. Default true. */\n when?: boolean;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n /** Wait before it appears, so it lands after the anchor's own entrance. Default 600ms. */\n delayMs?: number;\n /**\n * The beacon ring's shape: `capsule` (default; a row of capsule buttons), `box` (keeps the\n * anchor's own corner radius, for a card or a field) or `none`.\n */\n beacon?: \"capsule\" | \"box\" | \"none\";\n /** The ONE element the hint points at. A press anywhere inside it learns the hint. */\n children: React.ReactElement;\n}\n\nexport function FirstUseHint({\n id,\n title,\n detail,\n when = true,\n side = \"top\",\n align = \"end\",\n delayMs = 600,\n beacon = \"capsule\",\n pulse,\n children,\n}: FirstUseHintProps) {\n const hostRef = React.useRef<HTMLElement | null>(null);\n const { visible, learn } = useFirstUseHint(id);\n const eligible = visible && when;\n const [shown, setShown] = React.useState(false);\n\n React.useEffect(() => {\n if (!eligible) {\n setShown(false);\n return undefined;\n }\n const timer = setTimeout(() => setShown(true), delayMs);\n return () => clearTimeout(timer);\n }, [eligible, delayMs]);\n\n if (process.env.NODE_ENV !== \"production\") {\n if (title.length > FIRST_USE_HINT_TITLE_MAX || (detail?.length ?? 0) > FIRST_USE_HINT_DETAIL_MAX) {\n console.error(\n `[FirstUseHint] \"${id}\" is over budget (title ≤${FIRST_USE_HINT_TITLE_MAX}, detail ≤${FIRST_USE_HINT_DETAIL_MAX} characters).`,\n );\n }\n }\n\n const open = eligible && shown;\n const beaconOn = open && beacon !== \"none\";\n\n // `pulse`: the beacon sits on one control inside the anchor, and the bubble points at it.\n const target = React.useCallback(\n () => (pulse ? (hostRef.current?.querySelector<HTMLElement>(pulse) ?? hostRef.current) : hostRef.current),\n [pulse],\n );\n React.useEffect(() => {\n if (!pulse || !beaconOn) return undefined;\n const el = target();\n if (!el || el === hostRef.current) return undefined;\n el.classList.add(MOTION_HINT_BEACON);\n el.setAttribute(\"data-matrx-hint-beacon\", beacon);\n return () => {\n el.classList.remove(MOTION_HINT_BEACON);\n el.removeAttribute(\"data-matrx-hint-beacon\");\n };\n }, [pulse, beaconOn, beacon, target]);\n const virtualRef = React.useMemo(\n () => ({\n current: {\n getBoundingClientRect: () => target()?.getBoundingClientRect() ?? new DOMRect(),\n },\n }),\n [target],\n );\n\n return (\n <Popover open={open}>\n {pulse ? (\n <>\n <Slot\n ref={hostRef}\n data-matrx-first-use-hint={open ? id : undefined}\n onClickCapture={open ? learn : undefined}\n >\n {children}\n </Slot>\n <PopoverAnchor virtualRef={virtualRef} />\n </>\n ) : (\n <PopoverAnchor\n asChild\n ref={hostRef as React.Ref<HTMLDivElement>}\n data-matrx-first-use-hint={open ? id : undefined}\n data-matrx-hint-beacon={beaconOn ? beacon : undefined}\n className={beaconOn ? MOTION_HINT_BEACON : undefined}\n onClickCapture={open ? learn : undefined}\n >\n {children}\n </PopoverAnchor>\n )}\n <PopoverContent\n side={side}\n align={align}\n sideOffset={8}\n sizing=\"content\"\n padding=\"none\"\n role=\"status\"\n aria-live=\"polite\"\n data-testid=\"first-use-hint\"\n className=\"rounded-full shadow-lg data-[detail]:rounded-xl\"\n data-detail={detail ? \"\" : undefined}\n onOpenAutoFocus={(e) => e.preventDefault()}\n onInteractOutside={(e) => e.preventDefault()}\n onEscapeKeyDown={learn}\n >\n {/* One line: the fact, then the dismiss centered on it (TipKit's inline tip, Linear's coach mark). */}\n <div className=\"flex items-center gap-1 py-0.5 pl-3 pr-0.5\">\n <div className=\"flex min-w-0 flex-col py-1\">\n <span className=\"type-secondary truncate font-medium text-foreground\">{title}</span>\n {detail ? (\n // Two lines at most: on a 375px phone a full 60-character line can wrap once.\n <span className=\"type-secondary line-clamp-2 text-muted-foreground\">{detail}</span>\n ) : null}\n </div>\n <IconButton icon={XIcon} aria-label=\"Dismiss tip\" className=\"shrink-0\" onClick={learn} />\n </div>\n <PopoverPrimitive.Arrow className=\"fill-popover\" width={10} height={5} />\n </PopoverContent>\n </Popover>\n );\n}\n","\"use client\";\n/**\n * ReviewChanges — THE review of a delete, restore or move of a record with relationships.\n *\n * It renders the preview `platform.change_records` returns (move-and-archive plan § 8.2, § 9) and\n * nothing else: clients render the preview, never compute it. The host owns the window it sits in\n * (a window panel, never a blocking drawer) and opens every item: each group sample, each warning\n * item and each question's items is a door (`onOpenItem(item, \"peek\" | \"tab\")`), so a person can\n * click and see exactly what is affected before anything happens (Arman, 2026-10-16).\n *\n * Questions are grouped (one per decision kind, never one per record). Each is a DecisionControl\n * with its existing meaning: Yes = the first option, No = the second option or the first way out,\n * Other = the rest, then the generic exit. The suggestion glows and is never chosen for the\n * person; \"Accept suggestions\" answers every unanswered suggested question as the person's own\n * choice. The commit stays off until every question has an answer and nothing is refused.\n *\n * Scope links on a move are an ALARM (Arman, 2026-10-16: \"it's a strange thing that should raise\n * 1000 alarm bells\"): drawn first, in the destructive tone, naming every scope as a door.\n */\nimport * as React from \"react\";\nimport { cn } from \"./cn\";\nimport { Badge, Button } from \"./controls/controls\";\nimport { DecisionControl, type DecisionAnswer, type WayOutItem } from \"./controls/decision-control\";\nimport { RowGroup } from \"./controls/surfaces\";\nimport { ExternalLinkIcon } from \"./icons\";\n\nexport interface ChangeItemRef {\n /** Registry token (`web_brand`, `note`, `scope`, `file`); null when the table has none. */\n type: string | null;\n table?: string;\n id: string;\n title?: string | null;\n organization_id?: string | null;\n}\n\nexport interface ChangeGroup {\n rule_id: string | null;\n type: string | null;\n table?: string;\n noun: string;\n count: number;\n count_is_estimate?: boolean;\n sample: ChangeItemRef[];\n /** `delete` · `follow` · `stay`. */\n action: string;\n decided_automatically?: boolean;\n}\n\nexport interface ChangeOption {\n value: string;\n label: string;\n consequence?: string;\n}\n\nexport interface ChangeQuestion {\n id: string;\n kind: string;\n prompt: string;\n items: { count: number; sample: ChangeItemRef[] };\n options: ChangeOption[];\n suggested: string | null;\n way_out: ChangeOption[];\n}\n\nexport interface ChangeWarning {\n kind: string;\n /** `alarm` (drawn first, destructive) · `refuse` (the commit cannot run) · absent (information). */\n severity?: string;\n message?: string | null;\n noun?: string;\n count?: number | null;\n items?: ChangeItemRef[];\n users?: ChangeItemRef[];\n}\n\nexport interface ChangePreview {\n verb: \"delete\" | \"restore\" | \"move\" | string;\n fingerprint: string;\n plan_id?: string;\n roots: ChangeItemRef[];\n groups: ChangeGroup[];\n questions: ChangeQuestion[];\n warnings: ChangeWarning[];\n total_rows?: number;\n source_organization?: { id: string; name: string | null } | null;\n target_organization?: { id: string; name: string | null } | null;\n mode?: string;\n}\n\n/** Answers keyed by question id (or `question id#row id` for a per-item override). */\nexport type ChangeAnswers = Record<string, string>;\n\nexport interface ReviewChangesProps {\n preview: ChangePreview;\n answers: ChangeAnswers;\n /** null clears the answer (the question is undecided again). */\n onAnswer: (questionId: string, value: string | null) => void;\n /** Every named item is a door: `peek` opens it beside the review, `tab` in a new tab. */\n onOpenItem: (item: ChangeItemRef, how: \"peek\" | \"tab\") => void;\n /**\n * The host's own door for a named item (its canonical reference component with open, new tab and\n * peek). When given it replaces the built-in door everywhere in the review; `onOpenItem` stays the\n * fallback for an item the host returns null for.\n */\n renderItem?: ((item: ChangeItemRef) => React.ReactNode) | undefined;\n onCommit: () => void;\n onCancel: () => void;\n busy?: boolean;\n /** The commit's words; default by verb (Archive / Restore / Move). */\n commitLabel?: string;\n className?: string;\n}\n\nconst SKIP = \"skip\";\n\n/** The questions a person still has to answer. */\nexport function unansweredQuestions(preview: ChangePreview, answers: ChangeAnswers): ChangeQuestion[] {\n return preview.questions.filter((q) => !answers[q.id]);\n}\n\n/** True when nothing blocks the commit: every question answered, no refusal. */\nexport function canCommitChanges(preview: ChangePreview, answers: ChangeAnswers): boolean {\n return unansweredQuestions(preview, answers).length === 0 && !preview.warnings.some((w) => w.severity === \"refuse\");\n}\n\n/** \"Accept suggestions\": every unanswered question that carries a suggestion, answered with it. */\nexport function acceptSuggestions(preview: ChangePreview, answers: ChangeAnswers): ChangeAnswers {\n const next = { ...answers };\n for (const q of preview.questions) if (!next[q.id] && q.suggested) next[q.id] = q.suggested;\n return next;\n}\n\nconst RenderItemContext = React.createContext<ReviewChangesProps[\"renderItem\"]>(undefined);\n\nfunction ItemDoor({ item, onOpenItem }: { item: ChangeItemRef; onOpenItem: ReviewChangesProps[\"onOpenItem\"] }) {\n const renderItem = React.useContext(RenderItemContext);\n const hosted = renderItem ? renderItem(item) : null;\n if (hosted != null) {\n return (\n <span data-change-item={item.id} className=\"inline-flex max-w-full items-center\">\n {hosted}\n </span>\n );\n }\n const title = item.title?.trim() || \"Untitled\";\n return (\n <span data-change-item={item.id} className=\"inline-flex max-w-full items-center gap-0.5\">\n <Button\n type=\"button\"\n variant=\"link\"\n data-clickable=\"\"\n className=\"min-w-0 truncate\"\n onClick={() => onOpenItem(item, \"peek\")}\n >\n {title}\n </Button>\n <Button\n type=\"button\"\n variant=\"quiet\"\n icon={<ExternalLinkIcon />}\n data-clickable=\"\"\n aria-label={`Open ${title} in a new tab`}\n className=\"shrink-0\"\n onClick={() => onOpenItem(item, \"tab\")}\n />\n </span>\n );\n}\n\nfunction Doors({ items, total, onOpenItem }: { items: ChangeItemRef[]; total?: number | null | undefined; onOpenItem: ReviewChangesProps[\"onOpenItem\"] }) {\n if (!items.length) return null;\n const more = (total ?? items.length) - items.length;\n return (\n <span className=\"flex min-w-0 flex-wrap items-center gap-x-3 gap-y-1\">\n {items.map((item) => (\n <ItemDoor key={`${item.table ?? item.type}:${item.id}`} item={item} onOpenItem={onOpenItem} />\n ))}\n {more > 0 ? <span className=\"text-xs text-muted-foreground\">+{more} more</span> : null}\n </span>\n );\n}\n\nfunction Row({ title, meta, children }: { title: React.ReactNode; meta?: React.ReactNode; children?: React.ReactNode }) {\n return (\n <div data-change-row=\"\" className=\"flex flex-col gap-1 px-3 py-2\">\n <div className=\"flex items-baseline justify-between gap-3\">\n <span className=\"min-w-0 text-sm text-foreground\">{title}</span>\n {meta ? <span className=\"shrink-0 text-xs text-muted-foreground\">{meta}</span> : null}\n </div>\n {children}\n </div>\n );\n}\n\nfunction Alarm({ warning, onOpenItem }: { warning: ChangeWarning; onOpenItem: ReviewChangesProps[\"onOpenItem\"] }) {\n const items = [...(warning.items ?? []), ...(warning.users ?? [])];\n return (\n <div\n role=\"alert\"\n data-change-warning={warning.kind}\n data-severity={warning.severity}\n className=\"flex flex-col gap-1.5 rounded-group border border-destructive bg-destructive/10 px-3 py-2\"\n >\n <span className=\"text-sm font-medium text-foreground\">{warning.message}</span>\n <Doors items={items} total={warning.count ?? items.length} onOpenItem={onOpenItem} />\n </div>\n );\n}\n\nfunction Question({ question, answer, onAnswer, onOpenItem, disabled }: {\n question: ChangeQuestion;\n answer: string | undefined;\n onAnswer: ReviewChangesProps[\"onAnswer\"];\n onOpenItem: ReviewChangesProps[\"onOpenItem\"];\n disabled?: boolean | undefined;\n}) {\n const yes = question.options[0];\n const noOption = question.options[1] ?? question.way_out.find((w) => w.value !== SKIP);\n const rest: ChangeOption[] = [\n ...question.options.slice(noOption && question.options[1] === noOption ? 2 : 1),\n ...question.way_out.filter((w) => w.value !== SKIP && w !== noOption),\n ];\n const skip = question.way_out.find((w) => w.value === SKIP);\n const value: DecisionAnswer | null =\n !answer ? null : yes && answer === yes.value ? \"yes\" : noOption && answer === noOption.value ? \"no\" : \"other\";\n const suggested: DecisionAnswer | null =\n !question.suggested ? null : yes && question.suggested === yes.value ? \"yes\" : noOption && question.suggested === noOption.value ? \"no\" : \"other\";\n const wayOut: WayOutItem[] = rest.map((o) => ({ value: o.value, label: o.label }));\n const chosen = [...question.options, ...question.way_out].find((o) => o.value === answer);\n return (\n <div data-change-question={question.id} data-kind={question.kind} className=\"flex flex-col gap-1.5 px-3 py-2\">\n <span className=\"text-sm text-foreground\">{question.prompt}</span>\n <Doors items={question.items.sample} total={question.items.count} onOpenItem={onOpenItem} />\n <DecisionControl\n value={value}\n onChange={(v) => {\n const pick = v === \"yes\" ? yes : noOption;\n if (!pick) return;\n onAnswer(question.id, answer === pick.value ? null : pick.value);\n }}\n labels={{ yes: yes?.label ?? \"Yes\", no: noOption?.label ?? \"No\" }}\n wayOut={wayOut}\n wayOutValue={value === \"other\" ? answer ?? null : null}\n onWayOut={(v) => onAnswer(question.id, v)}\n onClear={() => onAnswer(question.id, null)}\n // A question with no \"skip\" answer stays undecided when skipped: the commit waits for it.\n onSkip={() => onAnswer(question.id, skip ? SKIP : null)}\n skipped={answer === SKIP}\n {...(skip ? { skipLabel: skip.label } : {})}\n suggested={suggested}\n disabled={!!disabled}\n aria-label={question.prompt}\n />\n {chosen?.consequence ? <span className=\"text-xs text-muted-foreground\">{chosen.consequence}</span> : null}\n </div>\n );\n}\n\nconst VERB_WORDS: Record<string, { goes: string; commit: string }> = {\n delete: { goes: \"Archived with it\", commit: \"Archive\" },\n restore: { goes: \"Comes back with it\", commit: \"Restore\" },\n move: { goes: \"Moves with it\", commit: \"Move\" },\n};\n\nexport function ReviewChanges({ renderItem, ...props }: ReviewChangesProps) {\n return (\n <RenderItemContext.Provider value={renderItem}>\n <ReviewChangesBody {...props} />\n </RenderItemContext.Provider>\n );\n}\n\nfunction ReviewChangesBody({ preview, answers, onAnswer, onOpenItem, onCommit, onCancel, busy, commitLabel, className }: Omit<ReviewChangesProps, \"renderItem\">) {\n const words = VERB_WORDS[preview.verb] ?? { goes: \"Changes with it\", commit: \"Apply\" };\n const alarms = preview.warnings.filter((w) => w.severity === \"alarm\" || w.severity === \"refuse\");\n const kept = preview.warnings.filter((w) => w.kind === \"kept_in_use\" || w.kind === \"access_loss\");\n const auto = preview.warnings.find((w) => w.kind === \"decided_automatically\");\n const unchecked = preview.warnings.find((w) => w.kind === \"unchecked_embeds\");\n const moving = preview.groups.filter((g) => g.action !== \"stay\");\n const staying = preview.groups.filter((g) => g.action === \"stay\");\n const pending = unansweredQuestions(preview, answers);\n const suggestible = pending.filter((q) => q.suggested);\n const ready = canCommitChanges(preview, answers);\n const target = preview.target_organization?.name;\n\n return (\n <div data-review-changes=\"\" data-verb={preview.verb} className={cn(\"flex min-h-0 flex-col gap-3\", className)}>\n {alarms.map((w, i) => (\n <Alarm key={`${w.kind}:${i}`} warning={w} onOpenItem={onOpenItem} />\n ))}\n\n <RowGroup title={preview.verb === \"move\" && target ? `Moving to ${target}` : undefined}>\n <Row title={<Doors items={preview.roots} onOpenItem={onOpenItem} />} />\n </RowGroup>\n\n {moving.length ? (\n <RowGroup title={words.goes}>\n {moving.map((g) => (\n <Row key={`${g.rule_id ?? \"root\"}:${g.table ?? g.type}`} title={g.noun} meta={`${g.count_is_estimate ? \"about \" : \"\"}${g.count}`}>\n <Doors items={g.sample} total={g.count} onOpenItem={onOpenItem} />\n </Row>\n ))}\n </RowGroup>\n ) : null}\n\n {kept.length || staying.length ? (\n <RowGroup title=\"Stays where it is\">\n {kept.map((w, i) => (\n <Row key={`kept:${i}`} title={w.message ?? w.noun ?? \"Used elsewhere\"} meta={w.count ?? undefined}>\n <Doors items={w.items ?? []} total={w.count} onOpenItem={onOpenItem} />\n </Row>\n ))}\n {staying.map((g) => (\n <Row key={`stay:${g.table ?? g.type}`} title={g.noun} meta={g.count}>\n <Doors items={g.sample} total={g.count} onOpenItem={onOpenItem} />\n </Row>\n ))}\n </RowGroup>\n ) : null}\n\n {preview.questions.length ? (\n <RowGroup title=\"Decide\">\n {preview.questions.map((q) => (\n <Question key={q.id} question={q} answer={answers[q.id]} onAnswer={onAnswer} onOpenItem={onOpenItem} disabled={busy} />\n ))}\n </RowGroup>\n ) : null}\n\n {auto || unchecked ? (\n <div className=\"flex flex-wrap gap-2 px-1\">\n {auto ? <Badge tone=\"neutral\">{`${auto.count ?? \"\"} decided automatically`.trim()}</Badge> : null}\n {unchecked ? <Badge tone=\"neutral\">Links inside text not checked</Badge> : null}\n </div>\n ) : null}\n\n <div data-review-changes-actions=\"\" className=\"flex flex-wrap items-center justify-end gap-2\">\n {suggestible.length ? (\n <Button variant=\"quiet\" disabled={busy} onClick={() => suggestible.forEach((q) => onAnswer(q.id, q.suggested))}>\n Accept suggestions\n </Button>\n ) : null}\n <Button variant=\"outline\" disabled={busy} onClick={onCancel}>\n Cancel\n </Button>\n <Button variant={preview.verb === \"delete\" ? \"danger\" : \"primary\"} disabled={busy || !ready} onClick={onCommit}>\n {commitLabel ?? words.commit}\n </Button>\n </div>\n </div>\n );\n}\n","/**\n * GRID CANVAS — THE ONE x/y/w/h widget grid (champions: Grafana / react-grid-layout\n * for the grid, iOS widgets for sizes). A 12-column desktop and a 4-column phone;\n * a phone with no saved placement reflows from the desktop grid. Fine rows, snap,\n * drag to move, drag the corner to resize, arrow keys to nudge (Shift = resize),\n * and collision push-down with vertical compaction.\n *\n * Rendering is CSS-first: every item carries both breakpoints' placements as CSS\n * variables and a container query picks one, so the server's first frame is the\n * final frame (no measuring, no layout shift). JavaScript measures the container\n * only to know which grid a gesture edits.\n *\n * A gesture never re-renders per pointer event: the dragged item follows the\n * pointer through a CSS transform (one animation frame per move), and the grid\n * re-renders only when the snapped cell changes. `onChange` fires ONCE per\n * gesture or key press with every item's placements for the grid that changed.\n *\n * `fit=\"content\"` (records-ui dashboards and Pages): a row is ONE LINE as tall as its tallest item's\n * content, not a fixed number of px — the Airtable-Interfaces model of ordered blocks with a width each,\n * drawn by this same engine. An item drops where its center is (past a neighbor's middle = after it),\n * resizing changes width only, and arrow keys move it one place in reading order (Shift = width).\n *\n * Inside an item: `[data-grid-drag-handle]` makes only that element start a\n * drag (a header grip); without one the whole item drags. Buttons, links, inputs\n * and `[data-no-drag]` never start a drag (DRAG_IGNORE_SELECTOR).\n */\n\nimport {\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n} from \"react\";\n\nimport { cn } from \"../cn\";\nimport { DRAG_IGNORE_SELECTOR, startPointerDrag, type PointerDragHandle } from \"../window-drag\";\nimport {\n gridRows,\n insertLines,\n nudgeBox,\n packLines,\n stepLines,\n phoneGrid,\n placeBox,\n placementOf,\n resolveGrid,\n type GridBox,\n type GridPlacement,\n type GridSizeLimits,\n} from \"./layout\";\n\n/** Columns of the desktop grid and of the phone grid. */\nexport const GRID_CANVAS_COLUMNS = { lg: 12, sm: 4 } as const;\n/** A container narrower than this draws the phone grid (matches the CSS container query). */\nexport const GRID_CANVAS_PHONE_MAX_PX = 640;\n/** Default row height in px: fine enough that a widget's height reads as chosen, not stepped. */\nexport const GRID_CANVAS_ROW_PX = 24;\n/** Default gap between items in px. */\nexport const GRID_CANVAS_GAP_PX = 12;\n\nexport type GridBreakpoint = \"lg\" | \"sm\";\n\nexport interface GridCanvasItem extends GridSizeLimits {\n id: string;\n /** The desktop placement (12 columns). */\n lg: GridPlacement;\n /** The phone placement (4 columns); absent = reflowed from `lg`. */\n sm?: GridPlacement | undefined;\n}\n\n/** One item's placements after a change. Only the grid that changed is rewritten. */\nexport interface GridCanvasPlacements {\n id: string;\n lg: GridPlacement;\n sm?: GridPlacement | undefined;\n}\n\nexport interface GridCanvasProps {\n items: readonly GridCanvasItem[];\n /** Draw one item's content. The canvas owns its box; the content fills it. */\n renderItem: (id: string, state: { breakpoint: GridBreakpoint; editing: boolean }) => ReactNode;\n /** Edit mode: drag, resize and keyboard nudge. */\n editable?: boolean;\n /** Once per gesture (or key press): every item, with the edited grid's placements. */\n onChange?: (next: GridCanvasPlacements[], info: { breakpoint: GridBreakpoint; id: string }) => void;\n /** An accessible name per item (\"Tasks widget\"), read with its position. */\n itemLabel?: (id: string) => string;\n rowHeight?: number;\n gap?: number;\n /**\n * \"cells\" (default): every row is `rowHeight` px and an item is exactly its cells.\n * \"content\": every row is one line as tall as its content (h stays 1); vertical moves go line to line,\n * and resizing and Shift+arrows change width only.\n */\n fit?: \"cells\" | \"content\";\n className?: string;\n \"aria-label\"?: string;\n}\n\ninterface Gesture {\n id: string;\n mode: \"move\" | \"resize\";\n breakpoint: GridBreakpoint;\n /** The grid as it was when the gesture began. */\n start: GridBox[];\n /** The last snapped grid shown. */\n current: GridBox[];\n handle: PointerDragHandle;\n}\n\nconst toBox = (item: GridCanvasItem, placement: GridPlacement): GridBox => ({\n id: item.id,\n ...placementOf(placement),\n ...(item.minW !== undefined ? { minW: item.minW } : {}),\n ...(item.minH !== undefined ? { minH: item.minH } : {}),\n ...(item.maxW !== undefined ? { maxW: item.maxW } : {}),\n ...(item.maxH !== undefined ? { maxH: item.maxH } : {}),\n});\n\n/** Both grids, legal and overlap-free, in the items' order. */\nexport function resolveGridCanvas(\n items: readonly GridCanvasItem[],\n fit: \"cells\" | \"content\" = \"cells\",\n): { lg: GridBox[]; sm: GridBox[] } {\n if (fit === \"content\") {\n const { lg: cols, sm: phoneCols } = GRID_CANVAS_COLUMNS;\n const lg = packLines(\n items.map((i) => toBox(i, i.lg)),\n cols,\n );\n // The phone: a saved phone placement where there is one; otherwise the desktop line order, each width\n // scaled to 4 columns (wider than half takes the whole line).\n const sm = packLines(\n items.map((i, n) => {\n if (i.sm) return toBox(i, i.sm);\n const box = lg[n]!;\n const w = Math.ceil((box.w * phoneCols) / cols);\n return { ...box, w: w * 2 > phoneCols ? phoneCols : w };\n }),\n phoneCols,\n );\n return { lg, sm };\n }\n const lg = resolveGrid(\n items.map((i) => toBox(i, i.lg)),\n GRID_CANVAS_COLUMNS.lg,\n );\n const sm = phoneGrid(\n items.map((i, n) => ({ box: lg[n]!, sm: i.sm })),\n GRID_CANVAS_COLUMNS.lg,\n GRID_CANVAS_COLUMNS.sm,\n );\n return { lg, sm };\n}\n\nconst sameGrid = (a: readonly GridBox[], b: readonly GridBox[]) =>\n a.length === b.length && a.every((x, i) => x.x === b[i]!.x && x.y === b[i]!.y && x.w === b[i]!.w && x.h === b[i]!.h);\n\n/** Which grid the container is drawing (mirrors the CSS container query). */\nfunction useBreakpoint(ref: React.RefObject<HTMLElement | null>): GridBreakpoint {\n const [breakpoint, setBreakpoint] = useState<GridBreakpoint>(\"lg\");\n useLayoutEffect(() => {\n const el = ref.current;\n if (!el) return;\n // Width 0 = not laid out yet (hidden, or a test DOM): keep the desktop grid until it is.\n const read = () => {\n const width = el.getBoundingClientRect().width;\n if (width > 0) setBreakpoint(width < GRID_CANVAS_PHONE_MAX_PX ? \"sm\" : \"lg\");\n };\n read();\n if (typeof ResizeObserver === \"undefined\") return;\n const observer = new ResizeObserver(read);\n observer.observe(el);\n return () => observer.disconnect();\n }, [ref]);\n return breakpoint;\n}\n\nexport function GridCanvas({\n items,\n renderItem,\n editable = false,\n onChange,\n itemLabel,\n rowHeight = GRID_CANVAS_ROW_PX,\n gap = GRID_CANVAS_GAP_PX,\n fit = \"cells\",\n className,\n \"aria-label\": ariaLabel,\n}: GridCanvasProps) {\n const rootRef = useRef<HTMLDivElement | null>(null);\n const breakpoint = useBreakpoint(rootRef);\n const resolved = resolveGridCanvas(items, fit);\n const [preview, setPreview] = useState<{ breakpoint: GridBreakpoint; boxes: GridBox[]; id: string; mode: Gesture[\"mode\"] } | null>(null);\n const gesture = useRef<Gesture | null>(null);\n const itemEls = useRef(new Map<string, HTMLElement>());\n const [announcement, setAnnouncement] = useState(\"\");\n\n useEffect(() => () => gesture.current?.handle.cancel(), []);\n\n const grids = {\n lg: preview?.breakpoint === \"lg\" ? preview.boxes : resolved.lg,\n sm: preview?.breakpoint === \"sm\" ? preview.boxes : resolved.sm,\n };\n const cols = GRID_CANVAS_COLUMNS[breakpoint];\n\n const commit = (bp: GridBreakpoint, boxes: GridBox[], id: string) => {\n if (!onChange) return;\n const before = bp === \"lg\" ? resolved.lg : resolved.sm;\n if (sameGrid(before, boxes)) return;\n const next = items.map((item, n) => {\n const lg = bp === \"lg\" ? placementOf(boxes[n]!) : item.lg;\n const sm = bp === \"sm\" ? placementOf(boxes[n]!) : item.sm;\n return sm ? { id: item.id, lg, sm } : { id: item.id, lg };\n });\n onChange(next, { breakpoint: bp, id });\n };\n\n const say = (boxes: readonly GridBox[], id: string) => {\n const box = boxes.find((b) => b.id === id);\n if (box) setAnnouncement(`${itemLabel?.(id) ?? \"Item\"}: column ${box.x + 1}, row ${box.y + 1}, ${box.w} wide, ${box.h} tall`);\n };\n\n const begin = (event: ReactPointerEvent<HTMLElement>, id: string, mode: Gesture[\"mode\"]) => {\n if (!editable || event.button !== 0 || gesture.current) return;\n const root = rootRef.current;\n if (!root) return;\n const bp = breakpoint;\n const start = bp === \"lg\" ? resolved.lg : resolved.sm;\n const box = start.find((b) => b.id === id);\n if (!box) return;\n const colPx = root.getBoundingClientRect().width / GRID_CANVAS_COLUMNS[bp];\n const el = itemEls.current.get(id) ?? null;\n if (mode === \"resize\") event.stopPropagation();\n const lines = fit === \"content\" ? measureLines(start, itemEls.current) : null;\n const startRect = el?.getBoundingClientRect();\n const lineFor = (dy: number): number => {\n if (!lines || !startRect) return box.y + Math.round(dy / rowHeight);\n const center = startRect.top + startRect.height / 2 + dy;\n if (center > lines.bottom) return lines.tops.length;\n let line = 0;\n lines.tops.forEach((top, n) => {\n if (top <= center) line = n;\n });\n return line;\n };\n const handle = startPointerDrag(event, {\n threshold: mode === \"move\" ? 4 : 0,\n cursor: mode === \"move\" ? \"grabbing\" : \"nwse-resize\",\n onStart: () => setPreview({ breakpoint: bp, boxes: start, id, mode }),\n onMove: ({ dx, dy }) => {\n const g = gesture.current;\n if (!g) return;\n if (mode === \"move\" && el) el.style.transform = `translate(${dx}px, ${dy}px)`;\n const next =\n mode === \"move\" && fit === \"content\"\n ? insertLines(g.start, id, lineFor(dy), box.x + box.w / 2 + dx / colPx, GRID_CANVAS_COLUMNS[bp])\n : mode === \"move\"\n ? placeBox(g.start, id, { x: box.x + Math.round(dx / colPx), y: lineFor(dy) }, GRID_CANVAS_COLUMNS[bp])\n : fit === \"content\"\n ? packLines(placeBox(g.start, id, { w: box.w + Math.round(dx / colPx) }, GRID_CANVAS_COLUMNS[bp]), GRID_CANVAS_COLUMNS[bp])\n : placeBox(\n g.start,\n id,\n { w: box.w + Math.round(dx / colPx), h: box.h + Math.round(dy / rowHeight) },\n GRID_CANVAS_COLUMNS[bp],\n );\n if (sameGrid(next, g.current)) return;\n g.current = next;\n setPreview({ breakpoint: bp, boxes: next, id, mode });\n },\n onEnd: (_delta, info) => {\n const g = gesture.current;\n gesture.current = null;\n if (el) el.style.transform = \"\";\n setPreview(null);\n if (!g || !info.started || info.cancelled) return;\n commit(bp, g.current, id);\n say(g.current, id);\n },\n });\n gesture.current = { id, mode, breakpoint: bp, start, current: start, handle };\n };\n\n const onItemPointerDown = (event: ReactPointerEvent<HTMLElement>, id: string) => {\n const target = event.target as Element | null;\n const item = event.currentTarget;\n const handle = item.querySelector(\"[data-grid-drag-handle]\");\n if (handle ? !handle.contains(target) : false) return;\n if (target?.closest(DRAG_IGNORE_SELECTOR) && !target.closest(\"[data-grid-drag-handle]\")) return;\n if (target?.closest(\"[data-grid-resize]\")) return;\n begin(event, id, \"move\");\n };\n\n const onItemKeyDown = (event: ReactKeyboardEvent<HTMLElement>, id: string) => {\n if (!editable || event.target !== event.currentTarget) return;\n const direction = ({ ArrowLeft: \"left\", ArrowRight: \"right\", ArrowUp: \"up\", ArrowDown: \"down\" } as const)[\n event.key as \"ArrowLeft\" | \"ArrowRight\" | \"ArrowUp\" | \"ArrowDown\"\n ];\n if (!direction) return;\n // A content-fit row is as tall as its content: Shift+Up/Down (resize height) means nothing there.\n if (fit === \"content\" && event.shiftKey && (direction === \"up\" || direction === \"down\")) return;\n event.preventDefault();\n const boxes = breakpoint === \"lg\" ? resolved.lg : resolved.sm;\n // A line grid: arrows move one place in reading order; Shift+Left/Right change the width.\n const next =\n fit !== \"content\"\n ? nudgeBox(boxes, id, direction, cols, event.shiftKey)\n : event.shiftKey\n ? packLines(nudgeBox(boxes, id, direction, cols, true), cols)\n : stepLines(boxes, id, direction === \"left\" || direction === \"up\" ? -1 : 1, cols);\n commit(breakpoint, next, id);\n say(next, id);\n };\n\n const rows = { lg: gridRows(grids.lg), sm: gridRows(grids.sm) };\n const active = preview ? preview.boxes.find((b) => b.id === preview.id) : undefined;\n\n return (\n <div\n ref={rootRef}\n className={cn(\"matrx-grid-canvas\", className)}\n data-editing={editable || undefined}\n data-fit={fit === \"content\" ? \"content\" : undefined}\n data-breakpoint={breakpoint}\n aria-label={ariaLabel}\n role={ariaLabel ? \"region\" : undefined}\n style={\n {\n \"--grid-row\": `${rowHeight}px`,\n \"--grid-gap\": `${gap}px`,\n \"--grid-cols-lg\": GRID_CANVAS_COLUMNS.lg,\n \"--grid-cols-sm\": GRID_CANVAS_COLUMNS.sm,\n // One spare row while a gesture runs, so an item can be dragged below the last one.\n \"--grid-rows-lg\": preview?.breakpoint === \"lg\" ? rows.lg + 1 : rows.lg,\n \"--grid-rows-sm\": preview?.breakpoint === \"sm\" ? rows.sm + 1 : rows.sm,\n } as CSSProperties\n }\n >\n <div className=\"matrx-grid-canvas-field\">\n {active && preview ? (\n <div className=\"matrx-grid-canvas-placeholder\" aria-hidden style={placementVars(active, active)} />\n ) : null}\n {items.map((item, n) => {\n const lg = grids.lg[n]!;\n const sm = grids.sm[n]!;\n // While moving, the dragged item stays at its start cell and follows the pointer by transform.\n const moving = preview?.mode === \"move\" && preview.id === item.id && gesture.current;\n const startBox = moving ? gesture.current!.start.find((b) => b.id === item.id)! : null;\n const drawLg = moving && preview!.breakpoint === \"lg\" ? startBox! : lg;\n const drawSm = moving && preview!.breakpoint === \"sm\" ? startBox! : sm;\n const label = itemLabel?.(item.id);\n return (\n <div\n key={item.id}\n ref={(el) => {\n if (el) itemEls.current.set(item.id, el);\n else itemEls.current.delete(item.id);\n }}\n className=\"matrx-grid-canvas-item\"\n data-grid-item={item.id}\n data-dragging={preview?.id === item.id || undefined}\n tabIndex={editable ? 0 : undefined}\n aria-label={editable && label ? `${label}. Arrow keys move, Shift and arrow keys resize.` : undefined}\n style={placementVars(drawLg, drawSm)}\n onPointerDown={editable ? (e) => onItemPointerDown(e, item.id) : undefined}\n onKeyDown={editable ? (e) => onItemKeyDown(e, item.id) : undefined}\n >\n <div className=\"matrx-grid-canvas-content\">{renderItem(item.id, { breakpoint, editing: editable })}</div>\n {editable ? (\n <span\n className=\"matrx-grid-canvas-resize\"\n data-grid-resize\n aria-hidden\n onPointerDown={(e) => begin(e, item.id, \"resize\")}\n />\n ) : null}\n </div>\n );\n })}\n </div>\n <span className=\"matrx-grid-canvas-live\" aria-live=\"polite\">\n {announcement}\n </span>\n </div>\n );\n}\n\nfunction placementVars(lg: GridPlacement, sm: GridPlacement): CSSProperties {\n return {\n \"--gx-lg\": lg.x,\n \"--gy-lg\": lg.y,\n \"--gw-lg\": lg.w,\n \"--gh-lg\": lg.h,\n \"--gx-sm\": sm.x,\n \"--gy-sm\": sm.y,\n \"--gw-sm\": sm.w,\n \"--gh-sm\": sm.h,\n // 1-based grid lines for the content-fit desktop grid (styles.css, `data-fit=\"content\"`).\n \"--gc-lg\": lg.x + 1,\n \"--gr-lg\": lg.y + 1,\n // 1-based grid lines for the phone's flowing layout (styles.css: a phone box grows to its content).\n \"--gc-sm\": sm.x + 1,\n \"--gr-sm\": sm.y + 1,\n } as CSSProperties;\n}\n\n/**\n * Where each line of a content-fit grid sits on screen at the start of a gesture: the top of the line's\n * highest item (px, viewport), and the bottom of the lowest item. Rows are as tall as their content, so\n * the pointer's line is read from the page, never computed from a row height.\n */\nfunction measureLines(boxes: readonly GridBox[], els: ReadonlyMap<string, HTMLElement>): { tops: number[]; bottom: number } {\n const tops: number[] = [];\n let bottom = -Infinity;\n for (const box of boxes) {\n const rect = els.get(box.id)?.getBoundingClientRect();\n if (!rect) continue;\n tops[box.y] = Math.min(tops[box.y] ?? Infinity, rect.top);\n bottom = Math.max(bottom, rect.bottom);\n }\n // A line with no measured item (never after compaction) takes the line above's top.\n for (let n = 0; n < tops.length; n++) if (tops[n] === undefined) tops[n] = n === 0 ? 0 : tops[n - 1]!;\n return { tops, bottom };\n}\n","/**\n * THE GRID CANVAS LAYOUT ENGINE — pure x/y/w/h placement on a column grid\n * (the react-grid-layout / Grafana model, iOS-widget sizes). No React, no DOM.\n *\n * - `resolveGrid` clamp every box into the grid, push overlaps down, then\n * pull everything up (vertical compaction). The ONE function\n * every render and every commit goes through, so a stored\n * layout that overlaps (an old save, a hand edit, an agent)\n * always draws clean.\n * - `placeBox` move or resize one box; boxes it lands on are pushed down\n * (cascading), then the grid compacts.\n * - `reflowGrid` derive a narrower grid (12 → 4 on a phone) from a wider\n * one when no phone placement was saved: reading order kept,\n * widths scaled, first-fit packing.\n * - `nudgeBox` the keyboard verbs (arrow = move one cell, shift = resize).\n */\n\n/** One box on the grid, in grid units (columns across, rows down). */\nexport interface GridPlacement {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\n/** Size limits a box keeps on every grid (in grid units). */\nexport interface GridSizeLimits {\n minW?: number;\n minH?: number;\n maxW?: number;\n maxH?: number;\n}\n\nexport interface GridBox extends GridPlacement, GridSizeLimits {\n id: string;\n}\n\nconst int = (v: number, fallback: number): number => (Number.isFinite(v) ? Math.round(v) : fallback);\n\n/** The two boxes share at least one cell. */\nexport function boxesCollide(a: GridPlacement, b: GridPlacement): boolean {\n return a.x < b.x + b.w && b.x < a.x + a.w && a.y < b.y + b.h && b.y < a.y + a.h;\n}\n\n/** A box made legal on a `cols`-wide grid: whole units, inside the columns, within its limits. */\nexport function clampBox<B extends GridBox>(box: B, cols: number): B {\n const maxW = Math.max(1, Math.min(cols, box.maxW ?? cols));\n const minW = Math.max(1, Math.min(maxW, box.minW ?? 1));\n const maxH = Math.max(1, box.maxH ?? Number.POSITIVE_INFINITY);\n const minH = Math.max(1, Math.min(maxH, box.minH ?? 1));\n const w = Math.min(maxW, Math.max(minW, int(box.w, minW)));\n const h = Math.min(maxH, Math.max(minH, int(box.h, minH)));\n const x = Math.min(cols - w, Math.max(0, int(box.x, 0)));\n const y = Math.max(0, int(box.y, 0));\n return { ...box, x, y, w, h };\n}\n\n/** Reading order: top to bottom, then left to right; `first` wins a tie. */\nfunction readingOrder<B extends GridBox>(boxes: readonly B[], first?: string): B[] {\n return [...boxes].sort((a, b) => a.y - b.y || (a.id === first ? -1 : b.id === first ? 1 : 0) || a.x - b.x);\n}\n\n/**\n * Pull every box up as far as it goes without overlapping a box placed before it\n * (reading order). Overlaps left by the input are pushed down first.\n */\nexport function compactGrid<B extends GridBox>(boxes: readonly B[], first?: string): B[] {\n const placed: B[] = [];\n for (const box of readingOrder(boxes, first)) {\n let next = { ...box };\n // Up while free…\n while (next.y > 0 && !placed.some((p) => boxesCollide(p, { ...next, y: next.y - 1 }))) next = { ...next, y: next.y - 1 };\n // …and down while it lands on something already placed.\n for (;;) {\n const hit = placed.find((p) => boxesCollide(p, next));\n if (!hit) break;\n next = { ...next, y: hit.y + hit.h };\n }\n placed.push(next);\n }\n const byId = new Map(placed.map((b) => [b.id, b]));\n return boxes.map((b) => byId.get(b.id)!);\n}\n\n/** Every box legal and no two overlapping. Order of the array is kept. */\nexport function resolveGrid<B extends GridBox>(boxes: readonly B[], cols: number, first?: string): B[] {\n return compactGrid(\n boxes.map((b) => clampBox(b, cols)),\n first,\n );\n}\n\n/**\n * Put box `id` at `next` (position and/or size). Boxes it lands on move DOWN out of\n * its way (and push what they land on, in turn); then the grid compacts with the\n * moved box winning ties. A box that is not there leaves the grid as it was.\n */\nexport function placeBox<B extends GridBox>(boxes: readonly B[], id: string, next: Partial<GridPlacement>, cols: number): B[] {\n const at = boxes.findIndex((b) => b.id === id);\n if (at < 0) return [...boxes];\n const moved = clampBox({ ...boxes[at]!, ...next }, cols);\n const out = boxes.map((b, i) => (i === at ? moved : clampBox(b, cols)));\n // Cascade: whatever overlaps a box that was just settled goes below it.\n const queue: B[] = [moved];\n let guard = 0;\n while (queue.length > 0 && guard++ < 10_000) {\n const settled = queue.shift()!;\n for (let i = 0; i < out.length; i++) {\n const other = out[i]!;\n if (other.id === settled.id || other.id === id) continue;\n if (!boxesCollide(other, settled)) continue;\n const pushed = { ...other, y: settled.y + settled.h };\n out[i] = pushed;\n queue.push(pushed);\n }\n }\n return compactGrid(out, id);\n}\n\n/** The keyboard verbs: arrows move one cell; with `resize` they grow or shrink the box instead. */\nexport function nudgeBox<B extends GridBox>(\n boxes: readonly B[],\n id: string,\n direction: \"left\" | \"right\" | \"up\" | \"down\",\n cols: number,\n resize = false,\n): B[] {\n const box = boxes.find((b) => b.id === id);\n if (!box) return [...boxes];\n const dx = direction === \"left\" ? -1 : direction === \"right\" ? 1 : 0;\n const dy = direction === \"up\" ? -1 : direction === \"down\" ? 1 : 0;\n if (resize) return placeBox(boxes, id, { w: box.w + dx, h: box.h + dy }, cols);\n // Moving down past a neighbor: jump below it, or compaction would pull the box straight back.\n if (dy === 1) {\n const below = readingOrder(boxes.filter((b) => b.id !== id && b.y >= box.y + box.h && b.x < box.x + box.w && box.x < b.x + b.w))[0];\n if (below && below.y === box.y + box.h) return placeBox(boxes, id, { y: below.y + below.h }, cols);\n }\n return placeBox(boxes, id, { x: box.x + dx, y: box.y + dy }, cols);\n}\n\n/** Rows the grid occupies (the field's height in rows). */\nexport function gridRows(boxes: readonly GridPlacement[]): number {\n return boxes.reduce((rows, b) => Math.max(rows, b.y + b.h), 0);\n}\n\n/**\n * A narrower grid derived from a wider one (a 4-column phone from a 12-column\n * desktop): reading order kept, each width scaled to the new columns (never\n * below its minimum, never wider than the grid; wider than half the grid takes\n * the whole row, so no dead strip sits beside it), heights kept, then packed\n * first-fit so two small widgets share a row the way iOS packs them.\n */\nexport function reflowGrid<B extends GridBox>(boxes: readonly B[], fromCols: number, toCols: number): B[] {\n const placed: B[] = [];\n let cursorY = 0;\n for (const box of readingOrder(boxes)) {\n // Wider than half the narrow grid takes the whole row: a 3-of-4 widget on a phone left a dead strip\n // beside it that nothing could ever fill (custom-experience lane F, 2026-10-19). Halves still pair.\n // Judged AFTER the box's own minimum: a desktop minimum of 3 lifted a half-width widget to 3 of 4.\n const fitted = clampBox({ ...box, x: 0, y: 0, w: Math.ceil((box.w * toCols) / Math.max(1, fromCols)) }, toCols);\n const scaled = fitted.w * 2 > toCols ? clampBox({ ...fitted, w: toCols }, toCols) : fitted;\n let spot: B | null = null;\n for (let y = cursorY; spot === null; y++) {\n for (let x = 0; x + scaled.w <= toCols; x++) {\n const candidate = { ...scaled, x, y };\n if (!placed.some((p) => boxesCollide(p, candidate))) {\n spot = candidate;\n break;\n }\n }\n }\n placed.push(spot);\n cursorY = spot.y; // never place a later widget above an earlier one\n }\n const byId = new Map(placed.map((b) => [b.id, b]));\n return boxes.map((b) => byId.get(b.id)!);\n}\n\n/**\n * The phone grid for a set of items: their saved phone placements where every\n * item has one; items without one (added on a desktop since) are packed in\n * below; with none saved at all, the whole grid reflows from the desktop one.\n */\nexport function phoneGrid<B extends GridBox>(\n items: readonly { box: B; sm?: GridPlacement | undefined }[],\n fromCols: number,\n toCols: number,\n): B[] {\n const saved = items.filter((i) => i.sm);\n if (saved.length === 0) return resolveGrid(reflowGrid(items.map((i) => i.box), fromCols, toCols), toCols);\n const kept = resolveGrid(\n saved.map((i) => ({ ...i.box, ...i.sm! })),\n toCols,\n );\n const missing = items.filter((i) => !i.sm);\n if (missing.length === 0) return items.map((i) => kept.find((k) => k.id === i.box.id)!);\n const floor = gridRows(kept);\n const extra = reflowGrid(\n missing.map((i) => i.box),\n fromCols,\n toCols,\n ).map((b) => ({ ...b, y: b.y + floor }));\n const all = [...kept, ...extra];\n return items.map((i) => all.find((b) => b.id === i.box.id)!);\n}\n\n/** Strip a box to its placement (what is stored). */\nexport function placementOf(box: GridPlacement): GridPlacement {\n return { x: box.x, y: box.y, w: box.w, h: box.h };\n}\n\n/** The same placement, cell for cell. */\nexport function samePlacement(a: GridPlacement | undefined, b: GridPlacement | undefined): boolean {\n if (!a || !b) return a === b;\n return a.x === b.x && a.y === b.y && a.w === b.w && a.h === b.h;\n}\n\n/**\n * LINES (a content-fit grid): the boxes in reading order, flowed left to right and wrapped, each one line\n * tall. Nothing can sit at a gap or overlap, so an ordered list with a width per item (records-ui blocks,\n * Airtable Interfaces) round-trips exactly: `order` is reading order, `w` is the width.\n */\nexport function packLines<B extends GridBox>(boxes: readonly B[], cols: number): B[] {\n const placed = new Map<string, B>();\n let x = 0;\n let y = 0;\n for (const box of readingOrder(boxes)) {\n const w = clampBox({ ...box, x: 0, y: 0 }, cols).w;\n if (x > 0 && x + w > cols) {\n x = 0;\n y += 1;\n }\n placed.set(box.id, { ...box, x, y, w, h: 1 });\n x += w;\n }\n return boxes.map((b) => placed.get(b.id)!);\n}\n\n/** One step in reading order for a line grid: `by` -1 = one place earlier, +1 = one later; then re-packed. */\nexport function stepLines<B extends GridBox>(boxes: readonly B[], id: string, by: -1 | 1, cols: number): B[] {\n const order = readingOrder(packLines(boxes, cols));\n const at = order.findIndex((b) => b.id === id);\n const to = at + by;\n if (at < 0 || to < 0 || to >= order.length) return packLines(boxes, cols);\n [order[at], order[to]] = [order[to]!, order[at]!];\n // Re-number in the new order so packLines reads it back exactly.\n const renumbered = order.map((b, n) => ({ ...b, x: 0, y: n }));\n const packed = packLines(renumbered, cols);\n const byId = new Map(packed.map((b) => [b.id, b]));\n return boxes.map((b) => byId.get(b.id)!);\n}\n\n/**\n * A line grid's drop: the dragged box goes where its CENTER is — on `line`, at column `col` (fractional) —\n * among the others' centers, then everything re-packs. Past the middle of a neighbor = after it, the way a\n * sortable list reads a drop.\n */\nexport function insertLines<B extends GridBox>(boxes: readonly B[], id: string, line: number, col: number, cols: number): B[] {\n const packed = packLines(boxes, cols);\n const key = (b: B) => (b.id === id ? line * (cols + 1) + col : b.y * (cols + 1) + b.x + b.w / 2);\n const order = [...packed].sort((a, b) => key(a) - key(b));\n const renumbered = order.map((b, n) => ({ ...b, x: 0, y: n }));\n const byId = new Map(packLines(renumbered, cols).map((b) => [b.id, b]));\n return boxes.map((b) => byId.get(b.id)!);\n}\n"],"mappings":"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","names":["React","jsx","Badge","cva","React","jsx","jsxs","cva","React","jsx","React","jsx","useState","jsx","jsxs","useState","useRef","useState","jsx","jsxs","actions","useRef","useState","React","jsx","React","jsx","jsxs","jsx","jsxs","React","jsx","cva","React","jsx","jsxs","open","cva","React","jsx","Switch","useState","jsx","jsxs","useState","React","jsx","React","jsx","React","jsx","React","copyText","openOutbound","React","OutboundLink","React","jsx","HoverCardPrimitive","Slot","React","OutboundLink","Fragment","jsx","jsxs","window","Button","OutboundLink","List","actions","scroller","Slot","Fragment","jsx","jsxs","OutboundLink","Button","jsx","handle","Fragment","jsx","jsxs","Button","copyText","openOutbound","React","formatCount","OutboundLink","jsx","jsxs","formatCount","Button","OutboundLink","CandidateCard","React","jsx","jsxs","MediaOption","AddTile","React","Slot","jsx","jsxs","Button","Slot","React","jsx","jsxs","jsx","jsxs","cva","React","jsx","cva","React","jsx","jsxs","Button","React","jsx","jsx","useState","useEffect","useCallback","useRef","Fragment","jsx","jsxs","useState","useRef","useEffect","useCallback","jsx","jsxs","React","Fragment","jsx","jsxs","React","sizeClasses","jsx","jsx","jsxs","useCallback","useRef","jsx","PopoverPrimitive","Slot","React","Fragment","jsx","jsxs","Slot","React","jsx","jsxs","Button","pick","useEffect","useLayoutEffect","useRef","useState","first","jsx","jsxs","lg","sm","useState","useLayoutEffect","useRef","useEffect"]}