@ai-matrx/design-system 0.43.0 → 0.44.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +30 -0
- package/dist/content-transfer.cjs +39 -0
- package/dist/content-transfer.cjs.map +1 -1
- package/dist/content-transfer.js +39 -0
- package/dist/content-transfer.js.map +1 -1
- package/dist/data-table/copy-helpers.d.cts +1 -1
- package/dist/data-table/copy-helpers.d.ts +1 -1
- package/dist/data-table/data-row-inspector.cjs +39 -0
- package/dist/data-table/data-row-inspector.cjs.map +1 -1
- package/dist/data-table/data-row-inspector.js +41 -2
- package/dist/data-table/data-row-inspector.js.map +1 -1
- package/dist/data-table/data-row-window.cjs +39 -0
- package/dist/data-table/data-row-window.cjs.map +1 -1
- package/dist/data-table/data-row-window.js +43 -4
- package/dist/data-table/data-row-window.js.map +1 -1
- package/dist/data-table/filter-engine.d.cts +1 -1
- package/dist/data-table/filter-engine.d.ts +1 -1
- package/dist/data-table/host.d.cts +1 -1
- package/dist/data-table/host.d.ts +1 -1
- package/dist/data-table/index.cjs +59 -0
- package/dist/data-table/index.cjs.map +1 -1
- package/dist/data-table/index.d.cts +2 -2
- package/dist/data-table/index.d.ts +2 -2
- package/dist/data-table/index.js +96 -37
- package/dist/data-table/index.js.map +1 -1
- package/dist/data-table/infer-filter.d.cts +1 -1
- package/dist/data-table/infer-filter.d.ts +1 -1
- package/dist/data-table/layered-filters.d.cts +1 -1
- package/dist/data-table/layered-filters.d.ts +1 -1
- package/dist/data-table/query-control.d.cts +1 -1
- package/dist/data-table/query-control.d.ts +1 -1
- package/dist/data-table/types.cjs.map +1 -1
- package/dist/data-table/types.d.cts +1 -1
- package/dist/data-table/types.d.ts +1 -1
- package/dist/data-table/url-state.d.cts +1 -1
- package/dist/data-table/url-state.d.ts +1 -1
- package/dist/data-table/xlsx.d.cts +1 -1
- package/dist/data-table/xlsx.d.ts +1 -1
- package/dist/index.cjs +47 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -1
- package/dist/index.d.ts +28 -1
- package/dist/index.js +52 -7
- package/dist/index.js.map +1 -1
- package/dist/{types-CUR8Hbt5.d.ts → types-Bzzzed5d.d.ts} +24 -1
- package/dist/{types-CqU57qk8.d.cts → types-cvgKRetM.d.cts} +24 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/data-table/DataRowWindow.tsx","../../src/dialog.tsx","../../src/cn.ts","../../src/motion.ts","../../src/icons.tsx","../../src/portal-container.tsx","../../src/radix-dialog-modal-context.tsx","../../src/use-is-mobile.ts","../../src/data-table/default-host.tsx","../../src/data-table/icons.tsx","../../src/data-table/host.tsx","../../src/content-transfer/matrx-copy.tsx","../../src/content-transfer/email-review.tsx","../../src/button.tsx","../../src/content-transfer/index.tsx","../../src/popover.tsx","../../src/tap-target/tap-target-button.tsx","../../src/tooltip.tsx","../../src/tap-target/cn.ts","../../src/tap-target/link.ts","../../src/content-transfer/icon.ts","../../src/content-transfer/extensions.ts","../../src/data-table/copy.tsx","../../src/data-table/MatrxUuidCell.tsx","../../src/data-table/useTableNotice.tsx","../../src/data-table/entity.ts","../../src/data-table/filter-engine.ts","../../src/data-table/display-value.ts","../../src/data-table/DataRowInspector.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * DataRowWindow — generic WindowPanel for any table row.\n *\n * Uses WindowPanel's built-in sidebar for View / Edit tabs when an edit body\n * is provided. Page-local close via `onClose` (no overlay required) so custom\n * JSX never has to travel through Redux.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { DefaultTableWindow } from \"./default-host\";\nimport { Eye, Pencil } from \"./icons\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport { cn } from \"../cn\";\nimport { DataRowInspector } from \"./DataRowInspector\";\n\nexport type DataRowWindowTab = \"view\" | \"edit\";\n\nexport interface DataRowWindowProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string | undefined;\n /** Serializable row for the default inspector. Ignored when viewContent set. */\n row?: unknown | undefined;\n /**\n * Full-body override (no tabs). Escape hatch — prefer viewContent +\n * editContent so the window stays editable.\n */\n children?: React.ReactNode | undefined;\n /** View tab body. Defaults to DataRowInspector. */\n viewContent?: React.ReactNode | undefined;\n /** Edit tab body. When set, View/Edit sidebar tabs are shown. */\n editContent?: React.ReactNode | undefined;\n /** Which tab to open. Default: \"edit\" when editContent exists, else \"view\". */\n defaultTab?: DataRowWindowTab | undefined;\n /** Right-side header actions (e.g. CopyButtons for the whole record). */\n headerActions?: React.ReactNode | undefined;\n width?: number | undefined;\n height?: number | undefined;\n windowId?: string | undefined;\n}\n\nexport function DataRowWindow({\n isOpen,\n onClose,\n title = \"Row details\",\n row,\n children,\n viewContent,\n editContent,\n defaultTab,\n headerActions,\n width = 720,\n height = 560,\n windowId = \"matrx-data-row-window\",\n}: DataRowWindowProps) {\n const host = useMatrxDataTableHost();\n const WindowPanel = host.WindowPanel ?? DefaultTableWindow;\n const hasEdit = editContent != null;\n const hasTabs = hasEdit && children == null;\n const initialTab: DataRowWindowTab =\n defaultTab ?? (hasEdit ? \"edit\" : \"view\");\n const [tab, setTab] = useState<DataRowWindowTab>(initialTab);\n\n // Reset tab when the window opens on a different row / edit availability.\n useEffect(() => {\n if (!isOpen) return;\n setTab(defaultTab ?? (hasEdit ? \"edit\" : \"view\"));\n }, [isOpen, windowId, hasEdit, defaultTab]);\n\n if (!isOpen) return null;\n\n const viewBody = viewContent ?? <DataRowInspector row={row} />;\n\n // Same contract as the side panel: `viewContent` / `editContent` are custom\n // bodies (usually the table's `detail.render`) that mostly do NOT own their\n // own scrolling, so `overflow-hidden` here cut them off at the fold. The\n // container owns the scroll; a body that already scrolls resolves to this\n // container's height and still shows a single scrollbar.\n const body = children ?? (\n <div className=\"flex h-full min-h-0 flex-1 flex-col overflow-hidden\">\n {hasTabs ? (\n tab === \"edit\" ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{editContent}</div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{viewBody}</div>\n )\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{viewBody}</div>\n )}\n </div>\n );\n\n return (\n <WindowPanel\n id={windowId}\n title={title}\n onClose={onClose}\n width={width}\n height={height}\n minWidth={420}\n minHeight={320}\n actionsRight={headerActions}\n bodyClassName=\"flex min-h-0 flex-1 flex-col overflow-hidden p-0\"\n sidebarDefaultSize={140}\n sidebarMinSize={110}\n sidebar={\n hasTabs ? (\n <nav\n aria-label=\"Row window tabs\"\n className=\"flex h-full flex-col gap-0.5 overflow-y-auto p-1.5\"\n >\n <TabButton\n active={tab === \"view\"}\n icon={<Eye className=\"h-4 w-4 shrink-0\" />}\n label=\"View\"\n onClick={() => setTab(\"view\")}\n />\n <TabButton\n active={tab === \"edit\"}\n icon={<Pencil className=\"h-4 w-4 shrink-0\" />}\n label=\"Edit\"\n onClick={() => setTab(\"edit\")}\n />\n </nav>\n ) : undefined\n }\n >\n {body}\n </WindowPanel>\n );\n}\n\nfunction TabButton({\n active,\n icon,\n label,\n onClick,\n}: {\n active: boolean;\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2.5 py-2 text-left text-sm transition-colors\",\n active\n ? \"bg-accent font-medium text-foreground\"\n : \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\",\n )}\n >\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </button>\n );\n}\n","\"use client\";\n\n/**\n * Dialog — the modal surface, carrying every ruling the host forks paid for.\n *\n * Four hosts shipped four dialogs. Three were the stock shadcn body: a\n * fixed-size centered card with `overflow: visible`. matrx-frontend's had been\n * hardened, incident by incident, and those hardenings are the reason this\n * component belongs in the package rather than being copied a fifth time:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate a\n * wrapper once carried (\"Radix ids differ between SSR and client\") was\n * false — Radix ids come from React's SSR-stable `useId` — and it deleted\n * the always-visible Trigger from SSR and the first client paint.\n *\n * 2. THE DIALOG IS CLAMPED TO THE VIEWPORT AND SCROLLS INSIDE ITSELF. Proven\n * live: an admin \"Create Category\" dialog rendered 851px tall in a 657px\n * viewport with `overflow-y: visible`, so its Create button sat below the\n * fold, unreachable. The only way out was a backdrop click — which\n * dismisses WITHOUT writing, and is indistinguishable from a silent save\n * failure. `max-h-[85dvh] overflow-y-auto` is the cap.\n *\n * 3. THE PRIMARY ACTION IS ALWAYS PRESSABLE — AND NEVER ON TOP OF THE BODY.\n * `DialogFooter` is sticky and bleeds to the card's edges using\n * `--dialog-pad`. Until 0.11.3 that bleed was a NEGATIVE BLOCK MARGIN,\n * which sticky clamps: the footer was dragged up over the row above it by\n * `--dialog-pad` minus the card gap. The card now RESERVES the footer's\n * block size instead (`.matrx-dialog-card` in `styles.css` hands its bottom\n * padding to the footer), so scrolled content never shows through beneath\n * the actions AND the footer never covers the row above it. Outside a\n * DialogContent both variables are unset, the padding falls back to `0px`,\n * and the footer is the plain row it always was.\n *\n * 4. ON MOBILE THE SAME DIALOG IS A BOTTOM SHEET — full width, bottom\n * anchored, height-capped, internally scrollable, safe-area padded. Opt out\n * with `mobileSheet={false}` only for the rare surface that must stay\n * centered (a tiny spinner). The sheet geometry is re-asserted AFTER the\n * caller's className so a desktop `max-w-2xl` cannot un-fullscreen it.\n *\n * 5. AN UNTITLED DIALOG IS STILL ACCESSIBLE. Radix warns (correctly) that\n * every dialog needs a title; rather than let hosts ship the warning, a\n * visually-hidden title is injected when the tree has none, and\n * `aria-describedby` is dropped when there is no description rather than\n * pointing at nothing.\n *\n * 6. ON DESKTOP A DIALOG IS A WINDOW, NOT A WALL (0.38.0, Arman 2026-09-23:\n * \"none of the built-in page ai integrations are accessible because the\n * page is totally blocked\"). Unless the caller passes `modal`, a desktop\n * dialog does not block the page: no overlay, the page, the Agents menu,\n * the assist dock and right-click AI stay usable beside it. It behaves like\n * a window: a click outside never closes it (`dismissOnOutsideClick` opts a\n * quick picker back in), Escape closes it only while focus is inside it\n * (Escape in the page belongs to the page), and its `DialogHeader` drags\n * it, clamped on screen, double-click to recenter. On a phone it stays the\n * blocking bottom sheet — nothing useful sits behind a sheet. Confirmations\n * are `AlertDialog`, a different component, and stay blocking. This is a\n * LIGHT window: the host's heavy window manager (tray, persistence) is a\n * separate system and must not be pulled into every dialog.\n *\n * SEAM INVERSIONS. The host original resolved its portal target through\n * app-shaped hooks (a popped-out window-panel body). Here that is the\n * package's `PortalContainerProvider` seam, with an explicit `container` prop\n * keeping top priority. And DialogContent PROVIDES that seam to its own\n * children, so a Popover or menu opened inside a dialog portals INTO the\n * dialog — staying inside the scroll shard, where its wheel events work.\n * `useDialogContainer` exposes the same element for host code that needs it.\n */\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport {\n MOTION_BOTTOM_SHEET,\n MOTION_DIALOG,\n MOTION_OVERLAY,\n} from \"./motion\";\nimport { XIcon } from \"./icons\";\nimport { usePortalContainer, PortalContainerProvider } from \"./portal-container\";\nimport {\n RadixDialogModalProvider,\n useRadixDialogModal,\n} from \"./radix-dialog-modal-context\";\nimport { useIsMobile } from \"./use-is-mobile\";\n\n/**\n * True when the dialog is a window because the caller said nothing about\n * modality (rule 6), false when the caller passed `modal={false}` itself.\n * The two sit on different layers: a default window sits WITH the other\n * layers it was opened from (z-10000 — a dialog opened from a menu, a popover\n * or a host window must never appear behind its opener), while an explicit\n * `modal={false}` keeps the older coexistence contract below the host's window\n * manager (z-900).\n */\nconst DialogWindowedByDefaultContext = React.createContext(false);\n\nconst Dialog = ({\n children,\n ...props\n}: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>) => {\n const isMobile = useIsMobile();\n // A window on desktop, a blocking sheet on a phone; `modal` forces either (rule 6).\n const modal = props.modal ?? isMobile;\n return (\n <DialogWindowedByDefaultContext.Provider value={props.modal === undefined}>\n <RadixDialogModalProvider modal={modal}>\n <DialogPrimitive.Root {...props} modal={modal}>\n {children}\n </DialogPrimitive.Root>\n </RadixDialogModalProvider>\n </DialogWindowedByDefaultContext.Provider>\n );\n};\nDialog.displayName = \"Dialog\";\n\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogClose = DialogPrimitive.Close;\n\n/**\n * Portal-seam-aware DialogPortal. An explicit `container` always wins; with\n * none, the injected `PortalContainerProvider` value decides; with neither,\n * Radix's `document.body`.\n */\nconst DialogPortal = ({\n container,\n ...props\n}: Omit<\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>,\n \"container\"\n> & {\n /** `undefined` → use the injected container; `null` → force document.body. */\n container?: HTMLElement | null | undefined;\n}) => {\n const resolved = usePortalContainer(container);\n return <DialogPrimitive.Portal container={resolved ?? null} {...props} />;\n};\nDialogPortal.displayName = \"DialogPortal\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.dialog-container-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<HTMLElement | null> };\nconst DialogContainerContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<HTMLElement | null>(null);\n\n/** The DialogContent element, for host code that portals into the dialog. */\nexport const useDialogContainer = (): HTMLElement | null =>\n React.useContext(DialogContainerContext);\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n // Page context behind the modal stays readable; separation comes from a\n // light token scrim, not a blur.\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim-soft)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\n/**\n * Unstyled, non-portalling Content for custom dialog layouts. Preserves Radix\n * focus/background behavior and derives `aria-modal` from the Root.\n */\nconst DialogContentPrimitive = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>((props, ref) => {\n const isModal = useRadixDialogModal();\n return (\n <DialogPrimitive.Content\n {...props}\n ref={ref}\n aria-modal={isModal || undefined}\n />\n );\n});\nDialogContentPrimitive.displayName = \"DialogContentPrimitive\";\n\nconst DIALOG_DESKTOP_CLASSES =\n \"matrx-dialog-card fixed inset-0 z-[10000] m-auto grid h-fit min-w-0 w-full max-w-lg gap-4 max-h-[85dvh] overflow-y-auto overscroll-contain [--dialog-pad:1.5rem] overflow-x-clip border bg-background p-6 shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full sm:rounded-lg\";\n\nconst DIALOG_MOBILE_SHEET_CLASSES =\n \"matrx-mobile-sheet matrx-dialog-card fixed inset-x-0 bottom-0 left-0 right-0 top-auto z-[10000] flex min-w-0 flex-col w-full max-w-full max-h-[90dvh] gap-4 [--dialog-pad:1rem] overflow-x-clip border-t bg-background p-4 pb-safe shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full rounded-t-2xl rounded-b-none overflow-y-auto overscroll-contain\";\n\n// Re-asserted LAST so sheet geometry always wins over a caller className.\nconst DIALOG_MOBILE_SHEET_OVERRIDE =\n \"inset-x-0 bottom-0 left-0 right-0 top-auto translate-none w-full max-w-full max-h-[90dvh] rounded-b-none rounded-t-2xl overflow-y-auto\";\n\n/** Drag props the windowed DialogContent hands its DialogHeader (rule 6). */\ntype DialogWindowHandle = {\n onPointerDown: (event: React.PointerEvent<HTMLElement>) => void;\n onPointerMove: (event: React.PointerEvent<HTMLElement>) => void;\n onPointerUp: (event: React.PointerEvent<HTMLElement>) => void;\n onPointerCancel: (event: React.PointerEvent<HTMLElement>) => void;\n onDoubleClick: () => void;\n};\nconst DialogWindowHandleContext = React.createContext<DialogWindowHandle | null>(null);\n\n/** Pixels of a dragged window that must stay on screen. */\nconst WINDOW_KEEP_VISIBLE = 80;\n\nfunction isInteractiveTarget(target: EventTarget | null): boolean {\n return (\n target instanceof Element &&\n Boolean(target.closest(\"button, a, input, textarea, select, [role='button'], [contenteditable='true']\"))\n );\n}\n\nexport interface DialogContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /**\n * Windowed (non-blocking) dialogs never close from a click outside them —\n * the person is reaching for the page or an AI control beside the window.\n * Pass `true` for a quick picker that should close when the person clicks\n * away. Ignored on a blocking dialog, which keeps Radix's behaviour.\n */\n dismissOnOutsideClick?: boolean;\n /** Render as a bottom sheet below the mobile breakpoint. Default `true`. */\n mobileSheet?: boolean;\n /** Render the built-in close control. Default `true`. */\n showCloseButton?: boolean;\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(\n (\n {\n className,\n children,\n mobileSheet = true,\n animated = true,\n showCloseButton = true,\n container,\n dismissOnOutsideClick = false,\n onInteractOutside,\n onEscapeKeyDown,\n style,\n ...props\n },\n ref,\n ) => {\n const isMobile = useIsMobile();\n const isModal = useRadixDialogModal();\n // Falls through to the injected container while `containerEl` is unset\n // (pre-mount) — the original's dialog > popout > body priority.\n const injectedContainer = usePortalContainer(container);\n const asSheet = mobileSheet && isMobile;\n const windowed = !isModal && !asSheet;\n const windowedByDefault = React.useContext(DialogWindowedByDefaultContext);\n const [containerEl, setContainerEl] = React.useState<HTMLElement | null>(\n null,\n );\n\n // ── rule 6: the windowed dialog drags by its header ──────────────────────\n const [offset, setOffset] = React.useState({ x: 0, y: 0 });\n const dragRef = React.useRef<{ x: number; y: number; baseX: number; baseY: number } | null>(null);\n const handle = React.useMemo<DialogWindowHandle | null>(() => {\n if (!windowed) return null;\n const clamp = (value: number, limit: number) => Math.max(-limit, Math.min(limit, value));\n return {\n onPointerDown: (event) => {\n if (event.button !== 0 || isInteractiveTarget(event.target)) return;\n dragRef.current = { x: event.clientX, y: event.clientY, baseX: offset.x, baseY: offset.y };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n },\n onPointerMove: (event) => {\n const start = dragRef.current;\n if (!start) return;\n setOffset({\n x: clamp(start.baseX + event.clientX - start.x, window.innerWidth / 2 - WINDOW_KEEP_VISIBLE / 2),\n y: clamp(start.baseY + event.clientY - start.y, window.innerHeight / 2 - WINDOW_KEEP_VISIBLE / 2),\n });\n },\n onPointerUp: (event) => {\n if (!dragRef.current) return;\n dragRef.current = null;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n },\n onPointerCancel: () => {\n dragRef.current = null;\n },\n onDoubleClick: () => setOffset({ x: 0, y: 0 }),\n };\n }, [windowed, offset.x, offset.y]);\n\n const mergedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setContainerEl(node);\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n const hasTitle =\n treeContainsComponent(children, DialogTitle) ||\n treeContainsComponent(children, DialogPrimitive.Title);\n const hasDescription =\n treeContainsComponent(children, DialogDescription) ||\n treeContainsComponent(children, DialogPrimitive.Description);\n\n return (\n <DialogPortal container={container}>\n {isModal ? <DialogOverlay /> : null}\n <DialogContentPrimitive\n ref={mergedRef}\n data-slot=\"dialog-content\"\n className={cn(\n asSheet ? DIALOG_MOBILE_SHEET_CLASSES : DIALOG_DESKTOP_CLASSES,\n animated && (asSheet ? MOTION_BOTTOM_SHEET : MOTION_DIALOG),\n className,\n asSheet && DIALOG_MOBILE_SHEET_OVERRIDE,\n // A non-modal dialog is the coexistence contract for content that\n // can sit beside a host's floating window manager (which starts at\n // z=1000); staying below that boundary makes a newly focused window\n // usable without coupling the two systems.\n !isModal && !windowedByDefault && \"z-[900]\",\n // Without an overlay the card needs its own separation from the page.\n windowed && \"shadow-2xl ring-1 ring-border/60\",\n )}\n style={\n windowed && (offset.x !== 0 || offset.y !== 0)\n ? { ...style, translate: `${offset.x}px ${offset.y}px` }\n : style\n }\n onInteractOutside={(event) => {\n onInteractOutside?.(event);\n if (windowed && !dismissOnOutsideClick) event.preventDefault();\n }}\n onEscapeKeyDown={(event) => {\n onEscapeKeyDown?.(event);\n // Escape pressed in the page belongs to the page (a grid cancelling\n // an edit), not to the window beside it.\n // The key's own target is where the person pressed it; focus is\n // the fallback when the event carries no element target.\n const pressedIn =\n event.target instanceof Node && event.target !== document.body\n ? event.target\n : document.activeElement;\n if (windowed && containerEl && !(pressedIn && containerEl.contains(pressedIn))) {\n event.preventDefault();\n }\n }}\n {...(hasDescription ? {} : { \"aria-describedby\": undefined })}\n {...props}\n >\n {hasTitle ? null : (\n <VisuallyHidden.Root>\n <DialogPrimitive.Title>Dialog</DialogPrimitive.Title>\n </VisuallyHidden.Root>\n )}\n <DialogContainerContext.Provider value={containerEl}>\n <DialogWindowHandleContext.Provider value={handle}>\n <PortalContainerProvider\n container={containerEl ?? injectedContainer ?? null}\n >\n {children}\n </PortalContainerProvider>\n </DialogWindowHandleContext.Provider>\n </DialogContainerContext.Provider>\n {showCloseButton ? (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n aria-label=\"Close\"\n className=\"absolute right-2 top-4 flex h-11 w-11 items-center justify-center rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground sm:right-4 lg:h-10 lg:w-10\"\n >\n <XIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n ) : null}\n </DialogContentPrimitive>\n </DialogPortal>\n );\n },\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => {\n // In a windowed dialog the header is the drag handle (rule 6).\n const handle = React.useContext(DialogWindowHandleContext);\n return (\n <div\n data-slot=\"dialog-header\"\n {...(handle\n ? {\n ...handle,\n \"data-window-handle\": \"\",\n title: \"Drag to move · double-click to recenter\",\n }\n : {})}\n className={cn(\n // DialogContent owns an absolute close control. Reserve its hit area in\n // every header so trailing actions never render underneath it.\n \"flex flex-col space-y-1.5 pr-12 text-center sm:text-left\",\n handle && \"cursor-grab select-none active:cursor-grabbing\",\n className,\n )}\n {...props}\n />\n );\n};\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n // Ruling 3/4 — sticky to the card edges so a scrolled body never shows\n // through under the actions, and safe-area padded on a phone.\n //\n // 🚨 THERE IS NO `mb-[…]` HERE, AND THERE MUST NEVER BE ONE AGAIN\n // (0.11.3, feedback bf8fb00b). The bleed over the card's bottom padding\n // used to be a NEGATIVE BLOCK MARGIN, which makes this box taller than\n // the grid area the card allocates it — and `position: sticky` CLAMPS a\n // box to its containing block, so the browser yanked the footer UP by\n // `--dialog-pad` against the card's `gap-4` and painted 8px of opaque\n // footer over the last line of the consequence, at every length. The\n // card now RESERVES this footer's block size instead (`matrx-dialog-card`\n // in styles.css hands over its `padding-bottom`), so the bleed costs no\n // margin at all. Guard: `sticky-footer-geometry.test.tsx`.\n //\n // These stay UTILITIES rather than a shipped rule so a caller's\n // `className` still wins through tailwind-merge — a shipped rule would\n // have to be unlayered to survive Tailwind preflight (§ THE PREFLIGHT\n // RULE in styles.css) and would then override every caller's padding.\n \"sticky bottom-0 z-10 bg-background pt-3\",\n \"mx-[calc(var(--dialog-pad,0px)*-1)] px-[var(--dialog-pad,0px)] pb-[var(--dialog-pad,0px)]\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogContentPrimitive,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * THE MOTION CONTRACT (0.10.0) — the class names every animated surface in\n * this package puts on the DOM, in ONE place.\n *\n * Why a module and not ten inline strings: the sweep that produced this file\n * found the same defect ten times over, and it was invisible each time\n * because each primitive spelled its animation out by hand. Ten hand-written\n * copies of `data-[state=open]:animate-in data-[state=closed]:animate-out\n * data-[state=closed]:fade-out-0 …` meant ten chances to reach for a utility\n * nothing in the package defines — which is exactly what happened. A single\n * exported constant per motion SHAPE means the next primitive cannot invent\n * an eleventh spelling, and `styles.test.ts` can prove every one of them\n * resolves to a rule in the shipped stylesheet.\n *\n * Every rule these name lives in `styles.css` under the package's own\n * keyframes. NONE of them is a Tailwind utility, and none requires a host\n * plugin — see that file's header for the measurement that made this\n * necessary.\n */\n\n/** Modal scrims: Dialog, AlertDialog, Sheet, CommandDialog. Fade only. */\nexport const MOTION_OVERLAY = \"matrx-motion-overlay\";\n\n/** The centred dialog card. Fades and scales; centring is not its business. */\nexport const MOTION_DIALOG = \"matrx-motion-dialog\";\n\n/**\n * THE CENTRING OF A CENTRED DIALOG CARD — package-owned, in the `translate`\n * property, and NEVER a Tailwind `translate-x-[-50%] translate-y-[-50%]` pair.\n *\n * Those utilities do not compile to the same thing in every host: Tailwind v3\n * writes them into `transform`, Tailwind v4 writes them into the independent\n * `translate` property, which COMPOSES with `transform` instead of being\n * replaced by it. 0.10.0's keyframes restated the centring inside `transform`,\n * which was harmless on v3 and doubled the centring on v4 — the card flew in\n * from off the top-left of the viewport for the animation's whole duration and\n * snapped into place at the end (fixed in 0.10.1).\n *\n * Owning it here means one spelling that reads the same on both, and it frees\n * `transform` so the keyframes carry ONLY the delta. Put this on every centred\n * surface UNCONDITIONALLY — it is geometry, so unlike {@link MOTION_DIALOG} it\n * must survive `animated={false}`. Its rule ships in `styles.css`.\n */\nexport const CENTERED_DIALOG = \"matrx-dialog-centered\";\n\n/**\n * The resting gap between a `popper`-positioned surface and its trigger, for\n * the primitives that want one (today: `Select`). Same law and same reason as\n * {@link CENTERED_DIALOG} — a position an animated surface holds AT REST is\n * the `translate` property's job, never a Tailwind translate utility, because\n * those land in `transform` on a v3 host and in `translate` on a v4 one while\n * the keyframes animate `transform` either way. Sizes from\n * `--matrx-popper-offset`; keys off Radix's `data-side`.\n */\nexport const POPPER_OFFSET = \"matrx-popper-offset\";\n\n/** The mobile Dialog / CommandDialog bottom sheet. Slides up and fades. */\nexport const MOTION_BOTTOM_SHEET = \"matrx-motion-bottom-sheet\";\n\n/**\n * Radix-popper surfaces: Popover, DropdownMenu, ContextMenu, HoverCard,\n * Select, Tooltip. Reads `--radix-popper-transform-origin` so the surface\n * grows out of its trigger, and `data-side` so it travels from it.\n */\nexport const MOTION_POPPER = \"matrx-motion-popper\";\n\n/** Edge sheets, one class per `sheetVariants` side. */\nexport const MOTION_SHEET = {\n top: \"matrx-motion-sheet-top\",\n bottom: \"matrx-motion-sheet-bottom\",\n left: \"matrx-motion-sheet-left\",\n right: \"matrx-motion-sheet-right\",\n center: \"matrx-motion-sheet-center\",\n} as const;\n\n/** Skeleton's breathing loop. */\nexport const MOTION_PULSE = \"matrx-pulse\";\n\n/** The spinner loop, for every inline busy indicator in the package. */\nexport const MOTION_SPIN = \"matrx-spin\";\n\n/**\n * Every motion class the package ships, for the guards. If a rule for one of\n * these is missing from `styles.css`, a component animates in no consumer and\n * says nothing about it — the C26 failure this list exists to make loud.\n */\nexport const ALL_MOTION_CLASSES = [\n MOTION_OVERLAY,\n MOTION_DIALOG,\n MOTION_BOTTOM_SHEET,\n MOTION_POPPER,\n ...Object.values(MOTION_SHEET),\n MOTION_PULSE,\n MOTION_SPIN,\n] as const;\n\n/**\n * The host-plugin utilities this package is forbidden to emit. They are\n * supplied by `tailwindcss-animate` / `tw-animate-css`, which is a HOST CSS\n * entry concern a package cannot declare a dependency on: three of the four\n * AI Matrx consumers never loaded it, so every surface wearing these appeared\n * with no animation and no error. `styles.test.ts` fails the build if one\n * comes back.\n */\nexport const FORBIDDEN_HOST_MOTION_UTILITIES = [\n \"animate-in\",\n \"animate-out\",\n \"fade-in\",\n \"fade-out\",\n \"zoom-in\",\n \"zoom-out\",\n \"slide-in-from\",\n \"slide-out-to\",\n \"animate-accordion\",\n \"animate-slide-down\",\n \"animate-slide-up\",\n \"animate-pulse\",\n \"animate-spin\",\n] as const;\n","/**\n * Internal inlined SVG icons (policy C19: no icon-library dependency, ever).\n *\n * Each icon is copied from the exact glyph the ported originals rendered:\n * lucide-react's Loader2 / ChevronLeft / ChevronRight / MoreHorizontal and\n * @radix-ui/react-icons' Cross2Icon. Same viewBoxes, same paths, same default\n * stroke geometry — a host swapping the import sees pixel-identical output.\n *\n * Not exported from the package entry; components consume them directly.\n */\n\nimport * as React from \"react\";\n\ntype IconProps = React.SVGAttributes<SVGSVGElement>;\n\nfunction lucideProps(props: IconProps): React.SVGAttributes<SVGSVGElement> {\n return {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": true,\n ...props,\n };\n}\n\n/**\n * lucide `loader-2` — the spinner glyph. Callers add `matrx-spin`.\n * Never a resting icon: at rest this incomplete arc reads as a broken\n * half-circle. Refresh controls use arrows, then swap to this only while busy.\n */\nexport function Loader2Icon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\n/** lucide `chevron-left`. */\nexport function ChevronLeftIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\n/** lucide `chevron-right`. */\nexport function ChevronRightIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\n/** lucide `chevron-down` — the disclosure's open glyph. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\n/** lucide `archive` — the archived-rows glyph (ArchivedDisclosure). */\nexport function ArchiveIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <rect width=\"20\" height=\"5\" x=\"2\" y=\"3\" rx=\"1\" />\n <path d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\" />\n <path d=\"M10 12h4\" />\n </svg>\n );\n}\n\n/** lucide `more-horizontal` — the kebab/ellipsis glyph. */\nexport function MoreHorizontalIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </svg>\n );\n}\n\n/** lucide `check` — the selected-row tick (CreatablePicker). */\nexport function LucideCheckIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\n/** lucide `chevrons-up-down` — the combobox trigger glyph. */\nexport function ChevronsUpDownIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m7 15 5 5 5-5\" />\n <path d=\"m7 9 5-5 5 5\" />\n </svg>\n );\n}\n\n/** lucide `external-link` — the manage-in-new-tab glyph. */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </svg>\n );\n}\n\n/** lucide `lock` — the platform-governed vocabulary glyph. */\nexport function LockIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\n/** lucide `plus` — the create/add glyph. */\nexport function PlusIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\n/** lucide `x` — the dialog close glyph (host dialog module used lucide X). */\nexport function XIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons components default to width/height 15 — the bare\n * `<ChevronUpIcon />` renders in Select's scroll buttons rely on it.\n */\nfunction radixProps(props: IconProps): React.SVGAttributes<SVGSVGElement> {\n return {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 15 15\",\n width: 15,\n height: 15,\n fill: \"none\",\n \"aria-hidden\": true,\n ...props,\n };\n}\n\n/** @radix-ui/react-icons `MagnifyingGlassIcon` — the command search glyph. */\nexport function MagnifyingGlassIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M10 6.5C10 8.433 8.433 10 6.5 10C4.567 10 3 8.433 3 6.5C3 4.567 4.567 3 6.5 3C8.433 3 10 4.567 10 6.5ZM9.30884 10.0159C8.53901 10.6318 7.56251 11 6.5 11C4.01472 11 2 8.98528 2 6.5C2 4.01472 4.01472 2 6.5 2C8.98528 2 11 4.01472 11 6.5C11 7.56251 10.6318 8.53901 10.0159 9.30884L12.8536 12.1464C13.0488 12.3417 13.0488 12.6583 12.8536 12.8536C12.6583 13.0488 12.3417 13.0488 12.1464 12.8536L9.30884 10.0159Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `CheckIcon` — the select item indicator glyph. */\nexport function CheckIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons `DividerHorizontalIcon` — the INDETERMINATE checkbox\n * glyph. Radix renders the indicator for both `true` and `\"indeterminate\"`, so\n * a half-selected \"select all\" that shows a full check states something false;\n * the two states get different glyphs on purpose.\n */\nexport function DividerHorizontalIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M2 7.5C2 7.22386 2.22386 7 2.5 7H12.5C12.7761 7 13 7.22386 13 7.5C13 7.77614 12.7761 8 12.5 8H2.5C2.22386 8 2 7.77614 2 7.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `DotFilledIcon` — the menu radio-item indicator. */\nexport function DotFilledIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M9.875 7.5C9.875 8.81168 8.81168 9.875 7.5 9.875C6.18832 9.875 5.125 8.81168 5.125 7.5C5.125 6.18832 6.18832 5.125 7.5 5.125C8.81168 5.125 9.875 6.18832 9.875 7.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronRightIcon` — the submenu-trigger glyph. */\nexport function RadixChevronRightIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M6.1584 3.13508C6.35985 2.94621 6.67627 2.95642 6.86514 3.15788L10.6151 7.15788C10.7954 7.3502 10.7954 7.64949 10.6151 7.84182L6.86514 11.8418C6.67627 12.0433 6.35985 12.0535 6.1584 11.8646C5.95694 11.6757 5.94673 11.3593 6.1356 11.1579L9.565 7.49985L6.1356 3.84182C5.94673 3.64036 5.95694 3.32394 6.1584 3.13508Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronDownIcon` — the select trigger/scroll glyph. */\nexport function RadixChevronDownIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronUpIcon` — the select scroll-up glyph. */\nexport function RadixChevronUpIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M3.13523 8.84197C3.3241 9.04343 3.64052 9.05363 3.84197 8.86477L7.5 5.43536L11.158 8.86477C11.3595 9.05363 11.6759 9.04343 11.8648 8.84197C12.0536 8.64051 12.0434 8.32409 11.842 8.13523L7.84197 4.38523C7.64964 4.20492 7.35036 4.20492 7.15803 4.38523L3.15803 8.13523C2.95657 8.32409 2.94637 8.64051 3.13523 8.84197Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `Cross2Icon` — the dialog/sheet close glyph. */\nexport function Cross2Icon(props: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 15 15\"\n fill=\"none\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons `DragHandleDots2Icon` — the grip on `ResizableHandle`.\n * Inlined per C19: this package depends on no icon library.\n */\nexport function DragHandleDots2Icon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M4.5 2.5C5.05228 2.5 5.5 2.05228 5.5 1.5C5.5 0.947715 5.05228 0.5 4.5 0.5C3.94772 0.5 3.5 0.947715 3.5 1.5C3.5 2.05228 3.94772 2.5 4.5 2.5ZM4.5 6.5C5.05228 6.5 5.5 6.05229 5.5 5.5C5.5 4.94771 5.05228 4.5 4.5 4.5C3.94772 4.5 3.5 4.94771 3.5 5.5C3.5 6.05229 3.94772 6.5 4.5 6.5ZM5.5 9.5C5.5 10.0523 5.05228 10.5 4.5 10.5C3.94772 10.5 3.5 10.0523 3.5 9.5C3.5 8.94771 3.94772 8.5 4.5 8.5C5.05228 8.5 5.5 8.94771 5.5 9.5ZM4.5 14.5C5.05228 14.5 5.5 14.0523 5.5 13.5C5.5 12.9477 5.05228 12.5 4.5 12.5C3.94772 12.5 3.5 12.9477 3.5 13.5C3.5 14.0523 3.94772 14.5 4.5 14.5ZM11.5 1.5C11.5 2.05228 11.0523 2.5 10.5 2.5C9.94771 2.5 9.5 2.05228 9.5 1.5C9.5 0.947715 9.94771 0.5 10.5 0.5C11.0523 0.5 11.5 0.947715 11.5 1.5ZM10.5 6.5C11.0523 6.5 11.5 6.05229 11.5 5.5C11.5 4.94771 11.0523 4.5 10.5 4.5C9.94771 4.5 9.5 4.94771 9.5 5.5C9.5 6.05229 9.94771 6.5 10.5 6.5ZM11.5 9.5C11.5 10.0523 11.0523 10.5 10.5 10.5C9.94771 10.5 9.5 10.0523 9.5 9.5C9.5 8.94771 9.94771 8.5 10.5 8.5C11.0523 8.5 11.5 8.94771 11.5 9.5ZM10.5 14.5C11.0523 14.5 11.5 14.0523 11.5 13.5C11.5 12.9477 11.0523 12.5 10.5 12.5C9.94771 12.5 9.5 12.9477 9.5 13.5C9.5 14.0523 9.94771 14.5 10.5 14.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** lucide `star` — the default-organization badge (OrganizationPicker). */\nexport function StarIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n </svg>\n );\n}\n\n/** lucide `building-2` — the organization glyph (OrganizationPicker trigger). */\nexport function Building2Icon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z\" />\n <path d=\"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2\" />\n <path d=\"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2\" />\n <path d=\"M10 6h4\" />\n <path d=\"M10 10h4\" />\n <path d=\"M10 14h4\" />\n <path d=\"M10 18h4\" />\n </svg>\n );\n}\n","\"use client\";\n\n/**\n * Injected portal-container seam.\n *\n * The matrx-frontend original resolved nested portal targets through\n * `useNestedPortalContainer` (explicit prop > dialog content > popout body >\n * document.body) — a host-shaped hook wired to that app's dialog and\n * window-panel systems. The package inverts the seam: hosts provide the\n * resolved container through `PortalContainerProvider`; an explicit\n * `container` prop on a component still wins, and with neither the portal\n * falls through to `document.body` (Radix default). Priority semantics are\n * unchanged from the original.\n */\n\nimport * as React from \"react\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.portal-container-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<HTMLElement | null | undefined> };\nconst PortalContainerContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<HTMLElement | null | undefined>(undefined);\n\nexport interface PortalContainerProviderProps {\n /** Where nested Radix portals (Popover, etc.) should mount. `null`/`undefined` → document.body. */\n container: HTMLElement | null | undefined;\n children: React.ReactNode;\n}\n\nexport function PortalContainerProvider({\n container,\n children,\n}: PortalContainerProviderProps) {\n return (\n <PortalContainerContext.Provider value={container ?? undefined}>\n {children}\n </PortalContainerContext.Provider>\n );\n}\n\n/**\n * Resolve a portal target: explicit prop (including an explicit `null`,\n * meaning \"the default body\") beats the injected container.\n */\nexport function usePortalContainer(\n explicit?: HTMLElement | null,\n): HTMLElement | undefined {\n const injected = React.useContext(PortalContainerContext);\n\n if (explicit !== undefined) {\n return explicit ?? undefined;\n }\n\n return injected ?? undefined;\n}\n","\"use client\";\n\n/**\n * Ported verbatim from matrx-frontend `components/ui/radix-dialog-modal-context.tsx`.\n * Shared by the Sheet and BottomSheet families (and available to hosts that\n * compose their own Radix Dialog-derived wrappers around these primitives).\n */\n\nimport * as React from \"react\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.dialog-modal-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<boolean> };\nconst RadixDialogModalContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<boolean>(true);\n\nexport interface RadixDialogModalProviderProps {\n children: React.ReactNode;\n modal: boolean;\n}\n\n/**\n * Keeps our Radix-based content wrappers aligned with the owning Root's\n * modality so ARIA semantics cannot drift from focus/pointer behavior.\n */\nexport function RadixDialogModalProvider({\n children,\n modal,\n}: RadixDialogModalProviderProps) {\n return (\n <RadixDialogModalContext.Provider value={modal}>\n {children}\n </RadixDialogModalContext.Provider>\n );\n}\n\n/** Returns whether the nearest Radix Dialog-derived root is modal. */\nexport function useRadixDialogModal(): boolean {\n return React.useContext(RadixDialogModalContext);\n}\n","\"use client\";\n\n/**\n * useIsMobile — the ONE breakpoint hook the package's responsive primitives\n * read (CommandDialog and Dialog both auto-render as a bottom sheet below it).\n *\n * Lifted out of `command.tsx`, where it lived privately, when Dialog arrived\n * and needed the SAME answer: two copies of a breakpoint hook is exactly the\n * duplication this package exists to end, and a Dialog that disagreed with a\n * CommandDialog about what \"mobile\" means would render two different sheet\n * geometries on one screen.\n *\n * SSR-safe by construction: `false` until mounted, so the server and the first\n * client paint agree and the desktop geometry is what hydrates. The mobile\n * geometry swaps in on the effect pass.\n *\n * The breakpoint is the host-original 768px (Tailwind `md`). It is exported so\n * a host can branch on the same number instead of inventing a second one.\n */\n\nimport * as React from \"react\";\n\n/** Viewport width (px) below which the package treats a surface as mobile. */\nexport const MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile(): boolean {\n const [isMobile, setIsMobile] = React.useState(false);\n const [hasMounted, setHasMounted] = React.useState(false);\n\n React.useEffect(() => {\n setHasMounted(true);\n\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n onChange();\n\n // NO ENVIRONMENT MAY CRASH ON THIS HOOK. `matchMedia` is absent in older\n // jsdom setups and in some embedded webviews, and a primitive that throws\n // there takes the whole host's test suite (or screen) down over a\n // breakpoint — a cost wildly out of proportion to the answer. Without it\n // the width read above still gives a correct first answer; only live\n // resize tracking is lost, which is exactly what is unavailable.\n if (typeof window.matchMedia !== \"function\") {\n return undefined;\n }\n\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n if (!hasMounted) {\n return false;\n }\n return isMobile;\n}\n","\"use client\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from \"../sheet\";\nimport type { TableLinkProps, TableSidePanelProps, TableWindowPanelProps } from \"./host\";\n\nexport function DefaultTableLink(props: TableLinkProps) { return <a {...props} />; }\nexport function DefaultTableSidePanel({ title, titleNode, description, defaultWidth = 480, onClose, headerActions, children }: TableSidePanelProps) {\n return <Sheet open onOpenChange={(open) => { if (!open) onClose(); }}><SheetContent side=\"right\" className=\"flex h-full flex-col\" style={{ width: `min(${defaultWidth}px, 100vw)` }}><SheetHeader><SheetTitle>{titleNode ?? title}</SheetTitle>{description ? <SheetDescription>{description}</SheetDescription> : null}{headerActions}</SheetHeader><div className=\"min-h-0 flex-1 overflow-auto\">{children}</div></SheetContent></Sheet>;\n}\nexport function DefaultTableWindow({ title, onClose, width = 720, height = 560, actionsRight, sidebar, children }: TableWindowPanelProps) {\n return <Dialog open onOpenChange={(open) => { if (!open) onClose(); }}><DialogContent className=\"flex flex-col overflow-hidden\" style={{ width: `min(${width}px, calc(100vw - 2rem))`, height: `min(${height}px, 85dvh)` }}><DialogHeader><DialogTitle>{title}</DialogTitle>{actionsRight}</DialogHeader><div className=\"flex min-h-0 flex-1\">{sidebar ? <aside className=\"shrink-0 border-r pr-2\">{sidebar}</aside> : null}<div className=\"min-h-0 min-w-0 flex-1 overflow-auto\">{children}</div></div></DialogContent></Dialog>;\n}\n","import type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\nfunction Icon({ children, ...props }: IconProps) {\n return <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}>{children}</svg>;\n}\nconst path = <path d=\"M4 12h16M12 4v16\" />;\nexport const ChevronLeft = (p: IconProps) => <Icon {...p}><path d=\"m15 18-6-6 6-6\" /></Icon>;\nexport const ChevronRight = (p: IconProps) => <Icon {...p}><path d=\"m9 18 6-6-6-6\" /></Icon>;\nexport const ChevronDown = (p: IconProps) => <Icon {...p}><path d=\"m6 9 6 6 6-6\" /></Icon>;\nexport const ArrowDown = (p: IconProps) => <Icon {...p}><path d=\"M12 4v16m-6-6 6 6 6-6\" /></Icon>;\nexport const ArrowUp = (p: IconProps) => <Icon {...p}><path d=\"M12 20V4m-6 6 6-6 6 6\" /></Icon>;\nexport const ArrowUpDown = (p: IconProps) => <Icon {...p}><path d=\"M12 4v16m-4-12 4-4 4 4m-8 8 4 4 4-4\" /></Icon>;\nexport const Check = (p: IconProps) => <Icon {...p}><path d=\"m5 12 4 4L19 6\" /></Icon>;\nexport const X = (p: IconProps) => <Icon {...p}><path d=\"M6 6l12 12M18 6 6 18\" /></Icon>;\nexport const Search = (p: IconProps) => <Icon {...p}><circle cx=\"11\" cy=\"11\" r=\"6\" /><path d=\"m16 16 4 4\" /></Icon>;\nexport const Plus = (p: IconProps) => <Icon {...p}>{path}</Icon>;\nexport const Minus = (p: IconProps) => <Icon {...p}><path d=\"M4 12h16\" /></Icon>;\n/** lucide `star` — compact saved-item marker. */\nexport const Star = (p: IconProps) => <Icon {...p}><path d=\"m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\" /></Icon>;\n/** lucide `pin` — compact saved-item marker. */\nexport const Pin = (p: IconProps) => <Icon {...p}><path d=\"M12 17v5M9 3h6l1 7 3 3v2H5v-2l3-3 1-7z\" /></Icon>;\nexport const Eraser = (p: IconProps) => <Icon {...p}><path d=\"m16 3 5 5-11 11H5l-3-3L13 5l3-2Z M8 10l6 6 M10 19h12\" /></Icon>;\nexport const GripVertical = (p: IconProps) => <Icon {...p}><circle cx=\"9\" cy=\"6\" r=\"1\" /><circle cx=\"15\" cy=\"6\" r=\"1\" /><circle cx=\"9\" cy=\"12\" r=\"1\" /><circle cx=\"15\" cy=\"12\" r=\"1\" /><circle cx=\"9\" cy=\"18\" r=\"1\" /><circle cx=\"15\" cy=\"18\" r=\"1\" /></Icon>;\n/** lucide `sliders-horizontal` — used for the table column manager. */\nexport const SlidersHorizontal = (p: IconProps) => <Icon {...p}>\n <path d=\"M21 4h-7M10 4H3M21 12h-9M8 12H3M21 20h-5M12 20H3M14 2v4M8 10v4M16 18v4\" />\n</Icon>;\nexport const Trash2 = (p: IconProps) => <Icon {...p}><path d=\"M4 7h16M10 11v6M14 11v6M9 7l1-2h4l1 2M6 7l1 13h10l1-13\" /></Icon>;\n/**\n * Spinner-only incomplete arc. Never a resting glyph — at rest this reads as a\n * broken half-circle. Pair it with `animate-spin` / `matrx-spin` only while\n * work is actually running. Refresh controls use `RefreshControlIcon`.\n */\nexport const Loader2 = (p: IconProps) => <Icon {...p}><path d=\"M20 12a8 8 0 1 1-2.3-5.7\" /></Icon>;\n/** lucide `refresh-cw` — the resting refresh arrows. */\nexport const RefreshCw = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </Icon>\n);\n/** Refresh affordance: arrows at rest, spinner only while busy. */\nexport function RefreshControlIcon({\n spinning = false,\n className,\n ...props\n}: IconProps & { spinning?: boolean }) {\n if (spinning) {\n return (\n <Loader2\n className={[className, \"animate-spin\"].filter(Boolean).join(\" \")}\n {...props}\n />\n );\n }\n return <RefreshCw className={className} {...props} />;\n}\nexport const Save = (p: IconProps) => <Icon {...p}><path d=\"M5 3h12l2 2v16H5zM8 3v6h8V3M8 21v-7h8v7\" /></Icon>;\nexport const Pencil = (p: IconProps) => <Icon {...p}><path d=\"m4 20 4-1 11-11-3-3L5 16l-1 4z\" /></Icon>;\nexport const Eye = (p: IconProps) => <Icon {...p}><path d=\"M2 12s3-6 10-6 10 6 10 6-3 6-10 6S2 12 2 12z\" /><circle cx=\"12\" cy=\"12\" r=\"2\" /></Icon>;\nexport const PanelRight = (p: IconProps) => <Icon {...p}><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M15 4v16\" /></Icon>;\nexport const PanelRightOpen = PanelRight;\nexport const WholeWord = (p: IconProps) => <Icon {...p}><path d=\"M4 6l3 12 3-8 3 8 3-12M17 15h4\" /></Icon>;\nexport const ExternalLink = (p: IconProps) => <Icon {...p}><path d=\"M14 4h6v6M20 4l-9 9M19 13v6H5V5h6\" /></Icon>;\nexport const Copy = (p: IconProps) => <Icon {...p}><rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" /><path d=\"M15 9V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3\" /></Icon>;\nexport const Lightbulb = (p: IconProps) => <Icon {...p}><path d=\"M9 18h6M10 22h4M8 14a6 6 0 1 1 8 0c-1 1-1 2-1 3H9c0-1 0-2-1-3z\" /></Icon>;\nexport const ShieldOff = (p: IconProps) => <Icon {...p}><path d=\"m3 3 18 18M12 3l7 3v5c0 4-3 7-7 9-4-2-7-5-7-9V6l4-2\" /></Icon>;\nexport const ListFilter = SlidersHorizontal;\nexport const ListX = X;\n\nexport const ChevronsLeft = (p: IconProps) => <Icon {...p}><path d=\"m11 18-6-6 6-6m8 12-6-6 6-6\" /></Icon>;\nexport const ChevronsRight = (p: IconProps) => <Icon {...p}><path d=\"m5 18 6-6-6-6m8 12 6-6-6-6\" /></Icon>;\n","\"use client\";\nimport { createContext, useContext, type Context, type ComponentType, type ReactNode, type MouseEventHandler } from \"react\";\nimport type { CopyControlProps } from \"./copy-types\";\nimport type { MatrxDataTableDensity, MatrxDataTableRecordControls, TableSavedViewsProps } from \"./types\";\nimport type {\n MatrxTableMenuIconName,\n MatrxTableMenuPayload,\n MatrxTableMenuSectionsResolver,\n MatrxTableMenuTarget,\n} from \"./menu-targets\";\n\nexport type {\n MatrxTableMenuIconName,\n MatrxTableMenuItem,\n MatrxTableMenuSection,\n MatrxTableMenuSectionsResolver,\n} from \"./menu-targets\";\n\nexport type {\n AgentPayloadInput,\n AiCustomSource,\n AiVariant,\n CopyControlProps,\n CopyExportConfig,\n} from \"./copy-types\";\n\nexport interface TableLinkProps { href: string; children: ReactNode; className?: string; onClick?: MouseEventHandler<HTMLAnchorElement>; }\n/**\n * Host-owned toolbar affordance. The table package keeps operation state and\n * labels; an application can supply its canonical icon-button primitive\n * without making the shared package depend on an application UI package.\n */\nexport interface TableToolbarActionProps { ariaLabel: string; tooltip?: string | undefined; disabled?: boolean | undefined; busy?: boolean | undefined; /** Indicates a selected mutually-exclusive action such as the current page. */ active?: boolean | undefined; onClick: () => void; children: ReactNode; }\nexport interface TableSidePanelProps { title: string; titleNode?: ReactNode; description?: ReactNode; onClose: () => void; defaultWidth?: number; headerActions?: ReactNode; children: ReactNode; }\nexport interface TableWindowPanelProps { id: string; title: string; onClose: () => void; width?: number; height?: number; minWidth?: number; minHeight?: number; actionsRight?: ReactNode; bodyClassName?: string; sidebarDefaultSize?: number; sidebarMinSize?: number; sidebar?: ReactNode; children: ReactNode; }\nexport interface TableEntityRefProps { token: string; id: string; href?: string; children: ReactNode; className?: string; }\nexport interface TablePeekProps { kind: string; id: string; href?: string; onClose: () => void; }\nexport interface TableDoors { href?: string; peekKind?: string; canPeek?: boolean; }\n/**\n * The host's door onto the table's right-click levels.\n *\n * A canonical table registers ONE resolver per instance. The host's own menu\n * reads which of the four levels was clicked (`readMenuTarget`) and asks for\n * that level's descriptor — the package never interprets what comes back, and\n * the host never reaches into the table for the row or the range.\n */\nexport interface TableRowContextRegistry { register(tableId: string, resolve: (target: MatrxTableMenuTarget) => unknown): () => void; }\nexport interface TableContextMenuBoundaryProps {\n label: string;\n children: ReactNode;\n /**\n * The consumer's own sections, asked per right-click. Present only when the\n * table's consumer declared `contextMenu.sections`; the host reads the level\n * off the clicked element (`readMenuTarget`), calls this, and draws what comes\n * back in its own menu. Absent, the boundary behaves exactly as before.\n */\n sections?: MatrxTableMenuSectionsResolver | undefined;\n}\n/** The host's glyph for a menu icon name. A host without one draws labels only. */\nexport interface TableMenuIconProps { name: MatrxTableMenuIconName; className?: string | undefined; }\nexport interface MatrxDataTableHost { JsonViewer?: ComponentType<{ data: object | string }>; Link?: ComponentType<TableLinkProps>; CopyControls?: ComponentType<CopyControlProps>; ToolbarAction?: ComponentType<TableToolbarActionProps>; SidePanelSurface?: ComponentType<TableSidePanelProps>; WindowPanel?: ComponentType<TableWindowPanelProps>; EntityRef?: ComponentType<TableEntityRefProps>; resolveEntityDoors?: (token: string, id: string, href?: string | null) => TableDoors | null; ResourcePeek?: ComponentType<TablePeekProps>; SavedViews?: ComponentType<TableSavedViewsProps>; rowContextRegistry?: TableRowContextRegistry; createDefaultMenuContext?: (payload: MatrxTableMenuPayload) => unknown; ContextMenuBoundary?: ComponentType<TableContextMenuBoundaryProps>; MenuIcon?: ComponentType<TableMenuIconProps>; /** Host default; a table's explicit density takes precedence. */ defaultDensity?: MatrxDataTableDensity; notify?: { success(message: string): void; error(message: string): void }; }\n// Public entrypoints are independently bundled in ESM and CJS. The context\n// identity must survive those bundle boundaries; values stay provider-scoped.\nconst HOST_SLOT = Symbol.for(\"ai-matrx.design-system.table-host-context\");\nconst hostRegistry = globalThis as typeof globalThis & { [HOST_SLOT]?: Context<MatrxDataTableHost> };\nconst HostContext = hostRegistry[HOST_SLOT] ??= createContext<MatrxDataTableHost>({});\nexport function MatrxDataTableProvider({ value, children }: { value: MatrxDataTableHost; children: ReactNode }) { return <HostContext.Provider value={value}>{children}</HostContext.Provider>; }\nexport function useMatrxDataTableHost(): MatrxDataTableHost { return useContext(HostContext); }\n\nexport interface MatrxTableRowAlchemy {\n copy: CopyControlProps;\n controls?: MatrxDataTableRecordControls;\n placement: \"inline\" | \"menu\";\n ready: boolean;\n activate(): void;\n /** Mount Alchemy's canonical palette in the host row menu. */\n mountMenu(target: HTMLElement | null, onClose?: () => void, restoreFocus?: () => void): void;\n prepare(restoreFocus?: () => void): Promise<void>;\n}\n\nconst ROW_ALCHEMY_SLOT = Symbol.for(\"ai-matrx.design-system.table-row-alchemy-context\");\nconst rowAlchemyRegistry = globalThis as typeof globalThis & { [ROW_ALCHEMY_SLOT]?: Context<MatrxTableRowAlchemy | null> };\nconst RowAlchemyContext = rowAlchemyRegistry[ROW_ALCHEMY_SLOT] ??= createContext<MatrxTableRowAlchemy | null>(null);\n\nexport function MatrxTableRowAlchemyScope({ value, children }: { value: MatrxTableRowAlchemy; children: ReactNode }) { return <RowAlchemyContext.Provider value={value}>{children}</RowAlchemyContext.Provider>; }\n\nexport function useMatrxTableRowAlchemy(): MatrxTableRowAlchemy | null { return useContext(RowAlchemyContext); }\n\nconst ROW_CONTROLS_SLOT = Symbol.for(\"ai-matrx.design-system.table-row-controls-context\");\nconst rowControlsRegistry = globalThis as typeof globalThis & { [ROW_CONTROLS_SLOT]?: Context<MatrxDataTableRecordControls | null> };\nconst RowControlsContext = rowControlsRegistry[ROW_CONTROLS_SLOT] ??= createContext<MatrxDataTableRecordControls | null>(null);\nexport function MatrxTableRowControlsScope({ value, children }: { value: MatrxDataTableRecordControls; children: ReactNode }) { return <RowControlsContext.Provider value={value}>{children}</RowControlsContext.Provider>; }\nexport function useMatrxTableRowControls(): MatrxDataTableRecordControls | null { return useContext(RowControlsContext); }\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n buildAgentPayload,\n createBrowserTransport,\n directSource,\n normalizeTransferJson,\n sealTransferArtifact,\n type AgentPayloadInput,\n type PageAction,\n type Payload,\n type Source,\n type TransferOutcome,\n} from \"@ai-matrx/kit/content-transfer\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport {\n ContentTransferMenu,\n useContentTransferCapabilities,\n type ContentTransferController,\n type ContentTransferReference,\n type ContentTransferReferenceAction,\n type TransferMenuPresentation,\n} from \"./index\";\nimport type { AlchemyIcon } from \"./icon\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../dialog\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\n\nexport type AlchemyOptionValues = Record<string, boolean | number>;\nexport type AlchemySourceOption =\n | {\n kind: \"toggle\";\n key: string;\n label: string;\n hint?: string;\n default: boolean;\n }\n | {\n kind: \"preset\";\n key: string;\n label: string;\n options: { label: string; value: number }[];\n default: number;\n }\n | {\n kind: \"slider\";\n key: string;\n label: string;\n hint?: string;\n stops: number[];\n default: number;\n formatValue: (value: number) => string;\n }\n | {\n kind: \"number\";\n key: string;\n label: string;\n hint?: string;\n min?: number;\n step?: number;\n presets?: { label: string; value: number }[];\n default: number;\n };\nexport interface AlchemyCustomSource {\n label?: string;\n hint?: string;\n options: AlchemySourceOption[];\n build(values: AlchemyOptionValues): {\n text: string;\n meta?: Record<string, string | number | boolean | undefined>;\n };\n wrap(\n text: string,\n values: AlchemyOptionValues,\n meta?: Record<string, string | number | boolean | undefined>,\n ): AgentPayloadInput;\n dialogTitle?: string;\n dialogDescription?: string;\n}\nexport type AlchemyDetail = \"full\" | \"compact\" | \"brief\";\nexport interface AlchemyGroomerSection {\n id: string;\n title: string;\n description?: string;\n cuttable?: boolean;\n levelLabels?: Partial<Record<AlchemyDetail, string>>;\n build(level: AlchemyDetail): unknown;\n defaultSelection?: AlchemyDetail | \"off\";\n}\nexport interface AlchemyGroomerConfig {\n label: string;\n kind: string;\n location: string;\n description: string;\n attributes?: AgentPayloadInput[\"attributes\"];\n context?: AgentPayloadInput[\"context\"];\n summary?: string;\n sections: AlchemyGroomerSection[];\n}\nexport interface AlchemyCopyVariant {\n id: string;\n label: string;\n hint?: string;\n icon?: React.ComponentType<{ className?: string }>;\n section?: \"copy\" | \"ai\";\n ariaLabel?: string;\n successMessage?: string;\n build?: () =>\n AgentPayloadInput | string | Promise<AgentPayloadInput | string>;\n onSelect?: () => void | Promise<void>;\n modal?: (props: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n }) => React.ReactNode;\n}\nexport interface AlchemyExportItem {\n id: string;\n label: string;\n build?: () => {\n content: BlobPart;\n extension: string;\n mime: string;\n /** Optional exact safe basename captured with bytes; omission derives a default, invalid values error. */\n filename?: string;\n };\n onSelect?: () => void | Promise<void>;\n}\ntype Resolvable<T> = T | (() => T);\nexport interface MatrxCopyMenuProps {\n label: string;\n /** Stable record identity when this mounted control can switch between records. */\n sourceId?: string;\n references?: readonly ContentTransferReference[];\n referenceActions?: readonly ContentTransferReferenceAction[];\n /** Prepare the tabular view while keeping raw JSON and human copy formats. */\n primarySource?: \"table\";\n human?: Resolvable<string>;\n json?: Resolvable<unknown>;\n agent?: Resolvable<AgentPayloadInput | string>;\n aiVariants?: AlchemyCopyVariant[];\n aiCustom?: AlchemyCustomSource;\n groomer?: () => AlchemyGroomerConfig;\n agentVariant?: {\n id?: string;\n label?: string;\n hint?: string;\n position?: \"first\" | \"last\";\n };\n export?: {\n items: AlchemyExportItem[];\n sheetRows?: () => Array<Record<string, unknown>>;\n sheetColumns?: () => Array<{ id: string; label: string }>;\n };\n /** Host-owned authenticated destination, not a second export serializer. */\n sendToSheet?: (\n rows: Array<Record<string, unknown>>,\n label: string,\n ) => Promise<TransferOutcome>;\n hide?: Array<\"copy\" | \"ai\" | \"export\">;\n disabled?: boolean;\n className?: string;\n stopPropagation?: boolean;\n size?: \"xs\" | \"icon\" | \"sm\" | \"toolbar\";\n appearance?: \"bare\" | \"segmented\";\n unified?: boolean;\n grouped?: boolean;\n icon?: AlchemyIcon;\n triggerVariant?: \"transparent\" | \"glass\" | \"outline\";\n controllerRef?: React.Ref<ContentTransferController>;\n triggerHidden?: boolean;\n}\nconst resolve = <T,>(value: Resolvable<T>): T =>\n typeof value === \"function\" ? (value as () => T)() : value;\nconst asPayload = (value: AgentPayloadInput | string): Payload => ({\n kind: \"markdown\",\n text: typeof value === \"string\" ? value : buildAgentPayload(value),\n});\nconst structuredPayload = (value: AgentPayloadInput | string): Payload => {\n if (typeof value === \"string\") return { kind: \"markdown\", text: value };\n const clean = (record?: AgentPayloadInput[\"context\"]) =>\n Object.fromEntries(\n Object.entries(record ?? {}).filter(([, entry]) => entry !== undefined),\n );\n return {\n kind: \"json\",\n value: normalizeTransferJson(\n {\n kind: value.kind,\n location: value.location,\n description: value.description,\n data: value.data,\n ...(value.summary !== undefined ? { summary: value.summary } : {}),\n attributes: clean(value.attributes),\n context: clean(value.context),\n },\n { omitUndefinedObjectProperties: true },\n ),\n };\n};\nconst actionDone = (message: string): TransferOutcome => ({\n status: \"success\",\n delivered: \"action\",\n mimeTypes: [],\n message,\n});\nconst isSafeFilename = (filename: string) =>\n filename === filename.trim() &&\n filename.length > 0 &&\n !/^\\.+$/.test(filename) &&\n !/[\\\\/\\x00-\\x1F\\x7F]/.test(filename);\nconst sourceFor = (\n id: string,\n label: string,\n build: () => Payload | Promise<Payload>,\n): Source => ({\n id,\n label,\n capture: async ({ signal }) => {\n signal.throwIfAborted();\n const payload = await build();\n signal.throwIfAborted();\n return directSource(payload, { sourceId: id, label });\n },\n});\n\n/** Opinionated bridge for Matrx's existing content builders, with one transfer UI. */\nexport function MatrxCopyMenu(props: MatrxCopyMenuProps) {\n const inherited = useContentTransferCapabilities();\n return (\n <MatrxCopyMenuSession\n key={JSON.stringify([\n inherited.identityKey ?? null,\n props.sourceId ?? props.label,\n ])}\n {...props}\n />\n );\n}\n\nfunction MatrxCopyMenuSession(props: MatrxCopyMenuProps) {\n const instance = React.useId();\n const controller = React.useRef<ContentTransferController>(null);\n const capabilities = useContentTransferCapabilities();\n const transport = capabilities.transport ?? createBrowserTransport();\n const [modal, setModal] = React.useState<AlchemyCopyVariant | null>(null);\n const [configuration, setConfiguration] = React.useState<{\n custom?: AlchemyCustomSource;\n groomer?: AlchemyGroomerConfig;\n } | null>(null);\n const copyVisible = !props.hide?.includes(\"copy\");\n const aiVisible = !props.hide?.includes(\"ai\");\n const exportVisible = !props.hide?.includes(\"export\");\n const make = (\n suffix: string,\n build: () => Payload | Promise<Payload>,\n label = props.label,\n ) =>\n sourceFor(\n `${props.sourceId ?? `${instance}:${props.label}`}:${suffix}`,\n label,\n build,\n );\n const human =\n copyVisible && props.human !== undefined\n ? make(\"human\", () => ({ kind: \"text\", text: resolve(props.human!) }))\n : undefined;\n const humanMarkdown =\n copyVisible && props.human !== undefined\n ? make(\"human-markdown\", () => ({\n kind: \"markdown\",\n text: resolve(props.human!),\n }))\n : undefined;\n const json =\n aiVisible && props.json !== undefined\n ? make(\"json\", () => ({\n kind: \"json\",\n value: normalizeTransferJson(resolve(props.json!), {\n omitUndefinedObjectProperties: true,\n }),\n }))\n : undefined;\n const agent =\n aiVisible && props.agent !== undefined\n ? make(\"agent\", () => asPayload(resolve(props.agent!)))\n : undefined;\n const structuredAgent =\n aiVisible && props.agent !== undefined\n ? make(\"structured-agent\", () => structuredPayload(resolve(props.agent!)))\n : undefined;\n const table =\n (exportVisible || props.primarySource === \"table\") &&\n props.export?.sheetRows\n ? make(\"rows\", () => {\n const value = normalizeTransferJson(props.export!.sheetRows!(), {\n omitUndefinedObjectProperties: true,\n });\n if (\n !Array.isArray(value) ||\n value.some(\n (row) =>\n row === null || typeof row !== \"object\" || Array.isArray(row),\n )\n )\n throw new Error(\"Sheet rows must be JSON objects.\");\n const rows = value as Array<\n Record<string, import(\"@ai-matrx/kit/content-transfer\").Json>\n >;\n const suppliedColumns = props.export!.sheetColumns?.();\n const columns = suppliedColumns ?? [...new Set(rows.flatMap((row) => Object.keys(row)))].map((id) => ({ id, label: id }));\n const ids = new Set<string>();\n for (const column of columns) {\n if (!column.id || !column.label || ids.has(column.id)) throw new Error(\"Sheet columns require unique nonempty ids and labels.\");\n ids.add(column.id);\n }\n for (const row of rows) for (const key of Object.keys(row)) if (!ids.has(key)) throw new Error(\"Table data contains a field outside its declared columns.\");\n return {\n kind: \"rows\",\n rows,\n columns: columns.map((column) => ({\n id: column.id,\n label: column.label,\n path: `/${column.id.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`,\n visible: true,\n })),\n };\n })\n : undefined;\n const builderVariants = aiVisible\n ? (props.aiVariants ?? [])\n .filter(\n (variant) => variant.build && !variant.onSelect && !variant.modal,\n )\n .map((variant) => ({\n ...variant,\n copyLabel: variant.label,\n source: make(\n `variant:${variant.id}`,\n async () => asPayload(await variant.build!()),\n variant.label,\n ),\n }))\n : [];\n const faithful = agent\n ? [\n {\n id: props.agentVariant?.id ?? \"faithful\",\n label: props.agentVariant?.label ?? \"Full AI context\",\n source: agent,\n copyLabel: props.agentVariant?.label ?? \"Copy for AI\",\n ...(props.agentVariant?.hint\n ? { hint: props.agentVariant.hint }\n : {}),\n },\n ]\n : [];\n const variants =\n props.agentVariant?.position === \"last\"\n ? [...builderVariants, ...faithful]\n : [...faithful, ...builderVariants];\n const actions: (PageAction & TransferMenuPresentation)[] = [];\n if (aiVisible)\n for (const variant of props.aiVariants ?? []) {\n if (!variant.onSelect && !variant.modal) continue;\n actions.push({\n ...variant,\n id: `variant-action:${variant.id}`,\n label: variant.label,\n supports: () => true,\n run: async () => {\n if (variant.onSelect) await variant.onSelect();\n else setModal(variant);\n return actionDone(`Opened ${variant.label}`);\n },\n });\n }\n if (aiVisible && props.aiCustom)\n actions.push({\n id: \"configure-source\",\n label: props.aiCustom.label ?? \"Customize source\",\n ...(props.aiCustom.hint ? { hint: props.aiCustom.hint } : {}),\n supports: () => true,\n run: async () => {\n setConfiguration({ custom: props.aiCustom! });\n return actionDone(\"Source options opened\");\n },\n });\n if (aiVisible && props.groomer)\n actions.push({\n id: \"groom-source\",\n label: \"Customize sections\",\n supports: () => true,\n run: async () => {\n setConfiguration({ groomer: props.groomer!() });\n return actionDone(\"Section options opened\");\n },\n });\n if (exportVisible)\n for (const item of props.export?.items ?? [])\n actions.push({\n id: `export:${item.id}`,\n label: item.label,\n supports: () => true,\n ...(item.build && !item.onSelect\n ? {\n placement: \"download\" as const,\n source: make(\n `export:${item.id}`,\n async () => {\n const file = item.build!();\n const bytes = new Uint8Array(\n await new Blob([file.content], {\n type: file.mime,\n }).arrayBuffer(),\n );\n return {\n kind: \"registered\",\n format: \"matrx-file\",\n value: {\n bytes: Array.from(bytes),\n mime: file.mime,\n extension: file.extension,\n ...(file.filename !== undefined\n ? { filename: file.filename }\n : {}),\n },\n };\n },\n item.label,\n ),\n }\n : {}),\n run: async ({ snapshot, draft, signal }) => {\n if (item.onSelect) {\n await item.onSelect();\n return actionDone(`Opened ${item.label}`);\n }\n const value =\n draft.payload.kind === \"registered\" ? draft.payload.value : null;\n if (\n !value ||\n Array.isArray(value) ||\n typeof value !== \"object\" ||\n !Array.isArray(value.bytes) ||\n typeof value.mime !== \"string\" ||\n typeof value.extension !== \"string\" ||\n value.bytes.some(\n (byte) =>\n typeof byte !== \"number\" ||\n !Number.isInteger(byte) ||\n byte < 0 ||\n byte > 255,\n )\n )\n throw new Error(`${item.label} did not capture a valid file.`);\n if (\n value.filename !== undefined &&\n (typeof value.filename !== \"string\" ||\n !isSafeFilename(value.filename))\n )\n throw new Error(\n `${item.label} has an unsafe filename. Use a nonempty basename without leading or trailing whitespace, dots only, path separators, or control characters.`,\n );\n if (\n draft.omissions.some((omission) => omission.reason !== \"duplicate\")\n )\n throw new Error(\n \"This custom file exceeds the configured export limits or contains excluded content. Use a standard format or revise the source options.\",\n );\n const bytes = new Uint8Array(value.bytes as number[]);\n const filename =\n typeof value.filename === \"string\"\n ? value.filename\n : `${\n props.label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"export\"\n }.${value.extension.replace(/[^a-zA-Z0-9.-]/g, \"\") || \"bin\"}`;\n return transport.download(\n sealTransferArtifact({\n snapshotId: snapshot.id,\n draftRevision: draft.revision,\n format: `export:${item.id}`,\n plainText: \"\",\n file: { filename, mime: value.mime, bytes },\n omissions: [...draft.omissions],\n }),\n signal,\n );\n },\n });\n if (exportVisible && table && props.sendToSheet)\n actions.push({\n id: \"send-google-sheet\",\n label: \"Send to Google Sheet\",\n source: table,\n supports: () => true,\n run: async ({ draft }) => {\n if (draft.payload.kind !== \"rows\")\n throw new Error(\"Google Sheets requires captured rows.\");\n return props.sendToSheet!(draft.payload.rows, props.label);\n },\n });\n const source =\n (props.primarySource === \"table\" ? table : undefined) ??\n json ??\n table ??\n structuredAgent ??\n human ??\n builderVariants[0]?.source;\n if (!source && !actions.length) return null;\n // Action-only targets carry an explicit description, never invented record data.\n const target =\n source ?? make(\"actions\", () => ({ kind: \"text\", text: props.label }));\n return (\n <>\n <ContentTransferMenu\n triggerSize={props.size === \"xs\" || props.size === \"toolbar\" ? \"compact\" : \"default\"}\n source={target}\n {...(props.references ? { references: props.references } : {})}\n {...(props.referenceActions ? { referenceActions: props.referenceActions } : {})}\n {...(props.icon !== undefined ? { icon: props.icon } : {})}\n {...(props.triggerVariant !== undefined\n ? { triggerVariant: props.triggerVariant }\n : {})}\n controllerRef={(value) => {\n controller.current = value;\n if (typeof props.controllerRef === \"function\") props.controllerRef(value);\n else if (props.controllerRef) (props.controllerRef as React.MutableRefObject<ContentTransferController | null>).current = value;\n }}\n {...(props.triggerHidden ? { triggerHidden: true } : {})}\n label={props.label}\n variants={variants}\n actions={actions}\n sourceFormats={Boolean(source)}\n hide={[\n ...(!copyVisible || !source ? [\"copy\" as const] : []),\n ...(!aiVisible || !source ? [\"prepare\" as const] : []),\n ...(!exportVisible ? [\"download\" as const] : []),\n ]}\n formatSources={{\n ...(human\n ? { plain: human, markdown: humanMarkdown!, html: humanMarkdown! }\n : {}),\n ...(json ? { json, \"compact-json\": json } : {}),\n ...(table && exportVisible ? { csv: table, tsv: table } : {}),\n }}\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n className={cn(\n props.className,\n props.size === \"xs\" && \"matrx-alchemy-xs\",\n props.size === \"sm\" && \"matrx-alchemy-sm\",\n props.size === \"toolbar\" && \"matrx-alchemy-toolbar-target\",\n )}\n {...(props.stopPropagation !== undefined\n ? { stopPropagation: props.stopPropagation }\n : {})}\n />\n {modal?.modal?.({\n open: true,\n onOpenChange: (open) => {\n if (!open) setModal(null);\n },\n })}\n {configuration ? (\n <SourceConfiguration\n restoreFocus={() => controller.current?.focusTrigger()}\n key={`${instance}:configuration`}\n configuration={configuration}\n onClose={() => setConfiguration(null)}\n onPrepare={async (payload, label) => {\n if (!controller.current)\n throw new Error(\"Alchemy is no longer mounted.\");\n await controller.current.prepare(payload, {\n label,\n id: `${instance}:configured:${crypto.randomUUID()}`,\n });\n setConfiguration(null);\n }}\n />\n ) : null}\n </>\n );\n}\n\nfunction SourceConfiguration({\n restoreFocus,\n configuration,\n onClose,\n onPrepare,\n}: {\n configuration: {\n custom?: AlchemyCustomSource;\n groomer?: AlchemyGroomerConfig;\n };\n restoreFocus(): void;\n onClose(): void;\n onPrepare(payload: Payload, label: string): Promise<void>;\n}) {\n const custom = configuration.custom;\n const handingOff = React.useRef(false);\n const groomer = configuration.groomer;\n const [values, setValues] = React.useState<AlchemyOptionValues>(() =>\n Object.fromEntries(\n custom?.options.map((option) => [option.key, option.default]) ?? [],\n ),\n );\n const [sections, setSections] = React.useState<\n Record<string, AlchemyDetail | \"off\">\n >(() =>\n Object.fromEntries(\n groomer?.sections.map((section) => [\n section.id,\n section.defaultSelection ?? \"full\",\n ]) ?? [],\n ),\n );\n const [error, setError] = React.useState<string | null>(null);\n const [busy, setBusy] = React.useState(false);\n const title = custom?.dialogTitle ?? groomer?.label ?? \"Customize source\";\n let prepared: AgentPayloadInput | null = null;\n let buildError: string | null = null;\n let text = \"\";\n try {\n if (custom) {\n const result = custom.build(values);\n prepared = custom.wrap(result.text, values, result.meta);\n } else if (groomer) {\n const data: Record<string, unknown> = {};\n const omitted: string[] = [];\n for (const section of groomer.sections) {\n const level = sections[section.id] ?? \"full\";\n if (level === \"off\") omitted.push(section.id);\n else {\n const value = section.build(level);\n if (value !== undefined && value !== null) data[section.id] = value;\n }\n }\n prepared = {\n kind: groomer.kind,\n location: groomer.location,\n description: groomer.description,\n data,\n ...(groomer.summary ? { summary: groomer.summary } : {}),\n attributes: {\n ...groomer.attributes,\n dropped_sections: omitted.join(\",\"),\n },\n ...(groomer.context ? { context: groomer.context } : {}),\n };\n }\n text = prepared ? buildAgentPayload(prepared) : \"\";\n } catch (cause) {\n buildError =\n cause instanceof Error ? cause.message : \"Could not prepare this source.\";\n }\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !busy) onClose();\n }}\n >\n <DialogContent\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (!handingOff.current) restoreFocus();\n }}\n className=\"matrx-alchemy-workspace matrx-alchemy-configuration\"\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>\n {custom?.dialogDescription ??\n \"Choose the source detail, then prepare, edit, summarize, copy or export it in Alchemy.\"}\n </DialogDescription>\n </DialogHeader>\n <div className=\"matrx-alchemy-workspace-body\">\n <div className=\"matrx-alchemy-main matrx-alchemy-toolbar\">\n {custom?.options.map((option) => (\n <label key={option.key}>\n {option.label}\n {\"hint\" in option && option.hint ? (\n <small>{option.hint}</small>\n ) : null}\n {option.kind === \"toggle\" ? (\n <input\n type=\"checkbox\"\n checked={Boolean(values[option.key])}\n onChange={(event) =>\n setValues({ ...values, [option.key]: event.target.checked })\n }\n />\n ) : option.kind === \"preset\" ? (\n <select\n value={Number(values[option.key])}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: Number(event.target.value),\n })\n }\n >\n {option.options.map((choice) => (\n <option key={choice.value} value={choice.value}>\n {choice.label}\n </option>\n ))}\n </select>\n ) : option.kind === \"slider\" ? (\n <>\n <input\n type=\"range\"\n min={0}\n max={Math.max(0, option.stops.length - 1)}\n step={1}\n value={option.stops.indexOf(Number(values[option.key]))}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: option.stops[Number(event.target.value)]!,\n })\n }\n />\n <span>{option.formatValue(Number(values[option.key]))}</span>\n </>\n ) : (\n <>\n <input\n type=\"number\"\n min={option.min}\n step={option.step}\n value={Number(values[option.key])}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: Number(event.target.value),\n })\n }\n />\n {option.presets?.map((preset) => (\n <Button\n key={preset.value}\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n onClick={() =>\n setValues({ ...values, [option.key]: preset.value })\n }\n >\n {preset.label}\n </Button>\n ))}\n </>\n )}\n </label>\n ))}\n {groomer ? (\n <>\n <div>\n {([\"full\", \"compact\", \"brief\"] as const).map((level) => (\n <Button\n key={level}\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n onClick={() =>\n setSections(\n Object.fromEntries(\n groomer.sections.map((section) => [\n section.id,\n level === \"brief\" && section.cuttable\n ? \"off\"\n : level,\n ]),\n ),\n )\n }\n >\n {level}\n </Button>\n ))}\n </div>\n {groomer.sections.map((section) => (\n <label key={section.id}>\n {section.title}\n <select\n value={sections[section.id]}\n onChange={(event) =>\n setSections({\n ...sections,\n [section.id]: event.target.value as\n AlchemyDetail | \"off\",\n })\n }\n >\n {([\"full\", \"compact\", \"brief\"] as const).map((level) => (\n <option key={level} value={level}>\n {section.levelLabels?.[level] ?? level}\n </option>\n ))}\n {section.cuttable ? (\n <option value=\"off\">Exclude</option>\n ) : null}\n </select>\n {section.description ? (\n <span>{section.description}</span>\n ) : null}\n </label>\n ))}\n </>\n ) : null}\n </div>\n <p>\n {formatCount(text.length)} characters · approximately{\" \"}\n {formatCount(Math.ceil(text.length / 4))} tokens\n </p>\n {error || buildError ? <p role=\"alert\">{error ?? buildError}</p> : null}\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n disabled={busy}\n onClick={onClose}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n className=\"matrx-alchemy-workspace-primary\"\n disabled={busy || !prepared || Boolean(buildError)}\n onClick={async () => {\n if (!prepared) return;\n setBusy(true);\n setError(null);\n try {\n handingOff.current = true;\n await onPrepare(structuredPayload(prepared), title);\n } catch (cause) {\n handingOff.current = false;\n setError(\n cause instanceof Error\n ? cause.message\n : \"Could not open Alchemy.\",\n );\n } finally {\n setBusy(false);\n }\n }}\n >\n {busy ? \"Preparing…\" : \"Prepare in Alchemy\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport type AlchemyGroomerPreset = \"everything\" | \"balanced\" | \"minimal\";\nexport const GROOMER_LEVELS: AlchemyDetail[] = [\"full\", \"compact\", \"brief\"];\nexport function applyGroomerPreset(\n preset: AlchemyGroomerPreset,\n sections: AlchemyGroomerSection[],\n): Record<string, AlchemyDetail | \"off\"> {\n return Object.fromEntries(\n sections.map((section) => [\n section.id,\n preset === \"everything\"\n ? \"full\"\n : preset === \"balanced\"\n ? \"compact\"\n : section.cuttable\n ? \"off\"\n : \"brief\",\n ]),\n );\n}\nexport function defaultGroomerSelections(\n sections: AlchemyGroomerSection[],\n): Record<string, AlchemyDetail | \"off\"> {\n return Object.fromEntries(\n sections.map((section) => [section.id, section.defaultSelection ?? \"full\"]),\n );\n}\nexport function buildGroomerPresetPayload(\n config: AlchemyGroomerConfig,\n preset: AlchemyGroomerPreset,\n): AgentPayloadInput {\n const selections = applyGroomerPreset(preset, config.sections);\n const data: Record<string, unknown> = {};\n const dropped: string[] = [];\n for (const section of config.sections) {\n const selection = selections[section.id] ?? \"full\";\n if (selection === \"off\") {\n dropped.push(section.id);\n continue;\n }\n const value = section.build(selection);\n if (value !== undefined && value !== null) data[section.id] = value;\n }\n return {\n kind: config.kind,\n location: config.location,\n description:\n preset === \"everything\"\n ? config.description\n : `${config.description} (${preset} detail)`,\n data,\n ...(config.summary !== undefined ? { summary: config.summary } : {}),\n attributes: {\n ...config.attributes,\n detail: preset,\n ...(dropped.length ? { dropped_sections: dropped.join(\",\") } : {}),\n },\n ...(config.context ? { context: config.context } : {}),\n };\n}\nexport function groomerPresetVariants(\n getConfig: () => AlchemyGroomerConfig,\n): AlchemyCopyVariant[] {\n return [\n {\n id: \"balanced\",\n label: \"Balanced\",\n hint: \"Compact sections\",\n build: () => buildGroomerPresetPayload(getConfig(), \"balanced\"),\n },\n {\n id: \"minimal\",\n label: \"Minimal\",\n hint: \"Brief sections with optional detail excluded\",\n build: () => buildGroomerPresetPayload(getConfig(), \"minimal\"),\n },\n ];\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { Artifact, TransferOutcome } from \"@ai-matrx/kit/content-transfer\";\nimport { Button } from \"../button\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport type { ContentTransferEmailPort } from \"./extensions\";\n\ntype PendingEmail = {\n artifact: Artifact;\n context: { label: string; signal: AbortSignal };\n resolve(outcome: TransferOutcome): void;\n onAbort(): void;\n};\n\nconst cancelled = (): TransferOutcome => ({ status: \"cancelled\" });\nconst failed = (error: unknown): TransferOutcome => ({\n status: \"error\",\n code: \"email-failed\",\n message: error instanceof Error ? error.message : \"Could not send email.\",\n retryable: true,\n});\n\n/** Adds one explicit review step without changing the sealed artifact handed to the host. */\nexport function useReviewedTransferEmail(email?: ContentTransferEmailPort): {\n email: ContentTransferEmailPort | undefined;\n review: React.ReactNode;\n} {\n const [pending, setPending] = React.useState<PendingEmail | null>(null);\n const [sending, setSending] = React.useState(false);\n const pendingRef = React.useRef<PendingEmail | null>(null);\n const sendingRef = React.useRef(false);\n\n const settle = React.useCallback((request: PendingEmail, outcome: TransferOutcome, render = true) => {\n if (pendingRef.current !== request) return;\n pendingRef.current = null;\n request.context.signal.removeEventListener(\"abort\", request.onAbort);\n request.resolve(outcome);\n sendingRef.current = false;\n if (render) {\n setSending(false);\n setPending(null);\n }\n }, []);\n\n React.useEffect(\n () => () => {\n const request = pendingRef.current;\n if (!request) return;\n pendingRef.current = null;\n request.context.signal.removeEventListener(\"abort\", request.onAbort);\n request.resolve(cancelled());\n sendingRef.current = false;\n },\n [],\n );\n\n const reviewed = React.useMemo<ContentTransferEmailPort | undefined>(() => {\n if (!email) return undefined;\n return {\n send: (artifact, context) => {\n if (context.signal.aborted) return Promise.resolve(cancelled());\n if (pendingRef.current)\n return Promise.resolve({\n status: \"error\",\n code: \"email-review-active\",\n message: \"Finish reviewing the current email before starting another.\",\n retryable: true,\n });\n return new Promise<TransferOutcome>((resolve) => {\n const request: PendingEmail = {\n artifact,\n context,\n resolve,\n onAbort: () => settle(request, cancelled()),\n };\n pendingRef.current = request;\n context.signal.addEventListener(\"abort\", request.onAbort, { once: true });\n setSending(false);\n setPending(request);\n });\n },\n };\n }, [email, settle]);\n\n const cancel = React.useCallback(() => {\n const request = pendingRef.current;\n if (request && !sendingRef.current) settle(request, cancelled());\n }, [settle]);\n const confirm = React.useCallback(() => {\n const request = pendingRef.current;\n if (!request || sendingRef.current || request.context.signal.aborted) return;\n sendingRef.current = true;\n setSending(true);\n void email?.send(request.artifact, request.context).then(\n (outcome) => settle(request, outcome),\n (error) => settle(request, failed(error)),\n );\n }, [email, settle]);\n\n const review = pending ? <Dialog open onOpenChange={(open) => { if (!open) cancel(); }}>\n <DialogContent className=\"matrx-alchemy-workspace matrx-alchemy-email-review\" aria-busy={sending}>\n <DialogHeader>\n <DialogTitle>Review email attachment</DialogTitle>\n <DialogDescription>Email {pending.artifact.file?.filename ?? `${pending.artifact.format} output`} from {pending.context.label}. Review this exact attachment before sending.</DialogDescription>\n </DialogHeader>\n <textarea aria-label=\"Email attachment preview\" readOnly value={pending.artifact.plainText} className=\"matrx-alchemy-preview\" />\n {pending.artifact.omissions.length ? <details className=\"matrx-alchemy-email-adjustments\" open><summary>{pending.artifact.omissions.length} omission{pending.artifact.omissions.length === 1 ? \"\" : \"s\"} or adjustment{pending.artifact.omissions.length === 1 ? \"\" : \"s\"}</summary><ul >{pending.artifact.omissions.map((omission, index) => <li key={`${omission.path}-${omission.reason}-${index}`}>{omission.path || \"/\"}: {omission.reason}{omission.count == null ? \"\" : ` (${omission.count})`}</li>)}</ul></details> : <p className=\"matrx-alchemy-meta\">No omissions or adjustments.</p>}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={sending} onClick={cancel}>Cancel</Button>\n <Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" disabled={sending} onClick={confirm}>{sending ? \"Sending email…\" : \"Send email\"}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog> : null;\n\n return { email: reviewed, review };\n}\n","\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport const buttonVariants = cva(\n \"inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-0 disabled:pointer-events-none disabled:opacity-50 active:scale-[0.98] [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n /**\n * An explicit spelling of `default`, identical by construction. It is\n * not decoration: matrx-frontend's `ButtonMine` fork carried it, ~17\n * call sites say `variant=\"primary\"`, and the alternative to keeping\n * the word was a host shim translating a prop — the massage C22 bans.\n */\n primary: \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n /** The affirmative twin of `destructive` — confirm, approve, publish. */\n success:\n \"bg-success text-success-foreground shadow-sm hover:bg-success/90\",\n outline:\n \"border border-border bg-card shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n subtle:\n \"border border-transparent bg-muted/50 text-foreground hover:border-border hover:bg-muted\",\n },\n /**\n * ONE size scale, xs → 3xl, plus the two icon boxes. The top and bottom\n * of the scale came in from matrx-frontend's `ButtonMine` fork (2026-09-07):\n * a dense toolbar needs `xs`, and a marketing/hero call to action needs\n * `xl`+. A host that has to reach outside this scale forks the button,\n * which is exactly how `ButtonMine` was born.\n */\n size: {\n xs: \"h-6 rounded-md px-1 text-xs\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n default: \"h-9 px-4 py-2\",\n /** An explicit spelling of `default` (the fork's middle rung). */\n md: \"h-9 px-4 py-2\",\n lg: \"h-10 rounded-md px-6\",\n xl: \"h-12 px-8 py-3 text-base\",\n \"2xl\": \"h-14 px-10 py-3 text-base\",\n \"3xl\": \"h-16 px-12 py-3 text-base\",\n icon: \"h-9 w-9\",\n \"icon-sm\": \"h-7 w-7\",\n /** A circular icon box — an avatar-shaped control, not a square one. */\n roundIcon: \"h-8 w-8 rounded-full p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\n/**\n * THE TOUCH FLOOR (2026-09-17).\n *\n * Every rung of the size scale below `xl` is shorter than the 44px platform\n * touch target: `xs` 24, `icon-sm` 28, `sm` 32, `roundIcon` 32, `default`/`md`\n * 36, `icon` 36, `lg` 40. Measured live at 390x844 on `/masterwork/<id>`, ALL\n * SEVEN design-system Buttons in the viewport were under the floor (four at\n * 32px, two at 28px).\n *\n * The floor is raised in CSS, under `@media (pointer: coarse)` ONLY, so DESKTOP\n * DENSITY IS UNTOUCHED — a narrow desktop window is not a finger, which is why\n * this rule deliberately does NOT carry the `(max-width: 1023px)` half that the\n * dialog-footer floor in `styles.css` uses.\n *\n * WHY EVERY SUB-44 RUNG AND NOT JUST `sm`: a floor applied to one rung inverts\n * the scale. Lift `sm` (32) alone and it renders TALLER on a phone than\n * `default` (36) and `lg` (40) — the scale would stop being a scale. A floor is\n * only coherent applied to everything beneath it.\n *\n * The mechanism is `min-height`/`min-width`, not an invisible 44px hit ring\n * over a 32px pill. A ring is the tap-target package's pattern and it is right\n * THERE (isolated glass buttons), but on a toolbar of adjacent `sm` buttons\n * separated by an 8px gap the rings overlap in the gap and one button silently\n * eats taps aimed at its neighbour — unacceptable where a neighbour is\n * destructive. `lib/entity-list`'s own phone contract (`h-11 min-w-11`) already\n * chose growth for the same reason; this is that choice made once, in the\n * primitive, instead of per surface.\n *\n * `min-width` is raised only on the SQUARE rungs (`icon`, `icon-sm`,\n * `roundIcon`) — a text button is already wider than 44px, and forcing a floor\n * on it would stretch short labels.\n *\n * Opt out on a control that is genuinely not a finger target with\n * `data-touch-exempt` (same escape hatch the footer floor honours), and say why\n * at the call site.\n */\nconst TOUCH_FLOOR_SIZES = new Set([\n \"xs\",\n \"sm\",\n \"default\",\n \"md\",\n \"lg\",\n \"icon\",\n \"icon-sm\",\n \"roundIcon\",\n]);\nconst SQUARE_SIZES = new Set([\"icon\", \"icon-sm\", \"roundIcon\"]);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Component = asChild ? Slot : \"button\";\n const resolvedSize = size ?? \"default\";\n return (\n <Component\n className={cn(buttonVariants({ variant, size, className }))}\n data-matrx-button=\"\"\n data-tap-floor={TOUCH_FLOOR_SIZES.has(resolvedSize) ? \"\" : undefined}\n data-tap-floor-square={\n SQUARE_SIZES.has(resolvedSize) ? \"\" : undefined\n }\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n","\"use client\";\n\nimport { useReviewedTransferEmail } from \"./email-review\";\n\nimport * as React from \"react\";\nimport { createPortal, flushSync } from \"react-dom\";\nimport {\n applySectionSelection,\n applyTransferLimits,\n capture,\n buildAgentPayload,\n collectAllMatching,\n createBrowserTransport,\n createDraft,\n directSource,\n editDraft,\n projectSnapshot,\n readTransferCell,\n reduceJson,\n resetDraft,\n resolveTransferPreferences,\n resolveTransferRegistry,\n sealTransferArtifact,\n serialize,\n serializeMarkdownRich,\n transformRows,\n undoDraft,\n type AiPreparation,\n type Artifact,\n type BoundAllMatching,\n type Draft,\n type ExportProjection,\n type FormatAdapter,\n type Json,\n type PageAction,\n type Payload,\n type Section,\n type Snapshot,\n type Source,\n type SurfaceHandle,\n type TransferCapabilities,\n type TransferOutcome,\n type TransferTarget,\n type TransferPreferenceOverrides,\n type TransferPreferences,\n type TransferScope,\n type Transport,\n} from \"@ai-matrx/kit/content-transfer\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { TapTargetButton, TapTargetButtonTransparent } from \"../tap-target/index\";\nimport { ALCHEMY_GLYPH_VIEWBOX, ALCHEMY_GLYPH_PATHS, type AlchemyIcon } from \"./icon\";\nexport { ALCHEMY_GLYPH_SVG, ALCHEMY_COPY_TRANSFORM_SVG, type AlchemyIcon } from \"./icon\";\n\nimport { createTransferEmailActions, type ContentTransferReference, type ContentTransferReferencePort, type ContentTransferEmailPort } from \"./extensions\";\nexport { tableSchemaFormat, tableDataFormat, createTransferEmailActions, type ContentTransferReference, type ContentTransferReferencePort, type ContentTransferEmailPort } from \"./extensions\";\nexport type ContentTransferReferenceAction = { id: string; label: string; run(): void | Promise<void> };\n\nexport function AlchemyGlyph({ icon = \"portal\", ...props }: React.SVGAttributes<SVGSVGElement> & { icon?: AlchemyIcon }) {\n return <svg width=\"18\" height=\"18\" viewBox={ALCHEMY_GLYPH_VIEWBOX[icon]} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}>{ALCHEMY_GLYPH_PATHS[icon].map((d) => <path key={d} d={d}/>)}</svg>;\n}\n\nexport type ContentTransferCapabilities = TransferCapabilities & {\n /** Opaque host session boundary. It is used only to reset local menu state. */\n identityKey?: string;\n transport?: Transport;\n reference?: ContentTransferReferencePort;\n email?: ContentTransferEmailPort;\n actions?: PageAction[];\n preferences?: TransferPreferenceOverrides;\n onOutcome?: (outcome: TransferOutcome) => void;\n};\nconst CapabilityContext = React.createContext<ContentTransferCapabilities>({});\nexport function ContentTransferCapabilitiesProvider({ value, children }: { value: ContentTransferCapabilities; children: React.ReactNode }) {\n return <CapabilityContext.Provider value={value}>{children}</CapabilityContext.Provider>;\n}\nexport const useContentTransferCapabilities = () => React.useContext(CapabilityContext);\nconst SurfaceContext = React.createContext<SurfaceHandle | null>(null);\nexport function ContentTransferSurfaceProvider({ handle, children }: { handle: SurfaceHandle; children: React.ReactNode }) {\n return <SurfaceContext.Provider value={handle}>{children}</SurfaceContext.Provider>;\n}\nexport const useContentTransferSurface = () => React.useContext(SurfaceContext);\n\nexport type SerializableFormat = \"plain\" | \"markdown\" | \"html\" | \"json\" | \"compact-json\" | \"csv\" | \"tsv\";\ntype BuiltInFormat = SerializableFormat | \"xlsx\";\nexport interface TransferMenuPresentation {\n group?: \"save\" | \"chat\" | \"email\";\n prepared?: boolean;\n hint?: string;\n icon?: React.ComponentType<{ className?: string }>;\n ariaLabel?: string;\n /** Download-only actions join the shared format palette instead of a second menu. */\n placement?: \"download\";\n}\nexport interface TransferMenuVariant extends TransferMenuPresentation {\n id: string; label: string; source: Source | Payload;\n copyLabel?: string;\n section?: \"copy\" | \"ai\";\n successMessage?: string;\n}\nfunction MenuPresentation({ label, hint, icon: Icon }: TransferMenuPresentation & { label: string }) {\n return <>{Icon ? <Icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph file/>}<span>{label}{hint ? <small className=\"matrx-alchemy-menu-hint\">{hint}</small> : null}</span></>;\n}\nfunction DestinationPresentation({ action }: { action: PageAction & TransferMenuPresentation }) {\n const paths: Record<string, string> = {\n notes: \"M5 3h14v18H5zM8 8h8M8 12h8M8 16h5\",\n scratch: \"M5 3h14v18H5zM9 12h6M12 9v6\",\n document: \"M6 3h8l4 4v14H6zM14 3v5h4M9 12h6M9 16h6\",\n workbook: \"M3 4h18v16H3zM3 9h18M9 4v16M15 9v11M3 15h18\",\n task: \"M9 6h11M9 12h11M9 18h11M3 6l1 1 2-2M3 12l1 1 2-2M3 18l1 1 2-2\",\n attach: \"m9 12 5-5a3 3 0 0 1 4 4l-7 7a5 5 0 0 1-7-7l8-8M7 14l7-7\",\n code: \"m8 6-6 6 6 6m8-12 6 6-6 6m-3-14-2 16\",\n chat: \"M4 4h16v13H9l-5 4zM8 9h8M8 13h5\",\n assistant: \"M3 4h18v16H3zM15 4v16M6 9h6M6 13h4\",\n tools: \"m14 4 3 3 4-1a6 6 0 0 1-8 7l-7 7-3-3 7-7a6 6 0 0 1 4-6z\",\n };\n const path = paths[action.id.replace(/^matrx:/, \"\")];\n return <>{action.icon ? <action.icon className=\"matrx-alchemy-menu-icon\"/> : path ? <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d={path}/></svg> : <PaletteGlyph file/>}<span>{action.label}{action.hint ? <small className=\"matrx-alchemy-menu-hint\">{action.hint}</small> : null}</span></>;\n}\nfunction ReceiptLink({ target }: { target: TransferTarget | undefined }) {\n return target?.href && /^(\\/(?!\\/)|https?:\\/\\/)/.test(target.href) ? <a className=\"matrx-alchemy-receipt-link\" href={target.href}>Open {target.kind}</a> : null;\n}\nfunction PaletteGlyph({ format, ai = false, file = false, kind }: { format?: string; ai?: boolean; file?: boolean; kind?: \"ai-copy\" | \"sliders\" | \"link\" | \"surface\" }) {\n if (kind === \"link\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-2 2M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l2-2\"/></svg>;\n if (kind === \"surface\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18M9 9v12\"/></svg>;\n if (kind === \"ai-copy\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><rect x=\"5\" y=\"5\" width=\"11\" height=\"14\" rx=\"2\"/><path d=\"M9 3h6a2 2 0 0 1 2 2v10\"/><path d=\"m18.5 3 .55 1.45L20.5 5l-1.45.55L18.5 7l-.55-1.45L16.5 5l1.45-.55z\"/></svg>;\n if (kind === \"sliders\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 6h16M4 12h16M4 18h16\"/><path d=\"M8 3v6M16 9v6M10 15v6\"/></svg>;\n if (ai) return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 5a3 3 0 1 0-5.997.125A4 4 0 0 0 3.5 10.9a4 4 0 0 0 .556 6.588A4 4 0 0 0 12 19\"/><path d=\"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.503 5.775 4 4 0 0 1-.556 6.588A4 4 0 0 1 12 19\"/><path d=\"M12 5v14M8 9h1M15 9h1M8 15h1M15 15h1\"/></svg>;\n if (file) return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 3h8l4 4v14H6z\"/><path d=\"M14 3v5h5M9 13h6M9 17h6\"/></svg>;\n const path = format === \"json\" || format === \"table-data\" ? <><path d=\"M9 4C7 4 7 7 5 7v3c2 0 2 1 2 2s0 2-2 2v3c2 0 2 3 4 3\"/><path d=\"M15 4c2 0 2 3 4 3v3c-2 0-2 1-2 2s0 2 2 2v3c-2 0-2 3-4 3\"/></>\n : format === \"table-schema\" ? <><rect x=\"8\" y=\"3\" width=\"8\" height=\"5\" rx=\"1\"/><rect x=\"2\" y=\"16\" width=\"8\" height=\"5\" rx=\"1\"/><rect x=\"14\" y=\"16\" width=\"8\" height=\"5\" rx=\"1\"/><path d=\"M12 8v4M6 16v-4h12v4\"/></>\n : format === \"compact-json\" ? <><path d=\"m14 10 7-7\"/><path d=\"M20 10h-6V4\"/><path d=\"m3 21 7-7\"/><path d=\"M4 14h6v6\"/></>\n : format === \"csv\" ? <><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\"/><path d=\"M4 10h16M10 4v16\"/></>\n : format === \"tsv\" ? <><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6M8 13h2M14 13h2M8 17h2M14 17h2\"/></>\n : format === \"xlsx\" ? <><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6M8 13h8M8 17h8M12 11v8\"/></>\n : format === \"markdown\" ? <><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5z\"/><path d=\"M14 2v6h6M10 13l-2 2 2 2M14 17l2-2-2-2\"/></>\n : format === \"html\" ? <><path d=\"M15 6h6M3 6h7M3 12h18M3 18h12\"/></>\n : <><path d=\"M4 7V4h16v3M9 20h6M12 4v16\"/></>;\n return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">{path}</svg>;\n}\nfunction PaletteRows({ title, items, onRun, extra, ai = false, glyphKind, fallbackHint }: { title: string; items: readonly TransferMenuVariant[]; onRun?: (item: TransferMenuVariant) => void; extra?: React.ReactNode; ai?: boolean; glyphKind?: \"ai-copy\" | \"sliders\"; fallbackHint?: string }) {\n if (!items.length && !extra) return null;\n return <section className=\"matrx-alchemy-palette-section\"><h3>{title}</h3>{items.map((item) => { const label = item.copyLabel ?? item.label; const hint = item.hint ?? fallbackHint; return <button key={item.id} type=\"button\" className={cn(\"matrx-alchemy-palette-row\", ai && \"matrx-alchemy-palette-row-ai\")} aria-label={item.ariaLabel ?? `${label}${hint ? ` ${hint}` : \"\"}`} onClick={() => onRun?.(item)}>{item.icon ? <item.icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph ai={ai} {...(glyphKind ? { kind: glyphKind } : {})}/>}<span>{label}{hint ? <small className=\"matrx-alchemy-menu-hint\">{hint}</small> : null}</span></button>; })}{extra}</section>;\n}\nexport interface ContentTransferMenuProps {\n source?: Payload | Source;\n projection?: ExportProjection;\n sections?: Section[];\n preferences?: TransferPreferenceOverrides;\n enabled?: boolean;\n surface?: SurfaceHandle;\n label?: string;\n table?: { availableScopes: TransferScope[]; initialScope: TransferScope; scopeLabels?: Partial<Record<TransferScope, string>> };\n references?: readonly ContentTransferReference[];\n referenceActions?: readonly ContentTransferReferenceAction[];\n /** A quick format may explicitly capture a different representation. */\n formatSources?: Partial<Record<SerializableFormat, Source | Payload>>;\n /** Set false for action-only hosts; source formats and adapters are then omitted. */\n sourceFormats?: boolean;\n /** Named alternate sources open this same preparation workspace. */\n variants?: readonly TransferMenuVariant[];\n actions?: (PageAction & TransferMenuPresentation)[];\n capabilities?: ContentTransferCapabilities;\n disabled?: boolean;\n /** Portal is the default Alchemy mark; copy-transform remains opt-in. */\n icon?: AlchemyIcon;\n /** Uses the canonical TapTargetButton presentation. */\n triggerVariant?: \"transparent\" | \"glass\" | \"outline\";\n triggerSize?: \"default\" | \"compact\";\n /** Mount the transfer session without a visible trigger for a host-owned menu command. */\n triggerHidden?: boolean;\n className?: string;\n stopPropagation?: boolean;\n hide?: readonly (\"copy\" | \"prepare\" | \"download\")[];\n controllerRef?: React.Ref<ContentTransferController>;\n}\nexport interface ContentTransferController {\n focusTrigger(): void;\n /** Mount the one canonical Alchemy palette in a host-owned menu surface. */\n mountPalette(target: HTMLElement | null, onClose?: () => void, restoreFocus?: () => void): void;\n preparePrimary(options?: { restoreFocus?: () => void }): Promise<void>;\n prepare(source: Source | Payload, options?: { id?: string; label?: string }): Promise<void>;\n}\n\nconst LABEL: Record<BuiltInFormat, string> = { plain: \"Plain text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact JSON\", csv: \"CSV\", tsv: \"Google Sheets\", xlsx: \"Excel workbook\" };\nconst BUILT_INS = Object.freeze((Object.keys(LABEL) as BuiltInFormat[]).map((id) => ({ id })));\nconst COPIES: SerializableFormat[] = [\"plain\", \"markdown\", \"html\", \"json\", \"compact-json\", \"csv\", \"tsv\"];\nconst DOWNLOADS: BuiltInFormat[] = [...COPIES, \"xlsx\"];\nconst EMPTY_VARIANTS: readonly { id: string; label: string; source: Source | Payload }[] = [];\nconst SCOPE_LABEL: Record<TransferScope, string> = { target: \"This content\", row: \"This row\", selected: \"Selected rows\", view: \"Current view\", loaded: \"Loaded rows\", \"all-matching\": \"All matching rows\" };\nconst filenameFor = (label: string) => label.toLocaleLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/(^-|-$)/g, \"\") || \"export\";\nconst estimateTokens = (text: string) => Math.ceil(text.length / 4);\nconst errorMessage = (error: unknown, fallback: string) => error instanceof Error ? error.message : fallback;\nconst isAbort = (error: unknown) => error instanceof DOMException && error.name === \"AbortError\";\nconst supportsBuiltIn = (format: BuiltInFormat, payload: Payload) => ![\"csv\", \"tsv\", \"xlsx\"].includes(format) || payload.kind === \"rows\";\nconst outcomeMessage = (result: TransferOutcome) => {\n if (result.status === \"success\") {\n const success = result as TransferOutcome & { delivered: string; message?: string };\n return success.delivered === \"action\" ? success.message ?? \"Action completed\" : success.delivered === \"download-started\" ? \"Download started\" : success.message ?? \"Copied\";\n }\n // A queued write is NEITHER a delivery nor a failure (kit `TransferOutcome`\n // `queued`): the host's sentence alone reads as \"done\", so the remedy — what\n // has not happened yet and what the person does next — is always spoken with\n // it, and the pending request rides the same receipt door as any target.\n if (result.status === \"queued\") return `${result.message} ${result.remedy}`;\n return result.status === \"degraded\" ? `Copied as plain text: ${result.reason}` : result.status === \"cancelled\" ? \"Cancelled\" : result.message;\n};\nconst materialIds = new WeakMap<object, number>();\nlet nextMaterialId = 0;\nfunction materialIdentity(material: Source | Payload | SurfaceHandle | null | undefined) {\n if (!material) return \"missing\";\n if (\"instanceId\" in material) return `surface:${material.instanceId}`;\n if (\"id\" in material) return `source:${material.id}`;\n let id = materialIds.get(material);\n if (id === undefined) { id = ++nextMaterialId; materialIds.set(material, id); }\n return `payload:${id}`;\n}\n\ntype CaptureResult = { snapshot: Snapshot; allMatching?: BoundAllMatching; collectionError?: string };\ntype WorkspaceState = CaptureResult & { sourceStale?: boolean | undefined; key: string; original: Draft; draft: Draft; scope: TransferScope; preferences: TransferPreferences; pending?: (CaptureResult & { scope: TransferScope }) | undefined; error?: string | undefined };\n\n/** Compare captured meaning at the user action boundary, never during render. */\nfunction snapshotContent(snapshot: Snapshot) {\n const { sourceId, label, payload, coverage, unsavedChanges, omissions, sections, limits } = snapshot;\n return JSON.stringify({ sourceId, label, payload, coverage, unsavedChanges, omissions, sections, limits });\n}\n\nfunction useFence() {\n const mounted = React.useRef(true);\n const nextId = React.useRef(0);\n const active = React.useRef(new Set<AbortController>());\n React.useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; nextId.current += 1; active.current.forEach((c) => c.abort()); active.current.clear(); };\n }, []);\n const begin = React.useCallback(() => { const controller = new AbortController(); active.current.add(controller); return { controller, id: ++nextId.current }; }, []);\n const finish = React.useCallback((controller: AbortController) => active.current.delete(controller), []);\n const valid = React.useCallback((id: number, controller: AbortController) => mounted.current && !controller.signal.aborted && nextId.current === id, []);\n const abortAll = React.useCallback(() => { nextId.current += 1; active.current.forEach((c) => c.abort()); active.current.clear(); }, []);\n return { begin, finish, valid, abortAll };\n}\n\nasync function xlsxArtifact(draft: Draft, label: string): Promise<Artifact> {\n if (draft.payload.kind !== \"rows\") throw new Error(\"Excel workbook export requires tabular content.\");\n const XLSX = await import(\"xlsx\");\n const columns = draft.payload.columns.filter((c) => c.visible && c.exportable !== false && c.classification !== \"secret\" && c.classification !== \"credential\");\n const cells = draft.payload.rows.map((row) => columns.map((column) => {\n const value = readTransferCell(row, column);\n return value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value) ? value : value === undefined ? \"\" : JSON.stringify(value);\n }));\n const sheet = XLSX.utils.aoa_to_sheet([columns.map((c) => c.label), ...cells]);\n const book = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(book, sheet, label.replace(/[\\\\/?*[\\]:]/g, \" \").trim().slice(0, 31) || \"Data\");\n const written = XLSX.write(book, { type: \"array\", bookType: \"xlsx\", compression: true });\n return sealTransferArtifact({ snapshotId: draft.snapshotId, draftRevision: draft.revision, format: \"xlsx\", plainText: serialize(draft, \"tsv\", { spreadsheetSafe: true }).plainText, file: { filename: `${filenameFor(label)}.xlsx`, mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", bytes: written instanceof Uint8Array ? written : new Uint8Array(written) }, omissions: [...draft.omissions] });\n}\nasync function buildArtifact(draft: Draft, format: BuiltInFormat, label: string): Promise<Artifact> {\n if (!supportsBuiltIn(format, draft.payload)) throw new Error(`${LABEL[format]} is available for tabular content only.`);\n if (format === \"xlsx\") return xlsxArtifact(draft, label);\n if (format === \"html\" && draft.payload.kind === \"markdown\") return serializeMarkdownRich(draft, `${filenameFor(label)}.html`);\n const extension = format === \"plain\" ? \"txt\" : format === \"compact-json\" ? \"json\" : format;\n return serialize(draft, format, { spreadsheetSafe: format === \"csv\" || format === \"tsv\", filename: `${filenameFor(label)}.${extension}` });\n}\n\nexport function ContentTransferMenu(props: ContentTransferMenuProps) {\n const inherited = React.useContext(CapabilityContext);\n const identityKey = props.capabilities?.identityKey ?? inherited.identityKey;\n return <ContentTransferMenuSession key={identityKey ?? \"anonymous\"} {...props} />;\n}\n\nfunction ContentTransferMenuSession({ references = [], referenceActions = [], source, surface, label, projection, sections, preferences, table, formatSources, sourceFormats = true, variants = EMPTY_VARIANTS, actions = [], capabilities: local, disabled, enabled = true, className, stopPropagation = true, hide = [], controllerRef, icon = \"portal\", triggerVariant = \"transparent\", triggerSize = \"default\", triggerHidden = false }: ContentTransferMenuProps) {\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const restoreFocusRef = React.useRef<(() => void) | null>(null);\n const inherited = React.useContext(CapabilityContext);\n const nearestSurface = React.useContext(SurfaceContext);\n const fence = useFence();\n const [menuCapture, setMenuCapture] = React.useState<CaptureResult | null>(null);\n const [menuStatus, setMenuStatus] = React.useState<\"idle\" | \"loading\" | string>(\"idle\");\n const [workspaces, setWorkspaces] = React.useState<Record<string, WorkspaceState>>({});\n const [workspaceKey, setWorkspaceKey] = React.useState<string | null>(null);\n const [workspaceOpen, setWorkspaceOpen] = React.useState(false);\n const workspaceCaptures = React.useRef(new Map<string, (scope: TransferScope, signal: AbortSignal) => Promise<CaptureResult>>());\n const externalWorkspaceKeys = React.useRef(new Set<string>());\n const [notice, setNotice] = React.useState<string | null>(null);\n const [receiptTarget, setReceiptTarget] = React.useState<TransferTarget | undefined>();\n const [paletteOpen, setPaletteOpen] = React.useState(false);\n const [paletteTarget, setPaletteTarget] = React.useState<HTMLElement | null>(null);\n const externalPaletteClose = React.useRef<(() => void) | null>(null);\n const externalPaletteRestoreFocus = React.useRef<(() => void) | null>(null);\n // A host action closes its submenu before its async outcome arrives. Keep the\n // owner document so feedback and its receipt still have a durable portal.\n const feedbackDocument = React.useRef<Document | null>(null);\n const [mode, setMode] = React.useState<\"copy\" | \"download\">(\"copy\");\n const scopes = React.useMemo(() => table?.availableScopes ?? ([\"target\"] as TransferScope[]), [table]);\n const [requestedScope, setRequestedScope] = React.useState<TransferScope>(table?.initialScope ?? \"target\");\n const initialScope = scopes.includes(requestedScope) ? requestedScope : table?.initialScope ?? \"target\";\n if (!scopes.includes(initialScope)) throw new Error(\"Alchemy initialScope must be included in availableScopes.\");\n const primary = surface ?? source ?? nearestSurface;\n const sourceLabel = label ?? (surface?.surfaceName ?? (source && \"label\" in source ? source.label : nearestSurface?.surfaceName) ?? \"content\");\n const primaryWorkspaceBase = `primary:${materialIdentity(primary)}`;\n const primaryWorkspaceKey = `${primaryWorkspaceBase}:${initialScope}`;\n const nearestWorkspaceKey = source && !surface && nearestSurface ? `surface:${materialIdentity(nearestSurface)}` : null;\n const variantWorkspaceKeys = React.useMemo(() => new Map(variants.map((variant) => [variant.id, `variant:${variant.id}:${materialIdentity(variant.source)}`])), [variants]);\n const transport = local?.transport ?? inherited.transport ?? createBrowserTransport();\n const ai = local?.ai ?? inherited.ai;\n const referencePort = local?.reference ?? inherited.reference;\n const { email: emailPort, review: emailReview } = useReviewedTransferEmail(local?.email ?? inherited.email);\n const providerPreferences = React.useMemo(() => resolveTransferPreferences(inherited.preferences, local?.preferences), [inherited.preferences, local?.preferences]);\n const adapters = React.useMemo(() => resolveTransferRegistry<{ id: string }>(BUILT_INS, inherited.formats ?? [], local?.formats ?? []).filter((x): x is FormatAdapter => \"build\" in x), [inherited.formats, local?.formats]);\n const emailJsonFormat = adapters.find((adapter) => adapter.id === \"table-data\");\n const emailActions = React.useMemo(() => emailPort ? createTransferEmailActions(emailPort, emailJsonFormat ? { jsonFormat: emailJsonFormat } : {}) : [], [emailPort, emailJsonFormat]);\n const registeredActions = React.useMemo(() => resolveTransferRegistry(emailActions, inherited.actions ?? [], local?.actions ?? [], actions), [actions, emailActions, inherited.actions, local?.actions]);\n React.useMemo(() => resolveTransferRegistry(variants), [variants]);\n const report = React.useCallback((result: TransferOutcome) => { inherited.onOutcome?.(result); local?.onOutcome?.(result); setNotice(outcomeMessage(result)); setReceiptTarget(\"target\" in result ? result.target : undefined); }, [inherited, local]);\n React.useEffect(() => {\n const valid = new Set([...scopes.map((scope) => `${primaryWorkspaceBase}:${scope}`), ...(nearestWorkspaceKey ? [nearestWorkspaceKey] : []), ...variantWorkspaceKeys.values(), ...externalWorkspaceKeys.current]);\n setWorkspaces((current) => Object.fromEntries(Object.entries(current).filter(([key]) => valid.has(key))));\n for (const key of workspaceCaptures.current.keys()) if (!valid.has(key)) workspaceCaptures.current.delete(key);\n if (workspaceKey && !valid.has(workspaceKey)) { setWorkspaceKey(null); setWorkspaceOpen(false); }\n }, [nearestWorkspaceKey, primaryWorkspaceBase, scopes, variantWorkspaceKeys, workspaceKey]);\n\n const captureOne = React.useCallback(async (material: Source | Payload | SurfaceHandle | null, scope: TransferScope, signal: AbortSignal, applyMenuProjection = false, collectPages = true): Promise<CaptureResult> => {\n if (!material) throw new Error(\"Alchemy needs a source or a mounted transfer surface.\");\n let sourceMaterial: Source;\n if (\"instanceId\" in material) {\n if (!material.isMounted()) throw new Error(\"The requested transfer surface is no longer mounted.\");\n const captured = await material.capture(signal);\n sourceMaterial = { id: captured.snapshot.sourceId, label: captured.snapshot.label, capture: async () => captured };\n } else if (\"kind\" in material) {\n sourceMaterial = { id: materialIdentity(material), label: sourceLabel, capture: async () => directSource(material, { sourceId: materialIdentity(material), label: sourceLabel, ...(applyMenuProjection && projection ? { projection } : {}), ...(applyMenuProjection && sections ? { sections } : {}) }) };\n } else if (applyMenuProjection && (projection || sections)) {\n sourceMaterial = {\n id: material.id,\n label: material.label,\n capture: async (request) => {\n const captured = await material.capture(request);\n return {\n ...captured,\n projection: { rules: [...captured.projection.rules, ...(projection?.rules ?? [])] },\n snapshot: { ...captured.snapshot, ...(sections ? { sections } : {}) },\n };\n },\n };\n } else {\n sourceMaterial = material;\n }\n const raw = await sourceMaterial.capture({ scope, signal });\n const constrained = resolveTransferPreferences(providerPreferences, preferences, raw.snapshot.limits);\n const result = await capture({ id: raw.snapshot.sourceId, label: raw.snapshot.label, capture: async () => ({ ...raw, snapshot: { ...raw.snapshot, limits: constrained.limits } }) }, signal, scope);\n if (scope !== \"all-matching\" || !collectPages) return result;\n if (!result.allMatching) throw new Error(\"This source cannot provide a stable all-matching export.\");\n const collected = await collectAllMatching(result.allMatching, signal);\n if (result.snapshot.payload.kind !== \"rows\") throw new Error(\"All-matching export requires tabular content.\");\n return { snapshot: projectSnapshot({ ...result.snapshot, payload: { kind: \"rows\", rows: collected.rows, columns: result.snapshot.payload.columns }, coverage: collected.coverage, omissions: [...collected.omissions] }, { rules: [] }), allMatching: result.allMatching, ...(collected.error ? { collectionError: collected.error.message } : {}) };\n }, [preferences, projection, providerPreferences, sections, sourceLabel]);\n const capturePrimary = React.useCallback((scope: TransferScope, signal: AbortSignal) => captureOne(primary, scope, signal, true), [captureOne, primary]);\n workspaceCaptures.current.set(primaryWorkspaceKey, capturePrimary);\n if (nearestWorkspaceKey && nearestSurface) workspaceCaptures.current.set(nearestWorkspaceKey, (scope, signal) => captureOne(nearestSurface, scope, signal, true));\n for (const variant of variants) {\n const key = variantWorkspaceKeys.get(variant.id)!;\n workspaceCaptures.current.set(key, (scope, signal) => captureOne(variant.source, scope, signal, true));\n }\n\n const preflight = React.useCallback(async (scope = initialScope) => {\n const { controller, id } = fence.begin(); setMenuCapture(null); setMenuStatus(\"loading\");\n try { const result = await captureOne(primary, scope, controller.signal, true, false); if (fence.valid(id, controller)) { setMenuCapture(result); setMenuStatus(\"idle\"); } }\n catch (error) { if (fence.valid(id, controller)) { setMenuCapture(null); setMenuStatus(errorMessage(error, \"Could not inspect content\")); } }\n finally { fence.finish(controller); }\n }, [captureOne, fence, initialScope, primary]);\n\n const closePalette = React.useCallback(() => {\n const onClose = externalPaletteClose.current;\n const restoreFocus = externalPaletteRestoreFocus.current;\n externalPaletteClose.current = null;\n externalPaletteRestoreFocus.current = null;\n onClose?.();\n restoreFocus?.();\n setPaletteTarget(null);\n setPaletteOpen(false);\n }, []);\n const mountPalette = React.useCallback((target: HTMLElement | null, onClose?: () => void, restoreFocus?: () => void) => {\n if (!target) {\n // Host cleanup (submenu replacement, mobile drilldown back) must detach\n // without asking that host to close a second time.\n externalPaletteClose.current = null;\n externalPaletteRestoreFocus.current = null;\n setPaletteTarget(null);\n setPaletteOpen(false);\n return;\n }\n if (!enabled) throw new Error(\"Alchemy is not enabled for this record.\");\n if (disabled) throw new Error(\"Alchemy is disabled for this record.\");\n externalPaletteClose.current = onClose ?? null;\n externalPaletteRestoreFocus.current = restoreFocus ?? null;\n feedbackDocument.current = target.ownerDocument;\n restoreFocusRef.current = restoreFocus ?? (() => target.focus());\n setPaletteTarget(target);\n setPaletteOpen(true);\n setMode(\"copy\");\n void preflight();\n }, [closePalette, disabled, enabled, preflight]);\n React.useEffect(() => {\n if (!paletteTarget || !paletteOpen) return;\n const firstControl = paletteTarget.querySelector<HTMLElement>(\"button:not([disabled]), select:not([disabled]), input:not([disabled]), textarea:not([disabled]), [href]\");\n firstControl?.focus();\n }, [paletteOpen, paletteTarget]);\n\n const transfer = React.useCallback(async (format: BuiltInFormat | FormatAdapter, download: boolean, alternate?: TransferMenuVariant) => {\n const { controller, id } = fence.begin();\n try {\n const explicit = alternate?.source ?? (typeof format === \"string\" && format !== \"xlsx\" ? formatSources?.[format] : undefined);\n const result = await (explicit ? captureOne(explicit, initialScope, controller.signal, true) : capturePrimary(initialScope, controller.signal));\n if (result.collectionError) throw new Error(`The complete source could not be collected: ${result.collectionError}`);\n if (result.snapshot.coverage.status !== \"complete\" || result.snapshot.omissions.length > 0) {\n const reason = result.snapshot.coverage.reason ?? `${result.snapshot.omissions.length} omission${result.snapshot.omissions.length === 1 ? \"\" : \"s\"}`;\n throw new Error(`Quick transfer is partial (${reason}). Open Prepare for AI to review it before delivery.`);\n }\n const resolved = resolveTransferPreferences(providerPreferences, preferences, result.snapshot.limits);\n const draft = applyTransferLimits(createDraft(result.snapshot), resolved.limits); const revision = draft.revision;\n if (draft.omissions.length > result.snapshot.omissions.length) throw new Error(\"Quick transfer requires content reductions. Open Prepare for AI to review them before delivery.\");\n const artifact = typeof format === \"string\" ? await buildArtifact(draft, format, result.snapshot.label) : await format.build(draft, controller.signal);\n if (artifact.omissions.length > draft.omissions.length) throw new Error(`Quick format requires ${artifact.omissions.length - draft.omissions.length} adjustment${artifact.omissions.length - draft.omissions.length === 1 ? \"\" : \"s\"}. Open Prepare for AI to review before delivery.`);\n if (!fence.valid(id, controller) || artifact.snapshotId !== result.snapshot.id || artifact.draftRevision !== revision) return;\n const outcome = await transport[download ? \"download\" : \"copy\"](artifact, controller.signal);\n if (fence.valid(id, controller)) report(outcome.status === \"success\" && alternate?.successMessage ? { ...outcome, message: alternate.successMessage } : outcome);\n } catch (error) { if (fence.valid(id, controller)) report({ status: \"error\", code: \"prepare-failed\", message: errorMessage(error, \"Preparation failed\"), retryable: true }); }\n finally { fence.finish(controller); }\n }, [captureOne, capturePrimary, fence, formatSources, initialScope, preferences, providerPreferences, report, transport]);\n\n const openWorkspace = React.useCallback(\n async (\n key = primaryWorkspaceKey,\n variant?: { source: Source | Payload | SurfaceHandle; label: string },\n ) => {\n const variantMaterial =\n variant && \"kind\" in variant.source\n ? ({\n id: `variant:${key}`,\n label: variant.label,\n capture: async () =>\n directSource(variant.source as Payload, {\n sourceId: `variant:${key}`,\n label: variant.label,\n }),\n } satisfies Source)\n : variant?.source;\n const captureWorkspace = (\n scope: TransferScope,\n signal: AbortSignal,\n collectPages = true,\n ) =>\n captureOne(variantMaterial ?? primary, scope, signal, true, collectPages);\n workspaceCaptures.current.set(key, captureWorkspace);\n const existing = workspaces[key];\n const { controller, id } = fence.begin();\n if (existing) {\n try {\n const scopeChanged = existing.scope !== initialScope;\n const allMatching = initialScope === \"all-matching\";\n const fresh = await captureWorkspace(\n initialScope,\n controller.signal,\n scopeChanged || !allMatching,\n );\n if (!fence.valid(id, controller) || !workspaceCaptures.current.has(key))\n return;\n if (allMatching && (!fresh.allMatching || (!scopeChanged && !existing.allMatching)))\n throw new Error(\n \"This source can no longer provide an all-matching snapshot.\",\n );\n const collectionIdentity = (value: BoundAllMatching | undefined) =>\n value && {\n query: value.source.query,\n projection: value.projection,\n columns: value.columns,\n limits: value.limits,\n };\n const changed = scopeChanged || (allMatching\n ? JSON.stringify(collectionIdentity(existing.allMatching)) !==\n JSON.stringify(collectionIdentity(fresh.allMatching))\n : snapshotContent(existing.snapshot) !==\n snapshotContent(fresh.snapshot));\n setWorkspaces((current) => {\n const retained = current[key];\n if (!retained) return current;\n return {\n ...current,\n [key]: {\n ...retained,\n error: fresh.collectionError,\n ...(allMatching && !scopeChanged\n ? { sourceStale: changed }\n : changed\n ? { pending: { ...fresh, scope: initialScope } }\n : { pending: undefined }),\n },\n };\n });\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n } catch (error) {\n if (fence.valid(id, controller) && workspaceCaptures.current.has(key)) {\n setWorkspaces((current) =>\n current[key]\n ? {\n ...current,\n [key]: {\n ...current[key]!,\n error: errorMessage(error, \"Could not refresh source\"),\n },\n }\n : current,\n );\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n }\n } finally {\n fence.finish(controller);\n }\n return;\n }\n try {\n const result = await captureWorkspace(initialScope, controller.signal);\n if (!fence.valid(id, controller)) return;\n const resolved = resolveTransferPreferences(\n providerPreferences,\n preferences,\n result.snapshot.limits,\n );\n const original = createDraft(result.snapshot);\n const base: WorkspaceState = {\n ...result,\n key,\n original,\n draft: original,\n scope: initialScope,\n preferences: resolved,\n ...(result.collectionError ? { error: result.collectionError } : {}),\n };\n setWorkspaces((current) => ({\n ...current,\n [key]: { ...base, draft: rebuild(base, initialControls(base)) },\n }));\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n } catch (error) {\n if (fence.valid(id, controller))\n setReceiptTarget(undefined); setNotice(errorMessage(error, \"Could not capture content\"));\n } finally {\n fence.finish(controller);\n }\n },\n [\n captureOne,\n capturePrimary,\n fence,\n initialScope,\n preferences,\n primaryWorkspaceKey,\n primary,\n providerPreferences,\n workspaces,\n ],\n );\n React.useImperativeHandle(controllerRef, () => ({\n focusTrigger: () => triggerRef.current?.focus(),\n mountPalette,\n preparePrimary: async (options) => {\n if (!enabled) throw new Error(\"Alchemy is not enabled for this record.\");\n if (disabled) throw new Error(\"Alchemy is disabled for this record.\");\n if (hide.includes(\"prepare\")) throw new Error(\"Alchemy preparation is unavailable for this record.\");\n if (!primary) throw new Error(\"Alchemy has no source to prepare.\");\n restoreFocusRef.current = options?.restoreFocus ?? null;\n await openWorkspace(primaryWorkspaceKey, { source: primary, label: sourceLabel });\n },\n prepare: async (requestedSource, options) => {\n const requestedLabel = options?.label ?? (\"label\" in requestedSource ? requestedSource.label : \"content\");\n const requestedKey = `controller:${options?.id ?? \"source\"}:${materialIdentity(requestedSource)}`;\n externalWorkspaceKeys.current.add(requestedKey);\n await openWorkspace(requestedKey, { source: requestedSource, label: requestedLabel });\n },\n }), [disabled, enabled, hide, mountPalette, openWorkspace, primary, primaryWorkspaceKey, sourceLabel]);\n\n const runAction = React.useCallback(async (action: PageAction) => {\n const { controller, id } = fence.begin();\n try { const actionSource = (action as PageAction & { source?: Source }).source; const { snapshot } = actionSource ? await captureOne(actionSource, initialScope, controller.signal, true) : await capturePrimary(initialScope, controller.signal); const resolved = resolveTransferPreferences(providerPreferences, preferences, snapshot.limits); const draft = applyTransferLimits(createDraft(snapshot), resolved.limits); if (snapshot.coverage.status !== \"complete\" || draft.omissions.length) throw new Error(\"This content is partial or requires reductions. Open Prepare for AI to review it before sending it to a destination.\"); if (!action.supports(snapshot, draft)) throw new Error(`${action.label} is unavailable for this content.`); const result = await action.run({ snapshot, draft, signal: controller.signal }); if (fence.valid(id, controller) && draft.snapshotId === snapshot.id) report(result); }\n catch (error) { if (fence.valid(id, controller)) report({ status: \"error\", code: \"action-failed\", message: errorMessage(error, \"Action failed\"), retryable: true }); }\n finally { fence.finish(controller); }\n }, [captureOne, capturePrimary, fence, initialScope, preferences, providerPreferences, report]);\n\n const copyReference = async (reference: ContentTransferReference) => {\n const { controller, id } = fence.begin();\n closePalette();\n try {\n if (!referencePort?.supports(reference)) throw new Error(\"This reference is not registered or its identity is incomplete.\");\n const text = await referencePort.build(reference);\n if (!text.trim()) throw new Error(\"The reference serializer returned no content.\");\n const artifact = sealTransferArtifact({ snapshotId: `reference:${reference.id}`, draftRevision: 0, format: \"matrx-reference\", plainText: text, omissions: [] });\n if (!fence.valid(id, controller)) return;\n const outcome = await transport.copy(artifact, controller.signal);\n if (fence.valid(id, controller)) report(outcome);\n } catch (error) { if (fence.valid(id, controller)) report({status: \"error\", code: \"reference-failed\", message: errorMessage(error, \"Could not copy reference\"), retryable: true}); }\n finally { fence.finish(controller); }\n };\n const openReference = async (action: ContentTransferReferenceAction) => {\n closePalette();\n try { await action.run(); }\n catch (error) { report({status: \"error\", code: \"reference-failed\", message: errorMessage(error, \"Could not open reference picker\"), retryable: true}); }\n };\n if (!enabled) return null;\n const payload = menuCapture?.snapshot.payload ?? (source && \"kind\" in source ? source : undefined);\n const quickVariants = (section: \"copy\" | \"ai\") => variants.filter((v) => v.copyLabel && (v.section ?? \"ai\") === section);\n const visibleCopies = sourceFormats ? COPIES.filter((f) => Boolean(formatSources?.[f]) || ![\"csv\", \"tsv\"].includes(f) || payload?.kind === \"rows\") : [];\n const visibleDownloads = sourceFormats ? DOWNLOADS.filter((f) => (f !== \"xlsx\" && Boolean(formatSources?.[f])) || ![\"csv\", \"tsv\", \"xlsx\"].includes(f) || payload?.kind === \"rows\") : [];\n const visibleAdapters = sourceFormats && menuCapture ? adapters.filter((a) => a.supports(menuCapture.snapshot.payload)) : [];\n const visibleActions = menuCapture ? registeredActions.filter((a) => a.supports(menuCapture.snapshot, applyTransferLimits(createDraft(menuCapture.snapshot), resolveTransferPreferences(providerPreferences, preferences, menuCapture.snapshot.limits).limits))) : [];\n const downloadActions = visibleActions.filter((action) => (action as TransferMenuPresentation).placement === \"download\");\n const ordinaryActions = visibleActions.filter((action) => (action as TransferMenuPresentation).placement !== \"download\");\n const preparedActions = registeredActions.filter((action) => (action as TransferMenuPresentation).prepared && !action.source);\n const copyAvailable = !hide.includes(\"copy\") && (visibleCopies.length + visibleAdapters.length + quickVariants(\"copy\").length > 0);\n const downloadAvailable = !hide.includes(\"download\") && (visibleDownloads.length + visibleAdapters.length + downloadActions.length > 0);\n const prepareAvailable = !hide.includes(\"prepare\") && (quickVariants(\"ai\").length > 0 || Boolean(primary) || Boolean(nearestWorkspaceKey) || variants.length > 0);\n const resolvedMode = mode === \"copy\" && !copyAvailable ? \"download\" : mode === \"download\" && !downloadAvailable ? \"copy\" : mode;\n const nativeAiFormat: FormatAdapter = {\n id: \"ai-context\", label: \"AI context\", supports: () => true,\n build: async (draft) => {\n const json = serialize(draft, \"json\");\n return sealTransferArtifact({ snapshotId: draft.snapshotId, draftRevision: draft.revision, format: \"ai-context\", plainText: buildAgentPayload({ kind: \"matrx_content\", location: sourceLabel, description: \"Captured content for an assistant\", data: JSON.parse(json.plainText), attributes: { source: draft.sourceId } }), omissions: [...json.omissions] });\n },\n };\n const tile = (id: string, label: string, onClick: () => void, options: { custom?: boolean; action?: PageAction; ai?: boolean; file?: boolean; ariaLabel?: string } = {}) => {\n const presentation = options.action as TransferMenuPresentation | undefined;\n const Icon = presentation?.icon;\n const fallbackLabel = options.file && !/^download\\b/i.test(label) ? `Download ${label}` : label;\n return <button key={id} type=\"button\" className=\"matrx-alchemy-palette-tile\" title={id === \"table-data\" ? \"JSON using column display names\" : id === \"table-schema\" ? \"Table schema and rows\" : label} aria-label={presentation?.ariaLabel ?? (presentation ? fallbackLabel : options.ariaLabel ?? `${resolvedMode === \"copy\" ? \"Copy\" : \"Download\"} ${label}`)} onClick={() => { closePalette(); onClick(); }}>{Icon ? <Icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph format={id} ai={Boolean(options.ai)} file={options.file || Boolean(options.custom && id !== \"table-data\" && id !== \"table-schema\")}/>}<span>{label}{presentation?.hint ? <small className=\"matrx-alchemy-menu-hint\">{presentation.hint}</small> : null}</span></button>;\n };\n const palette = <>\n {menuStatus === \"loading\" ? <p className=\"matrx-alchemy-palette-status\">Inspecting content…</p> : menuStatus !== \"idle\" ? <p className=\"matrx-alchemy-error\">{menuStatus}</p> : null}\n {table && scopes.length > 1 ? <label className=\"matrx-alchemy-scope\">Content scope<select aria-label=\"Content scope\" value={initialScope} onChange={(event) => { const next = scopes.find((scope) => scope === event.target.value); if (next) { setRequestedScope(next); void preflight(next); } }}>{scopes.map((scope) => <option key={scope} value={scope}>{table.scopeLabels?.[scope] ?? SCOPE_LABEL[scope]}</option>)}</select></label> : null}\n {copyAvailable || downloadAvailable ? <section className=\"matrx-alchemy-output\"><h3>{resolvedMode === \"copy\" ? \"Copy as\" : \"Download as\"}</h3>{copyAvailable && downloadAvailable ? <div className=\"matrx-alchemy-mode\" aria-label=\"Output action\"><button type=\"button\" aria-label=\"Copy mode\" aria-pressed={resolvedMode === \"copy\"} onClick={() => setMode(\"copy\")}>Copy</button><button type=\"button\" aria-label=\"Download mode\" aria-pressed={resolvedMode === \"download\"} onClick={() => setMode(\"download\")}>Download</button></div> : null}\n {resolvedMode === \"copy\" && copyAvailable ? <><div className=\"matrx-alchemy-palette-grid\">{visibleCopies.map((format) => tile(format, ({ plain: \"Text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact\", csv: \"CSV\", tsv: \"Sheets\" } as Record<SerializableFormat, string>)[format]!, () => void transfer(format, false), { ariaLabel: `Copy ${LABEL[format]}` }))}{visibleAdapters.map((adapter) => tile(adapter.id, adapter.label, () => void transfer(adapter, false), { custom: true }))}</div>{quickVariants(\"copy\").length ? <PaletteRows title=\"Quick copy\" items={quickVariants(\"copy\")} onRun={(variant) => { closePalette(); void transfer(\"markdown\", false, variant); }}/>: null}</> : null}\n {resolvedMode === \"download\" && downloadAvailable ? <><div className=\"matrx-alchemy-palette-grid\">{visibleDownloads.map((format) => tile(format, ({ plain: \"Text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact\", csv: \"CSV\", tsv: \"Sheets\", xlsx: \"Excel\" } as Record<BuiltInFormat, string>)[format]!, () => void transfer(format, true), { ariaLabel: `Download ${LABEL[format]}` }))}{visibleAdapters.map((adapter) => tile(adapter.id, adapter.label, () => void transfer(adapter, true), { custom: true }))}{downloadActions.map((action) => tile(action.id, action.label, () => void runAction(action), { custom: true, action, file: true }))}</div></> : null}</section> : null}\n {prepareAvailable ? <><PaletteRows title=\"Copy for AI\" ai glyphKind=\"ai-copy\" fallbackHint=\"Copies immediately\" extra={sourceFormats ? <button type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => { closePalette(); void transfer(nativeAiFormat, false); }}><PaletteGlyph kind=\"ai-copy\"/><span>Copy with AI context<small className=\"matrx-alchemy-menu-hint\">Include source context</small></span></button> : null} items={quickVariants(\"ai\")} onRun={(variant) => { closePalette(); void transfer(\"markdown\", false, variant); }}/><PaletteRows title=\"Edit and prepare\" items={[]} extra={<button type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label=\"Prepare for AI\" onClick={() => { closePalette(); void openWorkspace(); }}><PaletteGlyph kind=\"sliders\"/><span>Prepare for AI<small className=\"matrx-alchemy-menu-hint\">Trim, edit or summarize</small></span></button>}/></>: null}\n {prepareAvailable && (nearestWorkspaceKey || variants.length) ? <PaletteRows title=\"Other sources\" items={[]} extra={<>{nearestWorkspaceKey && nearestSurface ? <button type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => { closePalette(); void openWorkspace(nearestWorkspaceKey, { source: nearestSurface, label: nearestSurface.surfaceName }); }}><PaletteGlyph kind=\"surface\"/><span>Prepare this page</span></button> : null}{variants.map((variant) => <button key={variant.id} type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label={variant.ariaLabel} onClick={() => { closePalette(); void openWorkspace(variantWorkspaceKeys.get(variant.id)!, variant); }}><MenuPresentation {...variant} label={`Prepare ${variant.label}`}/></button>)}</>}/>: null}\n {references.length || referenceActions.length ? <section className=\"matrx-alchemy-palette-section\"><h3>References</h3>{referenceActions.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => void openReference(action)}><PaletteGlyph kind=\"link\"/><span>{action.label}</span><svg className=\"matrx-alchemy-disclosure\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\"/></svg></button>)}{references.map((reference) => <button key={reference.id} type=\"button\" className=\"matrx-alchemy-palette-row\" title=\"Copies a reference to saved data\" onClick={() => void copyReference(reference)}><PaletteGlyph kind=\"link\"/><span>{reference.label}</span></button>)}</section> : null}\n {([\"save\", \"chat\", \"email\", \"other\"] as const).map((group) => { const entries = ordinaryActions.filter((action) => ((action as TransferMenuPresentation).group ?? \"other\") === group); return entries.length ? <details key={group} className=\"matrx-alchemy-palette-destinations\"><summary>{group === \"save\" ? \"Save to Matrx\" : group === \"chat\" ? \"Continue with AI\" : group === \"email\" ? \"Email to me\" : \"Actions\"}<span className=\"matrx-alchemy-disclosure-meta\"><span>{entries.length}</span><svg className=\"matrx-alchemy-disclosure\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\"/></svg></span></summary><div>{entries.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label={(action as TransferMenuPresentation).ariaLabel} onClick={() => { closePalette(); void runAction(action); }}><DestinationPresentation action={action}/></button>)}</div></details> : null; })}\n </>;\n const feedbackOwner = paletteTarget ?? triggerRef.current ?? feedbackDocument.current?.body ?? null;\n return <span className={cn(\"matrx-alchemy\", className)} onClick={stopPropagation ? (event) => event.stopPropagation() : undefined}>\n {!triggerHidden && !paletteTarget ? <Popover open={paletteOpen} onOpenChange={(open) => { if (open) { setPaletteOpen(true); setMode(\"copy\"); void preflight(); } else closePalette(); }}><PopoverTrigger asChild>{triggerVariant === \"outline\" ? <Button ref={triggerRef} variant=\"outline\" size=\"icon-sm\" aria-label={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"outline\" disabled={disabled}><AlchemyGlyph icon={icon}/></Button> : triggerVariant === \"glass\" ? <TapTargetButton ref={triggerRef} icon={<AlchemyGlyph icon={icon}/>} tooltip={false} ariaLabel={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"glass\" data-alchemy-size={triggerSize} disabled={disabled} /> : <TapTargetButtonTransparent ref={triggerRef} icon={<AlchemyGlyph icon={icon}/>} tooltip={false} ariaLabel={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"transparent\" data-alchemy-size={triggerSize} disabled={disabled} />}</PopoverTrigger><PopoverContent align=\"end\" className=\"matrx-alchemy-menu matrx-alchemy-palette\" aria-label=\"Alchemy output options\" onCloseAutoFocus={() => triggerRef.current?.focus()}>{palette}</PopoverContent></Popover> : null}\n {paletteTarget && paletteOpen ? createPortal(<div className=\"matrx-alchemy-menu matrx-alchemy-palette\" role=\"dialog\" aria-label=\"Alchemy output options\">{palette}</div>, paletteTarget) : null}\n {notice && feedbackOwner ? createPortal(<div className=\"matrx-alchemy-feedback\"><span role=\"status\">{notice}</span><ReceiptLink target={receiptTarget}/><button type=\"button\" aria-label=\"Dismiss Alchemy feedback\" onClick={() => setNotice(null)}>×</button></div>, feedbackOwner.ownerDocument.body) : null}\n {Object.values(workspaces).map((saved) => <PreparationWorkspace restoreFocus={() => restoreFocusRef.current?.() ?? triggerRef.current?.focus()} key={saved.key} open={workspaceOpen && workspaceKey === saved.key} state={saved} scopes={scopes} scopeLabels={table?.scopeLabels} onClose={() => setWorkspaceOpen(false)} onChange={(next) => setWorkspaces((current) => ({ ...current, [saved.key]: next }))} transport={transport} adapters={adapters} actions={preparedActions} captureScope={workspaceCaptures.current.get(saved.key) ?? capturePrimary} {...(ai ? { ai } : {})} onOutcome={report}/>)}\n {emailReview}\n </span>;\n}\n\ntype Preset = \"full\" | \"compact\" | \"brief\" | \"custom\";\ntype Controls = {\n preset: Preset;\n sections: string[];\n search: string;\n filters: Record<string, string>;\n sort: string;\n direction: \"asc\" | \"desc\";\n top: number | null;\n visibleColumns: string[];\n selectedOnly: boolean;\n selectedIndices: number[];\n maxDepth: number | null;\n maxStringChars: number | null;\n maxArrayItems: number | null;\n};\n\nfunction initialControls(state: WorkspaceState): Controls {\n const rows = state.original.payload.kind === \"rows\" ? state.original.payload : null;\n return {\n preset: state.preferences.initialPreset,\n sections: state.snapshot.sections.filter((s) => s.includedByDefault).map((s) => s.id),\n search: \"\", filters: {}, sort: \"\", direction: \"asc\",\n top: state.preferences.limits.maxRows,\n visibleColumns: rows?.columns.filter((c) => c.visible).map((c) => c.id) ?? [],\n selectedOnly: false, selectedIndices: [],\n maxDepth: state.preferences.limits.maxDepth,\n maxStringChars: state.preferences.limits.maxStringChars,\n maxArrayItems: state.preferences.limits.maxArrayItems ?? null,\n };\n}\nfunction presetLimits(preset: Preset, controls: Controls, preferences: TransferPreferences) {\n const min = (choice: number | null, cap: number | null) => choice == null ? cap : cap == null ? choice : Math.min(choice, cap);\n if (preset === \"full\") return preferences.limits;\n const request = preset === \"brief\" ? { maxDepth: 4, maxStringChars: 800, maxArrayItems: 25 } : preset === \"compact\" ? { maxDepth: 8, maxStringChars: 4000, maxArrayItems: 100 } : { maxDepth: controls.maxDepth, maxStringChars: controls.maxStringChars, maxArrayItems: controls.maxArrayItems };\n return { ...preferences.limits, maxDepth: min(request.maxDepth, preferences.limits.maxDepth), maxStringChars: min(request.maxStringChars, preferences.limits.maxStringChars), maxArrayItems: min(request.maxArrayItems, preferences.limits.maxArrayItems ?? null) };\n}\nfunction rebuild(state: WorkspaceState, controls: Controls): Draft {\n let draft = resetDraft(state.snapshot);\n if (state.snapshot.sections.length) draft = applySectionSelection(draft, state.snapshot, controls.sections);\n if (draft.payload.kind === \"rows\") draft = transformRows(draft, {\n search: controls.search,\n filters: controls.filters,\n ...(controls.sort ? { sort: { column: controls.sort, direction: controls.direction } } : {}),\n ...(controls.selectedOnly ? { selectedIndices: controls.selectedIndices } : {}),\n visibleColumns: controls.visibleColumns,\n structuredProjection: \"visible\",\n top: controls.top,\n });\n const limits = presetLimits(controls.preset, controls, state.preferences);\n if (draft.payload.kind === \"json\" || draft.payload.kind === \"registered\") {\n draft = reduceJson(draft, { maxDepth: limits.maxDepth, maxStringChars: limits.maxStringChars, maxArrayItems: limits.maxArrayItems ?? null });\n }\n return applyTransferLimits(draft, limits);\n}\nfunction isBuiltInFormat(format: string): format is BuiltInFormat { return format in LABEL; }\nfunction preview(draft: Draft, format: string) {\n const resolved = isBuiltInFormat(format) ? format : \"plain\";\n return serialize(draft, resolved === \"xlsx\" ? \"tsv\" : resolved, { spreadsheetSafe: resolved === \"csv\" || resolved === \"tsv\" || resolved === \"xlsx\" }).plainText;\n}\n\nfunction PreparationWorkspace({ restoreFocus, open, state, scopes, scopeLabels, onClose, onChange, transport, ai, adapters, actions, onOutcome, captureScope }: {\n restoreFocus: () => void;\n open: boolean;\n state: WorkspaceState;\n scopes: TransferScope[];\n scopeLabels?: Partial<Record<TransferScope, string>> | undefined;\n onClose: () => void;\n onChange: (next: WorkspaceState) => void;\n transport: Transport;\n ai?: AiPreparation;\n adapters: FormatAdapter[];\n actions: PageAction[];\n onOutcome: (outcome: TransferOutcome) => void;\n captureScope: (scope: TransferScope, signal: AbortSignal) => Promise<CaptureResult>;\n}) {\n const fence = useFence();\n const latest = React.useRef(state); latest.current = state;\n const aiSession = React.useRef<AiPreparation | undefined>(undefined);\n if (!aiSession.current && ai) aiSession.current = ai.fork?.() ?? ai;\n const [controls, setControls] = React.useState(() => initialControls(state));\n const [controlsHistory, setControlsHistory] = React.useState<Controls[]>([]);\n const [pendingControls, setPendingControls] = React.useState<Controls | null>(null);\n const requestedFormat = state.preferences.initialFormat;\n const [format, setFormat] = React.useState<string>(() => isBuiltInFormat(requestedFormat) ? (supportsBuiltIn(requestedFormat, state.draft.payload) ? requestedFormat : \"plain\") : adapters.some((adapter) => adapter.id === requestedFormat && adapter.supports(state.draft.payload)) ? requestedFormat : \"plain\");\n const [buffer, setBuffer] = React.useState(() => isBuiltInFormat(format) ? preview(state.draft, format) : \"Preparing format preview…\");\n const [bufferError, setBufferError] = React.useState<string | null>(null);\n const [formatError, setFormatError] = React.useState<string | null>(null);\n const [preparedArtifact, setPreparedArtifact] = React.useState<Artifact | null>(null);\n const [instruction, setInstruction] = React.useState(\"\");\n const [busy, setBusy] = React.useState<\"ai\" | \"capture\" | \"copy\" | \"download\" | \"action\" | null>(null);\n const [aiFailed, setAiFailed] = React.useState(false);\n React.useEffect(() => { setAiFailed(false); }, [state.snapshot.id, state.draft.revision]);\n const handingOff = React.useRef(false);\n React.useEffect(() => { if (open) handingOff.current = false; }, [open]);\n const activeAi = React.useRef<AbortController | null>(null);\n const activeCapture = React.useRef<AbortController | null>(null);\n\n React.useEffect(() => {\n if (bufferError) return;\n const adapter = adapters.find((candidate) => candidate.id === format);\n const controller = new AbortController();\n const snapshotId = state.snapshot.id; const revision = state.draft.revision;\n setPreparedArtifact(null); setFormatError(null);\n if (adapter) setBuffer(\"Preparing format preview…\");\n const artifactPromise = adapter ? adapter.build(state.draft, controller.signal) : buildArtifact(state.draft, isBuiltInFormat(format) ? format : \"plain\", state.snapshot.label);\n void artifactPromise.then((artifact) => {\n if (!controller.signal.aborted && artifact.snapshotId === snapshotId && artifact.draftRevision === revision) { setPreparedArtifact(artifact); setBuffer(artifact.plainText); }\n }).catch((error) => { if (!controller.signal.aborted) setFormatError(errorMessage(error, \"Format preview failed\")); });\n return () => controller.abort();\n }, [adapters, bufferError, format, state.draft, state.snapshot.id]);\n const close = React.useCallback(() => { activeAi.current?.abort(); activeCapture.current?.abort(); activeAi.current = null; activeCapture.current = null; fence.abortAll(); setBusy(null); onClose(); }, [fence, onClose]);\n const changeControls = (next: Controls) => {\n if (state.draft.manuallyEdited) { setPendingControls(next); return; }\n setControlsHistory((history) => [...history, controls]); setControls(next); onChange({ ...state, draft: rebuild(state, next), error: undefined });\n };\n const applyPendingControls = () => {\n if (!pendingControls) return;\n setControlsHistory((history) => [...history, controls]); setControls(pendingControls); setBufferError(null);\n onChange({ ...state, draft: rebuild(state, pendingControls), error: undefined });\n setPendingControls(null);\n };\n const editBuffer = (text: string) => {\n setBuffer(text);\n setPreparedArtifact(null); setFormatError(null);\n const payload = state.draft.payload;\n if (payload.kind === \"json\" || payload.kind === \"registered\") {\n try {\n const value = JSON.parse(text) as Json;\n const next: Payload = payload.kind === \"json\" ? { kind: \"json\", value } : { kind: \"registered\", format: payload.format, value };\n setBufferError(null); onChange({ ...state, draft: editDraft(state.draft, next), error: undefined });\n } catch { setBufferError(\"JSON is incomplete or invalid. Fix it before copying or downloading.\"); }\n return;\n }\n setBufferError(null);\n const kind = payload.kind === \"markdown\" || format === \"markdown\" ? \"markdown\" : \"text\";\n if (payload.kind === \"rows\" || !isBuiltInFormat(format)) setFormat(\"plain\");\n onChange({ ...state, draft: editDraft(state.draft, { kind, text }), error: undefined });\n };\n\n const requestCapture = async (scope: TransferScope) => {\n activeCapture.current?.abort();\n const { controller, id } = fence.begin(); activeCapture.current = controller; const revision = state.draft.revision; setBusy(\"capture\");\n try {\n const result = await captureScope(scope, controller.signal);\n if (fence.valid(id, controller) && latest.current.draft.revision === revision) onChange({ ...latest.current, pending: { ...result, scope }, sourceStale: false, error: result.collectionError });\n } catch (error) { if (fence.valid(id, controller)) onChange({ ...latest.current, error: errorMessage(error, \"Refresh failed\") }); }\n finally { fence.finish(controller); if (activeCapture.current === controller) activeCapture.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const resolveCapture = (choice: \"keep\" | \"regenerate\") => {\n if (!state.pending) return;\n if (choice === \"keep\") { const { pending: _pending, ...kept } = state; onChange({ ...kept, error: undefined }); return; }\n const pending = state.pending;\n const preferences = resolveTransferPreferences({}, state.preferences, pending.snapshot.limits);\n const base: WorkspaceState = { ...pending, key: state.key, original: createDraft(pending.snapshot), draft: createDraft(pending.snapshot), scope: pending.scope, preferences, ...(pending.collectionError ? { error: pending.collectionError } : {}) };\n const nextControls = initialControls(base); setControls(nextControls); setControlsHistory([]); setPendingControls(null); setBufferError(null);\n onChange({ ...base, draft: rebuild(base, nextControls) });\n };\n\n const runAi = async (recover = false) => {\n const adapter = aiSession.current;\n if (!adapter || !adapter.supports(state.snapshot) || (!recover && !instruction.trim()) || (recover && !adapter.recover)) return;\n activeAi.current?.abort();\n const { controller, id } = fence.begin(); activeAi.current = controller;\n const snapshotId = state.snapshot.id; const revision = state.draft.revision; setBusy(\"ai\"); setAiFailed(false);\n try {\n const next = recover ? await adapter.recover!({ snapshot: state.snapshot, draft: state.draft, signal: controller.signal }) : await adapter.run({ snapshot: state.snapshot, draft: state.draft, instruction, signal: controller.signal });\n const current = latest.current;\n if (!fence.valid(id, controller) || current.snapshot.id !== snapshotId || current.draft.revision !== revision || next.snapshotId !== snapshotId || next.sourceId !== state.draft.sourceId || next.sourceRevision !== state.draft.sourceRevision || next.revision <= revision) return;\n try { serialize(next, \"plain\"); } catch { onChange({ ...current, error: \"AI returned an invalid transfer draft.\" }); setAiFailed(true); return; }\n onChange({ ...current, draft: next, error: undefined }); setBufferError(null);\n } catch (error) {\n if (!isAbort(error) && fence.valid(id, controller)) { setAiFailed(true); onChange({ ...latest.current, error: errorMessage(error, \"AI preparation failed\") }); }\n } finally { fence.finish(controller); if (activeAi.current === controller) activeAi.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const cancelAi = async () => {\n const aiController = activeAi.current;\n const { controller, id } = fence.begin();\n try { await aiSession.current?.cancel?.(); }\n catch (error) { if (fence.valid(id, controller)) onChange({ ...latest.current, error: errorMessage(error, \"AI cancellation failed\") }); }\n finally { aiController?.abort(); fence.finish(controller); if (activeAi.current === aiController) activeAi.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const [deliveryNotice, setDeliveryNotice] = React.useState<string | null>(null);\n React.useEffect(() => { setDeliveryNotice(null); }, [state.draft.revision]);\n const reportDelivery = (outcome: TransferOutcome) => { setDeliveryNotice(outcomeMessage(outcome)); onOutcome(outcome); };\n const deliver = async (download: boolean) => {\n if (bufferError) return;\n const { controller, id } = fence.begin(); const snapshotId = state.snapshot.id; const revision = state.draft.revision; setBusy(download ? \"download\" : \"copy\");\n try {\n if (!preparedArtifact) throw new Error(\"Wait for the selected format preview before delivery.\");\n const artifact = preparedArtifact;\n const current = latest.current;\n if (!fence.valid(id, controller) || current.snapshot.id !== snapshotId || current.draft.revision !== revision || artifact.snapshotId !== snapshotId || artifact.draftRevision !== revision) return;\n const result = await transport[download ? \"download\" : \"copy\"](artifact, controller.signal);\n if (fence.valid(id, controller)) reportDelivery(result);\n } catch (error) { if (fence.valid(id, controller)) reportDelivery({ status: \"error\", code: \"prepare-failed\", message: errorMessage(error, \"Preparation failed\"), retryable: true }); }\n finally { fence.finish(controller); if (fence.valid(id, controller)) setBusy(null); }\n };\n\n const deliverAction = async (action: PageAction) => {\n if (busy || bufferError || formatError || !preparedArtifact) return;\n const { controller, id } = fence.begin();\n const current = latest.current;\n setBusy(\"action\");\n try {\n if (!action.supports(current.snapshot, current.draft)) throw new Error(`${action.label} is unavailable for this prepared content.`);\n // Release the preparation focus trap before a host opens its destination.\n // This component remains mounted, retaining the exact edited revision.\n handingOff.current = true;\n flushSync(() => onClose());\n const result = await action.run({ snapshot: current.snapshot, draft: current.draft, signal: controller.signal });\n if (fence.valid(id, controller)) reportDelivery(result);\n } catch (error) {\n if (fence.valid(id, controller)) reportDelivery({ status: \"error\", code: \"destination-failed\", message: errorMessage(error, \"Could not deliver prepared content\"), retryable: false });\n } finally { fence.finish(controller); if (fence.valid(id, controller)) setBusy(null); }\n };\n const eligibleActions = actions.filter((action) => action.supports(state.snapshot, state.draft));\n\n const rows = state.original.payload.kind === \"rows\" ? state.original.payload : null;\n const formats = COPIES.filter((f) => supportsBuiltIn(f, state.draft.payload));\n const workspaceAdapters = adapters.filter((adapter) => adapter.supports(state.draft.payload));\n const displayedOmissions = preparedArtifact?.omissions ?? state.draft.omissions;\n const limitText = Object.entries(state.preferences.limits).filter(([, value]) => value != null).map(([key, value]) => `${key.replace(/^max/, \"max \")} ${formatCount(Number(value))}`).join(\" · \");\n return <Dialog open={open} onOpenChange={(next) => { if (!next) close(); }}><DialogContent onCloseAutoFocus={(event) => { event.preventDefault(); if (!handingOff.current) restoreFocus(); }} className=\"matrx-alchemy-workspace max-w-5xl\" aria-busy={busy !== null}>\n <DialogHeader><DialogTitle>Prepare {state.snapshot.label}</DialogTitle><DialogDescription>{state.snapshot.unsavedChanges ? \"Includes your unsaved changes. \" : \"\"}Review and edit this copy. Your original stays unchanged.</DialogDescription></DialogHeader>\n <div className=\"matrx-alchemy-workspace-body\"><div className=\"matrx-alchemy-workspace-grid\"><section className=\"matrx-alchemy-main\">\n <div className=\"matrx-alchemy-toolbar\">\n {scopes.length > 1 ? <label>Scope<select aria-label=\"Transfer scope\" value={state.scope} disabled={busy !== null} onChange={(e) => void requestCapture(e.target.value as TransferScope)}>{scopes.map((scope) => <option key={scope} value={scope}>{scopeLabels?.[scope] ?? SCOPE_LABEL[scope]}</option>)}</select></label> : null}\n <label>Detail<select aria-label=\"Detail preset\" value={controls.preset} onChange={(e) => changeControls({ ...controls, preset: e.target.value as Preset })}><option value=\"full\">Full</option><option value=\"compact\">Compact</option><option value=\"brief\">Brief</option><option value=\"custom\">Custom</option></select></label>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={(!state.draft.history?.length && !controlsHistory.length) || busy !== null} onClick={() => { setBufferError(null); if (controlsHistory.length) { const next = controlsHistory[controlsHistory.length - 1]!; setControls(next); setControlsHistory((history) => history.slice(0, -1)); onChange({ ...state, draft: rebuild(state, next), error: undefined }); } else onChange({ ...state, draft: undoDraft(state.draft), error: undefined }); }}>Undo</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={busy !== null} onClick={() => { const next = initialControls(state); setControls(next); setControlsHistory([]); setPendingControls(null); setBufferError(null); onChange({ ...state, draft: rebuild(state, next), error: undefined }); }}>Reset</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={busy !== null} onClick={() => void requestCapture(state.scope)}>Refresh source</Button>\n </div>\n {controls.preset === \"custom\" ? <fieldset className=\"matrx-alchemy-options\"><legend>{state.draft.payload.kind === \"json\" || state.draft.payload.kind === \"registered\" ? \"JSON limits\" : \"Content limits\"}</legend>{([ [\"maxDepth\", \"Maximum depth\"], [\"maxStringChars\", state.draft.payload.kind === \"rows\" ? \"Maximum characters per cell\" : \"Maximum string characters\"], [\"maxArrayItems\", \"Maximum array items\"] ] as const).filter(([key]) => key === \"maxStringChars\" || state.draft.payload.kind === \"json\" || state.draft.payload.kind === \"registered\").map(([key, text]) => <label key={key}>{text}<input type=\"number\" min=\"0\" value={controls[key] ?? \"\"} onChange={(e) => changeControls({ ...controls, [key]: Number.isNaN(e.target.valueAsNumber) ? null : e.target.valueAsNumber })}/></label>)}</fieldset> : null}\n {rows ? <details className=\"matrx-alchemy-options matrx-alchemy-data-controls\"><summary>Data selection · {controls.visibleColumns.length} columns{controls.search || controls.sort || controls.top != null || controls.selectedOnly || Object.values(controls.filters).some(Boolean) ? \" · customized\" : \" · all rows\"}</summary><div className=\"matrx-alchemy-data-controls-body\"><RowControls rows={rows} controls={controls} change={changeControls}/></div></details> : null}\n {state.snapshot.sections.length ? <details className=\"matrx-alchemy-options\"><summary>Sections · {controls.sections.length} included</summary><fieldset aria-label=\"Included sections\">{state.snapshot.sections.map((section) => <label key={section.id}><input type=\"checkbox\" checked={controls.sections.includes(section.id)} onChange={(e) => changeControls({ ...controls, sections: e.target.checked ? [...controls.sections, section.id] : controls.sections.filter((id) => id !== section.id) })}/> {section.label}</label>)}</fieldset></details> : null}\n <label className=\"matrx-alchemy-preview-label\">Output format<select aria-label=\"Output format\" value={format} onChange={(e) => setFormat(e.target.value)}>{formats.map((f) => <option key={f} value={f}>{LABEL[f]}</option>)}{state.draft.payload.kind === \"rows\" ? <option value=\"xlsx\">Excel workbook</option> : null}{workspaceAdapters.map((adapter) => <option key={adapter.id} value={adapter.id}>{adapter.label}</option>)}</select></label>\n <textarea className=\"matrx-alchemy-preview\" aria-label=\"Prepared output\" aria-invalid={bufferError ? true : undefined} aria-describedby={bufferError ? \"alchemy-buffer-error\" : undefined} value={buffer} onChange={(e) => editBuffer(e.target.value)}/>\n <div className=\"matrx-alchemy-coverage\"><span>{state.snapshot.coverage.included.toLocaleString()} included{state.snapshot.coverage.total == null ? \"\" : ` of ${state.snapshot.coverage.total.toLocaleString()}`} · {state.snapshot.coverage.status}</span>{state.snapshot.coverage.reason ? <span>{state.snapshot.coverage.reason}</span> : null}{limitText ? <span>Limits: {limitText}</span> : null}{displayedOmissions.length ? <details><summary>{displayedOmissions.length} omissions or adjustments</summary><ul>{displayedOmissions.map((o, i) => <li key={`${o.path}-${o.reason}-${i}`}>{o.path || \"/\"}: {o.reason}{o.count == null ? \"\" : ` (${o.count})`}</li>)}</ul></details> : null}</div>\n {bufferError ? <p id=\"alchemy-buffer-error\" role=\"alert\" className=\"matrx-alchemy-error\">{bufferError}</p> : null}\n {formatError ? <p role=\"alert\" className=\"matrx-alchemy-error\">{formatError}</p> : null}\n {bufferError ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" disabled={busy !== null} onClick={() => { const fallback = editDraft(state.draft, { kind: \"text\", text: buffer }); setBufferError(null); onChange({ ...state, draft: fallback, error: undefined }); setFormat(\"plain\"); }}>Use invalid JSON as plain text</Button> : null}\n </section>{ai || busy === \"capture\" || state.error ? <aside>\n {ai ? <>\n <label>Start with<select aria-label=\"AI preparation recipe\" defaultValue=\"\" onChange={(event) => { if (event.target.value) setInstruction(event.target.value); }}><option value=\"\">Choose an instruction</option><option value=\"Summarize this content concisely. Preserve important facts, names, decisions, and source references.\">Summarize</option><option value=\"Extract decisions, action items, owners, and due dates. Mark missing details as unspecified.\">Extract action items</option><option value=\"Prepare a complete handoff for another assistant. Include the objective, relevant facts, constraints, decisions, and unresolved questions.\">Assistant handoff</option><option value=\"Condense this content by removing repetition and formatting noise. Preserve every unique fact and all identifiers.\">Condense without losing facts</option><option value=\"Turn this content into a clear structured outline. Keep the original meaning and explicitly flag uncertainty.\">Create an outline</option><option value=\"Analyze this data. Identify patterns, anomalies, and useful comparisons. Distinguish observations from inferences.\">Analyze the data</option></select></label>\n <label>AI instruction<textarea value={instruction} onChange={(e) => setInstruction(e.target.value)} placeholder=\"Tell AI how to prepare this content\"/></label>\n <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" disabled={!aiSession.current || !instruction.trim() || busy !== null || !aiSession.current.supports(state.snapshot)} onClick={() => void runAi(false)}>Generate preview</Button>\n {busy === \"ai\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => void cancelAi()}>{aiSession.current?.cancel ? \"Cancel AI\" : \"Stop waiting\"}</Button> : null}\n </> : null}\n {busy === \"capture\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => { activeCapture.current?.abort(); activeCapture.current = null; setBusy(null); }}>Stop loading rows</Button> : null}\n {ai && aiFailed && aiSession.current?.recover && busy !== \"ai\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => void runAi(true)}>{aiFailed ? \"Retry or rejoin AI run\" : \"Rejoin AI run\"}</Button> : null}\n {ai ? <p className=\"matrx-alchemy-meta\">AI updates the preview; copy it when you are ready. Closing this window lets the AI run continue.</p> : null}{state.error ? <p role=\"alert\" className=\"matrx-alchemy-error\">{state.error}</p> : null}\n </aside> : null}</div>\n {pendingControls ? <div className=\"matrx-alchemy-decision\" role=\"alert\"><p>This control would replace your manual edit.</p><Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => setPendingControls(null)}>Keep edited draft</Button><Button className=\"matrx-alchemy-workspace-primary\" type=\"button\" onClick={applyPendingControls}>Rebuild from source</Button></div> : null}\n {state.sourceStale ? <p role=\"alert\" className=\"matrx-alchemy-decision\">The source changed since this draft. Use Refresh source to review the latest data.</p> : null}\n {state.pending ? <div className=\"matrx-alchemy-decision\" role=\"alert\"><p>A fresh source snapshot is ready.</p>{state.pending.scope !== state.scope ? <p>Switch from {scopeLabels?.[state.scope] ?? SCOPE_LABEL[state.scope]} to {scopeLabels?.[state.pending.scope] ?? SCOPE_LABEL[state.pending.scope]} by regenerating. Your current draft is retained until you choose.</p> : null}<Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => resolveCapture(\"keep\")}>Keep current snapshot and draft</Button><Button className=\"matrx-alchemy-workspace-primary\" type=\"button\" onClick={() => resolveCapture(\"regenerate\")}>Regenerate from fresh source</Button></div> : null}\n {eligibleActions.length ? <details className=\"matrx-alchemy-options matrx-alchemy-destinations\"><summary>Use prepared content · {eligibleActions.length} {eligibleActions.length === 1 ? \"destination\" : \"destinations\"}</summary><div className=\"matrx-alchemy-destination-grid\">{eligibleActions.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliverAction(action)}><DestinationPresentation action={action}/></button>)}</div></details> : null}\n {deliveryNotice ? <p role=\"status\" className=\"matrx-alchemy-meta\">{deliveryNotice}</p> : null}</div>\n <DialogFooter><span className=\"matrx-alchemy-meta\">{buffer.length.toLocaleString()} characters · ~{estimateTokens(buffer).toLocaleString()} tokens</span><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" onClick={close}>Close</Button><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" aria-label=\"Download prepared output\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliver(true)}>Download</Button><Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" aria-label=\"Copy prepared output\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliver(false)}>Copy</Button></DialogFooter>\n </DialogContent></Dialog>;\n}\n\nfunction RowControls({ rows, controls, change }: {\n rows: Extract<Payload, { kind: \"rows\" }>;\n controls: Controls;\n change: (next: Controls) => void;\n}) {\n const filterCount = Object.values(controls.filters).filter(Boolean).length;\n const selectionSummary = controls.selectedOnly ? `${controls.selectedIndices.length} selected row${controls.selectedIndices.length === 1 ? \"\" : \"s\"}` : \"All rows\";\n const dataSummary = [controls.search ? \"search active\" : \"\", controls.sort ? `sorted by ${rows.columns.find((column) => column.id === controls.sort)?.label ?? controls.sort}` : \"\", filterCount ? `${filterCount} filter${filterCount === 1 ? \"\" : \"s\"}` : \"\"].filter(Boolean).join(\" · \");\n return <>\n <div className=\"matrx-alchemy-toolbar\">\n <label>Search<input value={controls.search} onChange={(e) => change({ ...controls, search: e.target.value })}/></label>\n <label>Sort<select value={controls.sort} onChange={(e) => change({ ...controls, sort: e.target.value })}><option value=\"\">None</option>{rows.columns.map((column) => <option key={column.id} value={column.id}>{column.label}</option>)}</select></label>\n <label>Direction<select value={controls.direction} disabled={!controls.sort} onChange={(e) => change({ ...controls, direction: e.target.value as \"asc\" | \"desc\" })}><option value=\"asc\">Ascending</option><option value=\"desc\">Descending</option></select></label>\n <label>Top rows<input type=\"number\" min=\"0\" value={controls.top ?? \"\"} onChange={(e) => change({ ...controls, top: Number.isNaN(e.target.valueAsNumber) ? null : e.target.valueAsNumber })}/></label>\n </div>\n <details className=\"matrx-alchemy-options\"><summary>Columns and filters{dataSummary ? ` — ${dataSummary}` : \"\"}</summary><fieldset aria-label=\"Columns and filters\">{rows.columns.map((column) => <div className=\"matrx-alchemy-column\" key={column.id}><label><input type=\"checkbox\" checked={controls.visibleColumns.includes(column.id)} onChange={(e) => change({ ...controls, visibleColumns: e.target.checked ? [...controls.visibleColumns, column.id] : controls.visibleColumns.filter((id) => id !== column.id) })}/> {column.label}</label><input aria-label={`Filter ${column.label}`} placeholder=\"Filter\" value={controls.filters[column.id] ?? \"\"} onChange={(e) => change({ ...controls, filters: { ...controls.filters, [column.id]: e.target.value } })}/></div>)}</fieldset></details>\n <details className=\"matrx-alchemy-options\"><summary>Rows — {selectionSummary}</summary><fieldset aria-label=\"Row selection\"><label><input type=\"checkbox\" checked={controls.selectedOnly} onChange={(e) => change({ ...controls, selectedOnly: e.target.checked })}/> Only selected rows</label><div className=\"matrx-alchemy-row-list\">{rows.rows.map((row, index) => {\n const summary = rows.columns.filter((column) => column.visible).slice(0, 2).map((column) => String(readTransferCell(row, column) ?? \"\")).filter(Boolean).join(\" · \");\n return <label key={index}><input type=\"checkbox\" checked={controls.selectedIndices.includes(index)} onChange={(e) => change({ ...controls, selectedIndices: e.target.checked ? [...controls.selectedIndices, index] : controls.selectedIndices.filter((value) => value !== index) })}/> Row {index + 1}{summary ? ` — ${summary}` : \"\"}</label>;\n })}</div></fieldset></details>\n </>;\n}\n\nexport * from \"./matrx-copy\";\n","\"use client\";\n\n/**\n * Popover — ported verbatim from matrx-frontend `components/ui/popover.tsx`.\n *\n * Seam inversion: the host's `useNestedPortalContainer` (dialog/popout aware)\n * becomes the injected `PortalContainerProvider` seam (`portal-container.tsx`);\n * the explicit `container` prop keeps top priority, exactly as before.\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. This wrapper used to defer\n * rendering until after hydration (\"Radix generates dynamic aria-controls ids\n * that differ between SSR and client\"), and that justification was false:\n * Radix ids come from React's SSR-stable `useId` (verified against\n * @radix-ui/react-popover 1.1.17 / react-id 1.1.2). The gate was actively\n * harmful — the Trigger wraps ALWAYS-VISIBLE content, so `return null`\n * deleted it from SSR and the first client paint.\n */\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\nexport const Popover = PopoverPrimitive.Root;\n\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\n\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\n\nexport interface PopoverContentProps\n extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.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 honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n /**\n * HOW WIDE THE POPOVER IS ALLOWED TO BE, and it is the SYSTEM that decides — never a\n * surface pasting its own `w-64` over the default (lane FIX-14, 2026-09-22).\n *\n * `\"fixed\"` (default) is the historical `w-72`: right for a menu of short, known\n * labels, where a ragged edge would look broken.\n *\n * `\"content\"` is for a popover whose whole job is to SHOW SOMETHING THE SYSTEM DID\n * NOT CHOOSE — a person's name, a record's title, a row the user is about to\n * create. The relation picker offered\n *\n * Create “Marisol Okonkwo — 418 Calle Pu\n *\n * inside a 16rem box, cut mid-word, on the one control that exists to show the name\n * being created. A fixed width cannot be right for content of unknown length, so\n * this one grows to its content between an honest floor and an honest ceiling:\n *\n * · at least the trigger's own width, and at least 20rem — the width Airtable's and\n * Notion's link-record pickers settle on, and wide enough that an ordinary\n * \"name — street, town\" fits on one line;\n * · at most 28rem, and never wider than the viewport less a 1rem gutter each side,\n * so it still fits a 375px phone with nothing running off the screen. The floor is\n * clamped by the same gutter, so on a very narrow screen the ceiling still wins.\n *\n * Beyond that ceiling the CONTENT truncates with an ellipsis and carries a `title`.\n * Growing, then ellipsis — never a mid-word cut.\n */\n sizing?: \"fixed\" | \"content\";\n}\n\nexport const PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n PopoverContentProps\n>(\n (\n {\n className,\n align = \"center\",\n sideOffset = 4,\n container,\n animated = true,\n sizing = \"fixed\",\n ...props\n },\n ref,\n ) => {\n const portalContainer = usePortalContainer(container);\n return (\n <PopoverPrimitive.Portal container={portalContainer}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n // Cap to the viewport space Radix measured and scroll — a popover taller\n // than the screen must never trap the user with unreachable content.\n // z must EQUAL the dialog layer (z-[10000]), never exceed it: with equal\n // z, DOM portal order decides, so a dialog opened FROM a popover stacks\n // above it, and a popover opened from a dialog still stacks above the\n // dialog. z-[10001] buried dialogs behind fullscreen popovers.\n \"z-[10000] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto overscroll-contain rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n sizing === \"content\"\n ? \"w-auto min-w-[min(max(var(--radix-popover-trigger-width),20rem),calc(100vw-2rem))] max-w-[min(28rem,calc(100vw-2rem))]\"\n : \"w-72\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n },\n);\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n","\"use client\";\n\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type ButtonHTMLAttributes,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { cn } from \"./cn\";\nimport {\n getTapTargetLinkComponent,\n type TapTargetLinkComponent,\n} from \"./link\";\n\nexport interface TapTargetButtonProps {\n icon?: React.ReactNode;\n children?: React.ReactNode;\n strokeWidth?: number | undefined;\n onClick?: (() => void) | undefined;\n className?: string | undefined;\n as?: \"button\" | \"label\" | undefined;\n htmlFor?: string | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n /**\n * When set, the tap button renders as a link instead of a button.\n * - Internal hrefs (e.g. \"/tasks\") render via the injected link component\n * (`setTapTargetLinkComponent` / the `linkComponent` prop), falling back\n * to a plain `<a>` when none is registered.\n * - External hrefs (http://, https://, mailto:, tel:) render as `<a>`\n * with `target=\"_blank\"` and `rel=\"noopener noreferrer\"` by default.\n * - When combined with `disabled`, the trigger renders as a non-navigable\n * `<span aria-disabled=\"true\">` with the same visual styling.\n */\n href?: string | undefined;\n /** Override target. Works on both internal links and external anchors. */\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n /** Override rel. Works on both internal links and external anchors. */\n rel?: string | undefined;\n /** Forwarded to the injected link component. Pass `false` to disable prefetching. */\n prefetch?: boolean | null | undefined;\n /**\n * Per-instance link component for internal hrefs — overrides the\n * module-level `setTapTargetLinkComponent` registration.\n */\n linkComponent?: TapTargetLinkComponent | undefined;\n /**\n * Tooltip text. Defaults to `ariaLabel` when omitted.\n * Pass `false` to explicitly disable the tooltip.\n */\n tooltip?: string | false | undefined;\n /** Tooltip placement. Defaults to \"top\". */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\" | undefined;\n /** Tooltip alignment along its side. Defaults to \"center\". */\n tooltipAlign?: \"start\" | \"center\" | \"end\" | undefined;\n /**\n * Visible caption rendered inline after the icon (`[icon Label]`).\n * Widens the pill automatically. Tooltip defaults to off when set — the\n * label is self-describing. Visible text becomes the accessible name.\n */\n label?: string | undefined;\n /**\n * Collapse an icon + caption pill to its icon-only 44px tap target below\n * the `sm` breakpoint. The caption and inline geometry return at `sm+`;\n * `ariaLabel` (falling back to `label`) remains the accessible name.\n */\n mobileIconOnly?: boolean | undefined;\n}\n\nexport interface TapTargetButtonSolidProps extends TapTargetButtonProps {\n bgColor?: string | undefined;\n iconColor?: string | undefined;\n hoverBgColor?: string | undefined;\n /**\n * Press-state background. Defaults to `active:brightness-90` which works on\n * any color. Override when using a custom `bgColor` that should darken to a\n * specific shade on press (e.g. `active:bg-primary/60`).\n */\n activeBgColor?: string | undefined;\n}\n\nconst EXTERNAL_RE = /^(https?:|mailto:|tel:)/i;\n\n// Geometry + press feedback + tap hygiene are the SINGLE SOURCE OF TRUTH in\n// the shipped stylesheet (the `.matrx-tap-*` family in styles.css — import\n// \"@ai-matrx/tap-target/styles.css\" once at app root). This component only\n// picks the right class and layers each variant's decoration on top.\nconst TAP_OUTER_CLASS = \"matrx-tap-target group\";\nconst TAP_GROUP_OUTER_CLASS = \"matrx-tap-target matrx-tap-target-sm group\";\n\nfunction IconContent({\n icon,\n children,\n strokeWidth = 2,\n className,\n}: Pick<\n TapTargetButtonProps,\n \"icon\" | \"children\" | \"strokeWidth\" | \"className\"\n>) {\n if (icon) {\n if (isValidElement<{ className?: string }>(icon)) {\n return cloneElement(icon, {\n className: cn(className, icon.props.className),\n });\n }\n return <span className={className}>{icon}</span>;\n }\n return (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {children}\n </svg>\n );\n}\n\ntype TapTargetSize = \"default\" | \"sm\";\n\nfunction resolveTapGeometry(\n label: string | undefined,\n size: TapTargetSize,\n mobileIconOnly: boolean,\n) {\n const inline = Boolean(label);\n if (size === \"sm\") {\n return {\n outerClassName:\n inline && mobileIconOnly\n ? \"matrx-tap-target matrx-tap-target-sm matrx-tap-target-mobile-icon-only-sm group\"\n : inline\n ? \"matrx-tap-target matrx-tap-target-sm matrx-tap-target-inline-sm group\"\n : TAP_GROUP_OUTER_CLASS,\n inlineModifier: mobileIconOnly\n ? \"matrx-tap-pill-mobile-icon-only-sm\"\n : \"matrx-tap-pill-inline-sm\",\n };\n }\n return {\n outerClassName:\n inline && mobileIconOnly\n ? `${TAP_OUTER_CLASS} matrx-tap-target-mobile-icon-only`\n : inline\n ? `${TAP_OUTER_CLASS} matrx-tap-target-inline`\n : TAP_OUTER_CLASS,\n inlineModifier: mobileIconOnly\n ? \"matrx-tap-pill-mobile-icon-only\"\n : \"matrx-tap-pill-inline\",\n };\n}\n\nfunction buildTapInner({\n label,\n pillClassName,\n iconClassName,\n labelClassName,\n inlineModifier,\n icon,\n children,\n strokeWidth = 2,\n}: {\n label?: string | undefined;\n pillClassName: string;\n iconClassName: string;\n labelClassName?: string | undefined;\n inlineModifier: string;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n strokeWidth?: number | undefined;\n}) {\n const iconEl = (\n <IconContent\n icon={icon}\n strokeWidth={strokeWidth}\n className={iconClassName}\n >\n {children}\n </IconContent>\n );\n const pillClasses = label\n ? `${pillClassName} ${inlineModifier}`.trim()\n : pillClassName;\n\n if (!label) {\n return <div className={pillClasses}>{iconEl}</div>;\n }\n\n return (\n <div className={pillClasses}>\n {iconEl}\n <span className={labelClassName ?? \"matrx-tap-label\"}>{label}</span>\n </div>\n );\n}\n\ninterface RenderTapTargetArgs extends Pick<\n TapTargetButtonProps,\n | \"icon\"\n | \"children\"\n | \"strokeWidth\"\n | \"label\"\n | \"mobileIconOnly\"\n | \"onClick\"\n | \"as\"\n | \"htmlFor\"\n | \"ariaLabel\"\n | \"disabled\"\n | \"href\"\n | \"target\"\n | \"rel\"\n | \"prefetch\"\n | \"linkComponent\"\n | \"tooltip\"\n | \"tooltipSide\"\n | \"tooltipAlign\"\n> {\n size?: TapTargetSize;\n pillClassName: string;\n iconClassName: string;\n labelClassName?: string | undefined;\n rest?: ButtonHTMLAttributes<HTMLButtonElement> | undefined;\n buttonRef?: Ref<HTMLButtonElement> | undefined;\n}\n\nfunction renderTapTarget({\n size = \"default\",\n pillClassName,\n iconClassName,\n labelClassName,\n icon,\n children,\n strokeWidth,\n label,\n mobileIconOnly = false,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n rest,\n buttonRef,\n}: RenderTapTargetArgs): ReactElement {\n const { outerClassName, inlineModifier } = resolveTapGeometry(\n label,\n size,\n mobileIconOnly,\n );\n const responsiveLabelClassName = mobileIconOnly\n ? `${labelClassName ?? \"matrx-tap-label\"} matrx-tap-label-mobile-icon-only`\n : labelClassName;\n const inner = buildTapInner({\n label,\n pillClassName,\n iconClassName,\n labelClassName: responsiveLabelClassName,\n inlineModifier: label ? inlineModifier : \"\",\n icon,\n children,\n strokeWidth,\n });\n const resolvedTooltip =\n tooltip !== undefined ? tooltip : label ? false : undefined;\n const triggerAriaLabel =\n label && !mobileIconOnly ? undefined : (ariaLabel ?? label);\n const trigger = renderTrigger({\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n as,\n htmlFor,\n onClick,\n ariaLabel: triggerAriaLabel,\n disabled,\n outerClassName,\n children: inner,\n rest,\n buttonRef,\n });\n return withTooltip(trigger, {\n tooltip: resolvedTooltip,\n ariaLabel: triggerAriaLabel,\n disabled,\n tooltipSide,\n tooltipAlign,\n });\n}\n\ninterface RenderTriggerArgs {\n href?: string | undefined;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n rel?: string | undefined;\n prefetch?: boolean | null | undefined;\n linkComponent?: TapTargetLinkComponent | undefined;\n as?: \"button\" | \"label\" | undefined;\n htmlFor?: string | undefined;\n onClick?: (() => void) | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n outerClassName: string;\n children: ReactNode;\n rest?: ButtonHTMLAttributes<HTMLButtonElement> | undefined;\n buttonRef?: Ref<HTMLButtonElement> | undefined;\n}\n\n/**\n * Resolves the correct trigger element based on the props passed.\n *\n * - `href` + `disabled` → unclickable `<span aria-disabled>`\n * - `href` matching `http(s):|mailto:|tel:` → `<a target=\"_blank\" rel=\"noopener noreferrer\">`\n * - `href` (internal) → the injected link component (per-instance\n * `linkComponent` prop, else `setTapTargetLinkComponent` registration),\n * falling back to a plain `<a>` when none is registered\n * - `as=\"label\"` → `<label htmlFor=...>`\n * - default → `<button>`\n */\nfunction renderTrigger({\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n as,\n htmlFor,\n onClick,\n ariaLabel,\n disabled,\n outerClassName,\n children,\n rest,\n buttonRef,\n}: RenderTriggerArgs): ReactElement {\n if (disabled && href) {\n return (\n <span\n aria-disabled=\"true\"\n aria-label={ariaLabel}\n className={`${outerClassName} opacity-40 pointer-events-none`}\n >\n {children}\n </span>\n );\n }\n if (href) {\n const isExternal = EXTERNAL_RE.test(href);\n if (isExternal) {\n return (\n <a\n href={href}\n target={target ?? \"_blank\"}\n rel={rel ?? \"noopener noreferrer\"}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </a>\n );\n }\n const Link = linkComponent ?? getTapTargetLinkComponent();\n if (Link) {\n return (\n <Link\n href={href}\n target={target}\n rel={rel}\n prefetch={prefetch}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </Link>\n );\n }\n // No link component registered — plain <a>. `prefetch` is a router hint,\n // not a DOM attribute, so it is deliberately dropped here.\n return (\n <a\n href={href}\n target={target}\n rel={rel}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </a>\n );\n }\n if (as === \"label\") {\n return (\n <label\n htmlFor={htmlFor}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </label>\n );\n }\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n disabled={disabled}\n {...rest}\n className={outerClassName}\n >\n {children}\n </button>\n );\n}\n\n/**\n * Wraps a trigger element in a Tooltip when a tooltip label is available.\n * Falls back to `ariaLabel` when `tooltip` is not explicitly set. If both\n * are absent (or `tooltip === false`), the trigger is returned unwrapped.\n */\nfunction withTooltip(\n trigger: ReactElement,\n {\n tooltip,\n ariaLabel,\n disabled,\n tooltipSide = \"top\",\n tooltipAlign = \"center\",\n }: {\n tooltip?: string | false | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\" | undefined;\n tooltipAlign?: \"start\" | \"center\" | \"end\" | undefined;\n },\n): ReactElement {\n if (tooltip === false) return trigger;\n const label =\n typeof tooltip === \"string\" && tooltip.length > 0 ? tooltip : ariaLabel;\n if (!label) return trigger;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {disabled ? (\n // Radix Tooltip triggers need a hoverable element; a disabled button\n // does not dispatch pointer events, so we wrap in a span for the\n // trigger target while keeping the disabled visual state.\n <span className=\"inline-flex\">{trigger}</span>\n ) : (\n trigger\n )}\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} align={tooltipAlign}>\n {label}\n </TooltipContent>\n </Tooltip>\n );\n}\n\n// To resize/retune every tap button, edit styles.css — not here.\n\nexport const TapTargetButton = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButton(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: \"matrx-tap-pill matrx-glass-thin-border\",\n iconClassName: `matrx-tap-icon ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport const TapTargetButtonTransparent = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonTransparent(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName:\n \"matrx-tap-pill hover:bg-muted active:bg-muted-foreground/15\",\n iconClassName: `matrx-tap-icon ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport const TapTargetButtonSolid = forwardRef<\n HTMLButtonElement,\n TapTargetButtonSolidProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonSolid(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n bgColor = \"bg-primary\",\n iconColor = \"text-primary-foreground\",\n hoverBgColor = \"hover:bg-primary/80\",\n activeBgColor = \"active:brightness-90\",\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: `matrx-tap-pill ${bgColor} ${iconColor} ${hoverBgColor} ${activeBgColor}`,\n iconClassName: `matrx-tap-icon ${iconColor}`,\n labelClassName: `matrx-tap-label ${iconColor}`,\n rest,\n buttonRef: ref,\n });\n});\n\n/** Solid destructive pill — delete/remove actions. White-on-red like the\n * primary solid is white-on-blue. Use THIS, never hand-pass bg-destructive\n * with the default (dark) icon color. */\nexport const TapTargetButtonDestructive = forwardRef<\n HTMLButtonElement,\n TapTargetButtonSolidProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonDestructive(\n {\n bgColor = \"bg-destructive\",\n iconColor = \"text-destructive-foreground\",\n hoverBgColor = \"hover:bg-destructive/90\",\n ...rest\n },\n ref,\n) {\n return (\n <TapTargetButtonSolid\n ref={ref}\n bgColor={bgColor}\n iconColor={iconColor}\n hoverBgColor={hoverBgColor}\n {...rest}\n />\n );\n});\n\nexport const TapTargetButtonForGroup = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonForGroup(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n size: \"sm\",\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: \"matrx-tap-pill matrx-tap-pill-sm matrx-glass-interactive\",\n iconClassName: `matrx-tap-icon ${color}`,\n labelClassName: `matrx-tap-label ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport function TapTargetButtonGroup({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string | undefined;\n}) {\n return (\n <div\n className={\n className\n ? `relative inline-flex h-9 items-center ${className}`\n : \"relative inline-flex h-9 items-center\"\n }\n >\n <div className=\"pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 h-7 rounded-full matrx-glass-thin-border\" />\n {/* min-w-0 lets flexible children (e.g. a truncating filename) shrink\n under container pressure; fixed-size tap buttons are unaffected. */}\n <div className=\"relative flex min-w-0 items-center\">{children}</div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Tooltip — the ONE tooltip in the fleet.\n *\n * THE COLLAPSE (0.6.0). Two implementations existed: matrx-frontend's\n * `components/ui/tooltip.tsx` (182 import sites) and `@ai-matrx/tap-target`'s\n * `src/tooltip.tsx` — the latter an explicit inlined PORT of the former,\n * carrying a header that said so. tap-target shipped it only because its ~60\n * tap buttons need a tooltip and no shared package owned one; four repos then\n * adopted `TooltipProvider` from tap-target. That made tap-target — a\n * button-geometry package — the accidental owner of a design-system primitive,\n * with a second copy living in the biggest host.\n *\n * A tooltip is a design-system surface, so it lives here. tap-target now takes\n * `@ai-matrx/design-system` as an ordinary sibling dependency and imports this\n * file; its own copy is deleted, and its re-export removed. The DAG already\n * ordered design-system before tap-target, so no cycle is introduced.\n *\n * BEHAVIOUR is matrx-frontend's, verbatim, including the ruling both copies\n * carried in prose:\n *\n * 1. 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 false: Radix ids come from React's\n * SSR-stable `useId`. It was actively harmful — a Trigger wraps\n * ALWAYS-VISIBLE content, so `return null` deleted that subtree from SSR and\n * the first client paint.\n *\n * 2. THE SURFACE IS NEUTRAL, NOT BRANDED. Popover tokens, not `bg-primary`:\n * rich tooltip content using `text-muted-foreground` was illegible on a\n * brand-coloured background in one theme or the other.\n *\n * SEAM INVERSION. The host resolved nested portal targets through\n * `useNestedPortalContainer` (an app hook wired to its dialog + window-panel\n * systems); tap-target's port dropped that seam entirely and always portalled\n * to `document.body` — which is why a tooltip inside a popped-out panel landed\n * in the wrong window. Here it is the package's `PortalContainerProvider`\n * seam: an explicit `container` prop wins, then the injected container, then\n * `document.body`. Both prior behaviours are reachable; neither is forked.\n */\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\n/**\n * Mount once near the app root. Every tooltip in the tree shares its\n * `delayDuration` / `skipDelayDuration` timing.\n */\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport interface TooltipContentProps\n extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> {\n /**\n * Explicit portal target; wins over the injected `PortalContainerProvider`\n * value. Pass `null` to force `document.body`.\n */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n TooltipContentProps\n>(({ className, sideOffset = 4, container, animated = true, ...props }, ref) => {\n const resolved = usePortalContainer(container);\n return (\n <TooltipPrimitive.Portal container={resolved ?? null}>\n <TooltipPrimitive.Content\n ref={ref}\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-[10001] overflow-hidden rounded-md border border-border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n );\n});\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","/**\n * Minimal className join — the only piece of `cn` this package needs.\n * No tailwind-merge / clsx dependency by design: callers pass literal strings.\n */\nexport function cn(\n ...values: Array<string | null | undefined | false>\n): string {\n return values.filter(Boolean).join(\" \").trim();\n}\n","import type { ComponentType, ReactNode } from \"react\";\n\n/**\n * The injectable link seam — the package's replacement for the original\n * hard `next/link` import.\n *\n * Internal hrefs (anything NOT matching `http(s):`, `mailto:`, `tel:`) render\n * through the link component resolved here; external hrefs always render a\n * plain `<a target=\"_blank\" rel=\"noopener noreferrer\">`, exactly like the\n * original. When nothing is registered and no per-instance `linkComponent`\n * prop is given, internal hrefs fall back to a plain `<a>` (no prefetch, no\n * client-side routing — still a working link).\n */\nexport interface TapTargetLinkProps {\n href: string;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n rel?: string | undefined;\n /** Router prefetch hint (next/link semantics). Plain `<a>` fallback ignores it. */\n prefetch?: boolean | null | undefined;\n \"aria-label\"?: string | undefined;\n className?: string | undefined;\n children?: ReactNode;\n}\n\nexport type TapTargetLinkComponent = ComponentType<TapTargetLinkProps>;\n\n/**\n * The registered component lives in a `Symbol.for` slot on `globalThis` — NOT\n * in module state — so it survives the module graph being instantiated more\n * than once: the `.` and `./buttons` dist bundles each inline the primitives\n * (tsup `splitting: false`), and a consumer may even mix `import` and\n * `require`. One registration must reach every copy.\n */\nconst LINK_SLOT = Symbol.for(\"@ai-matrx/tap-target:link-component\");\n\ntype GlobalWithLinkSlot = typeof globalThis & {\n [LINK_SLOT]?: TapTargetLinkComponent | null;\n};\n\n/**\n * Register the app's link component once at startup (e.g. `next/link`):\n *\n * ```tsx\n * import Link from \"next/link\";\n * import { setTapTargetLinkComponent } from \"@ai-matrx/tap-target\";\n * setTapTargetLinkComponent(Link);\n * ```\n *\n * Pass `null` to unregister (plain `<a>` fallback resumes).\n */\nexport function setTapTargetLinkComponent(\n component: TapTargetLinkComponent | null,\n): void {\n (globalThis as GlobalWithLinkSlot)[LINK_SLOT] = component;\n}\n\n/** The currently registered link component, or `null` when none is set. */\nexport function getTapTargetLinkComponent(): TapTargetLinkComponent | null {\n return (globalThis as GlobalWithLinkSlot)[LINK_SLOT] ?? null;\n}\n","/** Pure Alchemy icon assets. Safe to import without React or browser APIs. */\nexport type AlchemyIcon = \"portal\" | \"copy-transform\";\nexport const ALCHEMY_GLYPH_PATHS: Record<AlchemyIcon, readonly string[]> = {\n portal: [\"M10 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4M14 4h4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-4M12 8v8m-3-3 3 3 3-3\"],\n \"copy-transform\": [\"M8 7V5a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v8M13 21H5a2 2 0 0 1-2-2V10a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v3m-5 4h11m-3-3 3 3-3 3\"],\n};\nexport const ALCHEMY_GLYPH_VIEWBOX: Record<AlchemyIcon, string> = { portal: \"0 0 24 24\", \"copy-transform\": \"0 0 24 24\" };\nconst svg = (paths: readonly string[], viewBox: string) => `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"${viewBox}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths.map((d) => `<path d=\"${d}\"/>`).join(\"\")}</svg>`;\nexport const ALCHEMY_GLYPH_SVG = svg(ALCHEMY_GLYPH_PATHS.portal, ALCHEMY_GLYPH_VIEWBOX.portal);\nexport const ALCHEMY_COPY_TRANSFORM_SVG = svg(ALCHEMY_GLYPH_PATHS[\"copy-transform\"], ALCHEMY_GLYPH_VIEWBOX[\"copy-transform\"]);\n","import {\n ContentTransferError,\n readTransferCell,\n sealTransferArtifact,\n serialize,\n type Artifact,\n type Draft,\n type FormatAdapter,\n type Json,\n type PageAction,\n type Payload,\n type TransferOutcome,\n} from \"@ai-matrx/kit/content-transfer\";\n\nexport type ContentTransferReference = {\n id: string;\n label: string;\n noun: string;\n items: Record<string, Json>[];\n};\n\nexport type ContentTransferReferencePort = {\n supports(reference: ContentTransferReference): boolean;\n build(reference: ContentTransferReference): string | Promise<string>;\n};\n\nexport type ContentTransferEmailPort = {\n send(\n artifact: Artifact,\n context: { label: string; signal: AbortSignal },\n ): Promise<TransferOutcome>;\n};\n\nconst exportableColumns = (payload: Extract<Payload, { kind: \"rows\" }>) =>\n payload.columns.filter(\n (column) =>\n column.visible &&\n column.exportable !== false &&\n column.classification !== \"secret\" &&\n column.classification !== \"credential\",\n );\n\n/** A sealed, projection-safe representation of a tabular draft's declared schema and values. */\nexport const tableSchemaFormat: FormatAdapter = {\n id: \"table-schema\",\n label: \"Schema\",\n supports: (payload) => payload.kind === \"rows\",\n async build(draft, signal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"rows\")\n throw new ContentTransferError(\n \"unsupported-format\",\n \"Schema + rows requires tabular content; manually edited text cannot carry a table schema.\",\n );\n const rowColumns = exportableColumns(draft.payload);\n const columns = rowColumns.map((column) => ({\n id: column.id,\n label: column.label,\n path: column.path,\n ...(column.schema === undefined ? {} : { schema: column.schema }),\n }));\n const body = {\n sourceId: draft.sourceId,\n columns,\n rows: draft.payload.rows.map((row) =>\n Object.fromEntries(rowColumns.map((column) => [column.id, readTransferCell(row, column) ?? null])),\n ),\n } satisfies Json;\n const plainText = JSON.stringify(body, null, 2);\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"table-schema\",\n plainText,\n file: {\n filename: \"table-schema.json\",\n mime: \"application/json\",\n bytes: new TextEncoder().encode(plainText),\n },\n omissions: [...draft.omissions],\n });\n },\n};\n\nfunction displayLabels(payload: Extract<Payload, { kind: \"rows\" }>): [string, typeof payload.columns[number]][] {\n const columns = exportableColumns(payload);\n const counts = new Map<string, number>();\n for (const column of columns) counts.set(column.label, (counts.get(column.label) ?? 0) + 1);\n const used = new Set<string>();\n return columns.map((column) => {\n const base = counts.get(column.label) === 1 ? column.label : `${column.label} [${column.id}]`;\n let label = base;\n for (let suffix = 2; used.has(label); suffix += 1) label = `${base} (${suffix})`;\n used.add(label);\n return [label, column];\n });\n}\n\n/** Flat row JSON keyed by user-facing display labels, never raw table records. */\nexport const tableDataFormat: FormatAdapter = {\n id: \"table-data\",\n label: \"Table JSON\",\n supports: (payload) => payload.kind === \"rows\",\n async build(draft, signal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"rows\")\n throw new ContentTransferError(\"unsupported-format\", \"Display-label JSON requires tabular content.\");\n const columns = displayLabels(draft.payload);\n const plainText = JSON.stringify(\n draft.payload.rows.map((row) =>\n Object.fromEntries(columns.map(([label, column]) => [label, readTransferCell(row, column) ?? null])),\n ),\n null,\n 2,\n );\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"json\",\n plainText,\n file: {\n filename: \"data.json\",\n mime: \"application/json;charset=utf-8\",\n bytes: new TextEncoder().encode(plainText),\n },\n omissions: [...draft.omissions],\n });\n },\n};\n\ntype EmailFormat = \"csv\" | \"json\" | \"markdown\";\nexport type TransferEmailAction = PageAction & { prepared: true; group: \"email\" };\n\nconst emailArtifact = (draft: Draft, format: EmailFormat, signal: AbortSignal, jsonFormat?: FormatAdapter): Promise<Artifact> =>\n format === \"json\" && jsonFormat?.supports(draft.payload)\n ? jsonFormat.build(draft, signal)\n : Promise.resolve(serialize(draft, format, { spreadsheetSafe: format === \"csv\" }));\n\n/** Prepared-only delivery actions always serialize the current draft, never a host source. */\nexport function createTransferEmailActions(\n email: ContentTransferEmailPort,\n options: { jsonFormat?: FormatAdapter } = {},\n): TransferEmailAction[] {\n return ([\"csv\", \"json\", \"markdown\"] as const).map((format) => ({\n id: `email-${format}`,\n label: `Email ${format === \"csv\" ? \"CSV\" : format === \"json\" ? \"JSON\" : \"Markdown\"}`,\n prepared: true,\n group: \"email\",\n supports: (_snapshot, draft) => Boolean(draft) && (format !== \"csv\" || draft?.payload.kind === \"rows\"),\n async run({ draft, signal, snapshot }) {\n if (signal.aborted) return { status: \"cancelled\" };\n const artifact = await emailArtifact(draft, format, signal, options.jsonFormat);\n return email.send(artifact, { label: snapshot.label, signal });\n },\n }));\n}\n","\"use client\";\nimport { MatrxCopyMenu } from \"../content-transfer/matrx-copy\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport type { CopyControlProps, ExportItem } from \"./copy-types\";\nexport type { AgentPayloadInput, AiCustomSource, AiVariant, CopyControlProps, CopySubsetColumn } from \"./copy-types\";\nexport { tableAgentText } from \"./copy-payload\";\n\n/** All portable row, selection, toolbar and detail copy controls use Alchemy.\n * Host ports remain explicit so installed applications can activate their\n * authenticated destinations when they adopt the published package. */\nexport function CopyButtons(props: CopyControlProps) {\n const { CopyControls } = useMatrxDataTableHost();\n const copyProps = props.export?.sheetRows\n ? { ...props, primarySource: \"table\" as const }\n : props;\n if (CopyControls) return <CopyControls {...copyProps} />;\n return <MatrxCopyMenu {...copyProps} />;\n}\nexport function jsonExportItem(build: () => unknown, label: string): ExportItem { return { id: \"json\", label, build: () => ({ content: JSON.stringify(build(), null, 2), extension: \"json\", mime: \"application/json\" }) }; }\n","\"use client\";\n\n/**\n * MatrxUuidCell — canonical UUID / FK display for dense tables.\n *\n * Port of aidream `UuidDisplay` + AI Models `UuidCell` + tool-call `ShortId`:\n * short prefix (8 chars), full value on hover, always-visible copy of the full\n * id. Optional FK open: in-app WindowPanel (`onOpen`) and/or route (`href`).\n * Forbidden targets stay copyable but are not navigable.\n *\n * THE DOOR LAW: \"never render an id you can't open\". Pass `token` (the canonical\n * entity token this id points at) and the cell resolves its own doors from the\n * registries — route, new tab, and peek — with no per-callsite wiring. Prefer\n * `EntityRef` whenever the record's NAME is available; this is the fallback for\n * a raw FK column where it genuinely isn't.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from \"react\";\nimport {\n Check,\n Copy,\n ExternalLink,\n Lightbulb,\n PanelRight,\n ShieldOff,\n} from \"./icons\";\nimport { useTableNotice } from \"./useTableNotice\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../tooltip\";\nimport { cn } from \"../cn\";\n\nconst SHORT_LEN = 8;\n\nexport function shortUuid(id: string, len = SHORT_LEN): string {\n return id.slice(0, len);\n}\n\nasync function copyText(text: string): Promise<boolean> {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // fall through\n }\n try {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n const ok = document.execCommand(\"copy\");\n document.body.removeChild(ta);\n return ok;\n } catch {\n return false;\n }\n}\n\nexport type MatrxUuidOpenResult = void | \"forbidden\";\n\nexport interface MatrxUuidCellProps {\n value: string | null | undefined;\n /** Tooltip / copy label prefix (e.g. column name). */\n label?: string | undefined;\n /**\n * Open the referenced record in-app (prefer WindowPanel).\n * Return `\"forbidden\"` to block navigation and show a muted state.\n */\n onOpen?: (id: string) => MatrxUuidOpenResult | Promise<MatrxUuidOpenResult>;\n /** Optional real href (new tab / cmd-click). Used when navigation is allowed. */\n href?: string | null | undefined;\n /**\n * Canonical entity token this id points at (`agent`, `note`, `task`, …).\n * Supplies the route and the peek automatically — THE DOOR LAW, resolved\n * from the registries instead of wired per callsite. An explicit `href` /\n * `onOpen` still wins.\n */\n token?: string | null | undefined;\n /** Force non-navigable (still copyable). */\n forbidden?: boolean;\n className?: string;\n trailing?: ReactNode;\n}\n\nexport function MatrxUuidCell({\n value,\n label,\n onOpen,\n href,\n token,\n forbidden = false,\n className,\n trailing,\n}: MatrxUuidCellProps) {\n const { resolveEntityDoors, ResourcePeek } = useMatrxDataTableHost();\n const { notify, notice } = useTableNotice();\n const [copied, setCopied] = useState(false);\n const [opening, setOpening] = useState(false);\n const [peekOpen, setPeekOpen] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timer.current) clearTimeout(timer.current);\n },\n [],\n );\n\n if (!value) {\n return <span className=\"text-muted-foreground/40\">—</span>;\n }\n\n const doors = token ? resolveEntityDoors?.(token, value, href) ?? null : null;\n const resolvedHref = doors?.href ?? href ?? null;\n const canPeek = Boolean(doors?.canPeek) && !forbidden;\n const display = shortUuid(value);\n const tip = label ? `${label}: ${value}` : value;\n\n const stop = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n const onCopy = (e: MouseEvent) => {\n stop(e);\n e.preventDefault();\n void copyText(value).then((ok) => {\n if (!ok) {\n notify?.error(\"Couldn't copy ID\");\n return;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 1500);\n });\n };\n\n const handleOpen = async (e: MouseEvent) => {\n stop(e);\n e.preventDefault();\n if (!onOpen || forbidden || opening) return;\n setOpening(true);\n try {\n const result = await onOpen(value);\n if (result === \"forbidden\") {\n // access-errors: ok — relays the onOpen contract's explicit verdict: the caller's opener returns \"forbidden\" only after ITS OWN access check; the cell performs no read and never guesses\n notify?.error(\"You don't have access to open this record\");\n }\n } catch (err) {\n notify?.error(\n `Couldn't open: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n setOpening(false);\n }\n };\n\n const idNode = (() => {\n if (forbidden) {\n return (\n <span className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-muted-foreground/70 tabular-nums\">\n <span className=\"min-w-0 truncate\">{display}</span>\n <ShieldOff className=\"h-3 w-3 shrink-0 opacity-60\" aria-hidden />\n </span>\n );\n }\n\n if (onOpen) {\n return (\n <button\n type=\"button\"\n aria-label={`Open ${label ?? \"record\"} ${display}`}\n onClick={(e) => void handleOpen(e)}\n disabled={opening}\n className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-sky-600 hover:underline dark:text-sky-400 disabled:opacity-60\"\n >\n <span className=\"min-w-0 truncate tabular-nums\">{display}</span>\n <PanelRight className=\"h-3 w-3 shrink-0 opacity-50\" />\n </button>\n );\n }\n\n if (resolvedHref) {\n return (\n <a\n href={resolvedHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Open ${label ?? \"record\"} ${display} in a new tab`}\n onClick={stop}\n className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-sky-600 hover:underline dark:text-sky-400\"\n >\n <span className=\"min-w-0 truncate tabular-nums\">{display}</span>\n <ExternalLink className=\"h-3 w-3 shrink-0 opacity-50\" />\n </a>\n );\n }\n\n return (\n <span className=\"min-w-0 truncate font-mono text-xs text-muted-foreground tabular-nums select-all\">\n {display}\n </span>\n );\n })();\n\n return (\n <TooltipProvider delayDuration={200}>\n <span\n data-matrx-cell-control\n className={cn(\n \"inline-flex min-w-0 max-w-full items-center gap-0.5 whitespace-nowrap\",\n className,\n )}\n onClick={stop}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex min-w-0 max-w-full items-center\">\n {idNode}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-sm break-all font-mono\">\n {forbidden ? `No access · ${tip}` : tip}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? \"Copied\" : `Copy ${label ?? \"id\"}`}\n className={cn(\n \"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\",\n copied && \"text-primary\",\n )}\n >\n {copied ? <Check className=\"h-3 w-3\" /> : <Copy className=\"h-3 w-3\" />}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{copied ? \"Copied\" : `Copy ${label ?? \"id\"}: ${value}`}</TooltipContent>\n </Tooltip>\n {canPeek ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => {\n stop(e);\n setPeekOpen(true);\n }}\n aria-label={`Quick look at ${label ?? \"record\"}`}\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\"\n >\n <Lightbulb className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Quick look at {label ?? \"record\"}</TooltipContent>\n </Tooltip>\n ) : null}\n {onOpen && resolvedHref && !forbidden ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <a\n href={resolvedHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={stop}\n aria-label={`Open ${label ?? \"record\"} in a new tab`}\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Open {label ?? \"record\"} in a new tab</TooltipContent>\n </Tooltip>\n ) : null}\n {trailing}\n {notice}\n {canPeek && peekOpen && ResourcePeek ? (\n <ResourcePeek\n kind={doors?.peekKind ?? token ?? \"record\"}\n id={value}\n onClose={() => setPeekOpen(false)}\n // Same contract as `EntityDoorControls`: forward the CALLER's raw\n // `href` so the peek's \"Open\" cannot send the user somewhere this\n // cell's own link does not go. `doors.ts` names EntityRef and this\n // cell as the two presentations that must not drift — the peek\n // override shipped on one of them first, which is exactly the drift\n // that file warns about.\n {...(href == null ? {} : { href })}\n />\n ) : null}\n </span>\n </TooltipProvider>\n );\n}\n","\"use client\";\nimport { useState } from \"react\";\nimport { useMatrxDataTableHost } from \"./host\";\n\n/** Every portable async action has visible feedback even without a host toast system. */\nexport function useTableNotice() {\n const host = useMatrxDataTableHost();\n const [message, setMessage] = useState<{ text: string; error: boolean } | null>(null);\n const notify = {\n success(text: string) { if (host.notify) host.notify.success(text); else setMessage({ text, error: false }); },\n error(text: string) { if (host.notify) host.notify.error(text); else setMessage({ text, error: true }); },\n };\n const notice = message ? <span role={message.error ? \"alert\" : \"status\"} className={message.error ? \"text-xs text-destructive\" : \"text-xs text-muted-foreground\"}>{message.text}<button type=\"button\" aria-label=\"Dismiss notification\" className=\"ml-2 underline\" onClick={() => setMessage(null)}>Dismiss</button></span> : null;\n return { notify, notice };\n}\n","export function isUuidValue(value: unknown): value is string {\n return typeof value === \"string\" && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n}\nexport function tokenFromColumnName(name: string): string | null {\n return name.endsWith(\"_id\") ? name.slice(0, -3) : null;\n}\n","import type {\n ColumnFilterValue,\n ColumnFiltersState,\n MatrxColumnDef,\n SortState,\n TableSearchMatchMode,\n} from \"./types\";\nimport {\n completeLayeredFilterRules,\n layeredFilterMatchesValue,\n type LayeredFilterRule,\n} from \"./layered-filters\";\nimport { dateFilterBounds } from \"./date-filter\";\n\n/**\n * Sentinel select-filter values for \"no value\" / \"any value\" — every select\n * filter offers them automatically when the column has empty cells, so any\n * table can isolate rows missing a value (or having one) without extra config.\n */\nexport const SELECT_EMPTY_VALUE = \"__empty__\";\nexport const SELECT_NOT_EMPTY_VALUE = \"__not_empty__\";\n/** Exact SQL-style NULL selection, distinct from the empty-cell option. */\nexport const SELECT_NULL_VALUE = \"__null__\";\n\nexport function columnId<T>(col: MatrxColumnDef<T>): string {\n if (col.id) return col.id;\n if (col.accessorKey) return String(col.accessorKey);\n throw new Error(\"MatrxDataTable column requires `id` or `accessorKey`\");\n}\n\nexport function getCellValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n if (col.accessorFn) return col.accessorFn(row);\n if (col.accessorKey) {\n return (row as Record<string, unknown>)[col.accessorKey];\n }\n return undefined;\n}\n\nexport function getFilterValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n return col.filterValue ? col.filterValue(row) : getCellValue(row, col);\n}\n\nexport function getSortValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n return col.sortValue ? col.sortValue(row) : getCellValue(row, col);\n}\n\nexport function stringifyCellValue(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return value.toISOString();\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/** Unicode-aware tokenization shared by whole-word table search. */\nexport function tableSearchWords(value: string): string[] {\n return value\n .toLocaleLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter(Boolean);\n}\n\n/**\n * Match the primary table search against one row's searchable text. In\n * whole-word mode every entered word must exist as a complete token, so\n * `are` matches `we are ready` but never `hardware`.\n */\nexport function matchesTableSearch(\n searchableText: string,\n query: string,\n mode: TableSearchMatchMode = \"contains\",\n): boolean {\n const normalizedQuery = query.trim().toLocaleLowerCase();\n if (!normalizedQuery) return true;\n if (mode === \"contains\") {\n return searchableText.toLocaleLowerCase().includes(normalizedQuery);\n }\n const actualWords = new Set(tableSearchWords(searchableText));\n const expectedWords = tableSearchWords(normalizedQuery);\n return (\n expectedWords.length > 0 &&\n expectedWords.every((word) => actualWords.has(word))\n );\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") {\n return Number(a) - Number(b);\n }\n return stringifyCellValue(a).localeCompare(stringifyCellValue(b), undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n}\n\n/** Select filters treat array-valued cells as sets, never as serialized JSON choices. */\nexport function selectCellValues(value: unknown): string[] {\n return (Array.isArray(value) ? value : [value])\n .map(stringifyCellValue)\n .filter((item) => item !== \"\");\n}\n\nexport function passesColumnFilter(\n value: unknown,\n filter: ColumnFilterValue,\n): boolean {\n const matches = (() => {\n switch (filter.kind) {\n case \"text\": {\n const s = stringifyCellValue(value);\n if (filter.mode === \"null\") return value == null;\n if (filter.mode === \"not_null\") return value != null;\n if (filter.mode === \"empty\") return s.trim() === \"\";\n if (filter.mode === \"not_empty\") return s.trim() !== \"\";\n const q = filter.value.trim().toLowerCase();\n if (!q) return true;\n return s.toLowerCase().includes(q);\n }\n case \"select\": {\n // `values: []` is an explicit multi-select state: the user deselected\n // every option, so it must produce an empty result. Legacy single-value\n // filters and an absent `values` field retain their clear/all behavior.\n if (filter.values !== undefined && filter.values.length === 0) {\n return false;\n }\n const selected = filter.values ??\n (filter.value && filter.value !== \"__all__\" ? [filter.value] : []);\n if (selected.length === 0) return true;\n const values = selectCellValues(value);\n // OR semantics across the set; sentinels compose (\"A or (empty)\").\n return selected.some((v) =>\n v === SELECT_NULL_VALUE\n ? value == null\n : v === SELECT_EMPTY_VALUE\n ? values.length === 0\n : v === SELECT_NOT_EMPTY_VALUE\n ? values.length > 0\n : v === \"\"\n ? value === \"\" || (Array.isArray(value) && value.includes(\"\"))\n : values.includes(v),\n );\n }\n case \"boolean\": {\n return Boolean(value) === filter.value;\n }\n case \"number\": {\n // A missing cell is not zero. Without this guard, Number(\"\") made a\n // blank numeric value pass filters whose range included zero.\n const raw = stringifyCellValue(value).trim();\n if (raw === \"\") return false;\n const normalized = raw.replace(/[^0-9.-]/g, \"\");\n if (normalized === \"\") return false;\n const n = typeof value === \"number\"\n ? value\n : Number(normalized);\n if (!Number.isFinite(n)) return false;\n if (filter.min !== undefined && n < filter.min) return false;\n if (filter.max !== undefined && n > filter.max) return false;\n return true;\n }\n case \"date\": {\n const raw = value instanceof Date ? value : new Date(stringifyCellValue(value));\n if (Number.isNaN(raw.valueOf())) return false;\n const { since, until } = dateFilterBounds(filter);\n const timestamp = raw.valueOf();\n if (since !== undefined) {\n const sinceTimestamp = new Date(since).valueOf();\n if (Number.isNaN(sinceTimestamp) || timestamp < sinceTimestamp) return false;\n }\n if (until !== undefined) {\n const untilTimestamp = new Date(until).valueOf();\n if (Number.isNaN(untilTimestamp) || timestamp >= untilTimestamp) return false;\n }\n return true;\n }\n }\n })();\n return filter.negated ? !matches : matches;\n}\n\nexport function filterAndSortRows<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n columnFilters: ColumnFiltersState,\n sort: SortState | null,\n globalSearch: string,\n anyOf?: { columnIds: string[]; query: string },\n layeredFilters?: readonly LayeredFilterRule[],\n globalSearchMode: TableSearchMatchMode = \"contains\",\n searchText?: (row: T) => string,\n): T[] {\n const colById = new Map(columns.map((c) => [columnId(c), c]));\n const q = globalSearch.trim().toLowerCase();\n const anyQ = anyOf?.query.trim().toLowerCase() ?? \"\";\n const activeLayeredFilters = completeLayeredFilterRules(layeredFilters);\n\n let result = rows.filter((row) => {\n for (const [id, filter] of Object.entries(columnFilters)) {\n if (!filter) continue;\n const col = colById.get(id);\n if (!col || col.filter === false) continue;\n if (!passesColumnFilter(getFilterValue(row, col), filter)) return false;\n }\n\n for (const rule of activeLayeredFilters) {\n const col = colById.get(rule.field);\n if (!col || !layeredFilterMatchesValue(getFilterValue(row, col), rule)) {\n return false;\n }\n }\n\n if (anyQ && anyOf) {\n const hit = anyOf.columnIds.some((id) => {\n const col = colById.get(id);\n if (!col) return false;\n return stringifyCellValue(getFilterValue(row, col))\n .toLowerCase()\n .includes(anyQ);\n });\n if (!hit) return false;\n }\n\n if (!q) return true;\n const searchableValues = columns\n .filter(\n (col) =>\n col.filter !== false || Boolean(col.accessorKey || col.accessorFn),\n )\n .map((col) => stringifyCellValue(getFilterValue(row, col)));\n const additionalSearchText = searchText?.(row);\n if (additionalSearchText) searchableValues.push(additionalSearchText);\n if (globalSearchMode === \"contains\") {\n return searchableValues.some((value) =>\n matchesTableSearch(value, q, \"contains\"),\n );\n }\n return matchesTableSearch(searchableValues.join(\" \"), q, \"whole_words\");\n });\n\n if (sort) {\n const col = colById.get(sort.id);\n if (col && col.sortable !== false) {\n const dir = sort.direction === \"asc\" ? 1 : -1;\n result = [...result].sort((a, b) => {\n const va = getSortValue(a, col);\n const vb = getSortValue(b, col);\n // Empty cells (null / \"\") sort LAST in both directions — sorting a\n // column should surface its values, never a wall of blanks.\n const ea = va == null || stringifyCellValue(va) === \"\";\n const eb = vb == null || stringifyCellValue(vb) === \"\";\n if (ea !== eb) return ea ? 1 : -1;\n return compareValues(va, vb) * dir;\n });\n }\n }\n\n return result;\n}\n\nexport function countActiveColumnFilters(filters: ColumnFiltersState): number {\n let n = 0;\n for (const f of Object.values(filters)) {\n if (!f) continue;\n switch (f.kind) {\n case \"text\":\n if (f.value.trim() || (f.mode && f.mode !== \"contains\")) n += 1;\n break;\n case \"select\":\n if (f.values !== undefined || (f.value && f.value !== \"__all__\"))\n n += 1;\n break;\n case \"boolean\":\n n += 1;\n break;\n case \"number\":\n if (f.min !== undefined || f.max !== undefined) n += 1;\n break;\n case \"date\":\n if (isColumnFilterActive(f)) n += 1;\n break;\n }\n }\n return n;\n}\n\nexport function isColumnFilterActive(\n filter: ColumnFilterValue | undefined,\n): boolean {\n if (!filter) return false;\n switch (filter.kind) {\n case \"text\":\n return (\n filter.value.trim().length > 0 ||\n (filter.mode !== undefined && filter.mode !== \"contains\")\n );\n case \"select\":\n return filter.values !== undefined\n ? true\n : Boolean(filter.value) && filter.value !== \"__all__\";\n case \"boolean\":\n return true;\n case \"number\":\n return filter.min !== undefined || filter.max !== undefined;\n case \"date\": {\n const bounds = dateFilterBounds(filter);\n return bounds.since !== undefined || bounds.until !== undefined;\n }\n }\n}\n\n/** Apply draft edits onto a row for display (shallow field merge). */\nexport function applyRowEdits<T>(\n row: T,\n edits: Record<string, unknown> | undefined,\n): T {\n if (!edits || Object.keys(edits).length === 0) return row;\n return { ...row, ...edits };\n}\n","import { stringifyCellValue } from \"./filter-engine\";\n\n/** Display formatting only; copy/export and persistence retain the original value. */\nexport function formatTableDisplayValue(value: unknown): string {\n if (typeof value === \"number\") return value.toLocaleString(undefined, { maximumFractionDigits: 12 });\n if (value instanceof Date) return value.toLocaleString();\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(value) && !Number.isNaN(Date.parse(value))) {\n return new Date(value).toLocaleString();\n }\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n return stringifyCellValue(value) || \"—\";\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../cn\";\nimport { CopyButtons } from \"./copy\";\nimport { MatrxUuidCell } from \"./MatrxUuidCell\";\nimport { isUuidValue } from \"./entity\";\nimport { formatTableDisplayValue } from \"./display-value\";\n\n/** No field is a door unless the caller says which token it points at. */\nconst noFieldToken = (): string | null => null;\n\nfunction formatValue(value: unknown): string {\n if (value == null) return \"—\";\n if (typeof value === \"string\") return value || \"—\";\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return value.toISOString();\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date)\n );\n}\n\n/**\n * Default detail / window View body for any row. Renders a scannable key/value\n * inspector. UUID-shaped values use MatrxUuidCell (short + copy). Every field\n * row gets hover-revealed Copy + Copy-for-AI buttons (set `fieldCopy={false}`\n * to opt out). Pass a custom `renderView` / `renderDetail` to replace it.\n */\nexport function DataRowInspector<T = unknown>({\n row,\n title,\n className,\n fieldCopy = true,\n recordKind = \"record\",\n recordLabel,\n location,\n tokenForField = noFieldToken,\n}: {\n row: T;\n title?: ReactNode;\n className?: string;\n /** Hover Copy + Copy-for-AI on every field row. Default true. */\n fieldCopy?: boolean;\n /** Stable slug for the record type, used in field agent payloads. */\n recordKind?: string;\n /** Human label for the record, used in toasts (\"Backlink · anchor_text\"). */\n recordLabel?: string;\n /** Where the user is, in words, for field agent payloads. */\n location?: string;\n /**\n * Maps one of this record's field names to the entity token its id points at,\n * turning that field into a door (route + peek).\n *\n * Defaults to NO doors, because this inspector renders arbitrary tables and a\n * wrong door opens a different record. A caller that has checked its FKs can\n * pass `tokenFromColumnName` (from `components/official/entity-ref/doors`) to\n * open every `<token>_id` field, or its own stricter map.\n */\n tokenForField?: (key: string, row: T) => string | null;\n}) {\n const entries = isPlainObject(row)\n ? Object.entries(row)\n : [[\"value\", row] as const];\n\n const fieldButtons = (key: string, value: unknown) =>\n fieldCopy ? (\n <div className=\"absolute right-1 top-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover/field:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={recordLabel ? `${recordLabel} · ${key}` : key}\n human={() => formatValue(value)}\n agent={() => ({\n kind: `${recordKind}-field`,\n location: location ?? \"Data row inspector\",\n description: `The \"${key}\" field of one ${recordLabel ?? recordKind}.`,\n data: { field: key, value, record: row },\n attributes: { field: key },\n })}\n />\n </div>\n ) : null;\n\n return (\n <div\n className={cn(\"flex h-full min-h-0 flex-col overflow-hidden\", className)}\n >\n {title ? (\n <div className=\"shrink-0 border-b border-border px-3 py-2 text-sm font-medium\">\n {title}\n </div>\n ) : null}\n <div className=\"min-h-0 flex-1 overflow-auto p-3\">\n <dl className=\"space-y-2\">\n {entries.map(([key, value]) => {\n if (isUuidValue(value)) {\n return (\n <div\n key={key}\n className=\"group/field relative grid grid-cols-[minmax(7rem,9rem)_1fr] gap-2 rounded-md border border-border/60 bg-muted/20 px-2.5 py-2\"\n >\n <dt className=\"truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {key}\n </dt>\n <dd className=\"min-w-0\">\n <MatrxUuidCell\n value={value}\n label={key}\n token={tokenForField(key, row)}\n />\n </dd>\n </div>\n );\n }\n\n const formatted = value !== null && typeof value === \"object\" && !(value instanceof Date)\n ? formatValue(value)\n : formatTableDisplayValue(value);\n const multiline = formatted.includes(\"\\n\") || formatted.length > 80;\n return (\n <div\n key={key}\n className=\"group/field relative grid grid-cols-[minmax(7rem,9rem)_1fr] gap-2 rounded-md border border-border/60 bg-muted/20 py-2 pl-2.5 pr-12\"\n >\n <dt className=\"truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {key}\n </dt>\n <dd\n className={cn(\n \"min-w-0 text-sm text-foreground break-words\",\n multiline &&\n \"whitespace-pre-wrap font-mono text-xs leading-relaxed\",\n )}\n >\n {formatted}\n </dd>\n {fieldButtons(key, value)}\n </div>\n );\n })}\n </dl>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","React","import_jsx_runtime","React","import_jsx_runtime","CONTEXT_SLOT","contextRegistry","React","import_jsx_runtime","CONTEXT_SLOT","contextRegistry","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_content_transfer","import_format","React","React","import_jsx_runtime","import_jsx_runtime","resolve","React","import_content_transfer","React","import_jsx_runtime","import_react","React","import_jsx_runtime","cn","import_jsx_runtime","cn","TapTargetButton","TapTargetButtonTransparent","TapTargetButtonSolid","TapTargetButtonDestructive","TapTargetButtonForGroup","import_jsx_runtime","Icon","label","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../../src/data-table/DataRowWindow.tsx","../../src/dialog.tsx","../../src/cn.ts","../../src/motion.ts","../../src/icons.tsx","../../src/portal-container.tsx","../../src/radix-dialog-modal-context.tsx","../../src/use-is-mobile.ts","../../src/layer-front.ts","../../src/data-table/default-host.tsx","../../src/data-table/icons.tsx","../../src/data-table/host.tsx","../../src/content-transfer/matrx-copy.tsx","../../src/content-transfer/email-review.tsx","../../src/button.tsx","../../src/content-transfer/index.tsx","../../src/popover.tsx","../../src/tap-target/tap-target-button.tsx","../../src/tooltip.tsx","../../src/tap-target/cn.ts","../../src/tap-target/link.ts","../../src/content-transfer/icon.ts","../../src/content-transfer/extensions.ts","../../src/data-table/copy.tsx","../../src/data-table/MatrxUuidCell.tsx","../../src/data-table/useTableNotice.tsx","../../src/data-table/entity.ts","../../src/data-table/filter-engine.ts","../../src/data-table/display-value.ts","../../src/data-table/DataRowInspector.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * DataRowWindow — generic WindowPanel for any table row.\n *\n * Uses WindowPanel's built-in sidebar for View / Edit tabs when an edit body\n * is provided. Page-local close via `onClose` (no overlay required) so custom\n * JSX never has to travel through Redux.\n */\n\nimport { useEffect, useState } from \"react\";\nimport { DefaultTableWindow } from \"./default-host\";\nimport { Eye, Pencil } from \"./icons\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport { cn } from \"../cn\";\nimport { DataRowInspector } from \"./DataRowInspector\";\n\nexport type DataRowWindowTab = \"view\" | \"edit\";\n\nexport interface DataRowWindowProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string | undefined;\n /** Serializable row for the default inspector. Ignored when viewContent set. */\n row?: unknown | undefined;\n /**\n * Full-body override (no tabs). Escape hatch — prefer viewContent +\n * editContent so the window stays editable.\n */\n children?: React.ReactNode | undefined;\n /** View tab body. Defaults to DataRowInspector. */\n viewContent?: React.ReactNode | undefined;\n /** Edit tab body. When set, View/Edit sidebar tabs are shown. */\n editContent?: React.ReactNode | undefined;\n /** Which tab to open. Default: \"edit\" when editContent exists, else \"view\". */\n defaultTab?: DataRowWindowTab | undefined;\n /** Right-side header actions (e.g. CopyButtons for the whole record). */\n headerActions?: React.ReactNode | undefined;\n width?: number | undefined;\n height?: number | undefined;\n windowId?: string | undefined;\n}\n\nexport function DataRowWindow({\n isOpen,\n onClose,\n title = \"Row details\",\n row,\n children,\n viewContent,\n editContent,\n defaultTab,\n headerActions,\n width = 720,\n height = 560,\n windowId = \"matrx-data-row-window\",\n}: DataRowWindowProps) {\n const host = useMatrxDataTableHost();\n const WindowPanel = host.WindowPanel ?? DefaultTableWindow;\n const hasEdit = editContent != null;\n const hasTabs = hasEdit && children == null;\n const initialTab: DataRowWindowTab =\n defaultTab ?? (hasEdit ? \"edit\" : \"view\");\n const [tab, setTab] = useState<DataRowWindowTab>(initialTab);\n\n // Reset tab when the window opens on a different row / edit availability.\n useEffect(() => {\n if (!isOpen) return;\n setTab(defaultTab ?? (hasEdit ? \"edit\" : \"view\"));\n }, [isOpen, windowId, hasEdit, defaultTab]);\n\n if (!isOpen) return null;\n\n const viewBody = viewContent ?? <DataRowInspector row={row} />;\n\n // Same contract as the side panel: `viewContent` / `editContent` are custom\n // bodies (usually the table's `detail.render`) that mostly do NOT own their\n // own scrolling, so `overflow-hidden` here cut them off at the fold. The\n // container owns the scroll; a body that already scrolls resolves to this\n // container's height and still shows a single scrollbar.\n const body = children ?? (\n <div className=\"flex h-full min-h-0 flex-1 flex-col overflow-hidden\">\n {hasTabs ? (\n tab === \"edit\" ? (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{editContent}</div>\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{viewBody}</div>\n )\n ) : (\n <div className=\"min-h-0 flex-1 overflow-y-auto\">{viewBody}</div>\n )}\n </div>\n );\n\n return (\n <WindowPanel\n id={windowId}\n title={title}\n onClose={onClose}\n width={width}\n height={height}\n minWidth={420}\n minHeight={320}\n actionsRight={headerActions}\n bodyClassName=\"flex min-h-0 flex-1 flex-col overflow-hidden p-0\"\n sidebarDefaultSize={140}\n sidebarMinSize={110}\n sidebar={\n hasTabs ? (\n <nav\n aria-label=\"Row window tabs\"\n className=\"flex h-full flex-col gap-0.5 overflow-y-auto p-1.5\"\n >\n <TabButton\n active={tab === \"view\"}\n icon={<Eye className=\"h-4 w-4 shrink-0\" />}\n label=\"View\"\n onClick={() => setTab(\"view\")}\n />\n <TabButton\n active={tab === \"edit\"}\n icon={<Pencil className=\"h-4 w-4 shrink-0\" />}\n label=\"Edit\"\n onClick={() => setTab(\"edit\")}\n />\n </nav>\n ) : undefined\n }\n >\n {body}\n </WindowPanel>\n );\n}\n\nfunction TabButton({\n active,\n icon,\n label,\n onClick,\n}: {\n active: boolean;\n icon: React.ReactNode;\n label: string;\n onClick: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"tab\"\n aria-selected={active}\n onClick={onClick}\n className={cn(\n \"flex items-center gap-2 rounded-md px-2.5 py-2 text-left text-sm transition-colors\",\n active\n ? \"bg-accent font-medium text-foreground\"\n : \"text-muted-foreground hover:bg-muted/60 hover:text-foreground\",\n )}\n >\n {icon}\n <span className=\"min-w-0 flex-1 truncate\">{label}</span>\n </button>\n );\n}\n","\"use client\";\n\n/**\n * Dialog — the modal surface, carrying every ruling the host forks paid for.\n *\n * Four hosts shipped four dialogs. Three were the stock shadcn body: a\n * fixed-size centered card with `overflow: visible`. matrx-frontend's had been\n * hardened, incident by incident, and those hardenings are the reason this\n * component belongs in the package rather than being copied a fifth time:\n *\n * 1. THE ROOT RENDERS UNCONDITIONALLY — no hydration mount gate. The gate a\n * wrapper once carried (\"Radix ids differ between SSR and client\") was\n * false — Radix ids come from React's SSR-stable `useId` — and it deleted\n * the always-visible Trigger from SSR and the first client paint.\n *\n * 2. THE DIALOG IS CLAMPED TO THE VIEWPORT AND SCROLLS INSIDE ITSELF. Proven\n * live: an admin \"Create Category\" dialog rendered 851px tall in a 657px\n * viewport with `overflow-y: visible`, so its Create button sat below the\n * fold, unreachable. The only way out was a backdrop click — which\n * dismisses WITHOUT writing, and is indistinguishable from a silent save\n * failure. `max-h-[85dvh] overflow-y-auto` is the cap.\n *\n * 3. THE PRIMARY ACTION IS ALWAYS PRESSABLE — AND NEVER ON TOP OF THE BODY.\n * `DialogFooter` is sticky and bleeds to the card's edges using\n * `--dialog-pad`. Until 0.11.3 that bleed was a NEGATIVE BLOCK MARGIN,\n * which sticky clamps: the footer was dragged up over the row above it by\n * `--dialog-pad` minus the card gap. The card now RESERVES the footer's\n * block size instead (`.matrx-dialog-card` in `styles.css` hands its bottom\n * padding to the footer), so scrolled content never shows through beneath\n * the actions AND the footer never covers the row above it. Outside a\n * DialogContent both variables are unset, the padding falls back to `0px`,\n * and the footer is the plain row it always was.\n *\n * 4. ON MOBILE THE SAME DIALOG IS A BOTTOM SHEET — full width, bottom\n * anchored, height-capped, internally scrollable, safe-area padded. Opt out\n * with `mobileSheet={false}` only for the rare surface that must stay\n * centered (a tiny spinner). The sheet geometry is re-asserted AFTER the\n * caller's className so a desktop `max-w-2xl` cannot un-fullscreen it.\n *\n * 5. AN UNTITLED DIALOG IS STILL ACCESSIBLE. Radix warns (correctly) that\n * every dialog needs a title; rather than let hosts ship the warning, a\n * visually-hidden title is injected when the tree has none, and\n * `aria-describedby` is dropped when there is no description rather than\n * pointing at nothing.\n *\n * 6. ON DESKTOP A DIALOG IS A WINDOW, NOT A WALL (0.38.0, Arman 2026-09-23:\n * \"none of the built-in page ai integrations are accessible because the\n * page is totally blocked\"). Unless the caller passes `modal`, a desktop\n * dialog does not block the page: no overlay, the page, the Agents menu,\n * the assist dock and right-click AI stay usable beside it. It behaves like\n * a window: a click outside never closes it (`dismissOnOutsideClick` opts a\n * quick picker back in), Escape closes it only while focus is inside it\n * (Escape in the page belongs to the page), and its `DialogHeader` drags\n * it, clamped on screen, double-click to recenter. On a phone it stays the\n * blocking bottom sheet — nothing useful sits behind a sheet. Confirmations\n * are `AlertDialog`, a different component, and stay blocking. This is a\n * LIGHT window: the host's heavy window manager (tray, persistence) is a\n * separate system and must not be pulled into every dialog.\n *\n * SEAM INVERSIONS. The host original resolved its portal target through\n * app-shaped hooks (a popped-out window-panel body). Here that is the\n * package's `PortalContainerProvider` seam, with an explicit `container` prop\n * keeping top priority. And DialogContent PROVIDES that seam to its own\n * children, so a Popover or menu opened inside a dialog portals INTO the\n * dialog — staying inside the scroll shard, where its wheel events work.\n * `useDialogContainer` exposes the same element for host code that needs it.\n */\n\nimport * as DialogPrimitive from \"@radix-ui/react-dialog\";\nimport * as VisuallyHidden from \"@radix-ui/react-visually-hidden\";\nimport { treeContainsComponent } from \"@ai-matrx/kit/react-tree\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport {\n MOTION_BOTTOM_SHEET,\n MOTION_DIALOG,\n MOTION_OVERLAY,\n} from \"./motion\";\nimport { XIcon } from \"./icons\";\nimport { usePortalContainer, PortalContainerProvider } from \"./portal-container\";\nimport {\n RadixDialogModalProvider,\n useRadixDialogModal,\n} from \"./radix-dialog-modal-context\";\nimport { useIsMobile } from \"./use-is-mobile\";\nimport { announceLayerFront, LAYER_FRONT_EVENT, type LayerFrontDetail } from \"./layer-front\";\n\n/**\n * True when the dialog is a window because the caller said nothing about\n * modality (rule 6), false when the caller passed `modal={false}` itself.\n * The two sit on different layers: a default window sits WITH the other\n * layers it was opened from (z-10000 — a dialog opened from a menu, a popover\n * or a host window must never appear behind its opener), while an explicit\n * `modal={false}` keeps the older coexistence contract below the host's window\n * manager (z-900).\n */\nconst DialogWindowedByDefaultContext = React.createContext(false);\n\nconst Dialog = ({\n children,\n ...props\n}: React.ComponentPropsWithoutRef<typeof DialogPrimitive.Root>) => {\n const isMobile = useIsMobile();\n // A window on desktop, a blocking sheet on a phone; `modal` forces either (rule 6).\n const modal = props.modal ?? isMobile;\n return (\n <DialogWindowedByDefaultContext.Provider value={props.modal === undefined}>\n <RadixDialogModalProvider modal={modal}>\n <DialogPrimitive.Root {...props} modal={modal}>\n {children}\n </DialogPrimitive.Root>\n </RadixDialogModalProvider>\n </DialogWindowedByDefaultContext.Provider>\n );\n};\nDialog.displayName = \"Dialog\";\n\nconst DialogTrigger = DialogPrimitive.Trigger;\nconst DialogClose = DialogPrimitive.Close;\n\n/**\n * Portal-seam-aware DialogPortal. An explicit `container` always wins; with\n * none, the injected `PortalContainerProvider` value decides; with neither,\n * Radix's `document.body`.\n */\nconst DialogPortal = ({\n container,\n ...props\n}: Omit<\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Portal>,\n \"container\"\n> & {\n /** `undefined` → use the injected container; `null` → force document.body. */\n container?: HTMLElement | null | undefined;\n}) => {\n const resolved = usePortalContainer(container);\n return <DialogPrimitive.Portal container={resolved ?? null} {...props} />;\n};\nDialogPortal.displayName = \"DialogPortal\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.dialog-container-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<HTMLElement | null> };\nconst DialogContainerContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<HTMLElement | null>(null);\n\n/** The DialogContent element, for host code that portals into the dialog. */\nexport const useDialogContainer = (): HTMLElement | null =>\n React.useContext(DialogContainerContext);\n\nconst DialogOverlay = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Overlay>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Overlay>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Overlay\n ref={ref}\n data-slot=\"dialog-overlay\"\n className={cn(\n // Page context behind the modal stays readable; separation comes from a\n // light token scrim, not a blur.\n \"fixed inset-0 z-[10000] bg-[var(--matrx-overlay-scrim-soft)]\",\n MOTION_OVERLAY,\n className,\n )}\n {...props}\n />\n));\nDialogOverlay.displayName = DialogPrimitive.Overlay.displayName;\n\n/**\n * Unstyled, non-portalling Content for custom dialog layouts. Preserves Radix\n * focus/background behavior and derives `aria-modal` from the Root.\n */\nconst DialogContentPrimitive = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content>\n>((props, ref) => {\n const isModal = useRadixDialogModal();\n return (\n <DialogPrimitive.Content\n {...props}\n ref={ref}\n aria-modal={isModal || undefined}\n />\n );\n});\nDialogContentPrimitive.displayName = \"DialogContentPrimitive\";\n\nconst DIALOG_DESKTOP_CLASSES =\n \"matrx-dialog-card fixed inset-0 z-[10000] m-auto grid h-fit min-w-0 w-full max-w-lg gap-4 max-h-[85dvh] overflow-y-auto overscroll-contain [--dialog-pad:1.5rem] overflow-x-clip border bg-background p-6 shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full sm:rounded-lg\";\n\nconst DIALOG_MOBILE_SHEET_CLASSES =\n \"matrx-mobile-sheet matrx-dialog-card fixed inset-x-0 bottom-0 left-0 right-0 top-auto z-[10000] flex min-w-0 flex-col w-full max-w-full max-h-[90dvh] gap-4 [--dialog-pad:1rem] overflow-x-clip border-t bg-background p-4 pb-safe shadow-lg [overflow-wrap:anywhere] [&>*]:min-w-0 [&>*]:max-w-full rounded-t-2xl rounded-b-none overflow-y-auto overscroll-contain\";\n\n// Re-asserted LAST so sheet geometry always wins over a caller className.\nconst DIALOG_MOBILE_SHEET_OVERRIDE =\n \"inset-x-0 bottom-0 left-0 right-0 top-auto translate-none w-full max-w-full max-h-[90dvh] rounded-b-none rounded-t-2xl overflow-y-auto\";\n\n/** Drag props the windowed DialogContent hands its DialogHeader (rule 6). */\ntype DialogWindowHandle = {\n onPointerDown: (event: React.PointerEvent<HTMLElement>) => void;\n onPointerMove: (event: React.PointerEvent<HTMLElement>) => void;\n onPointerUp: (event: React.PointerEvent<HTMLElement>) => void;\n onPointerCancel: (event: React.PointerEvent<HTMLElement>) => void;\n onDoubleClick: () => void;\n};\nconst DialogWindowHandleContext = React.createContext<DialogWindowHandle | null>(null);\n\n/** Pixels of a dragged window that must stay on screen. */\nconst WINDOW_KEEP_VISIBLE = 80;\n\nfunction isInteractiveTarget(target: EventTarget | null): boolean {\n return (\n target instanceof Element &&\n Boolean(target.closest(\"button, a, input, textarea, select, [role='button'], [contenteditable='true']\"))\n );\n}\n\nexport interface DialogContentProps\n extends React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> {\n /**\n * Windowed (non-blocking) dialogs never close from a click outside them —\n * the person is reaching for the page or an AI control beside the window.\n * Pass `true` for a quick picker that should close when the person clicks\n * away. Ignored on a blocking dialog, which keeps Radix's behaviour.\n */\n dismissOnOutsideClick?: boolean;\n /** Render as a bottom sheet below the mobile breakpoint. Default `true`. */\n mobileSheet?: boolean;\n /** Render the built-in close control. Default `true`. */\n showCloseButton?: boolean;\n /** Explicit portal target; wins over the injected container. */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst DialogContent = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Content>,\n DialogContentProps\n>(\n (\n {\n className,\n children,\n mobileSheet = true,\n animated = true,\n showCloseButton = true,\n container,\n dismissOnOutsideClick = false,\n onInteractOutside,\n onEscapeKeyDown,\n onPointerDownCapture,\n onFocusCapture,\n style,\n ...props\n },\n ref,\n ) => {\n const isMobile = useIsMobile();\n const isModal = useRadixDialogModal();\n // Falls through to the injected container while `containerEl` is unset\n // (pre-mount) — the original's dialog > popout > body priority.\n const injectedContainer = usePortalContainer(container);\n const asSheet = mobileSheet && isMobile;\n const windowed = !isModal && !asSheet;\n const windowedByDefault = React.useContext(DialogWindowedByDefaultContext);\n const [containerEl, setContainerEl] = React.useState<HTMLElement | null>(\n null,\n );\n\n // ── the front-most layer (layer-front.ts) ───────────────────────────────\n // A default window sits at z-10000 with the layers it was opened from; it\n // steps behind when another layer comes to the front after it (a host\n // window opened from the Agents menu) and returns when the person reaches\n // for it again. An explicit modal={false} keeps its fixed z-900 contract.\n const stacks = windowed && windowedByDefault;\n const [behind, setBehind] = React.useState(false);\n React.useEffect(() => {\n if (!stacks || !containerEl) return;\n const onFront = (event: Event) => {\n const element = (event as CustomEvent<LayerFrontDetail>).detail?.element ?? null;\n if (element && (element === containerEl || containerEl.contains(element))) return;\n setBehind(true);\n };\n document.addEventListener(LAYER_FRONT_EVENT, onFront);\n // Opening is coming to the front.\n announceLayerFront(containerEl);\n return () => document.removeEventListener(LAYER_FRONT_EVENT, onFront);\n }, [stacks, containerEl]);\n const bringToFront = () => {\n if (!stacks || !containerEl) return;\n setBehind(false);\n announceLayerFront(containerEl);\n };\n\n // ── rule 6: the windowed dialog drags by its header ──────────────────────\n const [offset, setOffset] = React.useState({ x: 0, y: 0 });\n const dragRef = React.useRef<{ x: number; y: number; baseX: number; baseY: number } | null>(null);\n const handle = React.useMemo<DialogWindowHandle | null>(() => {\n if (!windowed) return null;\n const clamp = (value: number, limit: number) => Math.max(-limit, Math.min(limit, value));\n return {\n onPointerDown: (event) => {\n if (event.button !== 0 || isInteractiveTarget(event.target)) return;\n dragRef.current = { x: event.clientX, y: event.clientY, baseX: offset.x, baseY: offset.y };\n event.currentTarget.setPointerCapture?.(event.pointerId);\n },\n onPointerMove: (event) => {\n const start = dragRef.current;\n if (!start) return;\n setOffset({\n x: clamp(start.baseX + event.clientX - start.x, window.innerWidth / 2 - WINDOW_KEEP_VISIBLE / 2),\n y: clamp(start.baseY + event.clientY - start.y, window.innerHeight / 2 - WINDOW_KEEP_VISIBLE / 2),\n });\n },\n onPointerUp: (event) => {\n if (!dragRef.current) return;\n dragRef.current = null;\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n },\n onPointerCancel: () => {\n dragRef.current = null;\n },\n onDoubleClick: () => setOffset({ x: 0, y: 0 }),\n };\n }, [windowed, offset.x, offset.y]);\n\n const mergedRef = React.useCallback(\n (node: HTMLDivElement | null) => {\n setContainerEl(node);\n if (typeof ref === \"function\") ref(node);\n else if (ref)\n (ref as React.MutableRefObject<HTMLDivElement | null>).current = node;\n },\n [ref],\n );\n\n const hasTitle =\n treeContainsComponent(children, DialogTitle) ||\n treeContainsComponent(children, DialogPrimitive.Title);\n const hasDescription =\n treeContainsComponent(children, DialogDescription) ||\n treeContainsComponent(children, DialogPrimitive.Description);\n\n return (\n <DialogPortal container={container}>\n {isModal ? <DialogOverlay /> : null}\n <DialogContentPrimitive\n ref={mergedRef}\n data-slot=\"dialog-content\"\n className={cn(\n asSheet ? DIALOG_MOBILE_SHEET_CLASSES : DIALOG_DESKTOP_CLASSES,\n animated && (asSheet ? MOTION_BOTTOM_SHEET : MOTION_DIALOG),\n className,\n asSheet && DIALOG_MOBILE_SHEET_OVERRIDE,\n // A non-modal dialog is the coexistence contract for content that\n // can sit beside a host's floating window manager (which starts at\n // z=1000); staying below that boundary makes a newly focused window\n // usable without coupling the two systems.\n !isModal && !windowedByDefault && \"z-[900]\",\n // Another layer came to the front after this window (layer-front.ts).\n stacks && behind && \"z-[999]\",\n // Without an overlay the card needs its own separation from the page.\n windowed && \"shadow-2xl ring-1 ring-border/60\",\n )}\n style={\n windowed && (offset.x !== 0 || offset.y !== 0)\n ? { ...style, translate: `${offset.x}px ${offset.y}px` }\n : style\n }\n onPointerDownCapture={(event) => {\n onPointerDownCapture?.(event);\n if (behind) bringToFront();\n }}\n onFocusCapture={(event) => {\n onFocusCapture?.(event);\n if (behind) bringToFront();\n }}\n onInteractOutside={(event) => {\n onInteractOutside?.(event);\n if (windowed && !dismissOnOutsideClick) event.preventDefault();\n }}\n onEscapeKeyDown={(event) => {\n onEscapeKeyDown?.(event);\n // Escape pressed in the page belongs to the page (a grid cancelling\n // an edit), not to the window beside it.\n // The key's own target is where the person pressed it; focus is\n // the fallback when the event carries no element target.\n const pressedIn =\n event.target instanceof Node && event.target !== document.body\n ? event.target\n : document.activeElement;\n if (windowed && containerEl && !(pressedIn && containerEl.contains(pressedIn))) {\n event.preventDefault();\n }\n }}\n {...(hasDescription ? {} : { \"aria-describedby\": undefined })}\n {...props}\n >\n {hasTitle ? null : (\n <VisuallyHidden.Root>\n <DialogPrimitive.Title>Dialog</DialogPrimitive.Title>\n </VisuallyHidden.Root>\n )}\n <DialogContainerContext.Provider value={containerEl}>\n <DialogWindowHandleContext.Provider value={handle}>\n <PortalContainerProvider\n container={containerEl ?? injectedContainer ?? null}\n >\n {children}\n </PortalContainerProvider>\n </DialogWindowHandleContext.Provider>\n </DialogContainerContext.Provider>\n {showCloseButton ? (\n <DialogPrimitive.Close\n data-slot=\"dialog-close\"\n aria-label=\"Close\"\n className=\"absolute right-2 top-4 flex h-11 w-11 items-center justify-center rounded-sm opacity-70 ring-offset-background transition-opacity hover:opacity-100 focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2 disabled:pointer-events-none data-[state=open]:bg-accent data-[state=open]:text-muted-foreground sm:right-4 lg:h-10 lg:w-10\"\n >\n <XIcon className=\"h-4 w-4\" />\n <span className=\"sr-only\">Close</span>\n </DialogPrimitive.Close>\n ) : null}\n </DialogContentPrimitive>\n </DialogPortal>\n );\n },\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nconst DialogHeader = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => {\n // In a windowed dialog the header is the drag handle (rule 6).\n const handle = React.useContext(DialogWindowHandleContext);\n return (\n <div\n data-slot=\"dialog-header\"\n {...(handle\n ? {\n ...handle,\n \"data-window-handle\": \"\",\n title: \"Drag to move · double-click to recenter\",\n }\n : {})}\n className={cn(\n // DialogContent owns an absolute close control. Reserve its hit area in\n // every header so trailing actions never render underneath it.\n \"flex flex-col space-y-1.5 pr-12 text-center sm:text-left\",\n handle && \"cursor-grab select-none active:cursor-grabbing\",\n className,\n )}\n {...props}\n />\n );\n};\nDialogHeader.displayName = \"DialogHeader\";\n\nconst DialogFooter = ({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) => (\n <div\n data-slot=\"dialog-footer\"\n className={cn(\n \"flex flex-col-reverse sm:flex-row sm:justify-end sm:space-x-2\",\n // Ruling 3/4 — sticky to the card edges so a scrolled body never shows\n // through under the actions, and safe-area padded on a phone.\n //\n // 🚨 THERE IS NO `mb-[…]` HERE, AND THERE MUST NEVER BE ONE AGAIN\n // (0.11.3, feedback bf8fb00b). The bleed over the card's bottom padding\n // used to be a NEGATIVE BLOCK MARGIN, which makes this box taller than\n // the grid area the card allocates it — and `position: sticky` CLAMPS a\n // box to its containing block, so the browser yanked the footer UP by\n // `--dialog-pad` against the card's `gap-4` and painted 8px of opaque\n // footer over the last line of the consequence, at every length. The\n // card now RESERVES this footer's block size instead (`matrx-dialog-card`\n // in styles.css hands over its `padding-bottom`), so the bleed costs no\n // margin at all. Guard: `sticky-footer-geometry.test.tsx`.\n //\n // These stay UTILITIES rather than a shipped rule so a caller's\n // `className` still wins through tailwind-merge — a shipped rule would\n // have to be unlayered to survive Tailwind preflight (§ THE PREFLIGHT\n // RULE in styles.css) and would then override every caller's padding.\n \"sticky bottom-0 z-10 bg-background pt-3\",\n \"mx-[calc(var(--dialog-pad,0px)*-1)] px-[var(--dialog-pad,0px)] pb-[var(--dialog-pad,0px)]\",\n className,\n )}\n {...props}\n />\n);\nDialogFooter.displayName = \"DialogFooter\";\n\nconst DialogTitle = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n data-slot=\"dialog-title\"\n className={cn(\"text-lg font-semibold leading-none tracking-tight\", className)}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ComponentRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n data-slot=\"dialog-description\"\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nexport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogContentPrimitive,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogOverlay,\n DialogPortal,\n DialogTitle,\n DialogTrigger,\n};\n","import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\nexport function cn(...inputs: ClassValue[]): string {\n return twMerge(clsx(inputs));\n}\n","/**\n * THE MOTION CONTRACT (0.10.0) — the class names every animated surface in\n * this package puts on the DOM, in ONE place.\n *\n * Why a module and not ten inline strings: the sweep that produced this file\n * found the same defect ten times over, and it was invisible each time\n * because each primitive spelled its animation out by hand. Ten hand-written\n * copies of `data-[state=open]:animate-in data-[state=closed]:animate-out\n * data-[state=closed]:fade-out-0 …` meant ten chances to reach for a utility\n * nothing in the package defines — which is exactly what happened. A single\n * exported constant per motion SHAPE means the next primitive cannot invent\n * an eleventh spelling, and `styles.test.ts` can prove every one of them\n * resolves to a rule in the shipped stylesheet.\n *\n * Every rule these name lives in `styles.css` under the package's own\n * keyframes. NONE of them is a Tailwind utility, and none requires a host\n * plugin — see that file's header for the measurement that made this\n * necessary.\n */\n\n/** Modal scrims: Dialog, AlertDialog, Sheet, CommandDialog. Fade only. */\nexport const MOTION_OVERLAY = \"matrx-motion-overlay\";\n\n/** The centred dialog card. Fades and scales; centring is not its business. */\nexport const MOTION_DIALOG = \"matrx-motion-dialog\";\n\n/**\n * THE CENTRING OF A CENTRED DIALOG CARD — package-owned, in the `translate`\n * property, and NEVER a Tailwind `translate-x-[-50%] translate-y-[-50%]` pair.\n *\n * Those utilities do not compile to the same thing in every host: Tailwind v3\n * writes them into `transform`, Tailwind v4 writes them into the independent\n * `translate` property, which COMPOSES with `transform` instead of being\n * replaced by it. 0.10.0's keyframes restated the centring inside `transform`,\n * which was harmless on v3 and doubled the centring on v4 — the card flew in\n * from off the top-left of the viewport for the animation's whole duration and\n * snapped into place at the end (fixed in 0.10.1).\n *\n * Owning it here means one spelling that reads the same on both, and it frees\n * `transform` so the keyframes carry ONLY the delta. Put this on every centred\n * surface UNCONDITIONALLY — it is geometry, so unlike {@link MOTION_DIALOG} it\n * must survive `animated={false}`. Its rule ships in `styles.css`.\n */\nexport const CENTERED_DIALOG = \"matrx-dialog-centered\";\n\n/**\n * The resting gap between a `popper`-positioned surface and its trigger, for\n * the primitives that want one (today: `Select`). Same law and same reason as\n * {@link CENTERED_DIALOG} — a position an animated surface holds AT REST is\n * the `translate` property's job, never a Tailwind translate utility, because\n * those land in `transform` on a v3 host and in `translate` on a v4 one while\n * the keyframes animate `transform` either way. Sizes from\n * `--matrx-popper-offset`; keys off Radix's `data-side`.\n */\nexport const POPPER_OFFSET = \"matrx-popper-offset\";\n\n/** The mobile Dialog / CommandDialog bottom sheet. Slides up and fades. */\nexport const MOTION_BOTTOM_SHEET = \"matrx-motion-bottom-sheet\";\n\n/**\n * Radix-popper surfaces: Popover, DropdownMenu, ContextMenu, HoverCard,\n * Select, Tooltip. Reads `--radix-popper-transform-origin` so the surface\n * grows out of its trigger, and `data-side` so it travels from it.\n */\nexport const MOTION_POPPER = \"matrx-motion-popper\";\n\n/** Edge sheets, one class per `sheetVariants` side. */\nexport const MOTION_SHEET = {\n top: \"matrx-motion-sheet-top\",\n bottom: \"matrx-motion-sheet-bottom\",\n left: \"matrx-motion-sheet-left\",\n right: \"matrx-motion-sheet-right\",\n center: \"matrx-motion-sheet-center\",\n} as const;\n\n/** Skeleton's breathing loop. */\nexport const MOTION_PULSE = \"matrx-pulse\";\n\n/** The spinner loop, for every inline busy indicator in the package. */\nexport const MOTION_SPIN = \"matrx-spin\";\n\n/**\n * Every motion class the package ships, for the guards. If a rule for one of\n * these is missing from `styles.css`, a component animates in no consumer and\n * says nothing about it — the C26 failure this list exists to make loud.\n */\nexport const ALL_MOTION_CLASSES = [\n MOTION_OVERLAY,\n MOTION_DIALOG,\n MOTION_BOTTOM_SHEET,\n MOTION_POPPER,\n ...Object.values(MOTION_SHEET),\n MOTION_PULSE,\n MOTION_SPIN,\n] as const;\n\n/**\n * The host-plugin utilities this package is forbidden to emit. They are\n * supplied by `tailwindcss-animate` / `tw-animate-css`, which is a HOST CSS\n * entry concern a package cannot declare a dependency on: three of the four\n * AI Matrx consumers never loaded it, so every surface wearing these appeared\n * with no animation and no error. `styles.test.ts` fails the build if one\n * comes back.\n */\nexport const FORBIDDEN_HOST_MOTION_UTILITIES = [\n \"animate-in\",\n \"animate-out\",\n \"fade-in\",\n \"fade-out\",\n \"zoom-in\",\n \"zoom-out\",\n \"slide-in-from\",\n \"slide-out-to\",\n \"animate-accordion\",\n \"animate-slide-down\",\n \"animate-slide-up\",\n \"animate-pulse\",\n \"animate-spin\",\n] as const;\n","/**\n * Internal inlined SVG icons (policy C19: no icon-library dependency, ever).\n *\n * Each icon is copied from the exact glyph the ported originals rendered:\n * lucide-react's Loader2 / ChevronLeft / ChevronRight / MoreHorizontal and\n * @radix-ui/react-icons' Cross2Icon. Same viewBoxes, same paths, same default\n * stroke geometry — a host swapping the import sees pixel-identical output.\n *\n * Not exported from the package entry; components consume them directly.\n */\n\nimport * as React from \"react\";\n\ntype IconProps = React.SVGAttributes<SVGSVGElement>;\n\nfunction lucideProps(props: IconProps): React.SVGAttributes<SVGSVGElement> {\n return {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\",\n \"aria-hidden\": true,\n ...props,\n };\n}\n\n/**\n * lucide `loader-2` — the spinner glyph. Callers add `matrx-spin`.\n * Never a resting icon: at rest this incomplete arc reads as a broken\n * half-circle. Refresh controls use arrows, then swap to this only while busy.\n */\nexport function Loader2Icon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />\n </svg>\n );\n}\n\n/** lucide `chevron-left`. */\nexport function ChevronLeftIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m15 18-6-6 6-6\" />\n </svg>\n );\n}\n\n/** lucide `chevron-right`. */\nexport function ChevronRightIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n}\n\n/** lucide `chevron-down` — the disclosure's open glyph. */\nexport function ChevronDownIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\n/** lucide `archive` — the archived-rows glyph (ArchivedDisclosure). */\nexport function ArchiveIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <rect width=\"20\" height=\"5\" x=\"2\" y=\"3\" rx=\"1\" />\n <path d=\"M4 8v11a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8\" />\n <path d=\"M10 12h4\" />\n </svg>\n );\n}\n\n/** lucide `more-horizontal` — the kebab/ellipsis glyph. */\nexport function MoreHorizontalIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <circle cx=\"12\" cy=\"12\" r=\"1\" />\n <circle cx=\"19\" cy=\"12\" r=\"1\" />\n <circle cx=\"5\" cy=\"12\" r=\"1\" />\n </svg>\n );\n}\n\n/** lucide `check` — the selected-row tick (CreatablePicker). */\nexport function LucideCheckIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n\n/** lucide `chevrons-up-down` — the combobox trigger glyph. */\nexport function ChevronsUpDownIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"m7 15 5 5 5-5\" />\n <path d=\"m7 9 5-5 5 5\" />\n </svg>\n );\n}\n\n/** lucide `external-link` — the manage-in-new-tab glyph. */\nexport function ExternalLinkIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M15 3h6v6\" />\n <path d=\"M10 14 21 3\" />\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n </svg>\n );\n}\n\n/** lucide `lock` — the platform-governed vocabulary glyph. */\nexport function LockIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <rect width=\"18\" height=\"11\" x=\"3\" y=\"11\" rx=\"2\" ry=\"2\" />\n <path d=\"M7 11V7a5 5 0 0 1 10 0v4\" />\n </svg>\n );\n}\n\n/** lucide `plus` — the create/add glyph. */\nexport function PlusIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n );\n}\n\n/** lucide `x` — the dialog close glyph (host dialog module used lucide X). */\nexport function XIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons components default to width/height 15 — the bare\n * `<ChevronUpIcon />` renders in Select's scroll buttons rely on it.\n */\nfunction radixProps(props: IconProps): React.SVGAttributes<SVGSVGElement> {\n return {\n xmlns: \"http://www.w3.org/2000/svg\",\n viewBox: \"0 0 15 15\",\n width: 15,\n height: 15,\n fill: \"none\",\n \"aria-hidden\": true,\n ...props,\n };\n}\n\n/** @radix-ui/react-icons `MagnifyingGlassIcon` — the command search glyph. */\nexport function MagnifyingGlassIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M10 6.5C10 8.433 8.433 10 6.5 10C4.567 10 3 8.433 3 6.5C3 4.567 4.567 3 6.5 3C8.433 3 10 4.567 10 6.5ZM9.30884 10.0159C8.53901 10.6318 7.56251 11 6.5 11C4.01472 11 2 8.98528 2 6.5C2 4.01472 4.01472 2 6.5 2C8.98528 2 11 4.01472 11 6.5C11 7.56251 10.6318 8.53901 10.0159 9.30884L12.8536 12.1464C13.0488 12.3417 13.0488 12.6583 12.8536 12.8536C12.6583 13.0488 12.3417 13.0488 12.1464 12.8536L9.30884 10.0159Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `CheckIcon` — the select item indicator glyph. */\nexport function CheckIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M11.4669 3.72684C11.7558 3.91574 11.8369 4.30308 11.648 4.59198L7.39799 11.092C7.29783 11.2452 7.13556 11.3467 6.95402 11.3699C6.77247 11.3931 6.58989 11.3355 6.45446 11.2124L3.70446 8.71241C3.44905 8.48022 3.43023 8.08494 3.66242 7.82953C3.89461 7.57412 4.28989 7.55529 4.5453 7.78749L6.75292 9.79441L10.6018 3.90792C10.7907 3.61902 11.178 3.53795 11.4669 3.72684Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons `DividerHorizontalIcon` — the INDETERMINATE checkbox\n * glyph. Radix renders the indicator for both `true` and `\"indeterminate\"`, so\n * a half-selected \"select all\" that shows a full check states something false;\n * the two states get different glyphs on purpose.\n */\nexport function DividerHorizontalIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M2 7.5C2 7.22386 2.22386 7 2.5 7H12.5C12.7761 7 13 7.22386 13 7.5C13 7.77614 12.7761 8 12.5 8H2.5C2.22386 8 2 7.77614 2 7.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `DotFilledIcon` — the menu radio-item indicator. */\nexport function DotFilledIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M9.875 7.5C9.875 8.81168 8.81168 9.875 7.5 9.875C6.18832 9.875 5.125 8.81168 5.125 7.5C5.125 6.18832 6.18832 5.125 7.5 5.125C8.81168 5.125 9.875 6.18832 9.875 7.5Z\"\n fill=\"currentColor\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronRightIcon` — the submenu-trigger glyph. */\nexport function RadixChevronRightIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M6.1584 3.13508C6.35985 2.94621 6.67627 2.95642 6.86514 3.15788L10.6151 7.15788C10.7954 7.3502 10.7954 7.64949 10.6151 7.84182L6.86514 11.8418C6.67627 12.0433 6.35985 12.0535 6.1584 11.8646C5.95694 11.6757 5.94673 11.3593 6.1356 11.1579L9.565 7.49985L6.1356 3.84182C5.94673 3.64036 5.95694 3.32394 6.1584 3.13508Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronDownIcon` — the select trigger/scroll glyph. */\nexport function RadixChevronDownIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M3.13523 6.15803C3.3241 5.95657 3.64052 5.94637 3.84197 6.13523L7.5 9.56464L11.158 6.13523C11.3595 5.94637 11.6759 5.95657 11.8648 6.15803C12.0536 6.35949 12.0434 6.67591 11.842 6.86477L7.84197 10.6148C7.64964 10.7951 7.35036 10.7951 7.15803 10.6148L3.15803 6.86477C2.95657 6.67591 2.94637 6.35949 3.13523 6.15803Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `ChevronUpIcon` — the select scroll-up glyph. */\nexport function RadixChevronUpIcon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M3.13523 8.84197C3.3241 9.04343 3.64052 9.05363 3.84197 8.86477L7.5 5.43536L11.158 8.86477C11.3595 9.05363 11.6759 9.04343 11.8648 8.84197C12.0536 8.64051 12.0434 8.32409 11.842 8.13523L7.84197 4.38523C7.64964 4.20492 7.35036 4.20492 7.15803 4.38523L3.15803 8.13523C2.95657 8.32409 2.94637 8.64051 3.13523 8.84197Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** @radix-ui/react-icons `Cross2Icon` — the dialog/sheet close glyph. */\nexport function Cross2Icon(props: IconProps) {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 15 15\"\n fill=\"none\"\n aria-hidden\n {...props}\n >\n <path\n d=\"M11.7816 4.03157C12.0062 3.80702 12.0062 3.44295 11.7816 3.2184C11.5571 2.99385 11.193 2.99385 10.9685 3.2184L7.50005 6.68682L4.03164 3.2184C3.80708 2.99385 3.44301 2.99385 3.21846 3.2184C2.99391 3.44295 2.99391 3.80702 3.21846 4.03157L6.68688 7.49999L3.21846 10.9684C2.99391 11.193 2.99391 11.557 3.21846 11.7816C3.44301 12.0061 3.80708 12.0061 4.03164 11.7816L7.50005 8.31316L10.9685 11.7816C11.193 12.0061 11.5571 12.0061 11.7816 11.7816C12.0062 11.557 12.0062 11.193 11.7816 10.9684L8.31322 7.49999L11.7816 4.03157Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/**\n * @radix-ui/react-icons `DragHandleDots2Icon` — the grip on `ResizableHandle`.\n * Inlined per C19: this package depends on no icon library.\n */\nexport function DragHandleDots2Icon(props: IconProps) {\n return (\n <svg {...radixProps(props)}>\n <path\n d=\"M4.5 2.5C5.05228 2.5 5.5 2.05228 5.5 1.5C5.5 0.947715 5.05228 0.5 4.5 0.5C3.94772 0.5 3.5 0.947715 3.5 1.5C3.5 2.05228 3.94772 2.5 4.5 2.5ZM4.5 6.5C5.05228 6.5 5.5 6.05229 5.5 5.5C5.5 4.94771 5.05228 4.5 4.5 4.5C3.94772 4.5 3.5 4.94771 3.5 5.5C3.5 6.05229 3.94772 6.5 4.5 6.5ZM5.5 9.5C5.5 10.0523 5.05228 10.5 4.5 10.5C3.94772 10.5 3.5 10.0523 3.5 9.5C3.5 8.94771 3.94772 8.5 4.5 8.5C5.05228 8.5 5.5 8.94771 5.5 9.5ZM4.5 14.5C5.05228 14.5 5.5 14.0523 5.5 13.5C5.5 12.9477 5.05228 12.5 4.5 12.5C3.94772 12.5 3.5 12.9477 3.5 13.5C3.5 14.0523 3.94772 14.5 4.5 14.5ZM11.5 1.5C11.5 2.05228 11.0523 2.5 10.5 2.5C9.94771 2.5 9.5 2.05228 9.5 1.5C9.5 0.947715 9.94771 0.5 10.5 0.5C11.0523 0.5 11.5 0.947715 11.5 1.5ZM10.5 6.5C11.0523 6.5 11.5 6.05229 11.5 5.5C11.5 4.94771 11.0523 4.5 10.5 4.5C9.94771 4.5 9.5 4.94771 9.5 5.5C9.5 6.05229 9.94771 6.5 10.5 6.5ZM11.5 9.5C11.5 10.0523 11.0523 10.5 10.5 10.5C9.94771 10.5 9.5 10.0523 9.5 9.5C9.5 8.94771 9.94771 8.5 10.5 8.5C11.0523 8.5 11.5 8.94771 11.5 9.5ZM10.5 14.5C11.0523 14.5 11.5 14.0523 11.5 13.5C11.5 12.9477 11.0523 12.5 10.5 12.5C9.94771 12.5 9.5 12.9477 9.5 13.5C9.5 14.0523 9.94771 14.5 10.5 14.5Z\"\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n clipRule=\"evenodd\"\n />\n </svg>\n );\n}\n\n/** lucide `star` — the default-organization badge (OrganizationPicker). */\nexport function StarIcon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z\" />\n </svg>\n );\n}\n\n/** lucide `building-2` — the organization glyph (OrganizationPicker trigger). */\nexport function Building2Icon(props: IconProps) {\n return (\n <svg {...lucideProps(props)}>\n <path d=\"M6 22V4a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v18Z\" />\n <path d=\"M6 12H4a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2\" />\n <path d=\"M18 9h2a2 2 0 0 1 2 2v9a2 2 0 0 1-2 2h-2\" />\n <path d=\"M10 6h4\" />\n <path d=\"M10 10h4\" />\n <path d=\"M10 14h4\" />\n <path d=\"M10 18h4\" />\n </svg>\n );\n}\n","\"use client\";\n\n/**\n * Injected portal-container seam.\n *\n * The matrx-frontend original resolved nested portal targets through\n * `useNestedPortalContainer` (explicit prop > dialog content > popout body >\n * document.body) — a host-shaped hook wired to that app's dialog and\n * window-panel systems. The package inverts the seam: hosts provide the\n * resolved container through `PortalContainerProvider`; an explicit\n * `container` prop on a component still wins, and with neither the portal\n * falls through to `document.body` (Radix default). Priority semantics are\n * unchanged from the original.\n */\n\nimport * as React from \"react\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.portal-container-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<HTMLElement | null | undefined> };\nconst PortalContainerContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<HTMLElement | null | undefined>(undefined);\n\nexport interface PortalContainerProviderProps {\n /** Where nested Radix portals (Popover, etc.) should mount. `null`/`undefined` → document.body. */\n container: HTMLElement | null | undefined;\n children: React.ReactNode;\n}\n\nexport function PortalContainerProvider({\n container,\n children,\n}: PortalContainerProviderProps) {\n return (\n <PortalContainerContext.Provider value={container ?? undefined}>\n {children}\n </PortalContainerContext.Provider>\n );\n}\n\n/**\n * Resolve a portal target: explicit prop (including an explicit `null`,\n * meaning \"the default body\") beats the injected container.\n */\nexport function usePortalContainer(\n explicit?: HTMLElement | null,\n): HTMLElement | undefined {\n const injected = React.useContext(PortalContainerContext);\n\n if (explicit !== undefined) {\n return explicit ?? undefined;\n }\n\n return injected ?? undefined;\n}\n","\"use client\";\n\n/**\n * Ported verbatim from matrx-frontend `components/ui/radix-dialog-modal-context.tsx`.\n * Shared by the Sheet and BottomSheet families (and available to hosts that\n * compose their own Radix Dialog-derived wrappers around these primitives).\n */\n\nimport * as React from \"react\";\n\n// Shared identity across independently bundled public entrypoints/loaders.\nconst CONTEXT_SLOT = Symbol.for(\"ai-matrx.design-system.dialog-modal-context\");\nconst contextRegistry = globalThis as typeof globalThis & { [CONTEXT_SLOT]?: React.Context<boolean> };\nconst RadixDialogModalContext = contextRegistry[CONTEXT_SLOT] ??= React.createContext<boolean>(true);\n\nexport interface RadixDialogModalProviderProps {\n children: React.ReactNode;\n modal: boolean;\n}\n\n/**\n * Keeps our Radix-based content wrappers aligned with the owning Root's\n * modality so ARIA semantics cannot drift from focus/pointer behavior.\n */\nexport function RadixDialogModalProvider({\n children,\n modal,\n}: RadixDialogModalProviderProps) {\n return (\n <RadixDialogModalContext.Provider value={modal}>\n {children}\n </RadixDialogModalContext.Provider>\n );\n}\n\n/** Returns whether the nearest Radix Dialog-derived root is modal. */\nexport function useRadixDialogModal(): boolean {\n return React.useContext(RadixDialogModalContext);\n}\n","\"use client\";\n\n/**\n * useIsMobile — the ONE breakpoint hook the package's responsive primitives\n * read (CommandDialog and Dialog both auto-render as a bottom sheet below it).\n *\n * Lifted out of `command.tsx`, where it lived privately, when Dialog arrived\n * and needed the SAME answer: two copies of a breakpoint hook is exactly the\n * duplication this package exists to end, and a Dialog that disagreed with a\n * CommandDialog about what \"mobile\" means would render two different sheet\n * geometries on one screen.\n *\n * SSR-safe by construction: `false` until mounted, so the server and the first\n * client paint agree and the desktop geometry is what hydrates. The mobile\n * geometry swaps in on the effect pass.\n *\n * The breakpoint is the host-original 768px (Tailwind `md`). It is exported so\n * a host can branch on the same number instead of inventing a second one.\n */\n\nimport * as React from \"react\";\n\n/** Viewport width (px) below which the package treats a surface as mobile. */\nexport const MOBILE_BREAKPOINT = 768;\n\nexport function useIsMobile(): boolean {\n const [isMobile, setIsMobile] = React.useState(false);\n const [hasMounted, setHasMounted] = React.useState(false);\n\n React.useEffect(() => {\n setHasMounted(true);\n\n const onChange = () => {\n setIsMobile(window.innerWidth < MOBILE_BREAKPOINT);\n };\n onChange();\n\n // NO ENVIRONMENT MAY CRASH ON THIS HOOK. `matchMedia` is absent in older\n // jsdom setups and in some embedded webviews, and a primitive that throws\n // there takes the whole host's test suite (or screen) down over a\n // breakpoint — a cost wildly out of proportion to the answer. Without it\n // the width read above still gives a correct first answer; only live\n // resize tracking is lost, which is exactly what is unavailable.\n if (typeof window.matchMedia !== \"function\") {\n return undefined;\n }\n\n const mql = window.matchMedia(`(max-width: ${MOBILE_BREAKPOINT - 1}px)`);\n mql.addEventListener(\"change\", onChange);\n return () => mql.removeEventListener(\"change\", onChange);\n }, []);\n\n if (!hasMounted) {\n return false;\n }\n return isMobile;\n}\n","/**\n * THE FRONT-MOST LAYER — one signal every floating layer shares, so the layer\n * the person used last is the one on top.\n *\n * A windowed Dialog sits at z-10000 so it is never behind the menu, popover or\n * host window it was opened from (0.38.1). But a host window opened or focused\n * AFTER it — the window an agent run opens from the Agents menu while Table\n * settings is open — then sat underneath it, and its composer could not be\n * clicked or typed into (found live 2026-09-26, register ARE-010). Recency has\n * to decide, across both systems, without coupling them.\n *\n * So any layer that comes to the front announces it: `announceLayerFront(el)`\n * dispatches `matrx:layer-front` on `document`. A windowed Dialog announces\n * itself when it opens and when the person presses or focuses inside it; it\n * steps BEHIND (z-999, still above the page and below the host's window\n * manager at 1000+) whenever another layer announces, and comes back the\n * moment the person reaches for it. A host window manager announces its\n * window on open and on focus.\n */\n\nexport const LAYER_FRONT_EVENT = \"matrx:layer-front\";\n\nexport interface LayerFrontDetail {\n /** The element that came to the front. */\n element: Element | null;\n}\n\n/** Tell every other floating layer that `element` is now the one in front. */\nexport function announceLayerFront(element: Element | null): void {\n if (typeof document === \"undefined\") return;\n document.dispatchEvent(\n new CustomEvent<LayerFrontDetail>(LAYER_FRONT_EVENT, { detail: { element } }),\n );\n}\n","\"use client\";\nimport { Dialog, DialogContent, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription } from \"../sheet\";\nimport type { TableLinkProps, TableSidePanelProps, TableWindowPanelProps } from \"./host\";\n\nexport function DefaultTableLink(props: TableLinkProps) { return <a {...props} />; }\nexport function DefaultTableSidePanel({ title, titleNode, description, defaultWidth = 480, onClose, headerActions, children }: TableSidePanelProps) {\n return <Sheet open onOpenChange={(open) => { if (!open) onClose(); }}><SheetContent side=\"right\" className=\"flex h-full flex-col\" style={{ width: `min(${defaultWidth}px, 100vw)` }}><SheetHeader><SheetTitle>{titleNode ?? title}</SheetTitle>{description ? <SheetDescription>{description}</SheetDescription> : null}{headerActions}</SheetHeader><div className=\"min-h-0 flex-1 overflow-auto\">{children}</div></SheetContent></Sheet>;\n}\nexport function DefaultTableWindow({ title, onClose, width = 720, height = 560, actionsRight, sidebar, children }: TableWindowPanelProps) {\n return <Dialog open onOpenChange={(open) => { if (!open) onClose(); }}><DialogContent className=\"flex flex-col overflow-hidden\" style={{ width: `min(${width}px, calc(100vw - 2rem))`, height: `min(${height}px, 85dvh)` }}><DialogHeader><DialogTitle>{title}</DialogTitle>{actionsRight}</DialogHeader><div className=\"flex min-h-0 flex-1\">{sidebar ? <aside className=\"shrink-0 border-r pr-2\">{sidebar}</aside> : null}<div className=\"min-h-0 min-w-0 flex-1 overflow-auto\">{children}</div></div></DialogContent></Dialog>;\n}\n","import type { SVGProps } from \"react\";\n\ntype IconProps = SVGProps<SVGSVGElement>;\nfunction Icon({ children, ...props }: IconProps) {\n return <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}>{children}</svg>;\n}\nconst path = <path d=\"M4 12h16M12 4v16\" />;\nexport const ChevronLeft = (p: IconProps) => <Icon {...p}><path d=\"m15 18-6-6 6-6\" /></Icon>;\nexport const ChevronRight = (p: IconProps) => <Icon {...p}><path d=\"m9 18 6-6-6-6\" /></Icon>;\nexport const ChevronDown = (p: IconProps) => <Icon {...p}><path d=\"m6 9 6 6 6-6\" /></Icon>;\nexport const ArrowDown = (p: IconProps) => <Icon {...p}><path d=\"M12 4v16m-6-6 6 6 6-6\" /></Icon>;\nexport const ArrowUp = (p: IconProps) => <Icon {...p}><path d=\"M12 20V4m-6 6 6-6 6 6\" /></Icon>;\nexport const ArrowUpDown = (p: IconProps) => <Icon {...p}><path d=\"M12 4v16m-4-12 4-4 4 4m-8 8 4 4 4-4\" /></Icon>;\nexport const Check = (p: IconProps) => <Icon {...p}><path d=\"m5 12 4 4L19 6\" /></Icon>;\nexport const X = (p: IconProps) => <Icon {...p}><path d=\"M6 6l12 12M18 6 6 18\" /></Icon>;\nexport const Search = (p: IconProps) => <Icon {...p}><circle cx=\"11\" cy=\"11\" r=\"6\" /><path d=\"m16 16 4 4\" /></Icon>;\nexport const Plus = (p: IconProps) => <Icon {...p}>{path}</Icon>;\nexport const Minus = (p: IconProps) => <Icon {...p}><path d=\"M4 12h16\" /></Icon>;\n/** lucide `star` — compact saved-item marker. */\nexport const Star = (p: IconProps) => <Icon {...p}><path d=\"m12 2 3.09 6.26L22 9.27l-5 4.87 1.18 6.88L12 17.77l-6.18 3.25L7 14.14 2 9.27l6.91-1.01L12 2z\" /></Icon>;\n/** lucide `pin` — compact saved-item marker. */\nexport const Pin = (p: IconProps) => <Icon {...p}><path d=\"M12 17v5M9 3h6l1 7 3 3v2H5v-2l3-3 1-7z\" /></Icon>;\nexport const Eraser = (p: IconProps) => <Icon {...p}><path d=\"m16 3 5 5-11 11H5l-3-3L13 5l3-2Z M8 10l6 6 M10 19h12\" /></Icon>;\nexport const GripVertical = (p: IconProps) => <Icon {...p}><circle cx=\"9\" cy=\"6\" r=\"1\" /><circle cx=\"15\" cy=\"6\" r=\"1\" /><circle cx=\"9\" cy=\"12\" r=\"1\" /><circle cx=\"15\" cy=\"12\" r=\"1\" /><circle cx=\"9\" cy=\"18\" r=\"1\" /><circle cx=\"15\" cy=\"18\" r=\"1\" /></Icon>;\n/** lucide `sliders-horizontal` — used for the table column manager. */\nexport const SlidersHorizontal = (p: IconProps) => <Icon {...p}>\n <path d=\"M21 4h-7M10 4H3M21 12h-9M8 12H3M21 20h-5M12 20H3M14 2v4M8 10v4M16 18v4\" />\n</Icon>;\nexport const Trash2 = (p: IconProps) => <Icon {...p}><path d=\"M4 7h16M10 11v6M14 11v6M9 7l1-2h4l1 2M6 7l1 13h10l1-13\" /></Icon>;\n/**\n * Spinner-only incomplete arc. Never a resting glyph — at rest this reads as a\n * broken half-circle. Pair it with `animate-spin` / `matrx-spin` only while\n * work is actually running. Refresh controls use `RefreshControlIcon`.\n */\nexport const Loader2 = (p: IconProps) => <Icon {...p}><path d=\"M20 12a8 8 0 1 1-2.3-5.7\" /></Icon>;\n/** lucide `refresh-cw` — the resting refresh arrows. */\nexport const RefreshCw = (p: IconProps) => (\n <Icon {...p}>\n <path d=\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\" />\n <path d=\"M21 3v5h-5\" />\n <path d=\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\" />\n <path d=\"M8 16H3v5\" />\n </Icon>\n);\n/** Refresh affordance: arrows at rest, spinner only while busy. */\nexport function RefreshControlIcon({\n spinning = false,\n className,\n ...props\n}: IconProps & { spinning?: boolean }) {\n if (spinning) {\n return (\n <Loader2\n className={[className, \"animate-spin\"].filter(Boolean).join(\" \")}\n {...props}\n />\n );\n }\n return <RefreshCw className={className} {...props} />;\n}\nexport const Save = (p: IconProps) => <Icon {...p}><path d=\"M5 3h12l2 2v16H5zM8 3v6h8V3M8 21v-7h8v7\" /></Icon>;\nexport const Pencil = (p: IconProps) => <Icon {...p}><path d=\"m4 20 4-1 11-11-3-3L5 16l-1 4z\" /></Icon>;\nexport const Eye = (p: IconProps) => <Icon {...p}><path d=\"M2 12s3-6 10-6 10 6 10 6-3 6-10 6S2 12 2 12z\" /><circle cx=\"12\" cy=\"12\" r=\"2\" /></Icon>;\nexport const PanelRight = (p: IconProps) => <Icon {...p}><rect x=\"3\" y=\"4\" width=\"18\" height=\"16\" rx=\"2\" /><path d=\"M15 4v16\" /></Icon>;\nexport const PanelRightOpen = PanelRight;\nexport const WholeWord = (p: IconProps) => <Icon {...p}><path d=\"M4 6l3 12 3-8 3 8 3-12M17 15h4\" /></Icon>;\nexport const ExternalLink = (p: IconProps) => <Icon {...p}><path d=\"M14 4h6v6M20 4l-9 9M19 13v6H5V5h6\" /></Icon>;\nexport const Copy = (p: IconProps) => <Icon {...p}><rect x=\"9\" y=\"9\" width=\"11\" height=\"11\" rx=\"2\" /><path d=\"M15 9V6a2 2 0 0 0-2-2H6a2 2 0 0 0-2 2v7a2 2 0 0 0 2 2h3\" /></Icon>;\nexport const Lightbulb = (p: IconProps) => <Icon {...p}><path d=\"M9 18h6M10 22h4M8 14a6 6 0 1 1 8 0c-1 1-1 2-1 3H9c0-1 0-2-1-3z\" /></Icon>;\nexport const ShieldOff = (p: IconProps) => <Icon {...p}><path d=\"m3 3 18 18M12 3l7 3v5c0 4-3 7-7 9-4-2-7-5-7-9V6l4-2\" /></Icon>;\nexport const ListFilter = SlidersHorizontal;\nexport const ListX = X;\n\nexport const ChevronsLeft = (p: IconProps) => <Icon {...p}><path d=\"m11 18-6-6 6-6m8 12-6-6 6-6\" /></Icon>;\nexport const ChevronsRight = (p: IconProps) => <Icon {...p}><path d=\"m5 18 6-6-6-6m8 12 6-6-6-6\" /></Icon>;\n","\"use client\";\nimport { createContext, useContext, type Context, type ComponentType, type ReactNode, type MouseEventHandler } from \"react\";\nimport type { CopyControlProps } from \"./copy-types\";\nimport type { MatrxDataTableDensity, MatrxDataTableRecordControls, TableSavedViewsProps } from \"./types\";\nimport type {\n MatrxTableMenuIconName,\n MatrxTableMenuPayload,\n MatrxTableMenuSectionsResolver,\n MatrxTableMenuTarget,\n} from \"./menu-targets\";\n\nexport type {\n MatrxTableMenuIconName,\n MatrxTableMenuItem,\n MatrxTableMenuSection,\n MatrxTableMenuSectionsResolver,\n} from \"./menu-targets\";\n\nexport type {\n AgentPayloadInput,\n AiCustomSource,\n AiVariant,\n CopyControlProps,\n CopyExportConfig,\n} from \"./copy-types\";\n\nexport interface TableLinkProps { href: string; children: ReactNode; className?: string; onClick?: MouseEventHandler<HTMLAnchorElement>; }\n/**\n * Host-owned toolbar affordance. The table package keeps operation state and\n * labels; an application can supply its canonical icon-button primitive\n * without making the shared package depend on an application UI package.\n */\nexport interface TableToolbarActionProps { ariaLabel: string; tooltip?: string | undefined; disabled?: boolean | undefined; busy?: boolean | undefined; /** Indicates a selected mutually-exclusive action such as the current page. */ active?: boolean | undefined; onClick: () => void; children: ReactNode; }\nexport interface TableSidePanelProps { title: string; titleNode?: ReactNode; description?: ReactNode; onClose: () => void; defaultWidth?: number; headerActions?: ReactNode; children: ReactNode; }\nexport interface TableWindowPanelProps { id: string; title: string; onClose: () => void; width?: number; height?: number; minWidth?: number; minHeight?: number; actionsRight?: ReactNode; bodyClassName?: string; sidebarDefaultSize?: number; sidebarMinSize?: number; sidebar?: ReactNode; children: ReactNode; }\nexport interface TableEntityRefProps { token: string; id: string; href?: string; children: ReactNode; className?: string; }\nexport interface TablePeekProps { kind: string; id: string; href?: string; onClose: () => void; }\nexport interface TableDoors { href?: string; peekKind?: string; canPeek?: boolean; }\n/**\n * The host's door onto the table's right-click levels.\n *\n * A canonical table registers ONE resolver per instance. The host's own menu\n * reads which of the four levels was clicked (`readMenuTarget`) and asks for\n * that level's descriptor — the package never interprets what comes back, and\n * the host never reaches into the table for the row or the range.\n */\nexport interface TableRowContextRegistry { register(tableId: string, resolve: (target: MatrxTableMenuTarget) => unknown): () => void; }\nexport interface TableContextMenuBoundaryProps {\n label: string;\n children: ReactNode;\n /**\n * The consumer's own sections, asked per right-click. Present only when the\n * table's consumer declared `contextMenu.sections`; the host reads the level\n * off the clicked element (`readMenuTarget`), calls this, and draws what comes\n * back in its own menu. Absent, the boundary behaves exactly as before.\n */\n sections?: MatrxTableMenuSectionsResolver | undefined;\n}\n/** The host's glyph for a menu icon name. A host without one draws labels only. */\nexport interface TableMenuIconProps { name: MatrxTableMenuIconName; className?: string | undefined; }\nexport interface MatrxDataTableHost { JsonViewer?: ComponentType<{ data: object | string }>; Link?: ComponentType<TableLinkProps>; CopyControls?: ComponentType<CopyControlProps>; ToolbarAction?: ComponentType<TableToolbarActionProps>; SidePanelSurface?: ComponentType<TableSidePanelProps>; WindowPanel?: ComponentType<TableWindowPanelProps>; EntityRef?: ComponentType<TableEntityRefProps>; resolveEntityDoors?: (token: string, id: string, href?: string | null) => TableDoors | null; ResourcePeek?: ComponentType<TablePeekProps>; SavedViews?: ComponentType<TableSavedViewsProps>; rowContextRegistry?: TableRowContextRegistry; createDefaultMenuContext?: (payload: MatrxTableMenuPayload) => unknown; ContextMenuBoundary?: ComponentType<TableContextMenuBoundaryProps>; MenuIcon?: ComponentType<TableMenuIconProps>; /** Host default; a table's explicit density takes precedence. */ defaultDensity?: MatrxDataTableDensity; notify?: { success(message: string): void; error(message: string): void }; }\n// Public entrypoints are independently bundled in ESM and CJS. The context\n// identity must survive those bundle boundaries; values stay provider-scoped.\nconst HOST_SLOT = Symbol.for(\"ai-matrx.design-system.table-host-context\");\nconst hostRegistry = globalThis as typeof globalThis & { [HOST_SLOT]?: Context<MatrxDataTableHost> };\nconst HostContext = hostRegistry[HOST_SLOT] ??= createContext<MatrxDataTableHost>({});\nexport function MatrxDataTableProvider({ value, children }: { value: MatrxDataTableHost; children: ReactNode }) { return <HostContext.Provider value={value}>{children}</HostContext.Provider>; }\nexport function useMatrxDataTableHost(): MatrxDataTableHost { return useContext(HostContext); }\n\nexport interface MatrxTableRowAlchemy {\n copy: CopyControlProps;\n controls?: MatrxDataTableRecordControls;\n placement: \"inline\" | \"menu\";\n ready: boolean;\n activate(): void;\n /** Mount Alchemy's canonical palette in the host row menu. */\n mountMenu(target: HTMLElement | null, onClose?: () => void, restoreFocus?: () => void): void;\n prepare(restoreFocus?: () => void): Promise<void>;\n}\n\nconst ROW_ALCHEMY_SLOT = Symbol.for(\"ai-matrx.design-system.table-row-alchemy-context\");\nconst rowAlchemyRegistry = globalThis as typeof globalThis & { [ROW_ALCHEMY_SLOT]?: Context<MatrxTableRowAlchemy | null> };\nconst RowAlchemyContext = rowAlchemyRegistry[ROW_ALCHEMY_SLOT] ??= createContext<MatrxTableRowAlchemy | null>(null);\n\nexport function MatrxTableRowAlchemyScope({ value, children }: { value: MatrxTableRowAlchemy; children: ReactNode }) { return <RowAlchemyContext.Provider value={value}>{children}</RowAlchemyContext.Provider>; }\n\nexport function useMatrxTableRowAlchemy(): MatrxTableRowAlchemy | null { return useContext(RowAlchemyContext); }\n\nconst ROW_CONTROLS_SLOT = Symbol.for(\"ai-matrx.design-system.table-row-controls-context\");\nconst rowControlsRegistry = globalThis as typeof globalThis & { [ROW_CONTROLS_SLOT]?: Context<MatrxDataTableRecordControls | null> };\nconst RowControlsContext = rowControlsRegistry[ROW_CONTROLS_SLOT] ??= createContext<MatrxDataTableRecordControls | null>(null);\nexport function MatrxTableRowControlsScope({ value, children }: { value: MatrxDataTableRecordControls; children: ReactNode }) { return <RowControlsContext.Provider value={value}>{children}</RowControlsContext.Provider>; }\nexport function useMatrxTableRowControls(): MatrxDataTableRecordControls | null { return useContext(RowControlsContext); }\n","\"use client\";\n\nimport * as React from \"react\";\nimport {\n buildAgentPayload,\n createBrowserTransport,\n directSource,\n normalizeTransferJson,\n sealTransferArtifact,\n type AgentPayloadInput,\n type PageAction,\n type Payload,\n type Source,\n type TransferOutcome,\n} from \"@ai-matrx/kit/content-transfer\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport {\n ContentTransferMenu,\n useContentTransferCapabilities,\n type ContentTransferController,\n type ContentTransferReference,\n type ContentTransferReferenceAction,\n type TransferMenuPresentation,\n} from \"./index\";\nimport type { AlchemyIcon } from \"./icon\";\nimport {\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../dialog\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\n\nexport type AlchemyOptionValues = Record<string, boolean | number>;\nexport type AlchemySourceOption =\n | {\n kind: \"toggle\";\n key: string;\n label: string;\n hint?: string;\n default: boolean;\n }\n | {\n kind: \"preset\";\n key: string;\n label: string;\n options: { label: string; value: number }[];\n default: number;\n }\n | {\n kind: \"slider\";\n key: string;\n label: string;\n hint?: string;\n stops: number[];\n default: number;\n formatValue: (value: number) => string;\n }\n | {\n kind: \"number\";\n key: string;\n label: string;\n hint?: string;\n min?: number;\n step?: number;\n presets?: { label: string; value: number }[];\n default: number;\n };\nexport interface AlchemyCustomSource {\n label?: string;\n hint?: string;\n options: AlchemySourceOption[];\n build(values: AlchemyOptionValues): {\n text: string;\n meta?: Record<string, string | number | boolean | undefined>;\n };\n wrap(\n text: string,\n values: AlchemyOptionValues,\n meta?: Record<string, string | number | boolean | undefined>,\n ): AgentPayloadInput;\n dialogTitle?: string;\n dialogDescription?: string;\n}\nexport type AlchemyDetail = \"full\" | \"compact\" | \"brief\";\nexport interface AlchemyGroomerSection {\n id: string;\n title: string;\n description?: string;\n cuttable?: boolean;\n levelLabels?: Partial<Record<AlchemyDetail, string>>;\n build(level: AlchemyDetail): unknown;\n defaultSelection?: AlchemyDetail | \"off\";\n}\nexport interface AlchemyGroomerConfig {\n label: string;\n kind: string;\n location: string;\n description: string;\n attributes?: AgentPayloadInput[\"attributes\"];\n context?: AgentPayloadInput[\"context\"];\n summary?: string;\n sections: AlchemyGroomerSection[];\n}\nexport interface AlchemyCopyVariant {\n id: string;\n label: string;\n hint?: string;\n icon?: React.ComponentType<{ className?: string }>;\n section?: \"copy\" | \"ai\";\n ariaLabel?: string;\n successMessage?: string;\n build?: () =>\n AgentPayloadInput | string | Promise<AgentPayloadInput | string>;\n onSelect?: () => void | Promise<void>;\n modal?: (props: {\n open: boolean;\n onOpenChange: (open: boolean) => void;\n }) => React.ReactNode;\n}\nexport interface AlchemyExportItem {\n id: string;\n label: string;\n build?: () => {\n content: BlobPart;\n extension: string;\n mime: string;\n /** Optional exact safe basename captured with bytes; omission derives a default, invalid values error. */\n filename?: string;\n };\n onSelect?: () => void | Promise<void>;\n}\ntype Resolvable<T> = T | (() => T);\nexport interface MatrxCopyMenuProps {\n label: string;\n /** Stable record identity when this mounted control can switch between records. */\n sourceId?: string;\n references?: readonly ContentTransferReference[];\n referenceActions?: readonly ContentTransferReferenceAction[];\n /** Prepare the tabular view while keeping raw JSON and human copy formats. */\n primarySource?: \"table\";\n human?: Resolvable<string>;\n json?: Resolvable<unknown>;\n agent?: Resolvable<AgentPayloadInput | string>;\n aiVariants?: AlchemyCopyVariant[];\n aiCustom?: AlchemyCustomSource;\n groomer?: () => AlchemyGroomerConfig;\n agentVariant?: {\n id?: string;\n label?: string;\n hint?: string;\n position?: \"first\" | \"last\";\n };\n export?: {\n items: AlchemyExportItem[];\n sheetRows?: () => Array<Record<string, unknown>>;\n sheetColumns?: () => Array<{ id: string; label: string }>;\n };\n /** Host-owned authenticated destination, not a second export serializer. */\n sendToSheet?: (\n rows: Array<Record<string, unknown>>,\n label: string,\n ) => Promise<TransferOutcome>;\n hide?: Array<\"copy\" | \"ai\" | \"export\">;\n disabled?: boolean;\n className?: string;\n stopPropagation?: boolean;\n size?: \"xs\" | \"icon\" | \"sm\" | \"toolbar\";\n appearance?: \"bare\" | \"segmented\";\n unified?: boolean;\n grouped?: boolean;\n icon?: AlchemyIcon;\n triggerVariant?: \"transparent\" | \"glass\" | \"outline\";\n controllerRef?: React.Ref<ContentTransferController>;\n triggerHidden?: boolean;\n}\nconst resolve = <T,>(value: Resolvable<T>): T =>\n typeof value === \"function\" ? (value as () => T)() : value;\nconst asPayload = (value: AgentPayloadInput | string): Payload => ({\n kind: \"markdown\",\n text: typeof value === \"string\" ? value : buildAgentPayload(value),\n});\nconst structuredPayload = (value: AgentPayloadInput | string): Payload => {\n if (typeof value === \"string\") return { kind: \"markdown\", text: value };\n const clean = (record?: AgentPayloadInput[\"context\"]) =>\n Object.fromEntries(\n Object.entries(record ?? {}).filter(([, entry]) => entry !== undefined),\n );\n return {\n kind: \"json\",\n value: normalizeTransferJson(\n {\n kind: value.kind,\n location: value.location,\n description: value.description,\n data: value.data,\n ...(value.summary !== undefined ? { summary: value.summary } : {}),\n attributes: clean(value.attributes),\n context: clean(value.context),\n },\n { omitUndefinedObjectProperties: true },\n ),\n };\n};\nconst actionDone = (message: string): TransferOutcome => ({\n status: \"success\",\n delivered: \"action\",\n mimeTypes: [],\n message,\n});\nconst isSafeFilename = (filename: string) =>\n filename === filename.trim() &&\n filename.length > 0 &&\n !/^\\.+$/.test(filename) &&\n !/[\\\\/\\x00-\\x1F\\x7F]/.test(filename);\nconst sourceFor = (\n id: string,\n label: string,\n build: () => Payload | Promise<Payload>,\n): Source => ({\n id,\n label,\n capture: async ({ signal }) => {\n signal.throwIfAborted();\n const payload = await build();\n signal.throwIfAborted();\n return directSource(payload, { sourceId: id, label });\n },\n});\n\n/** Opinionated bridge for Matrx's existing content builders, with one transfer UI. */\nexport function MatrxCopyMenu(props: MatrxCopyMenuProps) {\n const inherited = useContentTransferCapabilities();\n return (\n <MatrxCopyMenuSession\n key={JSON.stringify([\n inherited.identityKey ?? null,\n props.sourceId ?? props.label,\n ])}\n {...props}\n />\n );\n}\n\nfunction MatrxCopyMenuSession(props: MatrxCopyMenuProps) {\n const instance = React.useId();\n const controller = React.useRef<ContentTransferController>(null);\n const capabilities = useContentTransferCapabilities();\n const transport = capabilities.transport ?? createBrowserTransport();\n const [modal, setModal] = React.useState<AlchemyCopyVariant | null>(null);\n const [configuration, setConfiguration] = React.useState<{\n custom?: AlchemyCustomSource;\n groomer?: AlchemyGroomerConfig;\n } | null>(null);\n const copyVisible = !props.hide?.includes(\"copy\");\n const aiVisible = !props.hide?.includes(\"ai\");\n const exportVisible = !props.hide?.includes(\"export\");\n const make = (\n suffix: string,\n build: () => Payload | Promise<Payload>,\n label = props.label,\n ) =>\n sourceFor(\n `${props.sourceId ?? `${instance}:${props.label}`}:${suffix}`,\n label,\n build,\n );\n const human =\n copyVisible && props.human !== undefined\n ? make(\"human\", () => ({ kind: \"text\", text: resolve(props.human!) }))\n : undefined;\n const humanMarkdown =\n copyVisible && props.human !== undefined\n ? make(\"human-markdown\", () => ({\n kind: \"markdown\",\n text: resolve(props.human!),\n }))\n : undefined;\n const json =\n aiVisible && props.json !== undefined\n ? make(\"json\", () => ({\n kind: \"json\",\n value: normalizeTransferJson(resolve(props.json!), {\n omitUndefinedObjectProperties: true,\n }),\n }))\n : undefined;\n const agent =\n aiVisible && props.agent !== undefined\n ? make(\"agent\", () => asPayload(resolve(props.agent!)))\n : undefined;\n const structuredAgent =\n aiVisible && props.agent !== undefined\n ? make(\"structured-agent\", () => structuredPayload(resolve(props.agent!)))\n : undefined;\n const table =\n (exportVisible || props.primarySource === \"table\") &&\n props.export?.sheetRows\n ? make(\"rows\", () => {\n const value = normalizeTransferJson(props.export!.sheetRows!(), {\n omitUndefinedObjectProperties: true,\n });\n if (\n !Array.isArray(value) ||\n value.some(\n (row) =>\n row === null || typeof row !== \"object\" || Array.isArray(row),\n )\n )\n throw new Error(\"Sheet rows must be JSON objects.\");\n const rows = value as Array<\n Record<string, import(\"@ai-matrx/kit/content-transfer\").Json>\n >;\n const suppliedColumns = props.export!.sheetColumns?.();\n const columns = suppliedColumns ?? [...new Set(rows.flatMap((row) => Object.keys(row)))].map((id) => ({ id, label: id }));\n const ids = new Set<string>();\n for (const column of columns) {\n if (!column.id || !column.label || ids.has(column.id)) throw new Error(\"Sheet columns require unique nonempty ids and labels.\");\n ids.add(column.id);\n }\n for (const row of rows) for (const key of Object.keys(row)) if (!ids.has(key)) throw new Error(\"Table data contains a field outside its declared columns.\");\n return {\n kind: \"rows\",\n rows,\n columns: columns.map((column) => ({\n id: column.id,\n label: column.label,\n path: `/${column.id.replace(/~/g, \"~0\").replace(/\\//g, \"~1\")}`,\n visible: true,\n })),\n };\n })\n : undefined;\n const builderVariants = aiVisible\n ? (props.aiVariants ?? [])\n .filter(\n (variant) => variant.build && !variant.onSelect && !variant.modal,\n )\n .map((variant) => ({\n ...variant,\n copyLabel: variant.label,\n source: make(\n `variant:${variant.id}`,\n async () => asPayload(await variant.build!()),\n variant.label,\n ),\n }))\n : [];\n const faithful = agent\n ? [\n {\n id: props.agentVariant?.id ?? \"faithful\",\n label: props.agentVariant?.label ?? \"Full AI context\",\n source: agent,\n copyLabel: props.agentVariant?.label ?? \"Copy for AI\",\n ...(props.agentVariant?.hint\n ? { hint: props.agentVariant.hint }\n : {}),\n },\n ]\n : [];\n const variants =\n props.agentVariant?.position === \"last\"\n ? [...builderVariants, ...faithful]\n : [...faithful, ...builderVariants];\n const actions: (PageAction & TransferMenuPresentation)[] = [];\n if (aiVisible)\n for (const variant of props.aiVariants ?? []) {\n if (!variant.onSelect && !variant.modal) continue;\n actions.push({\n ...variant,\n id: `variant-action:${variant.id}`,\n label: variant.label,\n supports: () => true,\n run: async () => {\n if (variant.onSelect) await variant.onSelect();\n else setModal(variant);\n return actionDone(`Opened ${variant.label}`);\n },\n });\n }\n if (aiVisible && props.aiCustom)\n actions.push({\n id: \"configure-source\",\n label: props.aiCustom.label ?? \"Customize source\",\n ...(props.aiCustom.hint ? { hint: props.aiCustom.hint } : {}),\n supports: () => true,\n run: async () => {\n setConfiguration({ custom: props.aiCustom! });\n return actionDone(\"Source options opened\");\n },\n });\n if (aiVisible && props.groomer)\n actions.push({\n id: \"groom-source\",\n label: \"Customize sections\",\n supports: () => true,\n run: async () => {\n setConfiguration({ groomer: props.groomer!() });\n return actionDone(\"Section options opened\");\n },\n });\n if (exportVisible)\n for (const item of props.export?.items ?? [])\n actions.push({\n id: `export:${item.id}`,\n label: item.label,\n supports: () => true,\n ...(item.build && !item.onSelect\n ? {\n placement: \"download\" as const,\n source: make(\n `export:${item.id}`,\n async () => {\n const file = item.build!();\n const bytes = new Uint8Array(\n await new Blob([file.content], {\n type: file.mime,\n }).arrayBuffer(),\n );\n return {\n kind: \"registered\",\n format: \"matrx-file\",\n value: {\n bytes: Array.from(bytes),\n mime: file.mime,\n extension: file.extension,\n ...(file.filename !== undefined\n ? { filename: file.filename }\n : {}),\n },\n };\n },\n item.label,\n ),\n }\n : {}),\n run: async ({ snapshot, draft, signal }) => {\n if (item.onSelect) {\n await item.onSelect();\n return actionDone(`Opened ${item.label}`);\n }\n const value =\n draft.payload.kind === \"registered\" ? draft.payload.value : null;\n if (\n !value ||\n Array.isArray(value) ||\n typeof value !== \"object\" ||\n !Array.isArray(value.bytes) ||\n typeof value.mime !== \"string\" ||\n typeof value.extension !== \"string\" ||\n value.bytes.some(\n (byte) =>\n typeof byte !== \"number\" ||\n !Number.isInteger(byte) ||\n byte < 0 ||\n byte > 255,\n )\n )\n throw new Error(`${item.label} did not capture a valid file.`);\n if (\n value.filename !== undefined &&\n (typeof value.filename !== \"string\" ||\n !isSafeFilename(value.filename))\n )\n throw new Error(\n `${item.label} has an unsafe filename. Use a nonempty basename without leading or trailing whitespace, dots only, path separators, or control characters.`,\n );\n if (\n draft.omissions.some((omission) => omission.reason !== \"duplicate\")\n )\n throw new Error(\n \"This custom file exceeds the configured export limits or contains excluded content. Use a standard format or revise the source options.\",\n );\n const bytes = new Uint8Array(value.bytes as number[]);\n const filename =\n typeof value.filename === \"string\"\n ? value.filename\n : `${\n props.label\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-|-$/g, \"\") || \"export\"\n }.${value.extension.replace(/[^a-zA-Z0-9.-]/g, \"\") || \"bin\"}`;\n return transport.download(\n sealTransferArtifact({\n snapshotId: snapshot.id,\n draftRevision: draft.revision,\n format: `export:${item.id}`,\n plainText: \"\",\n file: { filename, mime: value.mime, bytes },\n omissions: [...draft.omissions],\n }),\n signal,\n );\n },\n });\n if (exportVisible && table && props.sendToSheet)\n actions.push({\n id: \"send-google-sheet\",\n label: \"Send to Google Sheet\",\n source: table,\n supports: () => true,\n run: async ({ draft }) => {\n if (draft.payload.kind !== \"rows\")\n throw new Error(\"Google Sheets requires captured rows.\");\n return props.sendToSheet!(draft.payload.rows, props.label);\n },\n });\n const source =\n (props.primarySource === \"table\" ? table : undefined) ??\n json ??\n table ??\n structuredAgent ??\n human ??\n builderVariants[0]?.source;\n if (!source && !actions.length) return null;\n // Action-only targets carry an explicit description, never invented record data.\n const target =\n source ?? make(\"actions\", () => ({ kind: \"text\", text: props.label }));\n return (\n <>\n <ContentTransferMenu\n triggerSize={props.size === \"xs\" || props.size === \"toolbar\" ? \"compact\" : \"default\"}\n source={target}\n {...(props.references ? { references: props.references } : {})}\n {...(props.referenceActions ? { referenceActions: props.referenceActions } : {})}\n {...(props.icon !== undefined ? { icon: props.icon } : {})}\n {...(props.triggerVariant !== undefined\n ? { triggerVariant: props.triggerVariant }\n : {})}\n controllerRef={(value) => {\n controller.current = value;\n if (typeof props.controllerRef === \"function\") props.controllerRef(value);\n else if (props.controllerRef) (props.controllerRef as React.MutableRefObject<ContentTransferController | null>).current = value;\n }}\n {...(props.triggerHidden ? { triggerHidden: true } : {})}\n label={props.label}\n variants={variants}\n actions={actions}\n sourceFormats={Boolean(source)}\n hide={[\n ...(!copyVisible || !source ? [\"copy\" as const] : []),\n ...(!aiVisible || !source ? [\"prepare\" as const] : []),\n ...(!exportVisible ? [\"download\" as const] : []),\n ]}\n formatSources={{\n ...(human\n ? { plain: human, markdown: humanMarkdown!, html: humanMarkdown! }\n : {}),\n ...(json ? { json, \"compact-json\": json } : {}),\n ...(table && exportVisible ? { csv: table, tsv: table } : {}),\n }}\n {...(props.disabled !== undefined ? { disabled: props.disabled } : {})}\n className={cn(\n props.className,\n props.size === \"xs\" && \"matrx-alchemy-xs\",\n props.size === \"sm\" && \"matrx-alchemy-sm\",\n props.size === \"toolbar\" && \"matrx-alchemy-toolbar-target\",\n )}\n {...(props.stopPropagation !== undefined\n ? { stopPropagation: props.stopPropagation }\n : {})}\n />\n {modal?.modal?.({\n open: true,\n onOpenChange: (open) => {\n if (!open) setModal(null);\n },\n })}\n {configuration ? (\n <SourceConfiguration\n restoreFocus={() => controller.current?.focusTrigger()}\n key={`${instance}:configuration`}\n configuration={configuration}\n onClose={() => setConfiguration(null)}\n onPrepare={async (payload, label) => {\n if (!controller.current)\n throw new Error(\"Alchemy is no longer mounted.\");\n await controller.current.prepare(payload, {\n label,\n id: `${instance}:configured:${crypto.randomUUID()}`,\n });\n setConfiguration(null);\n }}\n />\n ) : null}\n </>\n );\n}\n\nfunction SourceConfiguration({\n restoreFocus,\n configuration,\n onClose,\n onPrepare,\n}: {\n configuration: {\n custom?: AlchemyCustomSource;\n groomer?: AlchemyGroomerConfig;\n };\n restoreFocus(): void;\n onClose(): void;\n onPrepare(payload: Payload, label: string): Promise<void>;\n}) {\n const custom = configuration.custom;\n const handingOff = React.useRef(false);\n const groomer = configuration.groomer;\n const [values, setValues] = React.useState<AlchemyOptionValues>(() =>\n Object.fromEntries(\n custom?.options.map((option) => [option.key, option.default]) ?? [],\n ),\n );\n const [sections, setSections] = React.useState<\n Record<string, AlchemyDetail | \"off\">\n >(() =>\n Object.fromEntries(\n groomer?.sections.map((section) => [\n section.id,\n section.defaultSelection ?? \"full\",\n ]) ?? [],\n ),\n );\n const [error, setError] = React.useState<string | null>(null);\n const [busy, setBusy] = React.useState(false);\n const title = custom?.dialogTitle ?? groomer?.label ?? \"Customize source\";\n let prepared: AgentPayloadInput | null = null;\n let buildError: string | null = null;\n let text = \"\";\n try {\n if (custom) {\n const result = custom.build(values);\n prepared = custom.wrap(result.text, values, result.meta);\n } else if (groomer) {\n const data: Record<string, unknown> = {};\n const omitted: string[] = [];\n for (const section of groomer.sections) {\n const level = sections[section.id] ?? \"full\";\n if (level === \"off\") omitted.push(section.id);\n else {\n const value = section.build(level);\n if (value !== undefined && value !== null) data[section.id] = value;\n }\n }\n prepared = {\n kind: groomer.kind,\n location: groomer.location,\n description: groomer.description,\n data,\n ...(groomer.summary ? { summary: groomer.summary } : {}),\n attributes: {\n ...groomer.attributes,\n dropped_sections: omitted.join(\",\"),\n },\n ...(groomer.context ? { context: groomer.context } : {}),\n };\n }\n text = prepared ? buildAgentPayload(prepared) : \"\";\n } catch (cause) {\n buildError =\n cause instanceof Error ? cause.message : \"Could not prepare this source.\";\n }\n return (\n <Dialog\n open\n onOpenChange={(open) => {\n if (!open && !busy) onClose();\n }}\n >\n <DialogContent\n onCloseAutoFocus={(event) => {\n event.preventDefault();\n if (!handingOff.current) restoreFocus();\n }}\n className=\"matrx-alchemy-workspace matrx-alchemy-configuration\"\n >\n <DialogHeader>\n <DialogTitle>{title}</DialogTitle>\n <DialogDescription>\n {custom?.dialogDescription ??\n \"Choose the source detail, then prepare, edit, summarize, copy or export it in Alchemy.\"}\n </DialogDescription>\n </DialogHeader>\n <div className=\"matrx-alchemy-workspace-body\">\n <div className=\"matrx-alchemy-main matrx-alchemy-toolbar\">\n {custom?.options.map((option) => (\n <label key={option.key}>\n {option.label}\n {\"hint\" in option && option.hint ? (\n <small>{option.hint}</small>\n ) : null}\n {option.kind === \"toggle\" ? (\n <input\n type=\"checkbox\"\n checked={Boolean(values[option.key])}\n onChange={(event) =>\n setValues({ ...values, [option.key]: event.target.checked })\n }\n />\n ) : option.kind === \"preset\" ? (\n <select\n value={Number(values[option.key])}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: Number(event.target.value),\n })\n }\n >\n {option.options.map((choice) => (\n <option key={choice.value} value={choice.value}>\n {choice.label}\n </option>\n ))}\n </select>\n ) : option.kind === \"slider\" ? (\n <>\n <input\n type=\"range\"\n min={0}\n max={Math.max(0, option.stops.length - 1)}\n step={1}\n value={option.stops.indexOf(Number(values[option.key]))}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: option.stops[Number(event.target.value)]!,\n })\n }\n />\n <span>{option.formatValue(Number(values[option.key]))}</span>\n </>\n ) : (\n <>\n <input\n type=\"number\"\n min={option.min}\n step={option.step}\n value={Number(values[option.key])}\n onChange={(event) =>\n setValues({\n ...values,\n [option.key]: Number(event.target.value),\n })\n }\n />\n {option.presets?.map((preset) => (\n <Button\n key={preset.value}\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n onClick={() =>\n setValues({ ...values, [option.key]: preset.value })\n }\n >\n {preset.label}\n </Button>\n ))}\n </>\n )}\n </label>\n ))}\n {groomer ? (\n <>\n <div>\n {([\"full\", \"compact\", \"brief\"] as const).map((level) => (\n <Button\n key={level}\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n onClick={() =>\n setSections(\n Object.fromEntries(\n groomer.sections.map((section) => [\n section.id,\n level === \"brief\" && section.cuttable\n ? \"off\"\n : level,\n ]),\n ),\n )\n }\n >\n {level}\n </Button>\n ))}\n </div>\n {groomer.sections.map((section) => (\n <label key={section.id}>\n {section.title}\n <select\n value={sections[section.id]}\n onChange={(event) =>\n setSections({\n ...sections,\n [section.id]: event.target.value as\n AlchemyDetail | \"off\",\n })\n }\n >\n {([\"full\", \"compact\", \"brief\"] as const).map((level) => (\n <option key={level} value={level}>\n {section.levelLabels?.[level] ?? level}\n </option>\n ))}\n {section.cuttable ? (\n <option value=\"off\">Exclude</option>\n ) : null}\n </select>\n {section.description ? (\n <span>{section.description}</span>\n ) : null}\n </label>\n ))}\n </>\n ) : null}\n </div>\n <p>\n {formatCount(text.length)} characters · approximately{\" \"}\n {formatCount(Math.ceil(text.length / 4))} tokens\n </p>\n {error || buildError ? <p role=\"alert\">{error ?? buildError}</p> : null}\n </div>\n <DialogFooter>\n <Button\n type=\"button\"\n variant=\"ghost\"\n className=\"matrx-alchemy-workspace-secondary\"\n disabled={busy}\n onClick={onClose}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n className=\"matrx-alchemy-workspace-primary\"\n disabled={busy || !prepared || Boolean(buildError)}\n onClick={async () => {\n if (!prepared) return;\n setBusy(true);\n setError(null);\n try {\n handingOff.current = true;\n await onPrepare(structuredPayload(prepared), title);\n } catch (cause) {\n handingOff.current = false;\n setError(\n cause instanceof Error\n ? cause.message\n : \"Could not open Alchemy.\",\n );\n } finally {\n setBusy(false);\n }\n }}\n >\n {busy ? \"Preparing…\" : \"Prepare in Alchemy\"}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n );\n}\n\nexport type AlchemyGroomerPreset = \"everything\" | \"balanced\" | \"minimal\";\nexport const GROOMER_LEVELS: AlchemyDetail[] = [\"full\", \"compact\", \"brief\"];\nexport function applyGroomerPreset(\n preset: AlchemyGroomerPreset,\n sections: AlchemyGroomerSection[],\n): Record<string, AlchemyDetail | \"off\"> {\n return Object.fromEntries(\n sections.map((section) => [\n section.id,\n preset === \"everything\"\n ? \"full\"\n : preset === \"balanced\"\n ? \"compact\"\n : section.cuttable\n ? \"off\"\n : \"brief\",\n ]),\n );\n}\nexport function defaultGroomerSelections(\n sections: AlchemyGroomerSection[],\n): Record<string, AlchemyDetail | \"off\"> {\n return Object.fromEntries(\n sections.map((section) => [section.id, section.defaultSelection ?? \"full\"]),\n );\n}\nexport function buildGroomerPresetPayload(\n config: AlchemyGroomerConfig,\n preset: AlchemyGroomerPreset,\n): AgentPayloadInput {\n const selections = applyGroomerPreset(preset, config.sections);\n const data: Record<string, unknown> = {};\n const dropped: string[] = [];\n for (const section of config.sections) {\n const selection = selections[section.id] ?? \"full\";\n if (selection === \"off\") {\n dropped.push(section.id);\n continue;\n }\n const value = section.build(selection);\n if (value !== undefined && value !== null) data[section.id] = value;\n }\n return {\n kind: config.kind,\n location: config.location,\n description:\n preset === \"everything\"\n ? config.description\n : `${config.description} (${preset} detail)`,\n data,\n ...(config.summary !== undefined ? { summary: config.summary } : {}),\n attributes: {\n ...config.attributes,\n detail: preset,\n ...(dropped.length ? { dropped_sections: dropped.join(\",\") } : {}),\n },\n ...(config.context ? { context: config.context } : {}),\n };\n}\nexport function groomerPresetVariants(\n getConfig: () => AlchemyGroomerConfig,\n): AlchemyCopyVariant[] {\n return [\n {\n id: \"balanced\",\n label: \"Balanced\",\n hint: \"Compact sections\",\n build: () => buildGroomerPresetPayload(getConfig(), \"balanced\"),\n },\n {\n id: \"minimal\",\n label: \"Minimal\",\n hint: \"Brief sections with optional detail excluded\",\n build: () => buildGroomerPresetPayload(getConfig(), \"minimal\"),\n },\n ];\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport type { Artifact, TransferOutcome } from \"@ai-matrx/kit/content-transfer\";\nimport { Button } from \"../button\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport type { ContentTransferEmailPort } from \"./extensions\";\n\ntype PendingEmail = {\n artifact: Artifact;\n context: { label: string; signal: AbortSignal };\n resolve(outcome: TransferOutcome): void;\n onAbort(): void;\n};\n\nconst cancelled = (): TransferOutcome => ({ status: \"cancelled\" });\nconst failed = (error: unknown): TransferOutcome => ({\n status: \"error\",\n code: \"email-failed\",\n message: error instanceof Error ? error.message : \"Could not send email.\",\n retryable: true,\n});\n\n/** Adds one explicit review step without changing the sealed artifact handed to the host. */\nexport function useReviewedTransferEmail(email?: ContentTransferEmailPort): {\n email: ContentTransferEmailPort | undefined;\n review: React.ReactNode;\n} {\n const [pending, setPending] = React.useState<PendingEmail | null>(null);\n const [sending, setSending] = React.useState(false);\n const pendingRef = React.useRef<PendingEmail | null>(null);\n const sendingRef = React.useRef(false);\n\n const settle = React.useCallback((request: PendingEmail, outcome: TransferOutcome, render = true) => {\n if (pendingRef.current !== request) return;\n pendingRef.current = null;\n request.context.signal.removeEventListener(\"abort\", request.onAbort);\n request.resolve(outcome);\n sendingRef.current = false;\n if (render) {\n setSending(false);\n setPending(null);\n }\n }, []);\n\n React.useEffect(\n () => () => {\n const request = pendingRef.current;\n if (!request) return;\n pendingRef.current = null;\n request.context.signal.removeEventListener(\"abort\", request.onAbort);\n request.resolve(cancelled());\n sendingRef.current = false;\n },\n [],\n );\n\n const reviewed = React.useMemo<ContentTransferEmailPort | undefined>(() => {\n if (!email) return undefined;\n return {\n send: (artifact, context) => {\n if (context.signal.aborted) return Promise.resolve(cancelled());\n if (pendingRef.current)\n return Promise.resolve({\n status: \"error\",\n code: \"email-review-active\",\n message: \"Finish reviewing the current email before starting another.\",\n retryable: true,\n });\n return new Promise<TransferOutcome>((resolve) => {\n const request: PendingEmail = {\n artifact,\n context,\n resolve,\n onAbort: () => settle(request, cancelled()),\n };\n pendingRef.current = request;\n context.signal.addEventListener(\"abort\", request.onAbort, { once: true });\n setSending(false);\n setPending(request);\n });\n },\n };\n }, [email, settle]);\n\n const cancel = React.useCallback(() => {\n const request = pendingRef.current;\n if (request && !sendingRef.current) settle(request, cancelled());\n }, [settle]);\n const confirm = React.useCallback(() => {\n const request = pendingRef.current;\n if (!request || sendingRef.current || request.context.signal.aborted) return;\n sendingRef.current = true;\n setSending(true);\n void email?.send(request.artifact, request.context).then(\n (outcome) => settle(request, outcome),\n (error) => settle(request, failed(error)),\n );\n }, [email, settle]);\n\n const review = pending ? <Dialog open onOpenChange={(open) => { if (!open) cancel(); }}>\n <DialogContent className=\"matrx-alchemy-workspace matrx-alchemy-email-review\" aria-busy={sending}>\n <DialogHeader>\n <DialogTitle>Review email attachment</DialogTitle>\n <DialogDescription>Email {pending.artifact.file?.filename ?? `${pending.artifact.format} output`} from {pending.context.label}. Review this exact attachment before sending.</DialogDescription>\n </DialogHeader>\n <textarea aria-label=\"Email attachment preview\" readOnly value={pending.artifact.plainText} className=\"matrx-alchemy-preview\" />\n {pending.artifact.omissions.length ? <details className=\"matrx-alchemy-email-adjustments\" open><summary>{pending.artifact.omissions.length} omission{pending.artifact.omissions.length === 1 ? \"\" : \"s\"} or adjustment{pending.artifact.omissions.length === 1 ? \"\" : \"s\"}</summary><ul >{pending.artifact.omissions.map((omission, index) => <li key={`${omission.path}-${omission.reason}-${index}`}>{omission.path || \"/\"}: {omission.reason}{omission.count == null ? \"\" : ` (${omission.count})`}</li>)}</ul></details> : <p className=\"matrx-alchemy-meta\">No omissions or adjustments.</p>}\n <DialogFooter>\n <Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={sending} onClick={cancel}>Cancel</Button>\n <Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" disabled={sending} onClick={confirm}>{sending ? \"Sending email…\" : \"Send email\"}</Button>\n </DialogFooter>\n </DialogContent>\n </Dialog> : null;\n\n return { email: reviewed, review };\n}\n","\"use client\";\n\nimport { Slot } from \"@radix-ui/react-slot\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\n\nexport const buttonVariants = cva(\n \"inline-flex cursor-pointer items-center justify-center gap-2 whitespace-nowrap rounded-md text-sm font-medium transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-0 disabled:pointer-events-none disabled:opacity-50 active:scale-[0.98] [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0\",\n {\n variants: {\n variant: {\n default: \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n /**\n * An explicit spelling of `default`, identical by construction. It is\n * not decoration: matrx-frontend's `ButtonMine` fork carried it, ~17\n * call sites say `variant=\"primary\"`, and the alternative to keeping\n * the word was a host shim translating a prop — the massage C22 bans.\n */\n primary: \"bg-primary text-primary-foreground shadow-sm hover:bg-primary/90\",\n destructive:\n \"bg-destructive text-destructive-foreground shadow-sm hover:bg-destructive/90\",\n /** The affirmative twin of `destructive` — confirm, approve, publish. */\n success:\n \"bg-success text-success-foreground shadow-sm hover:bg-success/90\",\n outline:\n \"border border-border bg-card shadow-sm hover:bg-accent hover:text-accent-foreground\",\n secondary:\n \"bg-secondary text-secondary-foreground shadow-sm hover:bg-secondary/80\",\n ghost: \"hover:bg-accent hover:text-accent-foreground\",\n link: \"text-primary underline-offset-4 hover:underline\",\n subtle:\n \"border border-transparent bg-muted/50 text-foreground hover:border-border hover:bg-muted\",\n },\n /**\n * ONE size scale, xs → 3xl, plus the two icon boxes. The top and bottom\n * of the scale came in from matrx-frontend's `ButtonMine` fork (2026-09-07):\n * a dense toolbar needs `xs`, and a marketing/hero call to action needs\n * `xl`+. A host that has to reach outside this scale forks the button,\n * which is exactly how `ButtonMine` was born.\n */\n size: {\n xs: \"h-6 rounded-md px-1 text-xs\",\n sm: \"h-8 rounded-md px-3 text-xs\",\n default: \"h-9 px-4 py-2\",\n /** An explicit spelling of `default` (the fork's middle rung). */\n md: \"h-9 px-4 py-2\",\n lg: \"h-10 rounded-md px-6\",\n xl: \"h-12 px-8 py-3 text-base\",\n \"2xl\": \"h-14 px-10 py-3 text-base\",\n \"3xl\": \"h-16 px-12 py-3 text-base\",\n icon: \"h-9 w-9\",\n \"icon-sm\": \"h-7 w-7\",\n /** A circular icon box — an avatar-shaped control, not a square one. */\n roundIcon: \"h-8 w-8 rounded-full p-0\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n size: \"default\",\n },\n },\n);\n\n/**\n * THE TOUCH FLOOR (2026-09-17).\n *\n * Every rung of the size scale below `xl` is shorter than the 44px platform\n * touch target: `xs` 24, `icon-sm` 28, `sm` 32, `roundIcon` 32, `default`/`md`\n * 36, `icon` 36, `lg` 40. Measured live at 390x844 on `/masterwork/<id>`, ALL\n * SEVEN design-system Buttons in the viewport were under the floor (four at\n * 32px, two at 28px).\n *\n * The floor is raised in CSS, under `@media (pointer: coarse)` ONLY, so DESKTOP\n * DENSITY IS UNTOUCHED — a narrow desktop window is not a finger, which is why\n * this rule deliberately does NOT carry the `(max-width: 1023px)` half that the\n * dialog-footer floor in `styles.css` uses.\n *\n * WHY EVERY SUB-44 RUNG AND NOT JUST `sm`: a floor applied to one rung inverts\n * the scale. Lift `sm` (32) alone and it renders TALLER on a phone than\n * `default` (36) and `lg` (40) — the scale would stop being a scale. A floor is\n * only coherent applied to everything beneath it.\n *\n * The mechanism is `min-height`/`min-width`, not an invisible 44px hit ring\n * over a 32px pill. A ring is the tap-target package's pattern and it is right\n * THERE (isolated glass buttons), but on a toolbar of adjacent `sm` buttons\n * separated by an 8px gap the rings overlap in the gap and one button silently\n * eats taps aimed at its neighbour — unacceptable where a neighbour is\n * destructive. `lib/entity-list`'s own phone contract (`h-11 min-w-11`) already\n * chose growth for the same reason; this is that choice made once, in the\n * primitive, instead of per surface.\n *\n * `min-width` is raised only on the SQUARE rungs (`icon`, `icon-sm`,\n * `roundIcon`) — a text button is already wider than 44px, and forcing a floor\n * on it would stretch short labels.\n *\n * Opt out on a control that is genuinely not a finger target with\n * `data-touch-exempt` (same escape hatch the footer floor honours), and say why\n * at the call site.\n */\nconst TOUCH_FLOOR_SIZES = new Set([\n \"xs\",\n \"sm\",\n \"default\",\n \"md\",\n \"lg\",\n \"icon\",\n \"icon-sm\",\n \"roundIcon\",\n]);\nconst SQUARE_SIZES = new Set([\"icon\", \"icon-sm\", \"roundIcon\"]);\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean;\n}\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Component = asChild ? Slot : \"button\";\n const resolvedSize = size ?? \"default\";\n return (\n <Component\n className={cn(buttonVariants({ variant, size, className }))}\n data-matrx-button=\"\"\n data-tap-floor={TOUCH_FLOOR_SIZES.has(resolvedSize) ? \"\" : undefined}\n data-tap-floor-square={\n SQUARE_SIZES.has(resolvedSize) ? \"\" : undefined\n }\n ref={ref}\n {...props}\n />\n );\n },\n);\nButton.displayName = \"Button\";\n","\"use client\";\n\nimport { useReviewedTransferEmail } from \"./email-review\";\n\nimport * as React from \"react\";\nimport { createPortal, flushSync } from \"react-dom\";\nimport {\n applySectionSelection,\n applyTransferLimits,\n capture,\n buildAgentPayload,\n collectAllMatching,\n createBrowserTransport,\n createDraft,\n directSource,\n editDraft,\n projectSnapshot,\n readTransferCell,\n reduceJson,\n resetDraft,\n resolveTransferPreferences,\n resolveTransferRegistry,\n sealTransferArtifact,\n serialize,\n serializeMarkdownRich,\n transformRows,\n undoDraft,\n type AiPreparation,\n type Artifact,\n type BoundAllMatching,\n type Draft,\n type ExportProjection,\n type FormatAdapter,\n type Json,\n type PageAction,\n type Payload,\n type Section,\n type Snapshot,\n type Source,\n type SurfaceHandle,\n type TransferCapabilities,\n type TransferOutcome,\n type TransferTarget,\n type TransferPreferenceOverrides,\n type TransferPreferences,\n type TransferScope,\n type Transport,\n} from \"@ai-matrx/kit/content-transfer\";\nimport { formatCount } from \"@ai-matrx/kit/format\";\nimport { Button } from \"../button\";\nimport { cn } from \"../cn\";\nimport { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle } from \"../dialog\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../popover\";\nimport { TapTargetButton, TapTargetButtonTransparent } from \"../tap-target/index\";\nimport { ALCHEMY_GLYPH_VIEWBOX, ALCHEMY_GLYPH_PATHS, type AlchemyIcon } from \"./icon\";\nexport { ALCHEMY_GLYPH_SVG, ALCHEMY_COPY_TRANSFORM_SVG, type AlchemyIcon } from \"./icon\";\n\nimport { createTransferEmailActions, type ContentTransferReference, type ContentTransferReferencePort, type ContentTransferEmailPort } from \"./extensions\";\nexport { tableSchemaFormat, tableDataFormat, createTransferEmailActions, type ContentTransferReference, type ContentTransferReferencePort, type ContentTransferEmailPort } from \"./extensions\";\nexport type ContentTransferReferenceAction = { id: string; label: string; run(): void | Promise<void> };\n\nexport function AlchemyGlyph({ icon = \"portal\", ...props }: React.SVGAttributes<SVGSVGElement> & { icon?: AlchemyIcon }) {\n return <svg width=\"18\" height=\"18\" viewBox={ALCHEMY_GLYPH_VIEWBOX[icon]} fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.75\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\" {...props}>{ALCHEMY_GLYPH_PATHS[icon].map((d) => <path key={d} d={d}/>)}</svg>;\n}\n\nexport type ContentTransferCapabilities = TransferCapabilities & {\n /** Opaque host session boundary. It is used only to reset local menu state. */\n identityKey?: string;\n transport?: Transport;\n reference?: ContentTransferReferencePort;\n email?: ContentTransferEmailPort;\n actions?: PageAction[];\n preferences?: TransferPreferenceOverrides;\n onOutcome?: (outcome: TransferOutcome) => void;\n};\nconst CapabilityContext = React.createContext<ContentTransferCapabilities>({});\nexport function ContentTransferCapabilitiesProvider({ value, children }: { value: ContentTransferCapabilities; children: React.ReactNode }) {\n return <CapabilityContext.Provider value={value}>{children}</CapabilityContext.Provider>;\n}\nexport const useContentTransferCapabilities = () => React.useContext(CapabilityContext);\nconst SurfaceContext = React.createContext<SurfaceHandle | null>(null);\nexport function ContentTransferSurfaceProvider({ handle, children }: { handle: SurfaceHandle; children: React.ReactNode }) {\n return <SurfaceContext.Provider value={handle}>{children}</SurfaceContext.Provider>;\n}\nexport const useContentTransferSurface = () => React.useContext(SurfaceContext);\n\nexport type SerializableFormat = \"plain\" | \"markdown\" | \"html\" | \"json\" | \"compact-json\" | \"csv\" | \"tsv\";\ntype BuiltInFormat = SerializableFormat | \"xlsx\";\nexport interface TransferMenuPresentation {\n group?: \"save\" | \"chat\" | \"email\";\n prepared?: boolean;\n hint?: string;\n icon?: React.ComponentType<{ className?: string }>;\n ariaLabel?: string;\n /** Download-only actions join the shared format palette instead of a second menu. */\n placement?: \"download\";\n}\nexport interface TransferMenuVariant extends TransferMenuPresentation {\n id: string; label: string; source: Source | Payload;\n copyLabel?: string;\n section?: \"copy\" | \"ai\";\n successMessage?: string;\n}\nfunction MenuPresentation({ label, hint, icon: Icon }: TransferMenuPresentation & { label: string }) {\n return <>{Icon ? <Icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph file/>}<span>{label}{hint ? <small className=\"matrx-alchemy-menu-hint\">{hint}</small> : null}</span></>;\n}\nfunction DestinationPresentation({ action }: { action: PageAction & TransferMenuPresentation }) {\n const paths: Record<string, string> = {\n notes: \"M5 3h14v18H5zM8 8h8M8 12h8M8 16h5\",\n scratch: \"M5 3h14v18H5zM9 12h6M12 9v6\",\n document: \"M6 3h8l4 4v14H6zM14 3v5h4M9 12h6M9 16h6\",\n workbook: \"M3 4h18v16H3zM3 9h18M9 4v16M15 9v11M3 15h18\",\n task: \"M9 6h11M9 12h11M9 18h11M3 6l1 1 2-2M3 12l1 1 2-2M3 18l1 1 2-2\",\n attach: \"m9 12 5-5a3 3 0 0 1 4 4l-7 7a5 5 0 0 1-7-7l8-8M7 14l7-7\",\n code: \"m8 6-6 6 6 6m8-12 6 6-6 6m-3-14-2 16\",\n chat: \"M4 4h16v13H9l-5 4zM8 9h8M8 13h5\",\n assistant: \"M3 4h18v16H3zM15 4v16M6 9h6M6 13h4\",\n tools: \"m14 4 3 3 4-1a6 6 0 0 1-8 7l-7 7-3-3 7-7a6 6 0 0 1 4-6z\",\n };\n const path = paths[action.id.replace(/^matrx:/, \"\")];\n return <>{action.icon ? <action.icon className=\"matrx-alchemy-menu-icon\"/> : path ? <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d={path}/></svg> : <PaletteGlyph file/>}<span>{action.label}{action.hint ? <small className=\"matrx-alchemy-menu-hint\">{action.hint}</small> : null}</span></>;\n}\nfunction ReceiptLink({ target }: { target: TransferTarget | undefined }) {\n return target?.href && /^(\\/(?!\\/)|https?:\\/\\/)/.test(target.href) ? <a className=\"matrx-alchemy-receipt-link\" href={target.href}>Open {target.kind}</a> : null;\n}\nfunction PaletteGlyph({ format, ai = false, file = false, kind }: { format?: string; ai?: boolean; file?: boolean; kind?: \"ai-copy\" | \"sliders\" | \"link\" | \"surface\" }) {\n if (kind === \"link\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M10 13a5 5 0 0 0 7 0l3-3a5 5 0 0 0-7-7l-2 2M14 11a5 5 0 0 0-7 0l-3 3a5 5 0 0 0 7 7l2-2\"/></svg>;\n if (kind === \"surface\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\"/><path d=\"M3 9h18M9 9v12\"/></svg>;\n if (kind === \"ai-copy\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><rect x=\"5\" y=\"5\" width=\"11\" height=\"14\" rx=\"2\"/><path d=\"M9 3h6a2 2 0 0 1 2 2v10\"/><path d=\"m18.5 3 .55 1.45L20.5 5l-1.45.55L18.5 7l-.55-1.45L16.5 5l1.45-.55z\"/></svg>;\n if (kind === \"sliders\") return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M4 6h16M4 12h16M4 18h16\"/><path d=\"M8 3v6M16 9v6M10 15v6\"/></svg>;\n if (ai) return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M12 5a3 3 0 1 0-5.997.125A4 4 0 0 0 3.5 10.9a4 4 0 0 0 .556 6.588A4 4 0 0 0 12 19\"/><path d=\"M12 5a3 3 0 1 1 5.997.125 4 4 0 0 1 2.503 5.775 4 4 0 0 1-.556 6.588A4 4 0 0 1 12 19\"/><path d=\"M12 5v14M8 9h1M15 9h1M8 15h1M15 15h1\"/></svg>;\n if (file) return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\"><path d=\"M6 3h8l4 4v14H6z\"/><path d=\"M14 3v5h5M9 13h6M9 17h6\"/></svg>;\n const path = format === \"json\" || format === \"table-data\" ? <><path d=\"M9 4C7 4 7 7 5 7v3c2 0 2 1 2 2s0 2-2 2v3c2 0 2 3 4 3\"/><path d=\"M15 4c2 0 2 3 4 3v3c-2 0-2 1-2 2s0 2 2 2v3c-2 0-2 3-4 3\"/></>\n : format === \"table-schema\" ? <><rect x=\"8\" y=\"3\" width=\"8\" height=\"5\" rx=\"1\"/><rect x=\"2\" y=\"16\" width=\"8\" height=\"5\" rx=\"1\"/><rect x=\"14\" y=\"16\" width=\"8\" height=\"5\" rx=\"1\"/><path d=\"M12 8v4M6 16v-4h12v4\"/></>\n : format === \"compact-json\" ? <><path d=\"m14 10 7-7\"/><path d=\"M20 10h-6V4\"/><path d=\"m3 21 7-7\"/><path d=\"M4 14h6v6\"/></>\n : format === \"csv\" ? <><rect x=\"4\" y=\"4\" width=\"16\" height=\"16\" rx=\"1\"/><path d=\"M4 10h16M10 4v16\"/></>\n : format === \"tsv\" ? <><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6M8 13h2M14 13h2M8 17h2M14 17h2\"/></>\n : format === \"xlsx\" ? <><path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\"/><path d=\"M14 2v6h6M8 13h8M8 17h8M12 11v8\"/></>\n : format === \"markdown\" ? <><path d=\"M14.5 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7.5z\"/><path d=\"M14 2v6h6M10 13l-2 2 2 2M14 17l2-2-2-2\"/></>\n : format === \"html\" ? <><path d=\"M15 6h6M3 6h7M3 12h18M3 18h12\"/></>\n : <><path d=\"M4 7V4h16v3M9 20h6M12 4v16\"/></>;\n return <svg className=\"matrx-alchemy-palette-glyph\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">{path}</svg>;\n}\nfunction PaletteRows({ title, items, onRun, extra, ai = false, glyphKind, fallbackHint }: { title: string; items: readonly TransferMenuVariant[]; onRun?: (item: TransferMenuVariant) => void; extra?: React.ReactNode; ai?: boolean; glyphKind?: \"ai-copy\" | \"sliders\"; fallbackHint?: string }) {\n if (!items.length && !extra) return null;\n return <section className=\"matrx-alchemy-palette-section\"><h3>{title}</h3>{items.map((item) => { const label = item.copyLabel ?? item.label; const hint = item.hint ?? fallbackHint; return <button key={item.id} type=\"button\" className={cn(\"matrx-alchemy-palette-row\", ai && \"matrx-alchemy-palette-row-ai\")} aria-label={item.ariaLabel ?? `${label}${hint ? ` ${hint}` : \"\"}`} onClick={() => onRun?.(item)}>{item.icon ? <item.icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph ai={ai} {...(glyphKind ? { kind: glyphKind } : {})}/>}<span>{label}{hint ? <small className=\"matrx-alchemy-menu-hint\">{hint}</small> : null}</span></button>; })}{extra}</section>;\n}\nexport interface ContentTransferMenuProps {\n source?: Payload | Source;\n projection?: ExportProjection;\n sections?: Section[];\n preferences?: TransferPreferenceOverrides;\n enabled?: boolean;\n surface?: SurfaceHandle;\n label?: string;\n table?: { availableScopes: TransferScope[]; initialScope: TransferScope; scopeLabels?: Partial<Record<TransferScope, string>> };\n references?: readonly ContentTransferReference[];\n referenceActions?: readonly ContentTransferReferenceAction[];\n /** A quick format may explicitly capture a different representation. */\n formatSources?: Partial<Record<SerializableFormat, Source | Payload>>;\n /** Set false for action-only hosts; source formats and adapters are then omitted. */\n sourceFormats?: boolean;\n /** Named alternate sources open this same preparation workspace. */\n variants?: readonly TransferMenuVariant[];\n actions?: (PageAction & TransferMenuPresentation)[];\n capabilities?: ContentTransferCapabilities;\n disabled?: boolean;\n /** Portal is the default Alchemy mark; copy-transform remains opt-in. */\n icon?: AlchemyIcon;\n /** Uses the canonical TapTargetButton presentation. */\n triggerVariant?: \"transparent\" | \"glass\" | \"outline\";\n triggerSize?: \"default\" | \"compact\";\n /** Mount the transfer session without a visible trigger for a host-owned menu command. */\n triggerHidden?: boolean;\n className?: string;\n stopPropagation?: boolean;\n hide?: readonly (\"copy\" | \"prepare\" | \"download\")[];\n controllerRef?: React.Ref<ContentTransferController>;\n}\nexport interface ContentTransferController {\n focusTrigger(): void;\n /** Mount the one canonical Alchemy palette in a host-owned menu surface. */\n mountPalette(target: HTMLElement | null, onClose?: () => void, restoreFocus?: () => void): void;\n preparePrimary(options?: { restoreFocus?: () => void }): Promise<void>;\n prepare(source: Source | Payload, options?: { id?: string; label?: string }): Promise<void>;\n}\n\nconst LABEL: Record<BuiltInFormat, string> = { plain: \"Plain text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact JSON\", csv: \"CSV\", tsv: \"Google Sheets\", xlsx: \"Excel workbook\" };\nconst BUILT_INS = Object.freeze((Object.keys(LABEL) as BuiltInFormat[]).map((id) => ({ id })));\nconst COPIES: SerializableFormat[] = [\"plain\", \"markdown\", \"html\", \"json\", \"compact-json\", \"csv\", \"tsv\"];\nconst DOWNLOADS: BuiltInFormat[] = [...COPIES, \"xlsx\"];\nconst EMPTY_VARIANTS: readonly { id: string; label: string; source: Source | Payload }[] = [];\nconst SCOPE_LABEL: Record<TransferScope, string> = { target: \"This content\", row: \"This row\", selected: \"Selected rows\", view: \"Current view\", loaded: \"Loaded rows\", \"all-matching\": \"All matching rows\" };\nconst filenameFor = (label: string) => label.toLocaleLowerCase().replace(/[^a-z0-9]+/g, \"-\").replace(/(^-|-$)/g, \"\") || \"export\";\nconst estimateTokens = (text: string) => Math.ceil(text.length / 4);\nconst errorMessage = (error: unknown, fallback: string) => error instanceof Error ? error.message : fallback;\nconst isAbort = (error: unknown) => error instanceof DOMException && error.name === \"AbortError\";\nconst supportsBuiltIn = (format: BuiltInFormat, payload: Payload) => ![\"csv\", \"tsv\", \"xlsx\"].includes(format) || payload.kind === \"rows\";\nconst outcomeMessage = (result: TransferOutcome) => {\n if (result.status === \"success\") {\n const success = result as TransferOutcome & { delivered: string; message?: string };\n return success.delivered === \"action\" ? success.message ?? \"Action completed\" : success.delivered === \"download-started\" ? \"Download started\" : success.message ?? \"Copied\";\n }\n // A queued write is NEITHER a delivery nor a failure (kit `TransferOutcome`\n // `queued`): the host's sentence alone reads as \"done\", so the remedy — what\n // has not happened yet and what the person does next — is always spoken with\n // it, and the pending request rides the same receipt door as any target.\n if (result.status === \"queued\") return `${result.message} ${result.remedy}`;\n return result.status === \"degraded\" ? `Copied as plain text: ${result.reason}` : result.status === \"cancelled\" ? \"Cancelled\" : result.message;\n};\nconst materialIds = new WeakMap<object, number>();\nlet nextMaterialId = 0;\nfunction materialIdentity(material: Source | Payload | SurfaceHandle | null | undefined) {\n if (!material) return \"missing\";\n if (\"instanceId\" in material) return `surface:${material.instanceId}`;\n if (\"id\" in material) return `source:${material.id}`;\n let id = materialIds.get(material);\n if (id === undefined) { id = ++nextMaterialId; materialIds.set(material, id); }\n return `payload:${id}`;\n}\n\ntype CaptureResult = { snapshot: Snapshot; allMatching?: BoundAllMatching; collectionError?: string };\ntype WorkspaceState = CaptureResult & { sourceStale?: boolean | undefined; key: string; original: Draft; draft: Draft; scope: TransferScope; preferences: TransferPreferences; pending?: (CaptureResult & { scope: TransferScope }) | undefined; error?: string | undefined };\n\n/** Compare captured meaning at the user action boundary, never during render. */\nfunction snapshotContent(snapshot: Snapshot) {\n const { sourceId, label, payload, coverage, unsavedChanges, omissions, sections, limits } = snapshot;\n return JSON.stringify({ sourceId, label, payload, coverage, unsavedChanges, omissions, sections, limits });\n}\n\nfunction useFence() {\n const mounted = React.useRef(true);\n const nextId = React.useRef(0);\n const active = React.useRef(new Set<AbortController>());\n React.useEffect(() => {\n mounted.current = true;\n return () => { mounted.current = false; nextId.current += 1; active.current.forEach((c) => c.abort()); active.current.clear(); };\n }, []);\n const begin = React.useCallback(() => { const controller = new AbortController(); active.current.add(controller); return { controller, id: ++nextId.current }; }, []);\n const finish = React.useCallback((controller: AbortController) => active.current.delete(controller), []);\n const valid = React.useCallback((id: number, controller: AbortController) => mounted.current && !controller.signal.aborted && nextId.current === id, []);\n const abortAll = React.useCallback(() => { nextId.current += 1; active.current.forEach((c) => c.abort()); active.current.clear(); }, []);\n return { begin, finish, valid, abortAll };\n}\n\nasync function xlsxArtifact(draft: Draft, label: string): Promise<Artifact> {\n if (draft.payload.kind !== \"rows\") throw new Error(\"Excel workbook export requires tabular content.\");\n const XLSX = await import(\"xlsx\");\n const columns = draft.payload.columns.filter((c) => c.visible && c.exportable !== false && c.classification !== \"secret\" && c.classification !== \"credential\");\n const cells = draft.payload.rows.map((row) => columns.map((column) => {\n const value = readTransferCell(row, column);\n return value === null || [\"string\", \"number\", \"boolean\"].includes(typeof value) ? value : value === undefined ? \"\" : JSON.stringify(value);\n }));\n const sheet = XLSX.utils.aoa_to_sheet([columns.map((c) => c.label), ...cells]);\n const book = XLSX.utils.book_new();\n XLSX.utils.book_append_sheet(book, sheet, label.replace(/[\\\\/?*[\\]:]/g, \" \").trim().slice(0, 31) || \"Data\");\n const written = XLSX.write(book, { type: \"array\", bookType: \"xlsx\", compression: true });\n return sealTransferArtifact({ snapshotId: draft.snapshotId, draftRevision: draft.revision, format: \"xlsx\", plainText: serialize(draft, \"tsv\", { spreadsheetSafe: true }).plainText, file: { filename: `${filenameFor(label)}.xlsx`, mime: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", bytes: written instanceof Uint8Array ? written : new Uint8Array(written) }, omissions: [...draft.omissions] });\n}\nasync function buildArtifact(draft: Draft, format: BuiltInFormat, label: string): Promise<Artifact> {\n if (!supportsBuiltIn(format, draft.payload)) throw new Error(`${LABEL[format]} is available for tabular content only.`);\n if (format === \"xlsx\") return xlsxArtifact(draft, label);\n if (format === \"html\" && draft.payload.kind === \"markdown\") return serializeMarkdownRich(draft, `${filenameFor(label)}.html`);\n const extension = format === \"plain\" ? \"txt\" : format === \"compact-json\" ? \"json\" : format;\n return serialize(draft, format, { spreadsheetSafe: format === \"csv\" || format === \"tsv\", filename: `${filenameFor(label)}.${extension}` });\n}\n\nexport function ContentTransferMenu(props: ContentTransferMenuProps) {\n const inherited = React.useContext(CapabilityContext);\n const identityKey = props.capabilities?.identityKey ?? inherited.identityKey;\n return <ContentTransferMenuSession key={identityKey ?? \"anonymous\"} {...props} />;\n}\n\nfunction ContentTransferMenuSession({ references = [], referenceActions = [], source, surface, label, projection, sections, preferences, table, formatSources, sourceFormats = true, variants = EMPTY_VARIANTS, actions = [], capabilities: local, disabled, enabled = true, className, stopPropagation = true, hide = [], controllerRef, icon = \"portal\", triggerVariant = \"transparent\", triggerSize = \"default\", triggerHidden = false }: ContentTransferMenuProps) {\n const triggerRef = React.useRef<HTMLButtonElement>(null);\n const restoreFocusRef = React.useRef<(() => void) | null>(null);\n const inherited = React.useContext(CapabilityContext);\n const nearestSurface = React.useContext(SurfaceContext);\n const fence = useFence();\n const [menuCapture, setMenuCapture] = React.useState<CaptureResult | null>(null);\n const [menuStatus, setMenuStatus] = React.useState<\"idle\" | \"loading\" | string>(\"idle\");\n const [workspaces, setWorkspaces] = React.useState<Record<string, WorkspaceState>>({});\n const [workspaceKey, setWorkspaceKey] = React.useState<string | null>(null);\n const [workspaceOpen, setWorkspaceOpen] = React.useState(false);\n const workspaceCaptures = React.useRef(new Map<string, (scope: TransferScope, signal: AbortSignal) => Promise<CaptureResult>>());\n const externalWorkspaceKeys = React.useRef(new Set<string>());\n const [notice, setNotice] = React.useState<string | null>(null);\n const [receiptTarget, setReceiptTarget] = React.useState<TransferTarget | undefined>();\n const [paletteOpen, setPaletteOpen] = React.useState(false);\n const [paletteTarget, setPaletteTarget] = React.useState<HTMLElement | null>(null);\n const externalPaletteClose = React.useRef<(() => void) | null>(null);\n const externalPaletteRestoreFocus = React.useRef<(() => void) | null>(null);\n // A host action closes its submenu before its async outcome arrives. Keep the\n // owner document so feedback and its receipt still have a durable portal.\n const feedbackDocument = React.useRef<Document | null>(null);\n const [mode, setMode] = React.useState<\"copy\" | \"download\">(\"copy\");\n const scopes = React.useMemo(() => table?.availableScopes ?? ([\"target\"] as TransferScope[]), [table]);\n const [requestedScope, setRequestedScope] = React.useState<TransferScope>(table?.initialScope ?? \"target\");\n const initialScope = scopes.includes(requestedScope) ? requestedScope : table?.initialScope ?? \"target\";\n if (!scopes.includes(initialScope)) throw new Error(\"Alchemy initialScope must be included in availableScopes.\");\n const primary = surface ?? source ?? nearestSurface;\n const sourceLabel = label ?? (surface?.surfaceName ?? (source && \"label\" in source ? source.label : nearestSurface?.surfaceName) ?? \"content\");\n const primaryWorkspaceBase = `primary:${materialIdentity(primary)}`;\n const primaryWorkspaceKey = `${primaryWorkspaceBase}:${initialScope}`;\n const nearestWorkspaceKey = source && !surface && nearestSurface ? `surface:${materialIdentity(nearestSurface)}` : null;\n const variantWorkspaceKeys = React.useMemo(() => new Map(variants.map((variant) => [variant.id, `variant:${variant.id}:${materialIdentity(variant.source)}`])), [variants]);\n const transport = local?.transport ?? inherited.transport ?? createBrowserTransport();\n const ai = local?.ai ?? inherited.ai;\n const referencePort = local?.reference ?? inherited.reference;\n const { email: emailPort, review: emailReview } = useReviewedTransferEmail(local?.email ?? inherited.email);\n const providerPreferences = React.useMemo(() => resolveTransferPreferences(inherited.preferences, local?.preferences), [inherited.preferences, local?.preferences]);\n const adapters = React.useMemo(() => resolveTransferRegistry<{ id: string }>(BUILT_INS, inherited.formats ?? [], local?.formats ?? []).filter((x): x is FormatAdapter => \"build\" in x), [inherited.formats, local?.formats]);\n const emailJsonFormat = adapters.find((adapter) => adapter.id === \"table-data\");\n const emailActions = React.useMemo(() => emailPort ? createTransferEmailActions(emailPort, emailJsonFormat ? { jsonFormat: emailJsonFormat } : {}) : [], [emailPort, emailJsonFormat]);\n const registeredActions = React.useMemo(() => resolveTransferRegistry(emailActions, inherited.actions ?? [], local?.actions ?? [], actions), [actions, emailActions, inherited.actions, local?.actions]);\n React.useMemo(() => resolveTransferRegistry(variants), [variants]);\n const report = React.useCallback((result: TransferOutcome) => { inherited.onOutcome?.(result); local?.onOutcome?.(result); setNotice(outcomeMessage(result)); setReceiptTarget(\"target\" in result ? result.target : undefined); }, [inherited, local]);\n React.useEffect(() => {\n const valid = new Set([...scopes.map((scope) => `${primaryWorkspaceBase}:${scope}`), ...(nearestWorkspaceKey ? [nearestWorkspaceKey] : []), ...variantWorkspaceKeys.values(), ...externalWorkspaceKeys.current]);\n setWorkspaces((current) => Object.fromEntries(Object.entries(current).filter(([key]) => valid.has(key))));\n for (const key of workspaceCaptures.current.keys()) if (!valid.has(key)) workspaceCaptures.current.delete(key);\n if (workspaceKey && !valid.has(workspaceKey)) { setWorkspaceKey(null); setWorkspaceOpen(false); }\n }, [nearestWorkspaceKey, primaryWorkspaceBase, scopes, variantWorkspaceKeys, workspaceKey]);\n\n const captureOne = React.useCallback(async (material: Source | Payload | SurfaceHandle | null, scope: TransferScope, signal: AbortSignal, applyMenuProjection = false, collectPages = true): Promise<CaptureResult> => {\n if (!material) throw new Error(\"Alchemy needs a source or a mounted transfer surface.\");\n let sourceMaterial: Source;\n if (\"instanceId\" in material) {\n if (!material.isMounted()) throw new Error(\"The requested transfer surface is no longer mounted.\");\n const captured = await material.capture(signal);\n sourceMaterial = { id: captured.snapshot.sourceId, label: captured.snapshot.label, capture: async () => captured };\n } else if (\"kind\" in material) {\n sourceMaterial = { id: materialIdentity(material), label: sourceLabel, capture: async () => directSource(material, { sourceId: materialIdentity(material), label: sourceLabel, ...(applyMenuProjection && projection ? { projection } : {}), ...(applyMenuProjection && sections ? { sections } : {}) }) };\n } else if (applyMenuProjection && (projection || sections)) {\n sourceMaterial = {\n id: material.id,\n label: material.label,\n capture: async (request) => {\n const captured = await material.capture(request);\n return {\n ...captured,\n projection: { rules: [...captured.projection.rules, ...(projection?.rules ?? [])] },\n snapshot: { ...captured.snapshot, ...(sections ? { sections } : {}) },\n };\n },\n };\n } else {\n sourceMaterial = material;\n }\n const raw = await sourceMaterial.capture({ scope, signal });\n const constrained = resolveTransferPreferences(providerPreferences, preferences, raw.snapshot.limits);\n const result = await capture({ id: raw.snapshot.sourceId, label: raw.snapshot.label, capture: async () => ({ ...raw, snapshot: { ...raw.snapshot, limits: constrained.limits } }) }, signal, scope);\n if (scope !== \"all-matching\" || !collectPages) return result;\n if (!result.allMatching) throw new Error(\"This source cannot provide a stable all-matching export.\");\n const collected = await collectAllMatching(result.allMatching, signal);\n if (result.snapshot.payload.kind !== \"rows\") throw new Error(\"All-matching export requires tabular content.\");\n return { snapshot: projectSnapshot({ ...result.snapshot, payload: { kind: \"rows\", rows: collected.rows, columns: result.snapshot.payload.columns }, coverage: collected.coverage, omissions: [...collected.omissions] }, { rules: [] }), allMatching: result.allMatching, ...(collected.error ? { collectionError: collected.error.message } : {}) };\n }, [preferences, projection, providerPreferences, sections, sourceLabel]);\n const capturePrimary = React.useCallback((scope: TransferScope, signal: AbortSignal) => captureOne(primary, scope, signal, true), [captureOne, primary]);\n workspaceCaptures.current.set(primaryWorkspaceKey, capturePrimary);\n if (nearestWorkspaceKey && nearestSurface) workspaceCaptures.current.set(nearestWorkspaceKey, (scope, signal) => captureOne(nearestSurface, scope, signal, true));\n for (const variant of variants) {\n const key = variantWorkspaceKeys.get(variant.id)!;\n workspaceCaptures.current.set(key, (scope, signal) => captureOne(variant.source, scope, signal, true));\n }\n\n const preflight = React.useCallback(async (scope = initialScope) => {\n const { controller, id } = fence.begin(); setMenuCapture(null); setMenuStatus(\"loading\");\n try { const result = await captureOne(primary, scope, controller.signal, true, false); if (fence.valid(id, controller)) { setMenuCapture(result); setMenuStatus(\"idle\"); } }\n catch (error) { if (fence.valid(id, controller)) { setMenuCapture(null); setMenuStatus(errorMessage(error, \"Could not inspect content\")); } }\n finally { fence.finish(controller); }\n }, [captureOne, fence, initialScope, primary]);\n\n const closePalette = React.useCallback(() => {\n const onClose = externalPaletteClose.current;\n const restoreFocus = externalPaletteRestoreFocus.current;\n externalPaletteClose.current = null;\n externalPaletteRestoreFocus.current = null;\n onClose?.();\n restoreFocus?.();\n setPaletteTarget(null);\n setPaletteOpen(false);\n }, []);\n const mountPalette = React.useCallback((target: HTMLElement | null, onClose?: () => void, restoreFocus?: () => void) => {\n if (!target) {\n // Host cleanup (submenu replacement, mobile drilldown back) must detach\n // without asking that host to close a second time.\n externalPaletteClose.current = null;\n externalPaletteRestoreFocus.current = null;\n setPaletteTarget(null);\n setPaletteOpen(false);\n return;\n }\n if (!enabled) throw new Error(\"Alchemy is not enabled for this record.\");\n if (disabled) throw new Error(\"Alchemy is disabled for this record.\");\n externalPaletteClose.current = onClose ?? null;\n externalPaletteRestoreFocus.current = restoreFocus ?? null;\n feedbackDocument.current = target.ownerDocument;\n restoreFocusRef.current = restoreFocus ?? (() => target.focus());\n setPaletteTarget(target);\n setPaletteOpen(true);\n setMode(\"copy\");\n void preflight();\n }, [closePalette, disabled, enabled, preflight]);\n React.useEffect(() => {\n if (!paletteTarget || !paletteOpen) return;\n const firstControl = paletteTarget.querySelector<HTMLElement>(\"button:not([disabled]), select:not([disabled]), input:not([disabled]), textarea:not([disabled]), [href]\");\n firstControl?.focus();\n }, [paletteOpen, paletteTarget]);\n\n const transfer = React.useCallback(async (format: BuiltInFormat | FormatAdapter, download: boolean, alternate?: TransferMenuVariant) => {\n const { controller, id } = fence.begin();\n try {\n const explicit = alternate?.source ?? (typeof format === \"string\" && format !== \"xlsx\" ? formatSources?.[format] : undefined);\n const result = await (explicit ? captureOne(explicit, initialScope, controller.signal, true) : capturePrimary(initialScope, controller.signal));\n if (result.collectionError) throw new Error(`The complete source could not be collected: ${result.collectionError}`);\n if (result.snapshot.coverage.status !== \"complete\" || result.snapshot.omissions.length > 0) {\n const reason = result.snapshot.coverage.reason ?? `${result.snapshot.omissions.length} omission${result.snapshot.omissions.length === 1 ? \"\" : \"s\"}`;\n throw new Error(`Quick transfer is partial (${reason}). Open Prepare for AI to review it before delivery.`);\n }\n const resolved = resolveTransferPreferences(providerPreferences, preferences, result.snapshot.limits);\n const draft = applyTransferLimits(createDraft(result.snapshot), resolved.limits); const revision = draft.revision;\n if (draft.omissions.length > result.snapshot.omissions.length) throw new Error(\"Quick transfer requires content reductions. Open Prepare for AI to review them before delivery.\");\n const artifact = typeof format === \"string\" ? await buildArtifact(draft, format, result.snapshot.label) : await format.build(draft, controller.signal);\n if (artifact.omissions.length > draft.omissions.length) throw new Error(`Quick format requires ${artifact.omissions.length - draft.omissions.length} adjustment${artifact.omissions.length - draft.omissions.length === 1 ? \"\" : \"s\"}. Open Prepare for AI to review before delivery.`);\n if (!fence.valid(id, controller) || artifact.snapshotId !== result.snapshot.id || artifact.draftRevision !== revision) return;\n const outcome = await transport[download ? \"download\" : \"copy\"](artifact, controller.signal);\n if (fence.valid(id, controller)) report(outcome.status === \"success\" && alternate?.successMessage ? { ...outcome, message: alternate.successMessage } : outcome);\n } catch (error) { if (fence.valid(id, controller)) report({ status: \"error\", code: \"prepare-failed\", message: errorMessage(error, \"Preparation failed\"), retryable: true }); }\n finally { fence.finish(controller); }\n }, [captureOne, capturePrimary, fence, formatSources, initialScope, preferences, providerPreferences, report, transport]);\n\n const openWorkspace = React.useCallback(\n async (\n key = primaryWorkspaceKey,\n variant?: { source: Source | Payload | SurfaceHandle; label: string },\n ) => {\n const variantMaterial =\n variant && \"kind\" in variant.source\n ? ({\n id: `variant:${key}`,\n label: variant.label,\n capture: async () =>\n directSource(variant.source as Payload, {\n sourceId: `variant:${key}`,\n label: variant.label,\n }),\n } satisfies Source)\n : variant?.source;\n const captureWorkspace = (\n scope: TransferScope,\n signal: AbortSignal,\n collectPages = true,\n ) =>\n captureOne(variantMaterial ?? primary, scope, signal, true, collectPages);\n workspaceCaptures.current.set(key, captureWorkspace);\n const existing = workspaces[key];\n const { controller, id } = fence.begin();\n if (existing) {\n try {\n const scopeChanged = existing.scope !== initialScope;\n const allMatching = initialScope === \"all-matching\";\n const fresh = await captureWorkspace(\n initialScope,\n controller.signal,\n scopeChanged || !allMatching,\n );\n if (!fence.valid(id, controller) || !workspaceCaptures.current.has(key))\n return;\n if (allMatching && (!fresh.allMatching || (!scopeChanged && !existing.allMatching)))\n throw new Error(\n \"This source can no longer provide an all-matching snapshot.\",\n );\n const collectionIdentity = (value: BoundAllMatching | undefined) =>\n value && {\n query: value.source.query,\n projection: value.projection,\n columns: value.columns,\n limits: value.limits,\n };\n const changed = scopeChanged || (allMatching\n ? JSON.stringify(collectionIdentity(existing.allMatching)) !==\n JSON.stringify(collectionIdentity(fresh.allMatching))\n : snapshotContent(existing.snapshot) !==\n snapshotContent(fresh.snapshot));\n setWorkspaces((current) => {\n const retained = current[key];\n if (!retained) return current;\n return {\n ...current,\n [key]: {\n ...retained,\n error: fresh.collectionError,\n ...(allMatching && !scopeChanged\n ? { sourceStale: changed }\n : changed\n ? { pending: { ...fresh, scope: initialScope } }\n : { pending: undefined }),\n },\n };\n });\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n } catch (error) {\n if (fence.valid(id, controller) && workspaceCaptures.current.has(key)) {\n setWorkspaces((current) =>\n current[key]\n ? {\n ...current,\n [key]: {\n ...current[key]!,\n error: errorMessage(error, \"Could not refresh source\"),\n },\n }\n : current,\n );\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n }\n } finally {\n fence.finish(controller);\n }\n return;\n }\n try {\n const result = await captureWorkspace(initialScope, controller.signal);\n if (!fence.valid(id, controller)) return;\n const resolved = resolveTransferPreferences(\n providerPreferences,\n preferences,\n result.snapshot.limits,\n );\n const original = createDraft(result.snapshot);\n const base: WorkspaceState = {\n ...result,\n key,\n original,\n draft: original,\n scope: initialScope,\n preferences: resolved,\n ...(result.collectionError ? { error: result.collectionError } : {}),\n };\n setWorkspaces((current) => ({\n ...current,\n [key]: { ...base, draft: rebuild(base, initialControls(base)) },\n }));\n setWorkspaceKey(key);\n setWorkspaceOpen(true);\n } catch (error) {\n if (fence.valid(id, controller))\n setReceiptTarget(undefined); setNotice(errorMessage(error, \"Could not capture content\"));\n } finally {\n fence.finish(controller);\n }\n },\n [\n captureOne,\n capturePrimary,\n fence,\n initialScope,\n preferences,\n primaryWorkspaceKey,\n primary,\n providerPreferences,\n workspaces,\n ],\n );\n React.useImperativeHandle(controllerRef, () => ({\n focusTrigger: () => triggerRef.current?.focus(),\n mountPalette,\n preparePrimary: async (options) => {\n if (!enabled) throw new Error(\"Alchemy is not enabled for this record.\");\n if (disabled) throw new Error(\"Alchemy is disabled for this record.\");\n if (hide.includes(\"prepare\")) throw new Error(\"Alchemy preparation is unavailable for this record.\");\n if (!primary) throw new Error(\"Alchemy has no source to prepare.\");\n restoreFocusRef.current = options?.restoreFocus ?? null;\n await openWorkspace(primaryWorkspaceKey, { source: primary, label: sourceLabel });\n },\n prepare: async (requestedSource, options) => {\n const requestedLabel = options?.label ?? (\"label\" in requestedSource ? requestedSource.label : \"content\");\n const requestedKey = `controller:${options?.id ?? \"source\"}:${materialIdentity(requestedSource)}`;\n externalWorkspaceKeys.current.add(requestedKey);\n await openWorkspace(requestedKey, { source: requestedSource, label: requestedLabel });\n },\n }), [disabled, enabled, hide, mountPalette, openWorkspace, primary, primaryWorkspaceKey, sourceLabel]);\n\n const runAction = React.useCallback(async (action: PageAction) => {\n const { controller, id } = fence.begin();\n try { const actionSource = (action as PageAction & { source?: Source }).source; const { snapshot } = actionSource ? await captureOne(actionSource, initialScope, controller.signal, true) : await capturePrimary(initialScope, controller.signal); const resolved = resolveTransferPreferences(providerPreferences, preferences, snapshot.limits); const draft = applyTransferLimits(createDraft(snapshot), resolved.limits); if (snapshot.coverage.status !== \"complete\" || draft.omissions.length) throw new Error(\"This content is partial or requires reductions. Open Prepare for AI to review it before sending it to a destination.\"); if (!action.supports(snapshot, draft)) throw new Error(`${action.label} is unavailable for this content.`); const result = await action.run({ snapshot, draft, signal: controller.signal }); if (fence.valid(id, controller) && draft.snapshotId === snapshot.id) report(result); }\n catch (error) { if (fence.valid(id, controller)) report({ status: \"error\", code: \"action-failed\", message: errorMessage(error, \"Action failed\"), retryable: true }); }\n finally { fence.finish(controller); }\n }, [captureOne, capturePrimary, fence, initialScope, preferences, providerPreferences, report]);\n\n const copyReference = async (reference: ContentTransferReference) => {\n const { controller, id } = fence.begin();\n closePalette();\n try {\n if (!referencePort?.supports(reference)) throw new Error(\"This reference is not registered or its identity is incomplete.\");\n const text = await referencePort.build(reference);\n if (!text.trim()) throw new Error(\"The reference serializer returned no content.\");\n const artifact = sealTransferArtifact({ snapshotId: `reference:${reference.id}`, draftRevision: 0, format: \"matrx-reference\", plainText: text, omissions: [] });\n if (!fence.valid(id, controller)) return;\n const outcome = await transport.copy(artifact, controller.signal);\n if (fence.valid(id, controller)) report(outcome);\n } catch (error) { if (fence.valid(id, controller)) report({status: \"error\", code: \"reference-failed\", message: errorMessage(error, \"Could not copy reference\"), retryable: true}); }\n finally { fence.finish(controller); }\n };\n const openReference = async (action: ContentTransferReferenceAction) => {\n closePalette();\n try { await action.run(); }\n catch (error) { report({status: \"error\", code: \"reference-failed\", message: errorMessage(error, \"Could not open reference picker\"), retryable: true}); }\n };\n if (!enabled) return null;\n const payload = menuCapture?.snapshot.payload ?? (source && \"kind\" in source ? source : undefined);\n const quickVariants = (section: \"copy\" | \"ai\") => variants.filter((v) => v.copyLabel && (v.section ?? \"ai\") === section);\n const visibleCopies = sourceFormats ? COPIES.filter((f) => Boolean(formatSources?.[f]) || ![\"csv\", \"tsv\"].includes(f) || payload?.kind === \"rows\") : [];\n const visibleDownloads = sourceFormats ? DOWNLOADS.filter((f) => (f !== \"xlsx\" && Boolean(formatSources?.[f])) || ![\"csv\", \"tsv\", \"xlsx\"].includes(f) || payload?.kind === \"rows\") : [];\n const visibleAdapters = sourceFormats && menuCapture ? adapters.filter((a) => a.supports(menuCapture.snapshot.payload)) : [];\n const visibleActions = menuCapture ? registeredActions.filter((a) => a.supports(menuCapture.snapshot, applyTransferLimits(createDraft(menuCapture.snapshot), resolveTransferPreferences(providerPreferences, preferences, menuCapture.snapshot.limits).limits))) : [];\n const downloadActions = visibleActions.filter((action) => (action as TransferMenuPresentation).placement === \"download\");\n const ordinaryActions = visibleActions.filter((action) => (action as TransferMenuPresentation).placement !== \"download\");\n const preparedActions = registeredActions.filter((action) => (action as TransferMenuPresentation).prepared && !action.source);\n const copyAvailable = !hide.includes(\"copy\") && (visibleCopies.length + visibleAdapters.length + quickVariants(\"copy\").length > 0);\n const downloadAvailable = !hide.includes(\"download\") && (visibleDownloads.length + visibleAdapters.length + downloadActions.length > 0);\n const prepareAvailable = !hide.includes(\"prepare\") && (quickVariants(\"ai\").length > 0 || Boolean(primary) || Boolean(nearestWorkspaceKey) || variants.length > 0);\n const resolvedMode = mode === \"copy\" && !copyAvailable ? \"download\" : mode === \"download\" && !downloadAvailable ? \"copy\" : mode;\n const nativeAiFormat: FormatAdapter = {\n id: \"ai-context\", label: \"AI context\", supports: () => true,\n build: async (draft) => {\n const json = serialize(draft, \"json\");\n return sealTransferArtifact({ snapshotId: draft.snapshotId, draftRevision: draft.revision, format: \"ai-context\", plainText: buildAgentPayload({ kind: \"matrx_content\", location: sourceLabel, description: \"Captured content for an assistant\", data: JSON.parse(json.plainText), attributes: { source: draft.sourceId } }), omissions: [...json.omissions] });\n },\n };\n const tile = (id: string, label: string, onClick: () => void, options: { custom?: boolean; action?: PageAction; ai?: boolean; file?: boolean; ariaLabel?: string } = {}) => {\n const presentation = options.action as TransferMenuPresentation | undefined;\n const Icon = presentation?.icon;\n const fallbackLabel = options.file && !/^download\\b/i.test(label) ? `Download ${label}` : label;\n return <button key={id} type=\"button\" className=\"matrx-alchemy-palette-tile\" title={id === \"table-data\" ? \"JSON using column display names\" : id === \"table-schema\" ? \"Table schema and rows\" : label} aria-label={presentation?.ariaLabel ?? (presentation ? fallbackLabel : options.ariaLabel ?? `${resolvedMode === \"copy\" ? \"Copy\" : \"Download\"} ${label}`)} onClick={() => { closePalette(); onClick(); }}>{Icon ? <Icon className=\"matrx-alchemy-menu-icon\"/> : <PaletteGlyph format={id} ai={Boolean(options.ai)} file={options.file || Boolean(options.custom && id !== \"table-data\" && id !== \"table-schema\")}/>}<span>{label}{presentation?.hint ? <small className=\"matrx-alchemy-menu-hint\">{presentation.hint}</small> : null}</span></button>;\n };\n const palette = <>\n {menuStatus === \"loading\" ? <p className=\"matrx-alchemy-palette-status\">Inspecting content…</p> : menuStatus !== \"idle\" ? <p className=\"matrx-alchemy-error\">{menuStatus}</p> : null}\n {table && scopes.length > 1 ? <label className=\"matrx-alchemy-scope\">Content scope<select aria-label=\"Content scope\" value={initialScope} onChange={(event) => { const next = scopes.find((scope) => scope === event.target.value); if (next) { setRequestedScope(next); void preflight(next); } }}>{scopes.map((scope) => <option key={scope} value={scope}>{table.scopeLabels?.[scope] ?? SCOPE_LABEL[scope]}</option>)}</select></label> : null}\n {copyAvailable || downloadAvailable ? <section className=\"matrx-alchemy-output\"><h3>{resolvedMode === \"copy\" ? \"Copy as\" : \"Download as\"}</h3>{copyAvailable && downloadAvailable ? <div className=\"matrx-alchemy-mode\" aria-label=\"Output action\"><button type=\"button\" aria-label=\"Copy mode\" aria-pressed={resolvedMode === \"copy\"} onClick={() => setMode(\"copy\")}>Copy</button><button type=\"button\" aria-label=\"Download mode\" aria-pressed={resolvedMode === \"download\"} onClick={() => setMode(\"download\")}>Download</button></div> : null}\n {resolvedMode === \"copy\" && copyAvailable ? <><div className=\"matrx-alchemy-palette-grid\">{visibleCopies.map((format) => tile(format, ({ plain: \"Text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact\", csv: \"CSV\", tsv: \"Sheets\" } as Record<SerializableFormat, string>)[format]!, () => void transfer(format, false), { ariaLabel: `Copy ${LABEL[format]}` }))}{visibleAdapters.map((adapter) => tile(adapter.id, adapter.label, () => void transfer(adapter, false), { custom: true }))}</div>{quickVariants(\"copy\").length ? <PaletteRows title=\"Quick copy\" items={quickVariants(\"copy\")} onRun={(variant) => { closePalette(); void transfer(\"markdown\", false, variant); }}/>: null}</> : null}\n {resolvedMode === \"download\" && downloadAvailable ? <><div className=\"matrx-alchemy-palette-grid\">{visibleDownloads.map((format) => tile(format, ({ plain: \"Text\", markdown: \"Markdown\", html: \"Formatted\", json: \"JSON\", \"compact-json\": \"Compact\", csv: \"CSV\", tsv: \"Sheets\", xlsx: \"Excel\" } as Record<BuiltInFormat, string>)[format]!, () => void transfer(format, true), { ariaLabel: `Download ${LABEL[format]}` }))}{visibleAdapters.map((adapter) => tile(adapter.id, adapter.label, () => void transfer(adapter, true), { custom: true }))}{downloadActions.map((action) => tile(action.id, action.label, () => void runAction(action), { custom: true, action, file: true }))}</div></> : null}</section> : null}\n {prepareAvailable ? <><PaletteRows title=\"Copy for AI\" ai glyphKind=\"ai-copy\" fallbackHint=\"Copies immediately\" extra={sourceFormats ? <button type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => { closePalette(); void transfer(nativeAiFormat, false); }}><PaletteGlyph kind=\"ai-copy\"/><span>Copy with AI context<small className=\"matrx-alchemy-menu-hint\">Include source context</small></span></button> : null} items={quickVariants(\"ai\")} onRun={(variant) => { closePalette(); void transfer(\"markdown\", false, variant); }}/><PaletteRows title=\"Edit and prepare\" items={[]} extra={<button type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label=\"Prepare for AI\" onClick={() => { closePalette(); void openWorkspace(); }}><PaletteGlyph kind=\"sliders\"/><span>Prepare for AI<small className=\"matrx-alchemy-menu-hint\">Trim, edit or summarize</small></span></button>}/></>: null}\n {prepareAvailable && (nearestWorkspaceKey || variants.length) ? <PaletteRows title=\"Other sources\" items={[]} extra={<>{nearestWorkspaceKey && nearestSurface ? <button type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => { closePalette(); void openWorkspace(nearestWorkspaceKey, { source: nearestSurface, label: nearestSurface.surfaceName }); }}><PaletteGlyph kind=\"surface\"/><span>Prepare this page</span></button> : null}{variants.map((variant) => <button key={variant.id} type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label={variant.ariaLabel} onClick={() => { closePalette(); void openWorkspace(variantWorkspaceKeys.get(variant.id)!, variant); }}><MenuPresentation {...variant} label={`Prepare ${variant.label}`}/></button>)}</>}/>: null}\n {references.length || referenceActions.length ? <section className=\"matrx-alchemy-palette-section\"><h3>References</h3>{referenceActions.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" onClick={() => void openReference(action)}><PaletteGlyph kind=\"link\"/><span>{action.label}</span><svg className=\"matrx-alchemy-disclosure\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\"/></svg></button>)}{references.map((reference) => <button key={reference.id} type=\"button\" className=\"matrx-alchemy-palette-row\" title=\"Copies a reference to saved data\" onClick={() => void copyReference(reference)}><PaletteGlyph kind=\"link\"/><span>{reference.label}</span></button>)}</section> : null}\n {([\"save\", \"chat\", \"email\", \"other\"] as const).map((group) => { const entries = ordinaryActions.filter((action) => ((action as TransferMenuPresentation).group ?? \"other\") === group); return entries.length ? <details key={group} className=\"matrx-alchemy-palette-destinations\"><summary>{group === \"save\" ? \"Save to Matrx\" : group === \"chat\" ? \"Continue with AI\" : group === \"email\" ? \"Email to me\" : \"Actions\"}<span className=\"matrx-alchemy-disclosure-meta\"><span>{entries.length}</span><svg className=\"matrx-alchemy-disclosure\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" aria-hidden=\"true\"><path d=\"m6 4 4 4-4 4\"/></svg></span></summary><div>{entries.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" aria-label={(action as TransferMenuPresentation).ariaLabel} onClick={() => { closePalette(); void runAction(action); }}><DestinationPresentation action={action}/></button>)}</div></details> : null; })}\n </>;\n const feedbackOwner = paletteTarget ?? triggerRef.current ?? feedbackDocument.current?.body ?? null;\n return <span className={cn(\"matrx-alchemy\", className)} onClick={stopPropagation ? (event) => event.stopPropagation() : undefined}>\n {!triggerHidden && !paletteTarget ? <Popover open={paletteOpen} onOpenChange={(open) => { if (open) { setPaletteOpen(true); setMode(\"copy\"); void preflight(); } else closePalette(); }}><PopoverTrigger asChild>{triggerVariant === \"outline\" ? <Button ref={triggerRef} variant=\"outline\" size=\"icon-sm\" aria-label={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"outline\" disabled={disabled}><AlchemyGlyph icon={icon}/></Button> : triggerVariant === \"glass\" ? <TapTargetButton ref={triggerRef} icon={<AlchemyGlyph icon={icon}/>} tooltip={false} ariaLabel={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"glass\" data-alchemy-size={triggerSize} disabled={disabled} /> : <TapTargetButtonTransparent ref={triggerRef} icon={<AlchemyGlyph icon={icon}/>} tooltip={false} ariaLabel={`Copy, transform or export ${sourceLabel}`} data-alchemy-trigger=\"transparent\" data-alchemy-size={triggerSize} disabled={disabled} />}</PopoverTrigger><PopoverContent align=\"end\" className=\"matrx-alchemy-menu matrx-alchemy-palette\" aria-label=\"Alchemy output options\" onCloseAutoFocus={() => triggerRef.current?.focus()}>{palette}</PopoverContent></Popover> : null}\n {paletteTarget && paletteOpen ? createPortal(<div className=\"matrx-alchemy-menu matrx-alchemy-palette\" role=\"dialog\" aria-label=\"Alchemy output options\">{palette}</div>, paletteTarget) : null}\n {notice && feedbackOwner ? createPortal(<div className=\"matrx-alchemy-feedback\"><span role=\"status\">{notice}</span><ReceiptLink target={receiptTarget}/><button type=\"button\" aria-label=\"Dismiss Alchemy feedback\" onClick={() => setNotice(null)}>×</button></div>, feedbackOwner.ownerDocument.body) : null}\n {Object.values(workspaces).map((saved) => <PreparationWorkspace restoreFocus={() => restoreFocusRef.current?.() ?? triggerRef.current?.focus()} key={saved.key} open={workspaceOpen && workspaceKey === saved.key} state={saved} scopes={scopes} scopeLabels={table?.scopeLabels} onClose={() => setWorkspaceOpen(false)} onChange={(next) => setWorkspaces((current) => ({ ...current, [saved.key]: next }))} transport={transport} adapters={adapters} actions={preparedActions} captureScope={workspaceCaptures.current.get(saved.key) ?? capturePrimary} {...(ai ? { ai } : {})} onOutcome={report}/>)}\n {emailReview}\n </span>;\n}\n\ntype Preset = \"full\" | \"compact\" | \"brief\" | \"custom\";\ntype Controls = {\n preset: Preset;\n sections: string[];\n search: string;\n filters: Record<string, string>;\n sort: string;\n direction: \"asc\" | \"desc\";\n top: number | null;\n visibleColumns: string[];\n selectedOnly: boolean;\n selectedIndices: number[];\n maxDepth: number | null;\n maxStringChars: number | null;\n maxArrayItems: number | null;\n};\n\nfunction initialControls(state: WorkspaceState): Controls {\n const rows = state.original.payload.kind === \"rows\" ? state.original.payload : null;\n return {\n preset: state.preferences.initialPreset,\n sections: state.snapshot.sections.filter((s) => s.includedByDefault).map((s) => s.id),\n search: \"\", filters: {}, sort: \"\", direction: \"asc\",\n top: state.preferences.limits.maxRows,\n visibleColumns: rows?.columns.filter((c) => c.visible).map((c) => c.id) ?? [],\n selectedOnly: false, selectedIndices: [],\n maxDepth: state.preferences.limits.maxDepth,\n maxStringChars: state.preferences.limits.maxStringChars,\n maxArrayItems: state.preferences.limits.maxArrayItems ?? null,\n };\n}\nfunction presetLimits(preset: Preset, controls: Controls, preferences: TransferPreferences) {\n const min = (choice: number | null, cap: number | null) => choice == null ? cap : cap == null ? choice : Math.min(choice, cap);\n if (preset === \"full\") return preferences.limits;\n const request = preset === \"brief\" ? { maxDepth: 4, maxStringChars: 800, maxArrayItems: 25 } : preset === \"compact\" ? { maxDepth: 8, maxStringChars: 4000, maxArrayItems: 100 } : { maxDepth: controls.maxDepth, maxStringChars: controls.maxStringChars, maxArrayItems: controls.maxArrayItems };\n return { ...preferences.limits, maxDepth: min(request.maxDepth, preferences.limits.maxDepth), maxStringChars: min(request.maxStringChars, preferences.limits.maxStringChars), maxArrayItems: min(request.maxArrayItems, preferences.limits.maxArrayItems ?? null) };\n}\nfunction rebuild(state: WorkspaceState, controls: Controls): Draft {\n let draft = resetDraft(state.snapshot);\n if (state.snapshot.sections.length) draft = applySectionSelection(draft, state.snapshot, controls.sections);\n if (draft.payload.kind === \"rows\") draft = transformRows(draft, {\n search: controls.search,\n filters: controls.filters,\n ...(controls.sort ? { sort: { column: controls.sort, direction: controls.direction } } : {}),\n ...(controls.selectedOnly ? { selectedIndices: controls.selectedIndices } : {}),\n visibleColumns: controls.visibleColumns,\n structuredProjection: \"visible\",\n top: controls.top,\n });\n const limits = presetLimits(controls.preset, controls, state.preferences);\n if (draft.payload.kind === \"json\" || draft.payload.kind === \"registered\") {\n draft = reduceJson(draft, { maxDepth: limits.maxDepth, maxStringChars: limits.maxStringChars, maxArrayItems: limits.maxArrayItems ?? null });\n }\n return applyTransferLimits(draft, limits);\n}\nfunction isBuiltInFormat(format: string): format is BuiltInFormat { return format in LABEL; }\nfunction preview(draft: Draft, format: string) {\n const resolved = isBuiltInFormat(format) ? format : \"plain\";\n return serialize(draft, resolved === \"xlsx\" ? \"tsv\" : resolved, { spreadsheetSafe: resolved === \"csv\" || resolved === \"tsv\" || resolved === \"xlsx\" }).plainText;\n}\n\nfunction PreparationWorkspace({ restoreFocus, open, state, scopes, scopeLabels, onClose, onChange, transport, ai, adapters, actions, onOutcome, captureScope }: {\n restoreFocus: () => void;\n open: boolean;\n state: WorkspaceState;\n scopes: TransferScope[];\n scopeLabels?: Partial<Record<TransferScope, string>> | undefined;\n onClose: () => void;\n onChange: (next: WorkspaceState) => void;\n transport: Transport;\n ai?: AiPreparation;\n adapters: FormatAdapter[];\n actions: PageAction[];\n onOutcome: (outcome: TransferOutcome) => void;\n captureScope: (scope: TransferScope, signal: AbortSignal) => Promise<CaptureResult>;\n}) {\n const fence = useFence();\n const latest = React.useRef(state); latest.current = state;\n const aiSession = React.useRef<AiPreparation | undefined>(undefined);\n if (!aiSession.current && ai) aiSession.current = ai.fork?.() ?? ai;\n const [controls, setControls] = React.useState(() => initialControls(state));\n const [controlsHistory, setControlsHistory] = React.useState<Controls[]>([]);\n const [pendingControls, setPendingControls] = React.useState<Controls | null>(null);\n const requestedFormat = state.preferences.initialFormat;\n const [format, setFormat] = React.useState<string>(() => isBuiltInFormat(requestedFormat) ? (supportsBuiltIn(requestedFormat, state.draft.payload) ? requestedFormat : \"plain\") : adapters.some((adapter) => adapter.id === requestedFormat && adapter.supports(state.draft.payload)) ? requestedFormat : \"plain\");\n const [buffer, setBuffer] = React.useState(() => isBuiltInFormat(format) ? preview(state.draft, format) : \"Preparing format preview…\");\n const [bufferError, setBufferError] = React.useState<string | null>(null);\n const [formatError, setFormatError] = React.useState<string | null>(null);\n const [preparedArtifact, setPreparedArtifact] = React.useState<Artifact | null>(null);\n const [instruction, setInstruction] = React.useState(\"\");\n const [busy, setBusy] = React.useState<\"ai\" | \"capture\" | \"copy\" | \"download\" | \"action\" | null>(null);\n const [aiFailed, setAiFailed] = React.useState(false);\n React.useEffect(() => { setAiFailed(false); }, [state.snapshot.id, state.draft.revision]);\n const handingOff = React.useRef(false);\n React.useEffect(() => { if (open) handingOff.current = false; }, [open]);\n const activeAi = React.useRef<AbortController | null>(null);\n const activeCapture = React.useRef<AbortController | null>(null);\n\n React.useEffect(() => {\n if (bufferError) return;\n const adapter = adapters.find((candidate) => candidate.id === format);\n const controller = new AbortController();\n const snapshotId = state.snapshot.id; const revision = state.draft.revision;\n setPreparedArtifact(null); setFormatError(null);\n if (adapter) setBuffer(\"Preparing format preview…\");\n const artifactPromise = adapter ? adapter.build(state.draft, controller.signal) : buildArtifact(state.draft, isBuiltInFormat(format) ? format : \"plain\", state.snapshot.label);\n void artifactPromise.then((artifact) => {\n if (!controller.signal.aborted && artifact.snapshotId === snapshotId && artifact.draftRevision === revision) { setPreparedArtifact(artifact); setBuffer(artifact.plainText); }\n }).catch((error) => { if (!controller.signal.aborted) setFormatError(errorMessage(error, \"Format preview failed\")); });\n return () => controller.abort();\n }, [adapters, bufferError, format, state.draft, state.snapshot.id]);\n const close = React.useCallback(() => { activeAi.current?.abort(); activeCapture.current?.abort(); activeAi.current = null; activeCapture.current = null; fence.abortAll(); setBusy(null); onClose(); }, [fence, onClose]);\n const changeControls = (next: Controls) => {\n if (state.draft.manuallyEdited) { setPendingControls(next); return; }\n setControlsHistory((history) => [...history, controls]); setControls(next); onChange({ ...state, draft: rebuild(state, next), error: undefined });\n };\n const applyPendingControls = () => {\n if (!pendingControls) return;\n setControlsHistory((history) => [...history, controls]); setControls(pendingControls); setBufferError(null);\n onChange({ ...state, draft: rebuild(state, pendingControls), error: undefined });\n setPendingControls(null);\n };\n const editBuffer = (text: string) => {\n setBuffer(text);\n setPreparedArtifact(null); setFormatError(null);\n const payload = state.draft.payload;\n if (payload.kind === \"json\" || payload.kind === \"registered\") {\n try {\n const value = JSON.parse(text) as Json;\n const next: Payload = payload.kind === \"json\" ? { kind: \"json\", value } : { kind: \"registered\", format: payload.format, value };\n setBufferError(null); onChange({ ...state, draft: editDraft(state.draft, next), error: undefined });\n } catch { setBufferError(\"JSON is incomplete or invalid. Fix it before copying or downloading.\"); }\n return;\n }\n setBufferError(null);\n const kind = payload.kind === \"markdown\" || format === \"markdown\" ? \"markdown\" : \"text\";\n if (payload.kind === \"rows\" || !isBuiltInFormat(format)) setFormat(\"plain\");\n onChange({ ...state, draft: editDraft(state.draft, { kind, text }), error: undefined });\n };\n\n const requestCapture = async (scope: TransferScope) => {\n activeCapture.current?.abort();\n const { controller, id } = fence.begin(); activeCapture.current = controller; const revision = state.draft.revision; setBusy(\"capture\");\n try {\n const result = await captureScope(scope, controller.signal);\n if (fence.valid(id, controller) && latest.current.draft.revision === revision) onChange({ ...latest.current, pending: { ...result, scope }, sourceStale: false, error: result.collectionError });\n } catch (error) { if (fence.valid(id, controller)) onChange({ ...latest.current, error: errorMessage(error, \"Refresh failed\") }); }\n finally { fence.finish(controller); if (activeCapture.current === controller) activeCapture.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const resolveCapture = (choice: \"keep\" | \"regenerate\") => {\n if (!state.pending) return;\n if (choice === \"keep\") { const { pending: _pending, ...kept } = state; onChange({ ...kept, error: undefined }); return; }\n const pending = state.pending;\n const preferences = resolveTransferPreferences({}, state.preferences, pending.snapshot.limits);\n const base: WorkspaceState = { ...pending, key: state.key, original: createDraft(pending.snapshot), draft: createDraft(pending.snapshot), scope: pending.scope, preferences, ...(pending.collectionError ? { error: pending.collectionError } : {}) };\n const nextControls = initialControls(base); setControls(nextControls); setControlsHistory([]); setPendingControls(null); setBufferError(null);\n onChange({ ...base, draft: rebuild(base, nextControls) });\n };\n\n const runAi = async (recover = false) => {\n const adapter = aiSession.current;\n if (!adapter || !adapter.supports(state.snapshot) || (!recover && !instruction.trim()) || (recover && !adapter.recover)) return;\n activeAi.current?.abort();\n const { controller, id } = fence.begin(); activeAi.current = controller;\n const snapshotId = state.snapshot.id; const revision = state.draft.revision; setBusy(\"ai\"); setAiFailed(false);\n try {\n const next = recover ? await adapter.recover!({ snapshot: state.snapshot, draft: state.draft, signal: controller.signal }) : await adapter.run({ snapshot: state.snapshot, draft: state.draft, instruction, signal: controller.signal });\n const current = latest.current;\n if (!fence.valid(id, controller) || current.snapshot.id !== snapshotId || current.draft.revision !== revision || next.snapshotId !== snapshotId || next.sourceId !== state.draft.sourceId || next.sourceRevision !== state.draft.sourceRevision || next.revision <= revision) return;\n try { serialize(next, \"plain\"); } catch { onChange({ ...current, error: \"AI returned an invalid transfer draft.\" }); setAiFailed(true); return; }\n onChange({ ...current, draft: next, error: undefined }); setBufferError(null);\n } catch (error) {\n if (!isAbort(error) && fence.valid(id, controller)) { setAiFailed(true); onChange({ ...latest.current, error: errorMessage(error, \"AI preparation failed\") }); }\n } finally { fence.finish(controller); if (activeAi.current === controller) activeAi.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const cancelAi = async () => {\n const aiController = activeAi.current;\n const { controller, id } = fence.begin();\n try { await aiSession.current?.cancel?.(); }\n catch (error) { if (fence.valid(id, controller)) onChange({ ...latest.current, error: errorMessage(error, \"AI cancellation failed\") }); }\n finally { aiController?.abort(); fence.finish(controller); if (activeAi.current === aiController) activeAi.current = null; if (fence.valid(id, controller)) setBusy(null); }\n };\n const [deliveryNotice, setDeliveryNotice] = React.useState<string | null>(null);\n React.useEffect(() => { setDeliveryNotice(null); }, [state.draft.revision]);\n const reportDelivery = (outcome: TransferOutcome) => { setDeliveryNotice(outcomeMessage(outcome)); onOutcome(outcome); };\n const deliver = async (download: boolean) => {\n if (bufferError) return;\n const { controller, id } = fence.begin(); const snapshotId = state.snapshot.id; const revision = state.draft.revision; setBusy(download ? \"download\" : \"copy\");\n try {\n if (!preparedArtifact) throw new Error(\"Wait for the selected format preview before delivery.\");\n const artifact = preparedArtifact;\n const current = latest.current;\n if (!fence.valid(id, controller) || current.snapshot.id !== snapshotId || current.draft.revision !== revision || artifact.snapshotId !== snapshotId || artifact.draftRevision !== revision) return;\n const result = await transport[download ? \"download\" : \"copy\"](artifact, controller.signal);\n if (fence.valid(id, controller)) reportDelivery(result);\n } catch (error) { if (fence.valid(id, controller)) reportDelivery({ status: \"error\", code: \"prepare-failed\", message: errorMessage(error, \"Preparation failed\"), retryable: true }); }\n finally { fence.finish(controller); if (fence.valid(id, controller)) setBusy(null); }\n };\n\n const deliverAction = async (action: PageAction) => {\n if (busy || bufferError || formatError || !preparedArtifact) return;\n const { controller, id } = fence.begin();\n const current = latest.current;\n setBusy(\"action\");\n try {\n if (!action.supports(current.snapshot, current.draft)) throw new Error(`${action.label} is unavailable for this prepared content.`);\n // Release the preparation focus trap before a host opens its destination.\n // This component remains mounted, retaining the exact edited revision.\n handingOff.current = true;\n flushSync(() => onClose());\n const result = await action.run({ snapshot: current.snapshot, draft: current.draft, signal: controller.signal });\n if (fence.valid(id, controller)) reportDelivery(result);\n } catch (error) {\n if (fence.valid(id, controller)) reportDelivery({ status: \"error\", code: \"destination-failed\", message: errorMessage(error, \"Could not deliver prepared content\"), retryable: false });\n } finally { fence.finish(controller); if (fence.valid(id, controller)) setBusy(null); }\n };\n const eligibleActions = actions.filter((action) => action.supports(state.snapshot, state.draft));\n\n const rows = state.original.payload.kind === \"rows\" ? state.original.payload : null;\n const formats = COPIES.filter((f) => supportsBuiltIn(f, state.draft.payload));\n const workspaceAdapters = adapters.filter((adapter) => adapter.supports(state.draft.payload));\n const displayedOmissions = preparedArtifact?.omissions ?? state.draft.omissions;\n const limitText = Object.entries(state.preferences.limits).filter(([, value]) => value != null).map(([key, value]) => `${key.replace(/^max/, \"max \")} ${formatCount(Number(value))}`).join(\" · \");\n return <Dialog open={open} onOpenChange={(next) => { if (!next) close(); }}><DialogContent onCloseAutoFocus={(event) => { event.preventDefault(); if (!handingOff.current) restoreFocus(); }} className=\"matrx-alchemy-workspace max-w-5xl\" aria-busy={busy !== null}>\n <DialogHeader><DialogTitle>Prepare {state.snapshot.label}</DialogTitle><DialogDescription>{state.snapshot.unsavedChanges ? \"Includes your unsaved changes. \" : \"\"}Review and edit this copy. Your original stays unchanged.</DialogDescription></DialogHeader>\n <div className=\"matrx-alchemy-workspace-body\"><div className=\"matrx-alchemy-workspace-grid\"><section className=\"matrx-alchemy-main\">\n <div className=\"matrx-alchemy-toolbar\">\n {scopes.length > 1 ? <label>Scope<select aria-label=\"Transfer scope\" value={state.scope} disabled={busy !== null} onChange={(e) => void requestCapture(e.target.value as TransferScope)}>{scopes.map((scope) => <option key={scope} value={scope}>{scopeLabels?.[scope] ?? SCOPE_LABEL[scope]}</option>)}</select></label> : null}\n <label>Detail<select aria-label=\"Detail preset\" value={controls.preset} onChange={(e) => changeControls({ ...controls, preset: e.target.value as Preset })}><option value=\"full\">Full</option><option value=\"compact\">Compact</option><option value=\"brief\">Brief</option><option value=\"custom\">Custom</option></select></label>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={(!state.draft.history?.length && !controlsHistory.length) || busy !== null} onClick={() => { setBufferError(null); if (controlsHistory.length) { const next = controlsHistory[controlsHistory.length - 1]!; setControls(next); setControlsHistory((history) => history.slice(0, -1)); onChange({ ...state, draft: rebuild(state, next), error: undefined }); } else onChange({ ...state, draft: undoDraft(state.draft), error: undefined }); }}>Undo</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={busy !== null} onClick={() => { const next = initialControls(state); setControls(next); setControlsHistory([]); setPendingControls(null); setBufferError(null); onChange({ ...state, draft: rebuild(state, next), error: undefined }); }}>Reset</Button>\n <Button type=\"button\" size=\"sm\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" disabled={busy !== null} onClick={() => void requestCapture(state.scope)}>Refresh source</Button>\n </div>\n {controls.preset === \"custom\" ? <fieldset className=\"matrx-alchemy-options\"><legend>{state.draft.payload.kind === \"json\" || state.draft.payload.kind === \"registered\" ? \"JSON limits\" : \"Content limits\"}</legend>{([ [\"maxDepth\", \"Maximum depth\"], [\"maxStringChars\", state.draft.payload.kind === \"rows\" ? \"Maximum characters per cell\" : \"Maximum string characters\"], [\"maxArrayItems\", \"Maximum array items\"] ] as const).filter(([key]) => key === \"maxStringChars\" || state.draft.payload.kind === \"json\" || state.draft.payload.kind === \"registered\").map(([key, text]) => <label key={key}>{text}<input type=\"number\" min=\"0\" value={controls[key] ?? \"\"} onChange={(e) => changeControls({ ...controls, [key]: Number.isNaN(e.target.valueAsNumber) ? null : e.target.valueAsNumber })}/></label>)}</fieldset> : null}\n {rows ? <details className=\"matrx-alchemy-options matrx-alchemy-data-controls\"><summary>Data selection · {controls.visibleColumns.length} columns{controls.search || controls.sort || controls.top != null || controls.selectedOnly || Object.values(controls.filters).some(Boolean) ? \" · customized\" : \" · all rows\"}</summary><div className=\"matrx-alchemy-data-controls-body\"><RowControls rows={rows} controls={controls} change={changeControls}/></div></details> : null}\n {state.snapshot.sections.length ? <details className=\"matrx-alchemy-options\"><summary>Sections · {controls.sections.length} included</summary><fieldset aria-label=\"Included sections\">{state.snapshot.sections.map((section) => <label key={section.id}><input type=\"checkbox\" checked={controls.sections.includes(section.id)} onChange={(e) => changeControls({ ...controls, sections: e.target.checked ? [...controls.sections, section.id] : controls.sections.filter((id) => id !== section.id) })}/> {section.label}</label>)}</fieldset></details> : null}\n <label className=\"matrx-alchemy-preview-label\">Output format<select aria-label=\"Output format\" value={format} onChange={(e) => setFormat(e.target.value)}>{formats.map((f) => <option key={f} value={f}>{LABEL[f]}</option>)}{state.draft.payload.kind === \"rows\" ? <option value=\"xlsx\">Excel workbook</option> : null}{workspaceAdapters.map((adapter) => <option key={adapter.id} value={adapter.id}>{adapter.label}</option>)}</select></label>\n <textarea className=\"matrx-alchemy-preview\" aria-label=\"Prepared output\" aria-invalid={bufferError ? true : undefined} aria-describedby={bufferError ? \"alchemy-buffer-error\" : undefined} value={buffer} onChange={(e) => editBuffer(e.target.value)}/>\n <div className=\"matrx-alchemy-coverage\"><span>{state.snapshot.coverage.included.toLocaleString()} included{state.snapshot.coverage.total == null ? \"\" : ` of ${state.snapshot.coverage.total.toLocaleString()}`} · {state.snapshot.coverage.status}</span>{state.snapshot.coverage.reason ? <span>{state.snapshot.coverage.reason}</span> : null}{limitText ? <span>Limits: {limitText}</span> : null}{displayedOmissions.length ? <details><summary>{displayedOmissions.length} omissions or adjustments</summary><ul>{displayedOmissions.map((o, i) => <li key={`${o.path}-${o.reason}-${i}`}>{o.path || \"/\"}: {o.reason}{o.count == null ? \"\" : ` (${o.count})`}</li>)}</ul></details> : null}</div>\n {bufferError ? <p id=\"alchemy-buffer-error\" role=\"alert\" className=\"matrx-alchemy-error\">{bufferError}</p> : null}\n {formatError ? <p role=\"alert\" className=\"matrx-alchemy-error\">{formatError}</p> : null}\n {bufferError ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" disabled={busy !== null} onClick={() => { const fallback = editDraft(state.draft, { kind: \"text\", text: buffer }); setBufferError(null); onChange({ ...state, draft: fallback, error: undefined }); setFormat(\"plain\"); }}>Use invalid JSON as plain text</Button> : null}\n </section>{ai || busy === \"capture\" || state.error ? <aside>\n {ai ? <>\n <label>Start with<select aria-label=\"AI preparation recipe\" defaultValue=\"\" onChange={(event) => { if (event.target.value) setInstruction(event.target.value); }}><option value=\"\">Choose an instruction</option><option value=\"Summarize this content concisely. Preserve important facts, names, decisions, and source references.\">Summarize</option><option value=\"Extract decisions, action items, owners, and due dates. Mark missing details as unspecified.\">Extract action items</option><option value=\"Prepare a complete handoff for another assistant. Include the objective, relevant facts, constraints, decisions, and unresolved questions.\">Assistant handoff</option><option value=\"Condense this content by removing repetition and formatting noise. Preserve every unique fact and all identifiers.\">Condense without losing facts</option><option value=\"Turn this content into a clear structured outline. Keep the original meaning and explicitly flag uncertainty.\">Create an outline</option><option value=\"Analyze this data. Identify patterns, anomalies, and useful comparisons. Distinguish observations from inferences.\">Analyze the data</option></select></label>\n <label>AI instruction<textarea value={instruction} onChange={(e) => setInstruction(e.target.value)} placeholder=\"Tell AI how to prepare this content\"/></label>\n <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" disabled={!aiSession.current || !instruction.trim() || busy !== null || !aiSession.current.supports(state.snapshot)} onClick={() => void runAi(false)}>Generate preview</Button>\n {busy === \"ai\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => void cancelAi()}>{aiSession.current?.cancel ? \"Cancel AI\" : \"Stop waiting\"}</Button> : null}\n </> : null}\n {busy === \"capture\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => { activeCapture.current?.abort(); activeCapture.current = null; setBusy(null); }}>Stop loading rows</Button> : null}\n {ai && aiFailed && aiSession.current?.recover && busy !== \"ai\" ? <Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => void runAi(true)}>{aiFailed ? \"Retry or rejoin AI run\" : \"Rejoin AI run\"}</Button> : null}\n {ai ? <p className=\"matrx-alchemy-meta\">AI updates the preview; copy it when you are ready. Closing this window lets the AI run continue.</p> : null}{state.error ? <p role=\"alert\" className=\"matrx-alchemy-error\">{state.error}</p> : null}\n </aside> : null}</div>\n {pendingControls ? <div className=\"matrx-alchemy-decision\" role=\"alert\"><p>This control would replace your manual edit.</p><Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => setPendingControls(null)}>Keep edited draft</Button><Button className=\"matrx-alchemy-workspace-primary\" type=\"button\" onClick={applyPendingControls}>Rebuild from source</Button></div> : null}\n {state.sourceStale ? <p role=\"alert\" className=\"matrx-alchemy-decision\">The source changed since this draft. Use Refresh source to review the latest data.</p> : null}\n {state.pending ? <div className=\"matrx-alchemy-decision\" role=\"alert\"><p>A fresh source snapshot is ready.</p>{state.pending.scope !== state.scope ? <p>Switch from {scopeLabels?.[state.scope] ?? SCOPE_LABEL[state.scope]} to {scopeLabels?.[state.pending.scope] ?? SCOPE_LABEL[state.pending.scope]} by regenerating. Your current draft is retained until you choose.</p> : null}<Button className=\"matrx-alchemy-workspace-secondary\" type=\"button\" variant=\"outline\" onClick={() => resolveCapture(\"keep\")}>Keep current snapshot and draft</Button><Button className=\"matrx-alchemy-workspace-primary\" type=\"button\" onClick={() => resolveCapture(\"regenerate\")}>Regenerate from fresh source</Button></div> : null}\n {eligibleActions.length ? <details className=\"matrx-alchemy-options matrx-alchemy-destinations\"><summary>Use prepared content · {eligibleActions.length} {eligibleActions.length === 1 ? \"destination\" : \"destinations\"}</summary><div className=\"matrx-alchemy-destination-grid\">{eligibleActions.map((action) => <button key={action.id} type=\"button\" className=\"matrx-alchemy-palette-row\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliverAction(action)}><DestinationPresentation action={action}/></button>)}</div></details> : null}\n {deliveryNotice ? <p role=\"status\" className=\"matrx-alchemy-meta\">{deliveryNotice}</p> : null}</div>\n <DialogFooter><span className=\"matrx-alchemy-meta\">{buffer.length.toLocaleString()} characters · ~{estimateTokens(buffer).toLocaleString()} tokens</span><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" onClick={close}>Close</Button><Button type=\"button\" variant=\"outline\" className=\"matrx-alchemy-workspace-secondary\" aria-label=\"Download prepared output\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliver(true)}>Download</Button><Button type=\"button\" className=\"matrx-alchemy-workspace-primary\" aria-label=\"Copy prepared output\" disabled={busy !== null || Boolean(bufferError || formatError) || !preparedArtifact} onClick={() => void deliver(false)}>Copy</Button></DialogFooter>\n </DialogContent></Dialog>;\n}\n\nfunction RowControls({ rows, controls, change }: {\n rows: Extract<Payload, { kind: \"rows\" }>;\n controls: Controls;\n change: (next: Controls) => void;\n}) {\n const filterCount = Object.values(controls.filters).filter(Boolean).length;\n const selectionSummary = controls.selectedOnly ? `${controls.selectedIndices.length} selected row${controls.selectedIndices.length === 1 ? \"\" : \"s\"}` : \"All rows\";\n const dataSummary = [controls.search ? \"search active\" : \"\", controls.sort ? `sorted by ${rows.columns.find((column) => column.id === controls.sort)?.label ?? controls.sort}` : \"\", filterCount ? `${filterCount} filter${filterCount === 1 ? \"\" : \"s\"}` : \"\"].filter(Boolean).join(\" · \");\n return <>\n <div className=\"matrx-alchemy-toolbar\">\n <label>Search<input value={controls.search} onChange={(e) => change({ ...controls, search: e.target.value })}/></label>\n <label>Sort<select value={controls.sort} onChange={(e) => change({ ...controls, sort: e.target.value })}><option value=\"\">None</option>{rows.columns.map((column) => <option key={column.id} value={column.id}>{column.label}</option>)}</select></label>\n <label>Direction<select value={controls.direction} disabled={!controls.sort} onChange={(e) => change({ ...controls, direction: e.target.value as \"asc\" | \"desc\" })}><option value=\"asc\">Ascending</option><option value=\"desc\">Descending</option></select></label>\n <label>Top rows<input type=\"number\" min=\"0\" value={controls.top ?? \"\"} onChange={(e) => change({ ...controls, top: Number.isNaN(e.target.valueAsNumber) ? null : e.target.valueAsNumber })}/></label>\n </div>\n <details className=\"matrx-alchemy-options\"><summary>Columns and filters{dataSummary ? ` — ${dataSummary}` : \"\"}</summary><fieldset aria-label=\"Columns and filters\">{rows.columns.map((column) => <div className=\"matrx-alchemy-column\" key={column.id}><label><input type=\"checkbox\" checked={controls.visibleColumns.includes(column.id)} onChange={(e) => change({ ...controls, visibleColumns: e.target.checked ? [...controls.visibleColumns, column.id] : controls.visibleColumns.filter((id) => id !== column.id) })}/> {column.label}</label><input aria-label={`Filter ${column.label}`} placeholder=\"Filter\" value={controls.filters[column.id] ?? \"\"} onChange={(e) => change({ ...controls, filters: { ...controls.filters, [column.id]: e.target.value } })}/></div>)}</fieldset></details>\n <details className=\"matrx-alchemy-options\"><summary>Rows — {selectionSummary}</summary><fieldset aria-label=\"Row selection\"><label><input type=\"checkbox\" checked={controls.selectedOnly} onChange={(e) => change({ ...controls, selectedOnly: e.target.checked })}/> Only selected rows</label><div className=\"matrx-alchemy-row-list\">{rows.rows.map((row, index) => {\n const summary = rows.columns.filter((column) => column.visible).slice(0, 2).map((column) => String(readTransferCell(row, column) ?? \"\")).filter(Boolean).join(\" · \");\n return <label key={index}><input type=\"checkbox\" checked={controls.selectedIndices.includes(index)} onChange={(e) => change({ ...controls, selectedIndices: e.target.checked ? [...controls.selectedIndices, index] : controls.selectedIndices.filter((value) => value !== index) })}/> Row {index + 1}{summary ? ` — ${summary}` : \"\"}</label>;\n })}</div></fieldset></details>\n </>;\n}\n\nexport * from \"./matrx-copy\";\n","\"use client\";\n\n/**\n * Popover — ported verbatim from matrx-frontend `components/ui/popover.tsx`.\n *\n * Seam inversion: the host's `useNestedPortalContainer` (dialog/popout aware)\n * becomes the injected `PortalContainerProvider` seam (`portal-container.tsx`);\n * the explicit `container` prop keeps top priority, exactly as before.\n *\n * THE ROOT RENDERS UNCONDITIONALLY — no mount gate. This wrapper used to defer\n * rendering until after hydration (\"Radix generates dynamic aria-controls ids\n * that differ between SSR and client\"), and that justification was false:\n * Radix ids come from React's SSR-stable `useId` (verified against\n * @radix-ui/react-popover 1.1.17 / react-id 1.1.2). The gate was actively\n * harmful — the Trigger wraps ALWAYS-VISIBLE content, so `return null`\n * deleted it from SSR and the first client paint.\n */\n\nimport * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\nexport const Popover = PopoverPrimitive.Root;\n\nexport const PopoverTrigger = PopoverPrimitive.Trigger;\n\nexport const PopoverAnchor = PopoverPrimitive.Anchor;\n\nexport interface PopoverContentProps\n extends React.ComponentPropsWithoutRef<typeof PopoverPrimitive.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 honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n /**\n * HOW WIDE THE POPOVER IS ALLOWED TO BE, and it is the SYSTEM that decides — never a\n * surface pasting its own `w-64` over the default (lane FIX-14, 2026-09-22).\n *\n * `\"fixed\"` (default) is the historical `w-72`: right for a menu of short, known\n * labels, where a ragged edge would look broken.\n *\n * `\"content\"` is for a popover whose whole job is to SHOW SOMETHING THE SYSTEM DID\n * NOT CHOOSE — a person's name, a record's title, a row the user is about to\n * create. The relation picker offered\n *\n * Create “Marisol Okonkwo — 418 Calle Pu\n *\n * inside a 16rem box, cut mid-word, on the one control that exists to show the name\n * being created. A fixed width cannot be right for content of unknown length, so\n * this one grows to its content between an honest floor and an honest ceiling:\n *\n * · at least the trigger's own width, and at least 20rem — the width Airtable's and\n * Notion's link-record pickers settle on, and wide enough that an ordinary\n * \"name — street, town\" fits on one line;\n * · at most 28rem, and never wider than the viewport less a 1rem gutter each side,\n * so it still fits a 375px phone with nothing running off the screen. The floor is\n * clamped by the same gutter, so on a very narrow screen the ceiling still wins.\n *\n * Beyond that ceiling the CONTENT truncates with an ellipsis and carries a `title`.\n * Growing, then ellipsis — never a mid-word cut.\n */\n sizing?: \"fixed\" | \"content\";\n}\n\nexport const PopoverContent = React.forwardRef<\n React.ComponentRef<typeof PopoverPrimitive.Content>,\n PopoverContentProps\n>(\n (\n {\n className,\n align = \"center\",\n sideOffset = 4,\n container,\n animated = true,\n sizing = \"fixed\",\n ...props\n },\n ref,\n ) => {\n const portalContainer = usePortalContainer(container);\n return (\n <PopoverPrimitive.Portal container={portalContainer}>\n <PopoverPrimitive.Content\n ref={ref}\n align={align}\n sideOffset={sideOffset}\n className={cn(\n // Cap to the viewport space Radix measured and scroll — a popover taller\n // than the screen must never trap the user with unreachable content.\n // z must EQUAL the dialog layer (z-[10000]), never exceed it: with equal\n // z, DOM portal order decides, so a dialog opened FROM a popover stacks\n // above it, and a popover opened from a dialog still stacks above the\n // dialog. z-[10001] buried dialogs behind fullscreen popovers.\n \"z-[10000] max-h-[var(--radix-popover-content-available-height)] overflow-y-auto overscroll-contain rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none\",\n sizing === \"content\"\n ? \"w-auto min-w-[min(max(var(--radix-popover-trigger-width),20rem),calc(100vw-2rem))] max-w-[min(28rem,calc(100vw-2rem))]\"\n : \"w-72\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </PopoverPrimitive.Portal>\n );\n },\n);\nPopoverContent.displayName = PopoverPrimitive.Content.displayName;\n","\"use client\";\n\nimport {\n cloneElement,\n forwardRef,\n isValidElement,\n type ButtonHTMLAttributes,\n type ReactElement,\n type ReactNode,\n type Ref,\n} from \"react\";\n\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../tooltip\";\nimport { cn } from \"./cn\";\nimport {\n getTapTargetLinkComponent,\n type TapTargetLinkComponent,\n} from \"./link\";\n\nexport interface TapTargetButtonProps {\n icon?: React.ReactNode;\n children?: React.ReactNode;\n strokeWidth?: number | undefined;\n onClick?: (() => void) | undefined;\n className?: string | undefined;\n as?: \"button\" | \"label\" | undefined;\n htmlFor?: string | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n /**\n * When set, the tap button renders as a link instead of a button.\n * - Internal hrefs (e.g. \"/tasks\") render via the injected link component\n * (`setTapTargetLinkComponent` / the `linkComponent` prop), falling back\n * to a plain `<a>` when none is registered.\n * - External hrefs (http://, https://, mailto:, tel:) render as `<a>`\n * with `target=\"_blank\"` and `rel=\"noopener noreferrer\"` by default.\n * - When combined with `disabled`, the trigger renders as a non-navigable\n * `<span aria-disabled=\"true\">` with the same visual styling.\n */\n href?: string | undefined;\n /** Override target. Works on both internal links and external anchors. */\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n /** Override rel. Works on both internal links and external anchors. */\n rel?: string | undefined;\n /** Forwarded to the injected link component. Pass `false` to disable prefetching. */\n prefetch?: boolean | null | undefined;\n /**\n * Per-instance link component for internal hrefs — overrides the\n * module-level `setTapTargetLinkComponent` registration.\n */\n linkComponent?: TapTargetLinkComponent | undefined;\n /**\n * Tooltip text. Defaults to `ariaLabel` when omitted.\n * Pass `false` to explicitly disable the tooltip.\n */\n tooltip?: string | false | undefined;\n /** Tooltip placement. Defaults to \"top\". */\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\" | undefined;\n /** Tooltip alignment along its side. Defaults to \"center\". */\n tooltipAlign?: \"start\" | \"center\" | \"end\" | undefined;\n /**\n * Visible caption rendered inline after the icon (`[icon Label]`).\n * Widens the pill automatically. Tooltip defaults to off when set — the\n * label is self-describing. Visible text becomes the accessible name.\n */\n label?: string | undefined;\n /**\n * Collapse an icon + caption pill to its icon-only 44px tap target below\n * the `sm` breakpoint. The caption and inline geometry return at `sm+`;\n * `ariaLabel` (falling back to `label`) remains the accessible name.\n */\n mobileIconOnly?: boolean | undefined;\n}\n\nexport interface TapTargetButtonSolidProps extends TapTargetButtonProps {\n bgColor?: string | undefined;\n iconColor?: string | undefined;\n hoverBgColor?: string | undefined;\n /**\n * Press-state background. Defaults to `active:brightness-90` which works on\n * any color. Override when using a custom `bgColor` that should darken to a\n * specific shade on press (e.g. `active:bg-primary/60`).\n */\n activeBgColor?: string | undefined;\n}\n\nconst EXTERNAL_RE = /^(https?:|mailto:|tel:)/i;\n\n// Geometry + press feedback + tap hygiene are the SINGLE SOURCE OF TRUTH in\n// the shipped stylesheet (the `.matrx-tap-*` family in styles.css — import\n// \"@ai-matrx/tap-target/styles.css\" once at app root). This component only\n// picks the right class and layers each variant's decoration on top.\nconst TAP_OUTER_CLASS = \"matrx-tap-target group\";\nconst TAP_GROUP_OUTER_CLASS = \"matrx-tap-target matrx-tap-target-sm group\";\n\nfunction IconContent({\n icon,\n children,\n strokeWidth = 2,\n className,\n}: Pick<\n TapTargetButtonProps,\n \"icon\" | \"children\" | \"strokeWidth\" | \"className\"\n>) {\n if (icon) {\n if (isValidElement<{ className?: string }>(icon)) {\n return cloneElement(icon, {\n className: cn(className, icon.props.className),\n });\n }\n return <span className={className}>{icon}</span>;\n }\n return (\n <svg\n className={className}\n fill=\"none\"\n viewBox=\"0 0 24 24\"\n stroke=\"currentColor\"\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {children}\n </svg>\n );\n}\n\ntype TapTargetSize = \"default\" | \"sm\";\n\nfunction resolveTapGeometry(\n label: string | undefined,\n size: TapTargetSize,\n mobileIconOnly: boolean,\n) {\n const inline = Boolean(label);\n if (size === \"sm\") {\n return {\n outerClassName:\n inline && mobileIconOnly\n ? \"matrx-tap-target matrx-tap-target-sm matrx-tap-target-mobile-icon-only-sm group\"\n : inline\n ? \"matrx-tap-target matrx-tap-target-sm matrx-tap-target-inline-sm group\"\n : TAP_GROUP_OUTER_CLASS,\n inlineModifier: mobileIconOnly\n ? \"matrx-tap-pill-mobile-icon-only-sm\"\n : \"matrx-tap-pill-inline-sm\",\n };\n }\n return {\n outerClassName:\n inline && mobileIconOnly\n ? `${TAP_OUTER_CLASS} matrx-tap-target-mobile-icon-only`\n : inline\n ? `${TAP_OUTER_CLASS} matrx-tap-target-inline`\n : TAP_OUTER_CLASS,\n inlineModifier: mobileIconOnly\n ? \"matrx-tap-pill-mobile-icon-only\"\n : \"matrx-tap-pill-inline\",\n };\n}\n\nfunction buildTapInner({\n label,\n pillClassName,\n iconClassName,\n labelClassName,\n inlineModifier,\n icon,\n children,\n strokeWidth = 2,\n}: {\n label?: string | undefined;\n pillClassName: string;\n iconClassName: string;\n labelClassName?: string | undefined;\n inlineModifier: string;\n icon?: React.ReactNode;\n children?: React.ReactNode;\n strokeWidth?: number | undefined;\n}) {\n const iconEl = (\n <IconContent\n icon={icon}\n strokeWidth={strokeWidth}\n className={iconClassName}\n >\n {children}\n </IconContent>\n );\n const pillClasses = label\n ? `${pillClassName} ${inlineModifier}`.trim()\n : pillClassName;\n\n if (!label) {\n return <div className={pillClasses}>{iconEl}</div>;\n }\n\n return (\n <div className={pillClasses}>\n {iconEl}\n <span className={labelClassName ?? \"matrx-tap-label\"}>{label}</span>\n </div>\n );\n}\n\ninterface RenderTapTargetArgs extends Pick<\n TapTargetButtonProps,\n | \"icon\"\n | \"children\"\n | \"strokeWidth\"\n | \"label\"\n | \"mobileIconOnly\"\n | \"onClick\"\n | \"as\"\n | \"htmlFor\"\n | \"ariaLabel\"\n | \"disabled\"\n | \"href\"\n | \"target\"\n | \"rel\"\n | \"prefetch\"\n | \"linkComponent\"\n | \"tooltip\"\n | \"tooltipSide\"\n | \"tooltipAlign\"\n> {\n size?: TapTargetSize;\n pillClassName: string;\n iconClassName: string;\n labelClassName?: string | undefined;\n rest?: ButtonHTMLAttributes<HTMLButtonElement> | undefined;\n buttonRef?: Ref<HTMLButtonElement> | undefined;\n}\n\nfunction renderTapTarget({\n size = \"default\",\n pillClassName,\n iconClassName,\n labelClassName,\n icon,\n children,\n strokeWidth,\n label,\n mobileIconOnly = false,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n rest,\n buttonRef,\n}: RenderTapTargetArgs): ReactElement {\n const { outerClassName, inlineModifier } = resolveTapGeometry(\n label,\n size,\n mobileIconOnly,\n );\n const responsiveLabelClassName = mobileIconOnly\n ? `${labelClassName ?? \"matrx-tap-label\"} matrx-tap-label-mobile-icon-only`\n : labelClassName;\n const inner = buildTapInner({\n label,\n pillClassName,\n iconClassName,\n labelClassName: responsiveLabelClassName,\n inlineModifier: label ? inlineModifier : \"\",\n icon,\n children,\n strokeWidth,\n });\n const resolvedTooltip =\n tooltip !== undefined ? tooltip : label ? false : undefined;\n const triggerAriaLabel =\n label && !mobileIconOnly ? undefined : (ariaLabel ?? label);\n const trigger = renderTrigger({\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n as,\n htmlFor,\n onClick,\n ariaLabel: triggerAriaLabel,\n disabled,\n outerClassName,\n children: inner,\n rest,\n buttonRef,\n });\n return withTooltip(trigger, {\n tooltip: resolvedTooltip,\n ariaLabel: triggerAriaLabel,\n disabled,\n tooltipSide,\n tooltipAlign,\n });\n}\n\ninterface RenderTriggerArgs {\n href?: string | undefined;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n rel?: string | undefined;\n prefetch?: boolean | null | undefined;\n linkComponent?: TapTargetLinkComponent | undefined;\n as?: \"button\" | \"label\" | undefined;\n htmlFor?: string | undefined;\n onClick?: (() => void) | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n outerClassName: string;\n children: ReactNode;\n rest?: ButtonHTMLAttributes<HTMLButtonElement> | undefined;\n buttonRef?: Ref<HTMLButtonElement> | undefined;\n}\n\n/**\n * Resolves the correct trigger element based on the props passed.\n *\n * - `href` + `disabled` → unclickable `<span aria-disabled>`\n * - `href` matching `http(s):|mailto:|tel:` → `<a target=\"_blank\" rel=\"noopener noreferrer\">`\n * - `href` (internal) → the injected link component (per-instance\n * `linkComponent` prop, else `setTapTargetLinkComponent` registration),\n * falling back to a plain `<a>` when none is registered\n * - `as=\"label\"` → `<label htmlFor=...>`\n * - default → `<button>`\n */\nfunction renderTrigger({\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n as,\n htmlFor,\n onClick,\n ariaLabel,\n disabled,\n outerClassName,\n children,\n rest,\n buttonRef,\n}: RenderTriggerArgs): ReactElement {\n if (disabled && href) {\n return (\n <span\n aria-disabled=\"true\"\n aria-label={ariaLabel}\n className={`${outerClassName} opacity-40 pointer-events-none`}\n >\n {children}\n </span>\n );\n }\n if (href) {\n const isExternal = EXTERNAL_RE.test(href);\n if (isExternal) {\n return (\n <a\n href={href}\n target={target ?? \"_blank\"}\n rel={rel ?? \"noopener noreferrer\"}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </a>\n );\n }\n const Link = linkComponent ?? getTapTargetLinkComponent();\n if (Link) {\n return (\n <Link\n href={href}\n target={target}\n rel={rel}\n prefetch={prefetch}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </Link>\n );\n }\n // No link component registered — plain <a>. `prefetch` is a router hint,\n // not a DOM attribute, so it is deliberately dropped here.\n return (\n <a\n href={href}\n target={target}\n rel={rel}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </a>\n );\n }\n if (as === \"label\") {\n return (\n <label\n htmlFor={htmlFor}\n aria-label={ariaLabel}\n className={outerClassName}\n >\n {children}\n </label>\n );\n }\n return (\n <button\n ref={buttonRef}\n type=\"button\"\n onClick={onClick}\n aria-label={ariaLabel}\n disabled={disabled}\n {...rest}\n className={outerClassName}\n >\n {children}\n </button>\n );\n}\n\n/**\n * Wraps a trigger element in a Tooltip when a tooltip label is available.\n * Falls back to `ariaLabel` when `tooltip` is not explicitly set. If both\n * are absent (or `tooltip === false`), the trigger is returned unwrapped.\n */\nfunction withTooltip(\n trigger: ReactElement,\n {\n tooltip,\n ariaLabel,\n disabled,\n tooltipSide = \"top\",\n tooltipAlign = \"center\",\n }: {\n tooltip?: string | false | undefined;\n ariaLabel?: string | undefined;\n disabled?: boolean | undefined;\n tooltipSide?: \"top\" | \"right\" | \"bottom\" | \"left\" | undefined;\n tooltipAlign?: \"start\" | \"center\" | \"end\" | undefined;\n },\n): ReactElement {\n if (tooltip === false) return trigger;\n const label =\n typeof tooltip === \"string\" && tooltip.length > 0 ? tooltip : ariaLabel;\n if (!label) return trigger;\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {disabled ? (\n // Radix Tooltip triggers need a hoverable element; a disabled button\n // does not dispatch pointer events, so we wrap in a span for the\n // trigger target while keeping the disabled visual state.\n <span className=\"inline-flex\">{trigger}</span>\n ) : (\n trigger\n )}\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} align={tooltipAlign}>\n {label}\n </TooltipContent>\n </Tooltip>\n );\n}\n\n// To resize/retune every tap button, edit styles.css — not here.\n\nexport const TapTargetButton = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButton(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: \"matrx-tap-pill matrx-glass-thin-border\",\n iconClassName: `matrx-tap-icon ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport const TapTargetButtonTransparent = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonTransparent(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName:\n \"matrx-tap-pill hover:bg-muted active:bg-muted-foreground/15\",\n iconClassName: `matrx-tap-icon ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport const TapTargetButtonSolid = forwardRef<\n HTMLButtonElement,\n TapTargetButtonSolidProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonSolid(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n bgColor = \"bg-primary\",\n iconColor = \"text-primary-foreground\",\n hoverBgColor = \"hover:bg-primary/80\",\n activeBgColor = \"active:brightness-90\",\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n return renderTapTarget({\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: `matrx-tap-pill ${bgColor} ${iconColor} ${hoverBgColor} ${activeBgColor}`,\n iconClassName: `matrx-tap-icon ${iconColor}`,\n labelClassName: `matrx-tap-label ${iconColor}`,\n rest,\n buttonRef: ref,\n });\n});\n\n/** Solid destructive pill — delete/remove actions. White-on-red like the\n * primary solid is white-on-blue. Use THIS, never hand-pass bg-destructive\n * with the default (dark) icon color. */\nexport const TapTargetButtonDestructive = forwardRef<\n HTMLButtonElement,\n TapTargetButtonSolidProps & React.ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonDestructive(\n {\n bgColor = \"bg-destructive\",\n iconColor = \"text-destructive-foreground\",\n hoverBgColor = \"hover:bg-destructive/90\",\n ...rest\n },\n ref,\n) {\n return (\n <TapTargetButtonSolid\n ref={ref}\n bgColor={bgColor}\n iconColor={iconColor}\n hoverBgColor={hoverBgColor}\n {...rest}\n />\n );\n});\n\nexport const TapTargetButtonForGroup = forwardRef<\n HTMLButtonElement,\n TapTargetButtonProps & ButtonHTMLAttributes<HTMLButtonElement>\n>(function TapTargetButtonForGroup(\n {\n icon,\n children,\n strokeWidth = 2,\n onClick,\n className,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n ...rest\n },\n ref,\n) {\n const color = className ?? \"text-foreground\";\n return renderTapTarget({\n size: \"sm\",\n icon,\n children,\n strokeWidth,\n onClick,\n as,\n htmlFor,\n ariaLabel,\n disabled,\n href,\n target,\n rel,\n prefetch,\n linkComponent,\n tooltip,\n tooltipSide,\n tooltipAlign,\n label,\n mobileIconOnly,\n pillClassName: \"matrx-tap-pill matrx-tap-pill-sm matrx-glass-interactive\",\n iconClassName: `matrx-tap-icon ${color}`,\n labelClassName: `matrx-tap-label ${color}`,\n rest,\n buttonRef: ref,\n });\n});\n\nexport function TapTargetButtonGroup({\n children,\n className,\n}: {\n children: React.ReactNode;\n className?: string | undefined;\n}) {\n return (\n <div\n className={\n className\n ? `relative inline-flex h-9 items-center ${className}`\n : \"relative inline-flex h-9 items-center\"\n }\n >\n <div className=\"pointer-events-none absolute inset-x-0 top-1/2 -translate-y-1/2 h-7 rounded-full matrx-glass-thin-border\" />\n {/* min-w-0 lets flexible children (e.g. a truncating filename) shrink\n under container pressure; fixed-size tap buttons are unaffected. */}\n <div className=\"relative flex min-w-0 items-center\">{children}</div>\n </div>\n );\n}\n","\"use client\";\n\n/**\n * Tooltip — the ONE tooltip in the fleet.\n *\n * THE COLLAPSE (0.6.0). Two implementations existed: matrx-frontend's\n * `components/ui/tooltip.tsx` (182 import sites) and `@ai-matrx/tap-target`'s\n * `src/tooltip.tsx` — the latter an explicit inlined PORT of the former,\n * carrying a header that said so. tap-target shipped it only because its ~60\n * tap buttons need a tooltip and no shared package owned one; four repos then\n * adopted `TooltipProvider` from tap-target. That made tap-target — a\n * button-geometry package — the accidental owner of a design-system primitive,\n * with a second copy living in the biggest host.\n *\n * A tooltip is a design-system surface, so it lives here. tap-target now takes\n * `@ai-matrx/design-system` as an ordinary sibling dependency and imports this\n * file; its own copy is deleted, and its re-export removed. The DAG already\n * ordered design-system before tap-target, so no cycle is introduced.\n *\n * BEHAVIOUR is matrx-frontend's, verbatim, including the ruling both copies\n * carried in prose:\n *\n * 1. 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 false: Radix ids come from React's\n * SSR-stable `useId`. It was actively harmful — a Trigger wraps\n * ALWAYS-VISIBLE content, so `return null` deleted that subtree from SSR and\n * the first client paint.\n *\n * 2. THE SURFACE IS NEUTRAL, NOT BRANDED. Popover tokens, not `bg-primary`:\n * rich tooltip content using `text-muted-foreground` was illegible on a\n * brand-coloured background in one theme or the other.\n *\n * SEAM INVERSION. The host resolved nested portal targets through\n * `useNestedPortalContainer` (an app hook wired to its dialog + window-panel\n * systems); tap-target's port dropped that seam entirely and always portalled\n * to `document.body` — which is why a tooltip inside a popped-out panel landed\n * in the wrong window. Here it is the package's `PortalContainerProvider`\n * seam: an explicit `container` prop wins, then the injected container, then\n * `document.body`. Both prior behaviours are reachable; neither is forked.\n */\n\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport * as React from \"react\";\n\nimport { cn } from \"./cn\";\nimport { MOTION_POPPER } from \"./motion\";\nimport { usePortalContainer } from \"./portal-container\";\n\n/**\n * Mount once near the app root. Every tooltip in the tree shares its\n * `delayDuration` / `skipDelayDuration` timing.\n */\nconst TooltipProvider = TooltipPrimitive.Provider;\n\nconst Tooltip = TooltipPrimitive.Root;\n\nconst TooltipTrigger = TooltipPrimitive.Trigger;\n\nexport interface TooltipContentProps\n extends React.ComponentPropsWithoutRef<typeof TooltipPrimitive.Content> {\n /**\n * Explicit portal target; wins over the injected `PortalContainerProvider`\n * value. Pass `null` to force `document.body`.\n */\n container?: HTMLElement | null;\n /**\n * Package-owned open/close motion. Default `true`. Pass `false` for a\n * surface that must appear instantly. It is NOT the reduced-motion switch;\n * `styles.css` already honours `prefers-reduced-motion`.\n */\n animated?: boolean;\n}\n\nconst TooltipContent = React.forwardRef<\n React.ComponentRef<typeof TooltipPrimitive.Content>,\n TooltipContentProps\n>(({ className, sideOffset = 4, container, animated = true, ...props }, ref) => {\n const resolved = usePortalContainer(container);\n return (\n <TooltipPrimitive.Portal container={resolved ?? null}>\n <TooltipPrimitive.Content\n ref={ref}\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"z-[10001] overflow-hidden rounded-md border border-border bg-popover px-3 py-1.5 text-xs text-popover-foreground shadow-md\",\n animated && MOTION_POPPER,\n className,\n )}\n {...props}\n />\n </TooltipPrimitive.Portal>\n );\n});\nTooltipContent.displayName = TooltipPrimitive.Content.displayName;\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n","/**\n * Minimal className join — the only piece of `cn` this package needs.\n * No tailwind-merge / clsx dependency by design: callers pass literal strings.\n */\nexport function cn(\n ...values: Array<string | null | undefined | false>\n): string {\n return values.filter(Boolean).join(\" \").trim();\n}\n","import type { ComponentType, ReactNode } from \"react\";\n\n/**\n * The injectable link seam — the package's replacement for the original\n * hard `next/link` import.\n *\n * Internal hrefs (anything NOT matching `http(s):`, `mailto:`, `tel:`) render\n * through the link component resolved here; external hrefs always render a\n * plain `<a target=\"_blank\" rel=\"noopener noreferrer\">`, exactly like the\n * original. When nothing is registered and no per-instance `linkComponent`\n * prop is given, internal hrefs fall back to a plain `<a>` (no prefetch, no\n * client-side routing — still a working link).\n */\nexport interface TapTargetLinkProps {\n href: string;\n target?: \"_blank\" | \"_self\" | \"_parent\" | \"_top\" | undefined;\n rel?: string | undefined;\n /** Router prefetch hint (next/link semantics). Plain `<a>` fallback ignores it. */\n prefetch?: boolean | null | undefined;\n \"aria-label\"?: string | undefined;\n className?: string | undefined;\n children?: ReactNode;\n}\n\nexport type TapTargetLinkComponent = ComponentType<TapTargetLinkProps>;\n\n/**\n * The registered component lives in a `Symbol.for` slot on `globalThis` — NOT\n * in module state — so it survives the module graph being instantiated more\n * than once: the `.` and `./buttons` dist bundles each inline the primitives\n * (tsup `splitting: false`), and a consumer may even mix `import` and\n * `require`. One registration must reach every copy.\n */\nconst LINK_SLOT = Symbol.for(\"@ai-matrx/tap-target:link-component\");\n\ntype GlobalWithLinkSlot = typeof globalThis & {\n [LINK_SLOT]?: TapTargetLinkComponent | null;\n};\n\n/**\n * Register the app's link component once at startup (e.g. `next/link`):\n *\n * ```tsx\n * import Link from \"next/link\";\n * import { setTapTargetLinkComponent } from \"@ai-matrx/tap-target\";\n * setTapTargetLinkComponent(Link);\n * ```\n *\n * Pass `null` to unregister (plain `<a>` fallback resumes).\n */\nexport function setTapTargetLinkComponent(\n component: TapTargetLinkComponent | null,\n): void {\n (globalThis as GlobalWithLinkSlot)[LINK_SLOT] = component;\n}\n\n/** The currently registered link component, or `null` when none is set. */\nexport function getTapTargetLinkComponent(): TapTargetLinkComponent | null {\n return (globalThis as GlobalWithLinkSlot)[LINK_SLOT] ?? null;\n}\n","/** Pure Alchemy icon assets. Safe to import without React or browser APIs. */\nexport type AlchemyIcon = \"portal\" | \"copy-transform\";\nexport const ALCHEMY_GLYPH_PATHS: Record<AlchemyIcon, readonly string[]> = {\n portal: [\"M10 4H6a2 2 0 0 0-2 2v12a2 2 0 0 0 2 2h4M14 4h4a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2h-4M12 8v8m-3-3 3 3 3-3\"],\n \"copy-transform\": [\"M8 7V5a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v8M13 21H5a2 2 0 0 1-2-2V10a2 2 0 0 1 2-2h8a2 2 0 0 1 2 2v3m-5 4h11m-3-3 3 3-3 3\"],\n};\nexport const ALCHEMY_GLYPH_VIEWBOX: Record<AlchemyIcon, string> = { portal: \"0 0 24 24\", \"copy-transform\": \"0 0 24 24\" };\nconst svg = (paths: readonly string[], viewBox: string) => `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"18\" height=\"18\" viewBox=\"${viewBox}\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.75\" stroke-linecap=\"round\" stroke-linejoin=\"round\">${paths.map((d) => `<path d=\"${d}\"/>`).join(\"\")}</svg>`;\nexport const ALCHEMY_GLYPH_SVG = svg(ALCHEMY_GLYPH_PATHS.portal, ALCHEMY_GLYPH_VIEWBOX.portal);\nexport const ALCHEMY_COPY_TRANSFORM_SVG = svg(ALCHEMY_GLYPH_PATHS[\"copy-transform\"], ALCHEMY_GLYPH_VIEWBOX[\"copy-transform\"]);\n","import {\n ContentTransferError,\n readTransferCell,\n sealTransferArtifact,\n serialize,\n type Artifact,\n type Draft,\n type FormatAdapter,\n type Json,\n type PageAction,\n type Payload,\n type TransferOutcome,\n} from \"@ai-matrx/kit/content-transfer\";\n\nexport type ContentTransferReference = {\n id: string;\n label: string;\n noun: string;\n items: Record<string, Json>[];\n};\n\nexport type ContentTransferReferencePort = {\n supports(reference: ContentTransferReference): boolean;\n build(reference: ContentTransferReference): string | Promise<string>;\n};\n\nexport type ContentTransferEmailPort = {\n send(\n artifact: Artifact,\n context: { label: string; signal: AbortSignal },\n ): Promise<TransferOutcome>;\n};\n\nconst exportableColumns = (payload: Extract<Payload, { kind: \"rows\" }>) =>\n payload.columns.filter(\n (column) =>\n column.visible &&\n column.exportable !== false &&\n column.classification !== \"secret\" &&\n column.classification !== \"credential\",\n );\n\n/** A sealed, projection-safe representation of a tabular draft's declared schema and values. */\nexport const tableSchemaFormat: FormatAdapter = {\n id: \"table-schema\",\n label: \"Schema\",\n supports: (payload) => payload.kind === \"rows\",\n async build(draft, signal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"rows\")\n throw new ContentTransferError(\n \"unsupported-format\",\n \"Schema + rows requires tabular content; manually edited text cannot carry a table schema.\",\n );\n const rowColumns = exportableColumns(draft.payload);\n const columns = rowColumns.map((column) => ({\n id: column.id,\n label: column.label,\n path: column.path,\n ...(column.schema === undefined ? {} : { schema: column.schema }),\n }));\n const body = {\n sourceId: draft.sourceId,\n columns,\n rows: draft.payload.rows.map((row) =>\n Object.fromEntries(rowColumns.map((column) => [column.id, readTransferCell(row, column) ?? null])),\n ),\n } satisfies Json;\n const plainText = JSON.stringify(body, null, 2);\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"table-schema\",\n plainText,\n file: {\n filename: \"table-schema.json\",\n mime: \"application/json\",\n bytes: new TextEncoder().encode(plainText),\n },\n omissions: [...draft.omissions],\n });\n },\n};\n\nfunction displayLabels(payload: Extract<Payload, { kind: \"rows\" }>): [string, typeof payload.columns[number]][] {\n const columns = exportableColumns(payload);\n const counts = new Map<string, number>();\n for (const column of columns) counts.set(column.label, (counts.get(column.label) ?? 0) + 1);\n const used = new Set<string>();\n return columns.map((column) => {\n const base = counts.get(column.label) === 1 ? column.label : `${column.label} [${column.id}]`;\n let label = base;\n for (let suffix = 2; used.has(label); suffix += 1) label = `${base} (${suffix})`;\n used.add(label);\n return [label, column];\n });\n}\n\n/** Flat row JSON keyed by user-facing display labels, never raw table records. */\nexport const tableDataFormat: FormatAdapter = {\n id: \"table-data\",\n label: \"Table JSON\",\n supports: (payload) => payload.kind === \"rows\",\n async build(draft, signal) {\n if (signal.aborted) throw new DOMException(\"Cancelled\", \"AbortError\");\n if (draft.payload.kind !== \"rows\")\n throw new ContentTransferError(\"unsupported-format\", \"Display-label JSON requires tabular content.\");\n const columns = displayLabels(draft.payload);\n const plainText = JSON.stringify(\n draft.payload.rows.map((row) =>\n Object.fromEntries(columns.map(([label, column]) => [label, readTransferCell(row, column) ?? null])),\n ),\n null,\n 2,\n );\n return sealTransferArtifact({\n snapshotId: draft.snapshotId,\n draftRevision: draft.revision,\n format: \"json\",\n plainText,\n file: {\n filename: \"data.json\",\n mime: \"application/json;charset=utf-8\",\n bytes: new TextEncoder().encode(plainText),\n },\n omissions: [...draft.omissions],\n });\n },\n};\n\ntype EmailFormat = \"csv\" | \"json\" | \"markdown\";\nexport type TransferEmailAction = PageAction & { prepared: true; group: \"email\" };\n\nconst emailArtifact = (draft: Draft, format: EmailFormat, signal: AbortSignal, jsonFormat?: FormatAdapter): Promise<Artifact> =>\n format === \"json\" && jsonFormat?.supports(draft.payload)\n ? jsonFormat.build(draft, signal)\n : Promise.resolve(serialize(draft, format, { spreadsheetSafe: format === \"csv\" }));\n\n/** Prepared-only delivery actions always serialize the current draft, never a host source. */\nexport function createTransferEmailActions(\n email: ContentTransferEmailPort,\n options: { jsonFormat?: FormatAdapter } = {},\n): TransferEmailAction[] {\n return ([\"csv\", \"json\", \"markdown\"] as const).map((format) => ({\n id: `email-${format}`,\n label: `Email ${format === \"csv\" ? \"CSV\" : format === \"json\" ? \"JSON\" : \"Markdown\"}`,\n prepared: true,\n group: \"email\",\n supports: (_snapshot, draft) => Boolean(draft) && (format !== \"csv\" || draft?.payload.kind === \"rows\"),\n async run({ draft, signal, snapshot }) {\n if (signal.aborted) return { status: \"cancelled\" };\n const artifact = await emailArtifact(draft, format, signal, options.jsonFormat);\n return email.send(artifact, { label: snapshot.label, signal });\n },\n }));\n}\n","\"use client\";\nimport { MatrxCopyMenu } from \"../content-transfer/matrx-copy\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport type { CopyControlProps, ExportItem } from \"./copy-types\";\nexport type { AgentPayloadInput, AiCustomSource, AiVariant, CopyControlProps, CopySubsetColumn } from \"./copy-types\";\nexport { tableAgentText } from \"./copy-payload\";\n\n/** All portable row, selection, toolbar and detail copy controls use Alchemy.\n * Host ports remain explicit so installed applications can activate their\n * authenticated destinations when they adopt the published package. */\nexport function CopyButtons(props: CopyControlProps) {\n const { CopyControls } = useMatrxDataTableHost();\n const copyProps = props.export?.sheetRows\n ? { ...props, primarySource: \"table\" as const }\n : props;\n if (CopyControls) return <CopyControls {...copyProps} />;\n return <MatrxCopyMenu {...copyProps} />;\n}\nexport function jsonExportItem(build: () => unknown, label: string): ExportItem { return { id: \"json\", label, build: () => ({ content: JSON.stringify(build(), null, 2), extension: \"json\", mime: \"application/json\" }) }; }\n","\"use client\";\n\n/**\n * MatrxUuidCell — canonical UUID / FK display for dense tables.\n *\n * Port of aidream `UuidDisplay` + AI Models `UuidCell` + tool-call `ShortId`:\n * short prefix (8 chars), full value on hover, always-visible copy of the full\n * id. Optional FK open: in-app WindowPanel (`onOpen`) and/or route (`href`).\n * Forbidden targets stay copyable but are not navigable.\n *\n * THE DOOR LAW: \"never render an id you can't open\". Pass `token` (the canonical\n * entity token this id points at) and the cell resolves its own doors from the\n * registries — route, new tab, and peek — with no per-callsite wiring. Prefer\n * `EntityRef` whenever the record's NAME is available; this is the fallback for\n * a raw FK column where it genuinely isn't.\n */\n\nimport {\n useEffect,\n useRef,\n useState,\n type MouseEvent,\n type ReactNode,\n} from \"react\";\nimport {\n Check,\n Copy,\n ExternalLink,\n Lightbulb,\n PanelRight,\n ShieldOff,\n} from \"./icons\";\nimport { useTableNotice } from \"./useTableNotice\";\nimport { useMatrxDataTableHost } from \"./host\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../tooltip\";\nimport { cn } from \"../cn\";\n\nconst SHORT_LEN = 8;\n\nexport function shortUuid(id: string, len = SHORT_LEN): string {\n return id.slice(0, len);\n}\n\nasync function copyText(text: string): Promise<boolean> {\n try {\n if (navigator.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n return true;\n }\n } catch {\n // fall through\n }\n try {\n const ta = document.createElement(\"textarea\");\n ta.value = text;\n ta.style.position = \"fixed\";\n ta.style.opacity = \"0\";\n document.body.appendChild(ta);\n ta.select();\n const ok = document.execCommand(\"copy\");\n document.body.removeChild(ta);\n return ok;\n } catch {\n return false;\n }\n}\n\nexport type MatrxUuidOpenResult = void | \"forbidden\";\n\nexport interface MatrxUuidCellProps {\n value: string | null | undefined;\n /** Tooltip / copy label prefix (e.g. column name). */\n label?: string | undefined;\n /**\n * Open the referenced record in-app (prefer WindowPanel).\n * Return `\"forbidden\"` to block navigation and show a muted state.\n */\n onOpen?: (id: string) => MatrxUuidOpenResult | Promise<MatrxUuidOpenResult>;\n /** Optional real href (new tab / cmd-click). Used when navigation is allowed. */\n href?: string | null | undefined;\n /**\n * Canonical entity token this id points at (`agent`, `note`, `task`, …).\n * Supplies the route and the peek automatically — THE DOOR LAW, resolved\n * from the registries instead of wired per callsite. An explicit `href` /\n * `onOpen` still wins.\n */\n token?: string | null | undefined;\n /** Force non-navigable (still copyable). */\n forbidden?: boolean;\n className?: string;\n trailing?: ReactNode;\n}\n\nexport function MatrxUuidCell({\n value,\n label,\n onOpen,\n href,\n token,\n forbidden = false,\n className,\n trailing,\n}: MatrxUuidCellProps) {\n const { resolveEntityDoors, ResourcePeek } = useMatrxDataTableHost();\n const { notify, notice } = useTableNotice();\n const [copied, setCopied] = useState(false);\n const [opening, setOpening] = useState(false);\n const [peekOpen, setPeekOpen] = useState(false);\n const timer = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n useEffect(\n () => () => {\n if (timer.current) clearTimeout(timer.current);\n },\n [],\n );\n\n if (!value) {\n return <span className=\"text-muted-foreground/40\">—</span>;\n }\n\n const doors = token ? resolveEntityDoors?.(token, value, href) ?? null : null;\n const resolvedHref = doors?.href ?? href ?? null;\n const canPeek = Boolean(doors?.canPeek) && !forbidden;\n const display = shortUuid(value);\n const tip = label ? `${label}: ${value}` : value;\n\n const stop = (e: MouseEvent) => {\n e.stopPropagation();\n };\n\n const onCopy = (e: MouseEvent) => {\n stop(e);\n e.preventDefault();\n void copyText(value).then((ok) => {\n if (!ok) {\n notify?.error(\"Couldn't copy ID\");\n return;\n }\n setCopied(true);\n if (timer.current) clearTimeout(timer.current);\n timer.current = setTimeout(() => setCopied(false), 1500);\n });\n };\n\n const handleOpen = async (e: MouseEvent) => {\n stop(e);\n e.preventDefault();\n if (!onOpen || forbidden || opening) return;\n setOpening(true);\n try {\n const result = await onOpen(value);\n if (result === \"forbidden\") {\n // access-errors: ok — relays the onOpen contract's explicit verdict: the caller's opener returns \"forbidden\" only after ITS OWN access check; the cell performs no read and never guesses\n notify?.error(\"You don't have access to open this record\");\n }\n } catch (err) {\n notify?.error(\n `Couldn't open: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n setOpening(false);\n }\n };\n\n const idNode = (() => {\n if (forbidden) {\n return (\n <span className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-muted-foreground/70 tabular-nums\">\n <span className=\"min-w-0 truncate\">{display}</span>\n <ShieldOff className=\"h-3 w-3 shrink-0 opacity-60\" aria-hidden />\n </span>\n );\n }\n\n if (onOpen) {\n return (\n <button\n type=\"button\"\n aria-label={`Open ${label ?? \"record\"} ${display}`}\n onClick={(e) => void handleOpen(e)}\n disabled={opening}\n className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-sky-600 hover:underline dark:text-sky-400 disabled:opacity-60\"\n >\n <span className=\"min-w-0 truncate tabular-nums\">{display}</span>\n <PanelRight className=\"h-3 w-3 shrink-0 opacity-50\" />\n </button>\n );\n }\n\n if (resolvedHref) {\n return (\n <a\n href={resolvedHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={`Open ${label ?? \"record\"} ${display} in a new tab`}\n onClick={stop}\n className=\"inline-flex min-w-0 items-center gap-1 font-mono text-xs text-sky-600 hover:underline dark:text-sky-400\"\n >\n <span className=\"min-w-0 truncate tabular-nums\">{display}</span>\n <ExternalLink className=\"h-3 w-3 shrink-0 opacity-50\" />\n </a>\n );\n }\n\n return (\n <span className=\"min-w-0 truncate font-mono text-xs text-muted-foreground tabular-nums select-all\">\n {display}\n </span>\n );\n })();\n\n return (\n <TooltipProvider delayDuration={200}>\n <span\n data-matrx-cell-control\n className={cn(\n \"inline-flex min-w-0 max-w-full items-center gap-0.5 whitespace-nowrap\",\n className,\n )}\n onClick={stop}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <span className=\"inline-flex min-w-0 max-w-full items-center\">\n {idNode}\n </span>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"max-w-sm break-all font-mono\">\n {forbidden ? `No access · ${tip}` : tip}\n </TooltipContent>\n </Tooltip>\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={onCopy}\n aria-label={copied ? \"Copied\" : `Copy ${label ?? \"id\"}`}\n className={cn(\n \"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\",\n copied && \"text-primary\",\n )}\n >\n {copied ? <Check className=\"h-3 w-3\" /> : <Copy className=\"h-3 w-3\" />}\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">{copied ? \"Copied\" : `Copy ${label ?? \"id\"}: ${value}`}</TooltipContent>\n </Tooltip>\n {canPeek ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={(e) => {\n stop(e);\n setPeekOpen(true);\n }}\n aria-label={`Quick look at ${label ?? \"record\"}`}\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\"\n >\n <Lightbulb className=\"h-3 w-3\" />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Quick look at {label ?? \"record\"}</TooltipContent>\n </Tooltip>\n ) : null}\n {onOpen && resolvedHref && !forbidden ? (\n <Tooltip>\n <TooltipTrigger asChild>\n <a\n href={resolvedHref}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={stop}\n aria-label={`Open ${label ?? \"record\"} in a new tab`}\n className=\"inline-flex h-4 w-4 shrink-0 items-center justify-center rounded text-muted-foreground transition-colors hover:text-foreground focus:outline-none\"\n >\n <ExternalLink className=\"h-3 w-3\" />\n </a>\n </TooltipTrigger>\n <TooltipContent side=\"top\">Open {label ?? \"record\"} in a new tab</TooltipContent>\n </Tooltip>\n ) : null}\n {trailing}\n {notice}\n {canPeek && peekOpen && ResourcePeek ? (\n <ResourcePeek\n kind={doors?.peekKind ?? token ?? \"record\"}\n id={value}\n onClose={() => setPeekOpen(false)}\n // Same contract as `EntityDoorControls`: forward the CALLER's raw\n // `href` so the peek's \"Open\" cannot send the user somewhere this\n // cell's own link does not go. `doors.ts` names EntityRef and this\n // cell as the two presentations that must not drift — the peek\n // override shipped on one of them first, which is exactly the drift\n // that file warns about.\n {...(href == null ? {} : { href })}\n />\n ) : null}\n </span>\n </TooltipProvider>\n );\n}\n","\"use client\";\nimport { useState } from \"react\";\nimport { useMatrxDataTableHost } from \"./host\";\n\n/** Every portable async action has visible feedback even without a host toast system. */\nexport function useTableNotice() {\n const host = useMatrxDataTableHost();\n const [message, setMessage] = useState<{ text: string; error: boolean } | null>(null);\n const notify = {\n success(text: string) { if (host.notify) host.notify.success(text); else setMessage({ text, error: false }); },\n error(text: string) { if (host.notify) host.notify.error(text); else setMessage({ text, error: true }); },\n };\n const notice = message ? <span role={message.error ? \"alert\" : \"status\"} className={message.error ? \"text-xs text-destructive\" : \"text-xs text-muted-foreground\"}>{message.text}<button type=\"button\" aria-label=\"Dismiss notification\" className=\"ml-2 underline\" onClick={() => setMessage(null)}>Dismiss</button></span> : null;\n return { notify, notice };\n}\n","export function isUuidValue(value: unknown): value is string {\n return typeof value === \"string\" && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\n}\nexport function tokenFromColumnName(name: string): string | null {\n return name.endsWith(\"_id\") ? name.slice(0, -3) : null;\n}\n","import type {\n ColumnFilterValue,\n ColumnFiltersState,\n MatrxColumnDef,\n SortState,\n TableSearchMatchMode,\n} from \"./types\";\nimport {\n completeLayeredFilterRules,\n layeredFilterMatchesValue,\n type LayeredFilterRule,\n} from \"./layered-filters\";\nimport { dateFilterBounds } from \"./date-filter\";\n\n/**\n * Sentinel select-filter values for \"no value\" / \"any value\" — every select\n * filter offers them automatically when the column has empty cells, so any\n * table can isolate rows missing a value (or having one) without extra config.\n */\nexport const SELECT_EMPTY_VALUE = \"__empty__\";\nexport const SELECT_NOT_EMPTY_VALUE = \"__not_empty__\";\n/** Exact SQL-style NULL selection, distinct from the empty-cell option. */\nexport const SELECT_NULL_VALUE = \"__null__\";\n\nexport function columnId<T>(col: MatrxColumnDef<T>): string {\n if (col.id) return col.id;\n if (col.accessorKey) return String(col.accessorKey);\n throw new Error(\"MatrxDataTable column requires `id` or `accessorKey`\");\n}\n\nexport function getCellValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n if (col.accessorFn) return col.accessorFn(row);\n if (col.accessorKey) {\n return (row as Record<string, unknown>)[col.accessorKey];\n }\n return undefined;\n}\n\nexport function getFilterValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n return col.filterValue ? col.filterValue(row) : getCellValue(row, col);\n}\n\nexport function getSortValue<T>(row: T, col: MatrxColumnDef<T>): unknown {\n return col.sortValue ? col.sortValue(row) : getCellValue(row, col);\n}\n\nexport function stringifyCellValue(value: unknown): string {\n if (value == null) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return value.toISOString();\n try {\n return JSON.stringify(value);\n } catch {\n return String(value);\n }\n}\n\n/** Unicode-aware tokenization shared by whole-word table search. */\nexport function tableSearchWords(value: string): string[] {\n return value\n .toLocaleLowerCase()\n .split(/[^\\p{L}\\p{N}]+/u)\n .filter(Boolean);\n}\n\n/**\n * Match the primary table search against one row's searchable text. In\n * whole-word mode every entered word must exist as a complete token, so\n * `are` matches `we are ready` but never `hardware`.\n */\nexport function matchesTableSearch(\n searchableText: string,\n query: string,\n mode: TableSearchMatchMode = \"contains\",\n): boolean {\n const normalizedQuery = query.trim().toLocaleLowerCase();\n if (!normalizedQuery) return true;\n if (mode === \"contains\") {\n return searchableText.toLocaleLowerCase().includes(normalizedQuery);\n }\n const actualWords = new Set(tableSearchWords(searchableText));\n const expectedWords = tableSearchWords(normalizedQuery);\n return (\n expectedWords.length > 0 &&\n expectedWords.every((word) => actualWords.has(word))\n );\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === \"number\" && typeof b === \"number\") return a - b;\n if (typeof a === \"boolean\" && typeof b === \"boolean\") {\n return Number(a) - Number(b);\n }\n return stringifyCellValue(a).localeCompare(stringifyCellValue(b), undefined, {\n numeric: true,\n sensitivity: \"base\",\n });\n}\n\n/** Select filters treat array-valued cells as sets, never as serialized JSON choices. */\nexport function selectCellValues(value: unknown): string[] {\n return (Array.isArray(value) ? value : [value])\n .map(stringifyCellValue)\n .filter((item) => item !== \"\");\n}\n\nexport function passesColumnFilter(\n value: unknown,\n filter: ColumnFilterValue,\n): boolean {\n const matches = (() => {\n switch (filter.kind) {\n case \"text\": {\n const s = stringifyCellValue(value);\n if (filter.mode === \"null\") return value == null;\n if (filter.mode === \"not_null\") return value != null;\n if (filter.mode === \"empty\") return s.trim() === \"\";\n if (filter.mode === \"not_empty\") return s.trim() !== \"\";\n const q = filter.value.trim().toLowerCase();\n if (!q) return true;\n return s.toLowerCase().includes(q);\n }\n case \"select\": {\n // `values: []` is an explicit multi-select state: the user deselected\n // every option, so it must produce an empty result. Legacy single-value\n // filters and an absent `values` field retain their clear/all behavior.\n if (filter.values !== undefined && filter.values.length === 0) {\n return false;\n }\n const selected = filter.values ??\n (filter.value && filter.value !== \"__all__\" ? [filter.value] : []);\n if (selected.length === 0) return true;\n const values = selectCellValues(value);\n // OR semantics across the set; sentinels compose (\"A or (empty)\").\n return selected.some((v) =>\n v === SELECT_NULL_VALUE\n ? value == null\n : v === SELECT_EMPTY_VALUE\n ? values.length === 0\n : v === SELECT_NOT_EMPTY_VALUE\n ? values.length > 0\n : v === \"\"\n ? value === \"\" || (Array.isArray(value) && value.includes(\"\"))\n : values.includes(v),\n );\n }\n case \"boolean\": {\n return Boolean(value) === filter.value;\n }\n case \"number\": {\n // A missing cell is not zero. Without this guard, Number(\"\") made a\n // blank numeric value pass filters whose range included zero.\n const raw = stringifyCellValue(value).trim();\n if (raw === \"\") return false;\n const normalized = raw.replace(/[^0-9.-]/g, \"\");\n if (normalized === \"\") return false;\n const n = typeof value === \"number\"\n ? value\n : Number(normalized);\n if (!Number.isFinite(n)) return false;\n if (filter.min !== undefined && n < filter.min) return false;\n if (filter.max !== undefined && n > filter.max) return false;\n return true;\n }\n case \"date\": {\n const raw = value instanceof Date ? value : new Date(stringifyCellValue(value));\n if (Number.isNaN(raw.valueOf())) return false;\n const { since, until } = dateFilterBounds(filter);\n const timestamp = raw.valueOf();\n if (since !== undefined) {\n const sinceTimestamp = new Date(since).valueOf();\n if (Number.isNaN(sinceTimestamp) || timestamp < sinceTimestamp) return false;\n }\n if (until !== undefined) {\n const untilTimestamp = new Date(until).valueOf();\n if (Number.isNaN(untilTimestamp) || timestamp >= untilTimestamp) return false;\n }\n return true;\n }\n }\n })();\n return filter.negated ? !matches : matches;\n}\n\nexport function filterAndSortRows<T>(\n rows: T[],\n columns: MatrxColumnDef<T>[],\n columnFilters: ColumnFiltersState,\n sort: SortState | null,\n globalSearch: string,\n anyOf?: { columnIds: string[]; query: string },\n layeredFilters?: readonly LayeredFilterRule[],\n globalSearchMode: TableSearchMatchMode = \"contains\",\n searchText?: (row: T) => string,\n): T[] {\n const colById = new Map(columns.map((c) => [columnId(c), c]));\n const q = globalSearch.trim().toLowerCase();\n const anyQ = anyOf?.query.trim().toLowerCase() ?? \"\";\n const activeLayeredFilters = completeLayeredFilterRules(layeredFilters);\n\n let result = rows.filter((row) => {\n for (const [id, filter] of Object.entries(columnFilters)) {\n if (!filter) continue;\n const col = colById.get(id);\n if (!col || col.filter === false) continue;\n if (!passesColumnFilter(getFilterValue(row, col), filter)) return false;\n }\n\n for (const rule of activeLayeredFilters) {\n const col = colById.get(rule.field);\n if (!col || !layeredFilterMatchesValue(getFilterValue(row, col), rule)) {\n return false;\n }\n }\n\n if (anyQ && anyOf) {\n const hit = anyOf.columnIds.some((id) => {\n const col = colById.get(id);\n if (!col) return false;\n return stringifyCellValue(getFilterValue(row, col))\n .toLowerCase()\n .includes(anyQ);\n });\n if (!hit) return false;\n }\n\n if (!q) return true;\n const searchableValues = columns\n .filter(\n (col) =>\n col.filter !== false || Boolean(col.accessorKey || col.accessorFn),\n )\n .map((col) => stringifyCellValue(getFilterValue(row, col)));\n const additionalSearchText = searchText?.(row);\n if (additionalSearchText) searchableValues.push(additionalSearchText);\n if (globalSearchMode === \"contains\") {\n return searchableValues.some((value) =>\n matchesTableSearch(value, q, \"contains\"),\n );\n }\n return matchesTableSearch(searchableValues.join(\" \"), q, \"whole_words\");\n });\n\n if (sort) {\n const col = colById.get(sort.id);\n if (col && col.sortable !== false) {\n const dir = sort.direction === \"asc\" ? 1 : -1;\n result = [...result].sort((a, b) => {\n const va = getSortValue(a, col);\n const vb = getSortValue(b, col);\n // Empty cells (null / \"\") sort LAST in both directions — sorting a\n // column should surface its values, never a wall of blanks.\n const ea = va == null || stringifyCellValue(va) === \"\";\n const eb = vb == null || stringifyCellValue(vb) === \"\";\n if (ea !== eb) return ea ? 1 : -1;\n return compareValues(va, vb) * dir;\n });\n }\n }\n\n return result;\n}\n\nexport function countActiveColumnFilters(filters: ColumnFiltersState): number {\n let n = 0;\n for (const f of Object.values(filters)) {\n if (!f) continue;\n switch (f.kind) {\n case \"text\":\n if (f.value.trim() || (f.mode && f.mode !== \"contains\")) n += 1;\n break;\n case \"select\":\n if (f.values !== undefined || (f.value && f.value !== \"__all__\"))\n n += 1;\n break;\n case \"boolean\":\n n += 1;\n break;\n case \"number\":\n if (f.min !== undefined || f.max !== undefined) n += 1;\n break;\n case \"date\":\n if (isColumnFilterActive(f)) n += 1;\n break;\n }\n }\n return n;\n}\n\nexport function isColumnFilterActive(\n filter: ColumnFilterValue | undefined,\n): boolean {\n if (!filter) return false;\n switch (filter.kind) {\n case \"text\":\n return (\n filter.value.trim().length > 0 ||\n (filter.mode !== undefined && filter.mode !== \"contains\")\n );\n case \"select\":\n return filter.values !== undefined\n ? true\n : Boolean(filter.value) && filter.value !== \"__all__\";\n case \"boolean\":\n return true;\n case \"number\":\n return filter.min !== undefined || filter.max !== undefined;\n case \"date\": {\n const bounds = dateFilterBounds(filter);\n return bounds.since !== undefined || bounds.until !== undefined;\n }\n }\n}\n\n/** Apply draft edits onto a row for display (shallow field merge). */\nexport function applyRowEdits<T>(\n row: T,\n edits: Record<string, unknown> | undefined,\n): T {\n if (!edits || Object.keys(edits).length === 0) return row;\n return { ...row, ...edits };\n}\n","import { stringifyCellValue } from \"./filter-engine\";\n\n/** Display formatting only; copy/export and persistence retain the original value. */\nexport function formatTableDisplayValue(value: unknown): string {\n if (typeof value === \"number\") return value.toLocaleString(undefined, { maximumFractionDigits: 12 });\n if (value instanceof Date) return value.toLocaleString();\n if (typeof value === \"string\" && /^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}/.test(value) && !Number.isNaN(Date.parse(value))) {\n return new Date(value).toLocaleString();\n }\n if (typeof value === \"boolean\") return value ? \"Yes\" : \"No\";\n return stringifyCellValue(value) || \"—\";\n}\n","\"use client\";\n\nimport type { ReactNode } from \"react\";\nimport { cn } from \"../cn\";\nimport { CopyButtons } from \"./copy\";\nimport { MatrxUuidCell } from \"./MatrxUuidCell\";\nimport { isUuidValue } from \"./entity\";\nimport { formatTableDisplayValue } from \"./display-value\";\n\n/** No field is a door unless the caller says which token it points at. */\nconst noFieldToken = (): string | null => null;\n\nfunction formatValue(value: unknown): string {\n if (value == null) return \"—\";\n if (typeof value === \"string\") return value || \"—\";\n if (typeof value === \"number\" || typeof value === \"boolean\") {\n return String(value);\n }\n if (value instanceof Date) return value.toISOString();\n try {\n return JSON.stringify(value, null, 2);\n } catch {\n return String(value);\n }\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n !Array.isArray(value) &&\n !(value instanceof Date)\n );\n}\n\n/**\n * Default detail / window View body for any row. Renders a scannable key/value\n * inspector. UUID-shaped values use MatrxUuidCell (short + copy). Every field\n * row gets hover-revealed Copy + Copy-for-AI buttons (set `fieldCopy={false}`\n * to opt out). Pass a custom `renderView` / `renderDetail` to replace it.\n */\nexport function DataRowInspector<T = unknown>({\n row,\n title,\n className,\n fieldCopy = true,\n recordKind = \"record\",\n recordLabel,\n location,\n tokenForField = noFieldToken,\n}: {\n row: T;\n title?: ReactNode;\n className?: string;\n /** Hover Copy + Copy-for-AI on every field row. Default true. */\n fieldCopy?: boolean;\n /** Stable slug for the record type, used in field agent payloads. */\n recordKind?: string;\n /** Human label for the record, used in toasts (\"Backlink · anchor_text\"). */\n recordLabel?: string;\n /** Where the user is, in words, for field agent payloads. */\n location?: string;\n /**\n * Maps one of this record's field names to the entity token its id points at,\n * turning that field into a door (route + peek).\n *\n * Defaults to NO doors, because this inspector renders arbitrary tables and a\n * wrong door opens a different record. A caller that has checked its FKs can\n * pass `tokenFromColumnName` (from `components/official/entity-ref/doors`) to\n * open every `<token>_id` field, or its own stricter map.\n */\n tokenForField?: (key: string, row: T) => string | null;\n}) {\n const entries = isPlainObject(row)\n ? Object.entries(row)\n : [[\"value\", row] as const];\n\n const fieldButtons = (key: string, value: unknown) =>\n fieldCopy ? (\n <div className=\"absolute right-1 top-1 opacity-0 transition-opacity focus-within:opacity-100 group-hover/field:opacity-100\">\n <CopyButtons\n size=\"xs\"\n label={recordLabel ? `${recordLabel} · ${key}` : key}\n human={() => formatValue(value)}\n agent={() => ({\n kind: `${recordKind}-field`,\n location: location ?? \"Data row inspector\",\n description: `The \"${key}\" field of one ${recordLabel ?? recordKind}.`,\n data: { field: key, value, record: row },\n attributes: { field: key },\n })}\n />\n </div>\n ) : null;\n\n return (\n <div\n className={cn(\"flex h-full min-h-0 flex-col overflow-hidden\", className)}\n >\n {title ? (\n <div className=\"shrink-0 border-b border-border px-3 py-2 text-sm font-medium\">\n {title}\n </div>\n ) : null}\n <div className=\"min-h-0 flex-1 overflow-auto p-3\">\n <dl className=\"space-y-2\">\n {entries.map(([key, value]) => {\n if (isUuidValue(value)) {\n return (\n <div\n key={key}\n className=\"group/field relative grid grid-cols-[minmax(7rem,9rem)_1fr] gap-2 rounded-md border border-border/60 bg-muted/20 px-2.5 py-2\"\n >\n <dt className=\"truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {key}\n </dt>\n <dd className=\"min-w-0\">\n <MatrxUuidCell\n value={value}\n label={key}\n token={tokenForField(key, row)}\n />\n </dd>\n </div>\n );\n }\n\n const formatted = value !== null && typeof value === \"object\" && !(value instanceof Date)\n ? formatValue(value)\n : formatTableDisplayValue(value);\n const multiline = formatted.includes(\"\\n\") || formatted.length > 80;\n return (\n <div\n key={key}\n className=\"group/field relative grid grid-cols-[minmax(7rem,9rem)_1fr] gap-2 rounded-md border border-border/60 bg-muted/20 py-2 pl-2.5 pr-12\"\n >\n <dt className=\"truncate text-[11px] font-medium uppercase tracking-wide text-muted-foreground\">\n {key}\n </dt>\n <dd\n className={cn(\n \"min-w-0 text-sm text-foreground break-words\",\n multiline &&\n \"whitespace-pre-wrap font-mono text-xs leading-relaxed\",\n )}\n >\n {formatted}\n </dd>\n {fieldButtons(key, value)}\n </div>\n );\n })}\n </dl>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["import_react","React","import_jsx_runtime","React","import_jsx_runtime","CONTEXT_SLOT","contextRegistry","React","import_jsx_runtime","CONTEXT_SLOT","contextRegistry","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","React","import_content_transfer","import_format","React","React","import_jsx_runtime","import_jsx_runtime","resolve","React","import_content_transfer","React","import_jsx_runtime","import_react","React","import_jsx_runtime","cn","import_jsx_runtime","cn","TapTargetButton","TapTargetButtonTransparent","TapTargetButtonSolid","TapTargetButtonDestructive","TapTargetButtonForGroup","import_jsx_runtime","Icon","label","import_jsx_runtime","import_jsx_runtime","import_react","import_react","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime","import_jsx_runtime"]}
|