@ai-matrx/content-ir-react 0.24.2 → 0.24.5
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 +10 -0
- package/dist/kind-kit.cjs +2 -6
- package/dist/kind-kit.cjs.map +1 -1
- package/dist/kind-kit.js +2 -6
- package/dist/kind-kit.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,15 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 0.24.4
|
|
4
|
+
|
|
5
|
+
Automatic changed-only republish (docs/metadata drift since the last tag — see
|
|
6
|
+
`git diff npm/content-ir-react/v0.24.2..npm/content-ir-react/v0.24.4 -- apps/shared/content-ir-react`).
|
|
7
|
+
No source changes intended and no consumer action required.
|
|
8
|
+
|
|
9
|
+
## 0.24.3
|
|
10
|
+
|
|
11
|
+
AP-2 (2026-10-07) — the kit and Alchemy doors are the only doors in this package (aidream guard `apps/shared/scripts/check-shared-doors.mjs`). Kind-kit `DefaultCopyButtons` copies through `@ai-matrx/kit/clipboard` `copyText` (copied/failed from its boolean). No consumer action.
|
|
12
|
+
|
|
3
13
|
## 0.24.2 — 2026-10-06
|
|
4
14
|
|
|
5
15
|
- Compiled kind components receive `itemState` (the item's durable state; image refs carry `src`).
|
package/dist/kind-kit.cjs
CHANGED
|
@@ -129,6 +129,7 @@ var import_design_system = require("@ai-matrx/design-system");
|
|
|
129
129
|
|
|
130
130
|
// kind-kit/kind-kit-host.tsx
|
|
131
131
|
var React2 = __toESM(require("react"), 1);
|
|
132
|
+
var import_clipboard = require("@ai-matrx/kit/clipboard");
|
|
132
133
|
var import_jsx_runtime2 = require("react/jsx-runtime");
|
|
133
134
|
var KEY = /* @__PURE__ */ Symbol.for("ai-matrx.content-ir-react.kind-kit-host");
|
|
134
135
|
function resolveText(human, json) {
|
|
@@ -140,12 +141,7 @@ function resolveText(human, json) {
|
|
|
140
141
|
function DefaultCopyButtons({ label, human, json, size, className }) {
|
|
141
142
|
const [state, setState] = React2.useState("idle");
|
|
142
143
|
const onClick = async () => {
|
|
143
|
-
|
|
144
|
-
await navigator.clipboard.writeText(resolveText(human, json));
|
|
145
|
-
setState("copied");
|
|
146
|
-
} catch {
|
|
147
|
-
setState("failed");
|
|
148
|
-
}
|
|
144
|
+
setState(await (0, import_clipboard.copyText)(resolveText(human, json)) ? "copied" : "failed");
|
|
149
145
|
setTimeout(() => setState("idle"), 1500);
|
|
150
146
|
};
|
|
151
147
|
return /* @__PURE__ */ (0, import_jsx_runtime2.jsx)(
|
package/dist/kind-kit.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../kind-kit.ts","../kind-kit/SortableList.tsx","../kind-kit/icons.tsx","../kind-kit/kind-kit-host.tsx","../kind-kit/KindPanelGrid.tsx","../kind-kit/KindPanel.tsx","../kind-kit/icon-slot.tsx","../kind-kit/KindHeaderBar.tsx","../kind-kit/KindActionButton.tsx","../kind-kit/StreamingSkeleton.tsx","../kind-kit/TagList.tsx"],"sourcesContent":["export { SortableList, type SortableListProps, type SortableRenderContext } from \"./kind-kit/SortableList\";\nexport { KindPanelGrid, type KindPanelGridProps } from \"./kind-kit/KindPanelGrid\";\nexport * from \"./kind-kit/KindPanel\";\nexport { KindHeaderBar, type KindHeaderBarProps, type KindHeaderStat } from \"./kind-kit/KindHeaderBar\";\nexport {\n KindActionButton,\n type KindActionButtonProps,\n type KindActionEnvelope,\n} from \"./kind-kit/KindActionButton\";\nexport {\n StreamingSkeleton,\n useStreamingValue,\n streamList,\n streamText,\n type StreamingSkeletonProps,\n} from \"./kind-kit/StreamingSkeleton\";\nexport { KeywordChip, TagList, type KeywordChipProps, type TagItem, type TagListProps } from \"./kind-kit/TagList\";\nexport { renderKindKitIcon, type KindKitIcon } from \"./kind-kit/icon-slot\";\nexport {\n setKindKitHost,\n getKindKitHost,\n resetKindKitHost,\n DefaultCopyButtons,\n DefaultReadEmpty,\n DefaultReadStaleNotice,\n type KindKitHost,\n type KindKitCopyProps,\n type KindKitReadEmptyProps,\n type KindKitReadStaleNoticeProps,\n type ReadOutcome,\n type ReadStatus,\n} from \"./kind-kit/kind-kit-host\";\n","\"use client\";\n\n/**\n * SortableList — drag-to-reorder list for kind components.\n *\n * The mandated reorder UX, built once: while a row is dragged, the rows it\n * passes DISPLACE (translate) out of the way and a SHADOWED placeholder marks\n * exactly where the item will land. Native HTML5 drag-and-drop (no deps); a\n * grab handle starts the drag (so text and inputs inside rows stay usable);\n * up/down buttons are the keyboard + touch fallback; `onRemove` adds an inline\n * remove control. Contract: `kind-kit/README.md`.\n *\n * Sandbox-safe by construction: imports only react, the design system,\n * and `cn`.\n */\n\nimport * as React from \"react\";\nimport { ChevronDown, ChevronUp, GripVertical, X } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { getKindKitHost, type ReadOutcome } from \"./kind-kit-host\";\n\nexport interface SortableRenderContext {\n index: number;\n /** True for the row currently being dragged (rendered as the placeholder). */\n isDragging: boolean;\n}\n\nexport interface SortableListProps<T> {\n /** Current order. Treated as read-only; the new order arrives via `onReorder`. */\n items: readonly T[];\n /**\n * Stable key per item. Default: the item itself when it is a string, else\n * `item.id` / `item.key` when present, else the index (unstable — pass one).\n */\n getKey?: (item: T, index: number) => string;\n /** Called with the full reordered array after a drop or an arrow press. */\n onReorder: (items: T[]) => void;\n /**\n * Row content. Default: the item when it is a string/number, else its\n * `label` / `title` / `name` / `text` field, else `JSON.stringify`.\n */\n renderItem?: (item: T, ctx: SortableRenderContext) => React.ReactNode;\n /** When set, every row gets an inline remove (X) control. */\n onRemove?: (item: T, index: number) => void;\n /** Disables drag, arrows and remove (rows still render). */\n disabled?: boolean;\n /** Hide the up/down arrow buttons (drag only). Default false. */\n hideArrows?: boolean;\n /** Shown when `items` is empty. */\n emptyState?: React.ReactNode;\n /**\n * The outcome of the read behind the rows (RC-B12 r13). `emptyState` shows\n * only after a read that succeeded; a failed read shows the failure + retry.\n */\n read?: ReadOutcome;\n /** Wrapper `<ul>` className. */\n className?: string;\n /** Per-row className (applied to every `<li>`). */\n itemClassName?: string;\n /** Accessible name for the list. */\n ariaLabel?: string;\n}\n\nfunction defaultKey<T>(item: T, index: number): string {\n if (typeof item === \"string\" || typeof item === \"number\") return String(item);\n if (item && typeof item === \"object\") {\n const rec = item as Record<string, unknown>;\n if (typeof rec.id === \"string\" || typeof rec.id === \"number\")\n return String(rec.id);\n if (typeof rec.key === \"string\") return rec.key;\n }\n return String(index);\n}\n\nfunction defaultRender<T>(item: T): React.ReactNode {\n if (typeof item === \"string\" || typeof item === \"number\") return String(item);\n if (item && typeof item === \"object\") {\n const rec = item as Record<string, unknown>;\n for (const k of [\"label\", \"title\", \"name\", \"text\"]) {\n if (typeof rec[k] === \"string\") return rec[k] as string;\n }\n return JSON.stringify(item);\n }\n return String(item);\n}\n\nfunction moveItem<T>(items: readonly T[], from: number, to: number): T[] {\n const next = items.slice();\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved as T);\n return next;\n}\n\ninterface DragState {\n from: number;\n over: number;\n /**\n * Row rects captured at drag start, relative to the list's top — a fixed\n * ruler: the pointer's position on it decides the landing slot, so the\n * target never depends on which (already displaced) row fires the event.\n */\n rects: { top: number; bottom: number; height: number }[];\n}\n\nexport function SortableList<T>({\n items,\n getKey = defaultKey,\n onReorder,\n renderItem,\n onRemove,\n disabled = false,\n hideArrows = false,\n emptyState,\n read,\n className,\n itemClassName,\n ariaLabel,\n}: SortableListProps<T>) {\n const { ReadEmpty, ReadStaleNotice } = getKindKitHost();\n const [drag, setDrag] = React.useState<DragState | null>(null);\n const [armed, setArmed] = React.useState<number | null>(null);\n const listRef = React.useRef<HTMLUListElement | null>(null);\n const rowRefs = React.useRef<(HTMLLIElement | null)[]>([]);\n\n const canInteract = !disabled;\n\n const handleDragStart = (index: number) => (e: React.DragEvent<HTMLLIElement>) => {\n if (!canInteract || armed !== index) {\n e.preventDefault();\n return;\n }\n e.dataTransfer.effectAllowed = \"move\";\n // Firefox requires data to start a drag.\n e.dataTransfer.setData(\"text/plain\", String(index));\n const listTop = listRef.current?.getBoundingClientRect().top ?? 0;\n const rects = rowRefs.current.slice(0, items.length).map((el) => {\n const r = el ? el.getBoundingClientRect() : new DOMRect();\n return { top: r.top - listTop, bottom: r.bottom - listTop, height: r.height };\n });\n setDrag({ from: index, over: index, rects });\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const listTop = listRef.current?.getBoundingClientRect().top ?? 0;\n const y = e.clientY - listTop;\n let over = drag.rects.length - 1;\n for (let i = 0; i < drag.rects.length; i++) {\n const r = drag.rects[i];\n if (r && y < r.bottom) {\n over = i;\n break;\n }\n }\n if (over !== drag.over) setDrag({ ...drag, over });\n };\n\n const finish = () => {\n setDrag(null);\n setArmed(null);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n if (drag && drag.from !== drag.over) {\n onReorder(moveItem(items, drag.from, drag.over));\n }\n finish();\n };\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= items.length || from === to) return;\n onReorder(moveItem(items, from, to));\n };\n\n /** Translate (px) for row `index` while a drag is in flight. */\n const translateFor = (index: number): number => {\n if (!drag) return 0;\n const { from, over, rects } = drag;\n if (from === over) return 0;\n const dragged = rects[from];\n if (!dragged) return 0;\n // Slot size = row height + the gap to its neighbour (so displaced rows\n // land exactly on the grid the dragged row vacates).\n const neighbour = rects[from + 1] ?? rects[from - 1];\n const gap = neighbour\n ? Math.max(\n 0,\n from + 1 < rects.length\n ? neighbour.top - dragged.bottom\n : dragged.top - neighbour.bottom,\n )\n : 0;\n const slot = dragged.height + gap;\n if (index === from) {\n const target = rects[over];\n if (!target) return 0;\n return over > from\n ? target.bottom - dragged.bottom\n : target.top - dragged.top;\n }\n if (from < over && index > from && index <= over) return -slot;\n if (over < from && index >= over && index < from) return slot;\n return 0;\n };\n\n if (items.length === 0) {\n if (read && read.status !== \"ready\") return <ReadEmpty read={read} />;\n return emptyState !== undefined ? (\n <div className={cn(\"text-xs text-muted-foreground\", className)}>\n {emptyState}\n </div>\n ) : null;\n }\n\n return (\n <>\n <ReadStaleNotice read={read} className=\"mb-1.5\" />\n <ul\n role=\"list\"\n aria-label={ariaLabel}\n ref={listRef}\n className={cn(\"flex flex-col gap-1.5\", className)}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {items.map((item, index) => {\n const key = getKey(item, index);\n const isDragging = drag?.from === index;\n const translate = translateFor(index);\n return (\n <li\n key={key}\n ref={(el) => {\n rowRefs.current[index] = el;\n }}\n draggable={canInteract && armed === index}\n onDragStart={handleDragStart(index)}\n onDragEnd={finish}\n style={{\n transform: translate ? `translate3d(0, ${translate}px, 0)` : undefined,\n }}\n className={cn(\n \"flex items-center gap-1.5 rounded-md border px-2 py-1.5 text-sm text-foreground\",\n \"transition-transform duration-150 ease-out will-change-transform\",\n isDragging\n ? \"border-dashed border-primary/60 bg-primary/5 shadow-inner\"\n : \"border-border bg-card\",\n itemClassName,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Drag to reorder\"\n disabled={!canInteract}\n onPointerDown={() => canInteract && setArmed(index)}\n onPointerUp={() => !drag && setArmed(null)}\n className={cn(\n \"flex h-7 w-6 shrink-0 touch-none items-center justify-center rounded text-muted-foreground\",\n canInteract\n ? \"cursor-grab hover:bg-muted hover:text-foreground active:cursor-grabbing\"\n : \"opacity-40\",\n )}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n <div\n className={cn(\n \"min-w-0 flex-1 break-words\",\n isDragging && \"opacity-40\",\n )}\n >\n {renderItem\n ? renderItem(item, { index, isDragging })\n : defaultRender(item)}\n </div>\n {(!hideArrows || onRemove) && (\n /*\n * Controls sit IN FLOW at the row's end — never floating.\n *\n * A cluster that costs no layout width must, by construction,\n * land on top of something when it appears, and it wins every\n * click there because it is the layer above. Rows here carry the\n * host component's own trailing controls (copy, edit, menus), so\n * a floating cluster covered live buttons on every consumer:\n * measured on `artisan_demo_reading_list`, it sat on \"Copy for\n * AI\" and \"Edit book\". The kit cannot know what a row draws in\n * its corner, so it takes its own width instead of borrowing the\n * row's. Ruled 2026-08-30: overlap is never worth the density.\n */\n <div\n className={cn(\n \"flex shrink-0 items-center gap-px self-start\",\n isDragging && \"opacity-40\",\n )}\n >\n {!hideArrows && (\n /* Chevrons stack so the pair costs one 20px column, not two. */\n <div className=\"flex flex-col items-center pointer-coarse:flex-row\">\n <button\n type=\"button\"\n aria-label=\"Move up\"\n disabled={!canInteract || index === 0}\n onClick={() => move(index, index - 1)}\n className=\"flex h-3.5 w-5 items-center justify-center rounded-sm text-muted-foreground/70 hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <ChevronUp className=\"h-3 w-3\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Move down\"\n disabled={!canInteract || index === items.length - 1}\n onClick={() => move(index, index + 1)}\n className=\"flex h-3.5 w-5 items-center justify-center rounded-sm text-muted-foreground/70 hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n disabled={!canInteract}\n onClick={() => onRemove(item, index)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/70 hover:bg-muted hover:text-destructive disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </>\n );\n}\n","/**\n * The kit's nine glyphs, inlined (C19: a package ships its own SVGs, no icon-library\n * dependency). Paths are Lucide's (ISC licence); stroke and size come from the\n * `className` the caller passes, exactly as a Lucide component would take it.\n */\nimport * as React from \"react\";\n\ntype IconProps = { className?: string };\n\nfunction make(name: string, children: React.ReactNode) {\n const Icon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\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 className={className}\n >\n {children}\n </svg>\n );\n Icon.displayName = name;\n return Icon;\n}\n\nexport const Loader2 = make(\"Loader2\", <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />);\nexport const MoreHorizontal = make(\n \"MoreHorizontal\",\n <>\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 </>,\n);\nexport const ChevronDown = make(\"ChevronDown\", <path d=\"m6 9 6 6 6-6\" />);\nexport const ChevronUp = make(\"ChevronUp\", <path d=\"m18 15-6-6-6 6\" />);\nexport const GripVertical = make(\n \"GripVertical\",\n <>\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\n </>,\n);\nexport const X = make(\n \"X\",\n <>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </>,\n);\nexport const Check = make(\"Check\", <path d=\"M20 6 9 17l-5-5\" />);\nexport const Pencil = make(\n \"Pencil\",\n <>\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </>,\n);\nexport const Plus = make(\n \"Plus\",\n <>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </>,\n);\n","\"use client\";\n\n/**\n * The kit's HOST SLOTS. The kit never imports app code; the three things it cannot own are\n * handed in once by the host through `setKindKitHost`:\n * - `CopyButtons` the copy bar `KindHeaderBar` renders for its `copy` prop;\n * - `ReadEmpty` what `SortableList` / `TagList` show instead of an empty state while a\n * read has not succeeded;\n * - `ReadStaleNotice` the notice above rows left on screen by a failed refresh.\n * Each default is honest and working: a plain Copy button, and text that says what happened.\n * State lives on globalThis under a Symbol.for key so two copies of the package share one host.\n */\nimport * as React from \"react\";\nimport type { MatrxCopyMenuProps } from \"@ai-matrx/alchemy/react/workspace\";\n\n/**\n * The copy bar's props: exactly the design system's `MatrxCopyMenuProps`, so a host registers its\n * own `CopyButtons` (which takes that shape) with no adapter. Type-only: no runtime import.\n */\nexport type KindKitCopyProps = MatrxCopyMenuProps;\n\nexport type ReadStatus = \"loading\" | \"error\" | \"ready\";\n\n/** A read's outcome, handed to a list primitive's `read` prop. */\nexport interface ReadOutcome {\n status: ReadStatus;\n /** The failure itself, or a truthy flag when the read only says it failed. */\n error?: unknown;\n onRetry?: (() => void) | undefined;\n /** What was read, in the reader's words: \"your tasks\". */\n what?: string | undefined;\n /** A successful read has already produced a value. */\n hasData?: boolean | undefined;\n}\n\nexport interface KindKitReadEmptyProps {\n read?: ReadOutcome | undefined;\n loading?: React.ReactNode;\n children?: React.ReactNode;\n}\nexport interface KindKitReadStaleNoticeProps {\n read?: ReadOutcome | undefined;\n className?: string;\n}\n\nexport interface KindKitHost {\n CopyButtons: React.ComponentType<KindKitCopyProps>;\n ReadEmpty: React.ComponentType<KindKitReadEmptyProps>;\n ReadStaleNotice: React.ComponentType<KindKitReadStaleNoticeProps>;\n}\n\nconst KEY = Symbol.for(\"ai-matrx.content-ir-react.kind-kit-host\");\ntype Store = { [KEY]?: Partial<KindKitHost> };\n\nfunction resolveText(human: KindKitCopyProps[\"human\"], json: KindKitCopyProps[\"json\"]): string {\n if (typeof human === \"function\") return human();\n if (typeof human === \"string\") return human;\n if (json !== undefined) return JSON.stringify(typeof json === \"function\" ? (json as () => unknown)() : json, null, 2);\n return \"\";\n}\n\n/** Default copy bar: one \"Copy\" button that writes the `human` text (else the JSON) to the clipboard. */\nexport function DefaultCopyButtons({ label, human, json, size, className }: KindKitCopyProps) {\n const [state, setState] = React.useState<\"idle\" | \"copied\" | \"failed\">(\"idle\");\n const onClick = async () => {\n try {\n await navigator.clipboard.writeText(resolveText(human, json));\n setState(\"copied\");\n } catch {\n setState(\"failed\");\n }\n setTimeout(() => setState(\"idle\"), 1500);\n };\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={`Copy ${label}`}\n aria-label={`Copy ${label}`}\n className={\n className ??\n `inline-flex items-center rounded-md border border-border px-2 text-xs text-foreground hover:bg-muted ${size === \"icon\" ? \"h-7\" : \"h-8\"}`\n }\n >\n {state === \"copied\" ? \"Copied\" : state === \"failed\" ? \"Copy failed\" : \"Copy\"}\n </button>\n );\n}\n\nfunction RetryButton({ onRetry }: { onRetry: (() => void) | undefined }) {\n if (!onRetry) return null;\n return (\n <button type=\"button\" onClick={onRetry} className=\"ml-2 underline underline-offset-2\">\n Try again\n </button>\n );\n}\n\n/** Default: loading says it is loading; an error says what failed (with retry); ready shows the host's empty state. */\nexport function DefaultReadEmpty({ read, loading, children }: KindKitReadEmptyProps) {\n const status = read?.status ?? \"ready\";\n const what = read?.what ?? \"this list\";\n if (status === \"loading\") return <>{loading ?? <div role=\"status\" className=\"text-xs text-muted-foreground\">{`Loading ${what}…`}</div>}</>;\n if (status === \"error\") {\n return (\n <div role=\"alert\" className=\"text-xs text-destructive\">\n {`Could not load ${what}.`}\n <RetryButton onRetry={read?.onRetry} />\n </div>\n );\n }\n return <>{children ?? null}</>;\n}\n\n/** Default: when the latest read failed, the rows on screen may be out of date; says so, with retry. */\nexport function DefaultReadStaleNotice({ read, className }: KindKitReadStaleNoticeProps) {\n if (read?.status !== \"error\") return null;\n return (\n <div role=\"alert\" className={`text-xs text-muted-foreground ${className ?? \"\"}`}>\n {`Showing earlier ${read.what ?? \"results\"}; the latest refresh failed.`}\n <RetryButton onRetry={read.onRetry} />\n </div>\n );\n}\n\nconst DEFAULTS: KindKitHost = {\n CopyButtons: DefaultCopyButtons,\n ReadEmpty: DefaultReadEmpty,\n ReadStaleNotice: DefaultReadStaleNotice,\n};\n\n/** Register the host's copy bar and read notices. Call once at boot; a slot left out keeps its default. */\nexport function setKindKitHost(host: Partial<KindKitHost>): void {\n (globalThis as Store)[KEY] = { ...(globalThis as Store)[KEY], ...host };\n}\n\n/** The slots in force: the host's where registered, the defaults elsewhere. */\nexport function getKindKitHost(): KindKitHost {\n return { ...DEFAULTS, ...(globalThis as Store)[KEY] };\n}\n\n/** Clear every registered slot (tests, hot reload). */\nexport function resetKindKitHost(): void {\n delete (globalThis as Store)[KEY];\n}\n","\"use client\";\n\n/**\n * KindPanelGrid — content-aware responsive grid for side-by-side panels.\n *\n * Never more columns than the content can afford: every track is at least\n * `minColumnWidth` (default 280px) wide, the column count is whatever fits\n * (`auto-fit`), and every panel in a row stretches to the same height so the\n * panels' footers line up. Pair with `KindPanel` (its `footer` is pinned to\n * the bottom). Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\n\nconst GAP_PX = { sm: 8, md: 12, lg: 16 } as const;\nconst GAP_CLASS = { sm: \"gap-2\", md: \"gap-3\", lg: \"gap-4\" } as const;\n\nexport interface KindPanelGridProps {\n children: React.ReactNode;\n /** Minimum width (px) of a column before the grid drops a column. Default 280. */\n minColumnWidth?: number;\n /** Hard ceiling on columns, however wide the container is. */\n maxColumns?: number;\n /** Space between panels. Default \"md\" (12px). */\n gap?: keyof typeof GAP_PX;\n /**\n * \"auto-fit\" (default): a short last row lets panels grow to fill the width.\n * \"auto-fill\": tracks stay the same width and the row is left short.\n */\n fill?: \"auto-fit\" | \"auto-fill\";\n className?: string;\n}\n\nexport function KindPanelGrid({\n children,\n minColumnWidth = 280,\n maxColumns,\n gap = \"md\",\n fill = \"auto-fit\",\n className,\n}: KindPanelGridProps) {\n const min = `min(100%, ${minColumnWidth}px)`;\n // With a column ceiling, each track must also be at least 1/n of the row —\n // which caps the count at n while still never going under minColumnWidth.\n const track =\n maxColumns && maxColumns > 0\n ? `max(${min}, calc((100% - ${GAP_PX[gap] * (maxColumns - 1)}px) / ${maxColumns}))`\n : min;\n return (\n <div\n className={cn(\"grid items-stretch\", GAP_CLASS[gap], className)}\n style={{ gridTemplateColumns: `repeat(${fill}, minmax(${track}, 1fr))` }}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * KindPanel — the standard panel for a kind component's sub-sections (a\n * keyword bucket, an option card, a section of results).\n *\n * Layout is fixed so agent-authored panels come out right by construction:\n * - compact header: icon · title (wraps, never squeezed) · count · ≤2 inline\n * actions · an overflow menu that absorbs EVERY other control (no control\n * row ever gets crammed);\n * - full-width subline (a rationale, a hint) on its own line UNDER the\n * header — never beside the title;\n * - body;\n * - `footer` pinned to the bottom (flex column + mt-auto) so \"Add\" rows\n * line up across sibling panels in a `KindPanelGrid`.\n * Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Loader2, MoreHorizontal } from \"./icons\";\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@ai-matrx/design-system\";\n\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\n\nexport interface KindPanelMenuItem {\n label: string;\n onSelect: () => void;\n icon?: React.ComponentType<{ className?: string }>;\n disabled?: boolean;\n /** Renders in the destructive colour (delete, clear, reset). */\n destructive?: boolean;\n /** Draws a separator ABOVE this item. */\n separatorBefore?: boolean;\n}\n\nexport interface KindPanelProps {\n /** Header title. Wraps onto extra lines rather than truncating. */\n title: React.ReactNode;\n /** Lucide component or an already-created icon element shown before the title. */\n icon?: KindKitIcon;\n /** Count pill after the title (e.g. number of items). */\n count?: number | string;\n /** Any extra pill/badge after the count (a status, a score). */\n badge?: React.ReactNode;\n /** Shows a spinner in the header while this panel's data is still arriving. */\n streaming?: boolean;\n /**\n * At most one or two compact controls rendered inline on the right of the\n * header (a toggle, a tiny icon button). Put everything else in `menuItems`.\n */\n actions?: React.ReactNode;\n /** Controls collapsed into the header's overflow (⋯) menu. */\n menuItems?: KindPanelMenuItem[];\n /** Full-width line under the header — a rationale, a hint. Never beside the title. */\n subline?: React.ReactNode;\n /** Panel body. */\n children?: React.ReactNode;\n /** Pinned to the bottom of the panel (an \"Add\" row, a summary, a copy bar). */\n footer?: React.ReactNode;\n /** \"card\" (default): bordered card. \"bare\": no border/background — the host IS the chrome. */\n variant?: \"card\" | \"bare\";\n /** Tighter paddings for dense lists. */\n dense?: boolean;\n className?: string;\n /** className for the body wrapper. */\n bodyClassName?: string;\n}\n\nexport function KindPanel({\n title,\n icon,\n count,\n badge,\n streaming = false,\n actions,\n menuItems,\n subline,\n children,\n footer,\n variant = \"card\",\n dense = false,\n className,\n bodyClassName,\n}: KindPanelProps) {\n const px = dense ? \"px-2.5\" : \"px-3\";\n const menu = menuItems && menuItems.length > 0 ? menuItems : null;\n return (\n <section\n className={cn(\n \"flex h-full min-h-0 min-w-0 flex-col\",\n variant === \"card\" && \"rounded-lg border border-border bg-card\",\n className,\n )}\n >\n <header\n className={cn(\n \"flex items-start gap-2\",\n px,\n dense ? \"pt-2\" : \"pt-3\",\n variant === \"bare\" && \"px-0\",\n )}\n >\n {renderKindKitIcon(icon, \"mt-0.5 h-3.5 w-3.5 shrink-0 text-primary\")}\n <h3 className=\"min-w-0 flex-1 text-xs font-semibold uppercase leading-5 tracking-wide text-foreground break-words\">\n {title}\n </h3>\n {count !== undefined && (\n <span className=\"mt-0.5 shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-[10px] tabular-nums text-muted-foreground\">\n {count}\n </span>\n )}\n {badge !== undefined && (\n <span className=\"mt-0.5 shrink-0\">{badge}</span>\n )}\n {streaming && (\n <Loader2\n aria-label=\"Still arriving\"\n className=\"mt-1 h-3 w-3 shrink-0 animate-spin text-muted-foreground\"\n />\n )}\n {actions && (\n <div className=\"flex shrink-0 items-center gap-1\">{actions}</div>\n )}\n {menu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"More actions\"\n className=\"-mr-1 -mt-1 h-7 w-7 shrink-0 text-muted-foreground\"\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-44\">\n {menu.map((item, i) => (\n <React.Fragment key={`${i}-${item.label}`}>\n {item.separatorBefore && i > 0 && <DropdownMenuSeparator />}\n <DropdownMenuItem\n disabled={item.disabled ?? false}\n onSelect={() => item.onSelect()}\n className={cn(\n \"text-xs\",\n item.destructive &&\n \"text-destructive focus:text-destructive\",\n )}\n >\n {item.icon && <item.icon className=\"mr-2 h-3.5 w-3.5\" />}\n {item.label}\n </DropdownMenuItem>\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </header>\n {subline !== undefined && subline !== null && subline !== \"\" && (\n <div\n className={cn(\n \"pt-1 text-xs leading-snug text-muted-foreground break-words\",\n px,\n variant === \"bare\" && \"px-0\",\n )}\n >\n {subline}\n </div>\n )}\n <div\n className={cn(\n \"min-w-0 flex-1\",\n px,\n dense ? \"py-1.5\" : \"py-2\",\n variant === \"bare\" && \"px-0\",\n bodyClassName,\n )}\n >\n {children}\n </div>\n {footer !== undefined && footer !== null && (\n <div\n className={cn(\n \"mt-auto border-t border-border\",\n px,\n dense ? \"py-1.5\" : \"py-2\",\n variant === \"bare\" && \"px-0\",\n )}\n >\n {footer}\n </div>\n )}\n </section>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@ai-matrx/design-system\";\n\nexport type KindKitIcon =\n | React.ComponentType<{ className?: string }>\n | React.ReactElement<{ className?: string }>;\n\n/**\n * Babel-sandbox imports normally bind a component directly, but an ESM/CJS\n * interop boundary may hand us `{ default: Component }`. React reports that\n * wrapper as error #130 if it is passed to createElement unchanged.\n */\nfunction resolveIconType(icon: unknown): React.ElementType | null {\n if (typeof icon === \"function\") return icon as React.ElementType;\n if (typeof icon !== \"object\" || icon === null) return null;\n\n const candidate = icon as Record<PropertyKey, unknown>;\n if (typeof candidate.$$typeof === \"symbol\") {\n return icon as React.ElementType;\n }\n if (\"default\" in candidate && candidate.default !== icon) {\n return resolveIconType(candidate.default);\n }\n return null;\n}\n\n/** Render either icon authoring form without treating an element as a component type. */\nexport function renderKindKitIcon(\n icon: KindKitIcon | undefined,\n className: string,\n): React.ReactElement | null {\n if (!icon) return null;\n if (React.isValidElement<{ className?: string }>(icon)) {\n return React.cloneElement(icon, {\n className: cn(className, icon.props.className),\n });\n }\n const Icon = resolveIconType(icon);\n return Icon ? React.createElement(Icon, { className }) : null;\n}\n","\"use client\";\n\n/**\n * KindHeaderBar — the standard compact header of a kind component:\n * icon · title (the instance's `title_key` value) · at-a-glance stats · the\n * copy bar (the host's `CopyButtons` slot: Copy / Copy-for-AI / JSON / Export from builders\n * the caller supplies). One row that wraps on narrow widths; the copy bar\n * stays on the right. Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Loader2 } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { getKindKitHost, type KindKitCopyProps } from \"./kind-kit-host\";\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\n\nexport interface KindHeaderStat {\n /** Short label, e.g. \"keywords\". */\n label: string;\n /** The number/text, e.g. 42 or \"3 buckets\". */\n value: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Optional hover text. */\n title?: string;\n}\n\nexport interface KindHeaderBarProps {\n /** The instance title (usually `data[title_key]`). */\n title: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Small muted line under the title (a primary keyword, a subtitle). */\n subtitle?: React.ReactNode;\n /** At-a-glance numbers rendered as compact \"value label\" stats. */\n stats?: KindHeaderStat[];\n /** Shows a spinner + \"Streaming\" while the instance is still arriving. */\n streaming?: boolean;\n /** Word shown beside the spinner. Default \"Streaming\". */\n streamingLabel?: string;\n /**\n * The copy bar. Pass the builders you have — `human` (text), `agent`\n * (payload or string), `json` (raw record), `export` (download items) and\n * the `label` used in toasts. Omit to render no copy bar.\n */\n copy?: Omit<KindKitCopyProps, \"size\" | \"className\">;\n /** Extra controls rendered between the stats and the copy bar. */\n actions?: React.ReactNode;\n /** \"sm\" (default) for in-chat blocks; \"md\" for page-level kind surfaces. */\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nexport function KindHeaderBar({\n title,\n icon,\n subtitle,\n stats,\n streaming = false,\n streamingLabel = \"Streaming\",\n copy,\n actions,\n size = \"sm\",\n className,\n}: KindHeaderBarProps) {\n const { CopyButtons } = getKindKitHost();\n const titleCls = size === \"md\" ? \"text-base\" : \"text-sm\";\n const iconCls = size === \"md\" ? \"h-5 w-5\" : \"h-4 w-4\";\n const iconNode = renderKindKitIcon(\n icon,\n cn(\"mt-0.5 shrink-0 text-primary\", iconCls),\n );\n return (\n <div\n className={cn(\"flex flex-wrap items-center gap-x-3 gap-y-1.5\", className)}\n >\n <div className=\"flex min-w-0 flex-1 basis-48 items-start gap-2\">\n {iconNode}\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"font-semibold leading-tight text-foreground break-words\",\n titleCls,\n )}\n >\n {title}\n </div>\n {subtitle !== undefined && subtitle !== null && subtitle !== \"\" && (\n <div className=\"mt-0.5 text-xs leading-snug text-muted-foreground break-words\">\n {subtitle}\n </div>\n )}\n </div>\n </div>\n {stats && stats.length > 0 && (\n <dl className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n {stats.map((s, i) => (\n <div\n key={`${i}-${s.label}`}\n title={s.title}\n className=\"flex items-baseline gap-1 text-xs\"\n >\n {renderKindKitIcon(\n s.icon,\n \"h-3 w-3 self-center text-muted-foreground\",\n )}\n <dd className=\"font-semibold tabular-nums text-foreground\">\n {s.value}\n </dd>\n <dt className=\"text-muted-foreground\">{s.label}</dt>\n </div>\n ))}\n </dl>\n )}\n {streaming && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n {streamingLabel}\n </span>\n )}\n {(actions || copy) && (\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {actions}\n {copy && (\n <CopyButtons {...copy} size={size === \"md\" ? \"sm\" : \"icon\"} />\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * KindActionButton — the one-click door from a kind component to a host\n * Action. Wraps the component's `runAction(key, input)` prop (the ONLY\n * side-effect channel; it never throws, it returns an `{ok}` envelope), with\n * a busy state, no double fire, an optional inline confirm that states the\n * consequence, and a one-line inline error (the host already toasts).\n * Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Button, cn } from \"@ai-matrx/design-system\";\nimport { Loader2 } from \"./icons\";\nimport { renderKindKitIcon, type KindKitIcon } from \"./icon-slot\";\n\nexport type KindActionEnvelope =\n | { ok: true; result?: unknown }\n | { ok: false; error: string };\n\n/** One action: `runAction` + `action` + `input`. */\ninterface KindActionSingle {\n /** The component's `runAction` prop, passed straight through. */\n runAction: (key: string, input: unknown) => Promise<KindActionEnvelope>;\n /** Action key, e.g. \"run_shortcut\". */\n action: string;\n /** The action input, or a function that builds it at click time. */\n input: unknown | (() => unknown);\n run?: never;\n}\n\n/** A chain: `run` awaits several `runAction` calls and returns the final envelope. */\ninterface KindActionChain {\n run: () => Promise<KindActionEnvelope>;\n runAction?: never;\n action?: never;\n input?: never;\n}\n\ninterface KindActionButtonBase {\n /** Short label. Also the aria-label/tooltip when `compact`. */\n label: string;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Label while running. Defaults to `label`. */\n busyLabel?: string;\n /** One-sentence consequence. When set, the first click asks to confirm. */\n confirm?: string;\n onDone?: (result: unknown) => void;\n onError?: (error: string) => void;\n variant?:\n | \"default\"\n | \"primary\"\n | \"destructive\"\n | \"success\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"subtle\";\n /** Icon-only with tooltip + aria-label, for menus and header rows. */\n compact?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport type KindActionButtonProps = KindActionButtonBase &\n (KindActionSingle | KindActionChain);\n\nconst ERROR_MAX = 60;\n\nexport function KindActionButton({\n runAction,\n action,\n input,\n run: runChain,\n label,\n icon,\n busyLabel,\n confirm,\n onDone,\n onError,\n variant = \"outline\",\n compact = false,\n disabled = false,\n className,\n}: KindActionButtonProps) {\n const [busy, setBusy] = React.useState(false);\n const [asking, setAsking] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const inFlight = React.useRef(false);\n const mounted = React.useRef(true);\n const errorTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n if (errorTimer.current) clearTimeout(errorTimer.current);\n };\n }, []);\n\n const run = React.useCallback(async () => {\n if (inFlight.current) return;\n inFlight.current = true;\n setAsking(false);\n setError(null);\n setBusy(true);\n try {\n let res: KindActionEnvelope;\n if (runChain) {\n res = await runChain();\n } else {\n const payload = typeof input === \"function\" ? (input as () => unknown)() : input;\n res = await runAction!(action!, payload);\n }\n if (res && res.ok) {\n onDone?.(res.result);\n } else {\n const message = (res && \"error\" in res && res.error) || \"Action failed\";\n if (mounted.current) {\n setError(message);\n if (errorTimer.current) clearTimeout(errorTimer.current);\n errorTimer.current = setTimeout(() => {\n if (mounted.current) setError(null);\n }, 8000);\n }\n onError?.(message);\n }\n } catch (e) {\n // runAction promises never to throw; stay honest if a host breaks that.\n const message = e instanceof Error ? e.message : \"Action failed\";\n if (mounted.current) setError(message);\n onError?.(message);\n } finally {\n inFlight.current = false;\n if (mounted.current) setBusy(false);\n }\n }, [action, input, onDone, onError, runAction, runChain]);\n\n const onClick = () => {\n if (busy || disabled || inFlight.current) return;\n if (confirm) setAsking(true);\n else void run();\n };\n\n if (asking && !busy) {\n return (\n <span\n role=\"group\"\n aria-label={label}\n className={cn(\n \"inline-flex flex-wrap items-center gap-x-2 gap-y-1 rounded-md border border-border bg-card px-2 py-1 text-xs\",\n className,\n )}\n >\n <span className=\"text-foreground\">{confirm}</span>\n <Button type=\"button\" size=\"xs\" variant={variant === \"outline\" ? \"default\" : variant} onClick={() => void run()}>\n {label}\n </Button>\n <Button type=\"button\" size=\"xs\" variant=\"ghost\" onClick={() => setAsking(false)}>\n Cancel\n </Button>\n </span>\n );\n }\n\n const shownLabel = busy ? (busyLabel ?? label) : label;\n const glyph = busy ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n renderKindKitIcon(icon, \"h-4 w-4\")\n );\n\n return (\n <span className={cn(\"inline-flex min-w-0 items-center gap-2\", className)}>\n <Button\n type=\"button\"\n variant={variant}\n size={compact ? \"icon-sm\" : \"sm\"}\n disabled={disabled || busy}\n aria-busy={busy || undefined}\n aria-label={compact ? shownLabel : undefined}\n title={compact ? label : undefined}\n onClick={onClick}\n >\n {glyph}\n {!compact && <span>{shownLabel}</span>}\n </Button>\n {error && (\n <span\n role=\"alert\"\n title={error}\n className=\"min-w-0 text-xs text-destructive\"\n >\n {error.length > ERROR_MAX ? `${error.slice(0, ERROR_MAX - 1)}…` : error}\n </span>\n )}\n </span>\n );\n}\n","\"use client\";\n\n/**\n * StreamingSkeleton + useStreamingValue — the \"before data lands\" kit.\n *\n * A kind component receives partial `data` on every envelope flush while the\n * agent streams: fields are absent, arrays are short, strings are cut. The\n * skeleton mimics the layout the real content will have (list / cards /\n * table / text) for the instant before anything arrives; the helpers make\n * field reads tolerant so a component never crashes on a half-built\n * instance and never flickers a value away. Contract:\n * `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { cn, Skeleton } from \"@ai-matrx/design-system\";\n\nexport interface StreamingSkeletonProps {\n /** Layout to mimic. Default \"list\". */\n layout?: \"list\" | \"cards\" | \"table\" | \"text\";\n /** Rows (list/table/text lines) or cards. Default 3. */\n rows?: number;\n /** Columns for \"table\" / \"cards\". Default 3 (table) / 2 (cards). */\n columns?: number;\n /** Render a title bar line above the body. Default true. */\n header?: boolean;\n /** Accessible label. Default \"Loading\". */\n label?: string;\n className?: string;\n}\n\nexport function StreamingSkeleton({\n layout = \"list\",\n rows = 3,\n columns,\n header = true,\n label = \"Loading\",\n className,\n}: StreamingSkeletonProps) {\n const n = Math.max(1, rows);\n const cols = Math.max(1, columns ?? (layout === \"cards\" ? 2 : 3));\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label={label}\n className={cn(\"space-y-2\", className)}\n >\n {header && (\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"ml-auto h-6 w-16\" />\n </div>\n )}\n {layout === \"list\" &&\n Array.from({ length: n }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-2 rounded-md border border-border px-2 py-2\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n <Skeleton className={cn(\"h-3.5\", i % 3 === 0 ? \"w-2/3\" : i % 3 === 1 ? \"w-1/2\" : \"w-3/4\")} />\n </div>\n ))}\n {layout === \"cards\" && (\n <div\n className=\"grid gap-3\"\n style={{ gridTemplateColumns: `repeat(auto-fit, minmax(min(100%, 240px), 1fr))` }}\n >\n {Array.from({ length: Math.max(n, cols) }).map((_, i) => (\n <div key={i} className=\"space-y-2 rounded-lg border border-border p-3\">\n <Skeleton className=\"h-3.5 w-1/2\" />\n <Skeleton className=\"h-3 w-full\" />\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-5 w-12 rounded-full\" />\n </div>\n </div>\n ))}\n </div>\n )}\n {layout === \"table\" && (\n <div className=\"overflow-hidden rounded-md border border-border\">\n <div\n className=\"grid gap-2 border-b border-border bg-muted/40 px-2 py-1.5\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, c) => (\n <Skeleton key={c} className=\"h-3 w-2/3\" />\n ))}\n </div>\n {Array.from({ length: n }).map((_, r) => (\n <div\n key={r}\n className=\"grid gap-2 px-2 py-2\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, c) => (\n <Skeleton key={c} className={cn(\"h-3\", c === 0 ? \"w-3/4\" : \"w-1/2\")} />\n ))}\n </div>\n ))}\n </div>\n )}\n {layout === \"text\" &&\n Array.from({ length: n }).map((_, i) => (\n <Skeleton\n key={i}\n className={cn(\"h-3\", i === n - 1 ? \"w-2/5\" : i % 2 === 0 ? \"w-full\" : \"w-11/12\")}\n />\n ))}\n <span className=\"sr-only\">{label}</span>\n </div>\n );\n}\n\n/**\n * Sticky, tolerant read of a value that may be absent mid-stream.\n *\n * Returns the latest DEFINED value seen (so a re-parse that momentarily drops\n * a field does not blank the UI), `fallback` until one arrives, and `arrived`\n * once any real value has been observed. Implemented with the React\n * \"remember the previous render\" pattern (state updated during render), so\n * pass a FIELD READ (`data?.summary`) — never an expression that builds a\n * new object/array on every render (`data?.items ?? []`), which would\n * re-trigger the update each render.\n */\nexport function useStreamingValue<T>(\n value: T | null | undefined,\n fallback: T,\n): { value: T; arrived: boolean } {\n const [last, setLast] = React.useState<{ value: T; arrived: boolean }>({\n value: fallback,\n arrived: false,\n });\n const defined = value !== null && value !== undefined;\n if (defined && (!last.arrived || !Object.is(value, last.value))) {\n const next = { value: value as T, arrived: true };\n setLast(next);\n return next;\n }\n return last;\n}\n\n/** `value` when it is an array, else `[]` — for `data.items` that is not there yet. */\nexport function streamList<T = unknown>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\n/** `value` when it is a non-empty string, else `fallback` (\"\" by default). */\nexport function streamText(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" && value.length > 0 ? value : fallback;\n}\n","\"use client\";\n\n/**\n * KeywordChip + TagList — chips that WRAP, never truncate.\n *\n * A keyword / tag / phrase is always shown in full: the chip wraps its text\n * onto extra lines inside the chip, and the list wraps chips onto extra rows.\n * Optional select (checkbox-like toggle), remove (X) and inline edit\n * (pencil → input, Enter commits, Esc cancels). `TagList` adds an inline\n * \"Add\" input at the end when `onAdd` is given. Contract:\n * `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Check, Pencil, Plus, X } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\nimport { getKindKitHost, type ReadOutcome } from \"./kind-kit-host\";\n\nexport interface KeywordChipProps {\n /** The phrase. Rendered in full — wraps, never truncates. */\n label: string;\n /** Small trailing detail (a count, a volume, a score). */\n meta?: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Selected state; pass `onSelect` to make the chip a toggle. */\n selected?: boolean;\n /** Makes the chip a toggle; called with the next selected state. */\n onSelect?: ((selected: boolean) => void) | undefined;\n /** Adds an X control. */\n onRemove?: (() => void) | undefined;\n /** Enables inline edit (pencil control + double-click); called with the committed text. */\n onEdit?: ((next: string) => void) | undefined;\n /** Greys the chip and disables select/remove/edit. */\n disabled?: boolean | undefined;\n tone?: \"default\" | \"primary\" | \"muted\" | undefined;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nconst TONE = {\n default: \"border-border bg-background text-foreground\",\n primary: \"border-primary/40 bg-primary/5 text-foreground\",\n muted: \"border-border bg-muted text-muted-foreground\",\n} as const;\n\nexport function KeywordChip({\n label,\n meta,\n icon,\n selected = false,\n onSelect,\n onRemove,\n onEdit,\n disabled = false,\n tone = \"default\",\n size = \"sm\",\n className,\n}: KeywordChipProps) {\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState(label);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n\n const selectable = !!onSelect && !disabled;\n const editable = !!onEdit && !disabled;\n\n const startEdit = () => {\n if (!editable) return;\n setDraft(label);\n setEditing(true);\n // Focus after the input mounts.\n requestAnimationFrame(() => inputRef.current?.select());\n };\n const commit = () => {\n setEditing(false);\n const next = draft.trim();\n if (next && next !== label) onEdit?.(next);\n };\n const cancel = () => {\n setEditing(false);\n setDraft(label);\n };\n\n const pad = size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\";\n // Inputs stay >=16px on phones (no iOS zoom), shrink to the chip size on sm+.\n const inputText = size === \"md\" ? \"text-[16px] sm:text-sm\" : \"text-[16px] sm:text-xs\";\n const ctl = size === \"md\" ? \"h-4 w-4\" : \"h-3.5 w-3.5\";\n\n return (\n <span\n className={cn(\n // max-w-full + min-w-0 + break-words: the text wraps INSIDE the chip.\n \"inline-flex max-w-full min-w-0 items-center gap-1 rounded-full border leading-snug\",\n pad,\n selected ? \"border-primary bg-primary/10 text-foreground\" : TONE[tone],\n disabled && \"opacity-60\",\n className,\n )}\n >\n {selectable && (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={selected}\n aria-label={`${selected ? \"Deselect\" : \"Select\"} ${label}`}\n onClick={() => onSelect?.(!selected)}\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-sm border\",\n size === \"md\" ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n selected\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-muted-foreground/50 bg-background\",\n )}\n >\n {selected && <Check className=\"h-2.5 w-2.5\" />}\n </button>\n )}\n {renderKindKitIcon(\n icon,\n cn(\"shrink-0 text-muted-foreground\", ctl),\n )}\n {editing ? (\n <input\n ref={inputRef}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n }\n }}\n aria-label={`Edit ${label}`}\n size={Math.max(4, draft.length + 1)}\n className={cn(\"min-w-0 bg-transparent outline-none\", inputText)}\n />\n ) : (\n <span\n className=\"min-w-0 whitespace-normal break-words text-left\"\n onDoubleClick={startEdit}\n >\n {label}\n </span>\n )}\n {meta !== undefined && meta !== null && (\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">{meta}</span>\n )}\n {editable && !editing && (\n <button\n type=\"button\"\n aria-label={`Edit ${label}`}\n onClick={startEdit}\n className=\"shrink-0 rounded-full text-muted-foreground hover:text-foreground\"\n >\n <Pencil className={cn(\"h-3 w-3\", size === \"md\" && \"h-3.5 w-3.5\")} />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n disabled={disabled}\n onClick={onRemove}\n className=\"-mr-0.5 shrink-0 rounded-full text-muted-foreground hover:text-destructive disabled:pointer-events-none\"\n >\n <X className={ctl} />\n </button>\n )}\n </span>\n );\n}\n\nexport interface TagItem {\n label: string;\n /** Stable key; defaults to `label`. */\n key?: string;\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface TagListProps {\n /** Phrases, as strings or `{ label, key?, meta?, disabled? }` objects. */\n items: readonly (string | TagItem)[];\n /** Selected keys (label when no key). Pass with `onToggle` for selectable chips. */\n selected?: readonly string[];\n /** Makes chips toggles; called with (key, nextSelected). */\n onToggle?: (key: string, selected: boolean) => void;\n /** Adds an X on every chip; called with (key, index). */\n onRemove?: (key: string, index: number) => void;\n /** Enables inline edit on every chip; called with (key, index, nextLabel). */\n onEdit?: (key: string, index: number, next: string) => void;\n /** Renders an inline \"Add\" input at the end; called with the trimmed text. */\n onAdd?: (label: string) => void;\n /** Placeholder of the add input. Default \"Add…\". */\n addPlaceholder?: string;\n /** Shown when `items` is empty (and there is no add input). */\n emptyState?: React.ReactNode;\n /**\n * The outcome of the read behind the rows (RC-B12 r13). `emptyState` shows\n * only after a read that succeeded; a failed read shows the failure + retry.\n */\n read?: ReadOutcome;\n tone?: KeywordChipProps[\"tone\"];\n size?: KeywordChipProps[\"size\"];\n disabled?: boolean;\n className?: string;\n}\n\nfunction normalize(item: string | TagItem): TagItem {\n return typeof item === \"string\" ? { label: item } : item;\n}\n\nexport function TagList({\n items,\n selected,\n onToggle,\n onRemove,\n onEdit,\n onAdd,\n addPlaceholder = \"Add…\",\n emptyState,\n read,\n tone,\n size = \"sm\",\n disabled = false,\n className,\n}: TagListProps) {\n const { ReadEmpty, ReadStaleNotice } = getKindKitHost();\n const [adding, setAdding] = React.useState(false);\n const [draft, setDraft] = React.useState(\"\");\n const inputText = size === \"md\" ? \"text-[16px] sm:text-sm\" : \"text-[16px] sm:text-xs\";\n const selectedSet = new Set(selected ?? []);\n\n const commitAdd = () => {\n const next = draft.trim();\n if (next) onAdd?.(next);\n setDraft(\"\");\n setAdding(false);\n };\n\n if (items.length === 0 && read && read.status !== \"ready\") return <ReadEmpty read={read} />;\n if (items.length === 0 && !onAdd) {\n return emptyState !== undefined ? (\n <div className={cn(\"text-xs text-muted-foreground\", className)}>\n {emptyState}\n </div>\n ) : null;\n }\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1.5\", className)}>\n <ReadStaleNotice read={read} className=\"w-full\" />\n {items.map((raw, index) => {\n const item = normalize(raw);\n const key = item.key ?? item.label;\n return (\n <KeywordChip\n key={`${key}-${index}`}\n label={item.label}\n meta={item.meta}\n tone={tone}\n size={size}\n disabled={disabled || item.disabled}\n selected={selectedSet.has(key)}\n onSelect={onToggle ? (next) => onToggle(key, next) : undefined}\n onRemove={onRemove ? () => onRemove(key, index) : undefined}\n onEdit={onEdit ? (next) => onEdit(key, index, next) : undefined}\n />\n );\n })}\n {items.length === 0 && emptyState !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{emptyState}</span>\n )}\n {onAdd && !disabled && (\n adding ? (\n <span\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border border-dashed border-primary/60 bg-background\",\n size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\",\n )}\n >\n <input\n autoFocus\n value={draft}\n placeholder={addPlaceholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commitAdd}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAdd();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setDraft(\"\");\n setAdding(false);\n }\n }}\n aria-label={addPlaceholder}\n size={Math.max(6, draft.length + 1)}\n className={cn(\"min-w-0 bg-transparent outline-none placeholder:text-muted-foreground\", inputText)}\n />\n </span>\n ) : (\n <button\n type=\"button\"\n onClick={() => setAdding(true)}\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border border-dashed border-border text-muted-foreground hover:border-primary/60 hover:text-foreground\",\n size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\",\n )}\n >\n <Plus className=\"h-3 w-3\" />\n {addPlaceholder.replace(/…$/, \"\")}\n </button>\n )\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["React","React","import_jsx_runtime","import_jsx_runtime","React","import_design_system","import_jsx_runtime","React","import_design_system","React","import_design_system","import_jsx_runtime","React","import_design_system","import_jsx_runtime","React","import_design_system","import_jsx_runtime","React","import_design_system","import_jsx_runtime","_","React","import_design_system","import_jsx_runtime"]}
|
|
1
|
+
{"version":3,"sources":["../kind-kit.ts","../kind-kit/SortableList.tsx","../kind-kit/icons.tsx","../kind-kit/kind-kit-host.tsx","../kind-kit/KindPanelGrid.tsx","../kind-kit/KindPanel.tsx","../kind-kit/icon-slot.tsx","../kind-kit/KindHeaderBar.tsx","../kind-kit/KindActionButton.tsx","../kind-kit/StreamingSkeleton.tsx","../kind-kit/TagList.tsx"],"sourcesContent":["export { SortableList, type SortableListProps, type SortableRenderContext } from \"./kind-kit/SortableList\";\nexport { KindPanelGrid, type KindPanelGridProps } from \"./kind-kit/KindPanelGrid\";\nexport * from \"./kind-kit/KindPanel\";\nexport { KindHeaderBar, type KindHeaderBarProps, type KindHeaderStat } from \"./kind-kit/KindHeaderBar\";\nexport {\n KindActionButton,\n type KindActionButtonProps,\n type KindActionEnvelope,\n} from \"./kind-kit/KindActionButton\";\nexport {\n StreamingSkeleton,\n useStreamingValue,\n streamList,\n streamText,\n type StreamingSkeletonProps,\n} from \"./kind-kit/StreamingSkeleton\";\nexport { KeywordChip, TagList, type KeywordChipProps, type TagItem, type TagListProps } from \"./kind-kit/TagList\";\nexport { renderKindKitIcon, type KindKitIcon } from \"./kind-kit/icon-slot\";\nexport {\n setKindKitHost,\n getKindKitHost,\n resetKindKitHost,\n DefaultCopyButtons,\n DefaultReadEmpty,\n DefaultReadStaleNotice,\n type KindKitHost,\n type KindKitCopyProps,\n type KindKitReadEmptyProps,\n type KindKitReadStaleNoticeProps,\n type ReadOutcome,\n type ReadStatus,\n} from \"./kind-kit/kind-kit-host\";\n","\"use client\";\n\n/**\n * SortableList — drag-to-reorder list for kind components.\n *\n * The mandated reorder UX, built once: while a row is dragged, the rows it\n * passes DISPLACE (translate) out of the way and a SHADOWED placeholder marks\n * exactly where the item will land. Native HTML5 drag-and-drop (no deps); a\n * grab handle starts the drag (so text and inputs inside rows stay usable);\n * up/down buttons are the keyboard + touch fallback; `onRemove` adds an inline\n * remove control. Contract: `kind-kit/README.md`.\n *\n * Sandbox-safe by construction: imports only react, the design system,\n * and `cn`.\n */\n\nimport * as React from \"react\";\nimport { ChevronDown, ChevronUp, GripVertical, X } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { getKindKitHost, type ReadOutcome } from \"./kind-kit-host\";\n\nexport interface SortableRenderContext {\n index: number;\n /** True for the row currently being dragged (rendered as the placeholder). */\n isDragging: boolean;\n}\n\nexport interface SortableListProps<T> {\n /** Current order. Treated as read-only; the new order arrives via `onReorder`. */\n items: readonly T[];\n /**\n * Stable key per item. Default: the item itself when it is a string, else\n * `item.id` / `item.key` when present, else the index (unstable — pass one).\n */\n getKey?: (item: T, index: number) => string;\n /** Called with the full reordered array after a drop or an arrow press. */\n onReorder: (items: T[]) => void;\n /**\n * Row content. Default: the item when it is a string/number, else its\n * `label` / `title` / `name` / `text` field, else `JSON.stringify`.\n */\n renderItem?: (item: T, ctx: SortableRenderContext) => React.ReactNode;\n /** When set, every row gets an inline remove (X) control. */\n onRemove?: (item: T, index: number) => void;\n /** Disables drag, arrows and remove (rows still render). */\n disabled?: boolean;\n /** Hide the up/down arrow buttons (drag only). Default false. */\n hideArrows?: boolean;\n /** Shown when `items` is empty. */\n emptyState?: React.ReactNode;\n /**\n * The outcome of the read behind the rows (RC-B12 r13). `emptyState` shows\n * only after a read that succeeded; a failed read shows the failure + retry.\n */\n read?: ReadOutcome;\n /** Wrapper `<ul>` className. */\n className?: string;\n /** Per-row className (applied to every `<li>`). */\n itemClassName?: string;\n /** Accessible name for the list. */\n ariaLabel?: string;\n}\n\nfunction defaultKey<T>(item: T, index: number): string {\n if (typeof item === \"string\" || typeof item === \"number\") return String(item);\n if (item && typeof item === \"object\") {\n const rec = item as Record<string, unknown>;\n if (typeof rec.id === \"string\" || typeof rec.id === \"number\")\n return String(rec.id);\n if (typeof rec.key === \"string\") return rec.key;\n }\n return String(index);\n}\n\nfunction defaultRender<T>(item: T): React.ReactNode {\n if (typeof item === \"string\" || typeof item === \"number\") return String(item);\n if (item && typeof item === \"object\") {\n const rec = item as Record<string, unknown>;\n for (const k of [\"label\", \"title\", \"name\", \"text\"]) {\n if (typeof rec[k] === \"string\") return rec[k] as string;\n }\n return JSON.stringify(item);\n }\n return String(item);\n}\n\nfunction moveItem<T>(items: readonly T[], from: number, to: number): T[] {\n const next = items.slice();\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved as T);\n return next;\n}\n\ninterface DragState {\n from: number;\n over: number;\n /**\n * Row rects captured at drag start, relative to the list's top — a fixed\n * ruler: the pointer's position on it decides the landing slot, so the\n * target never depends on which (already displaced) row fires the event.\n */\n rects: { top: number; bottom: number; height: number }[];\n}\n\nexport function SortableList<T>({\n items,\n getKey = defaultKey,\n onReorder,\n renderItem,\n onRemove,\n disabled = false,\n hideArrows = false,\n emptyState,\n read,\n className,\n itemClassName,\n ariaLabel,\n}: SortableListProps<T>) {\n const { ReadEmpty, ReadStaleNotice } = getKindKitHost();\n const [drag, setDrag] = React.useState<DragState | null>(null);\n const [armed, setArmed] = React.useState<number | null>(null);\n const listRef = React.useRef<HTMLUListElement | null>(null);\n const rowRefs = React.useRef<(HTMLLIElement | null)[]>([]);\n\n const canInteract = !disabled;\n\n const handleDragStart = (index: number) => (e: React.DragEvent<HTMLLIElement>) => {\n if (!canInteract || armed !== index) {\n e.preventDefault();\n return;\n }\n e.dataTransfer.effectAllowed = \"move\";\n // Firefox requires data to start a drag.\n e.dataTransfer.setData(\"text/plain\", String(index));\n const listTop = listRef.current?.getBoundingClientRect().top ?? 0;\n const rects = rowRefs.current.slice(0, items.length).map((el) => {\n const r = el ? el.getBoundingClientRect() : new DOMRect();\n return { top: r.top - listTop, bottom: r.bottom - listTop, height: r.height };\n });\n setDrag({ from: index, over: index, rects });\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const listTop = listRef.current?.getBoundingClientRect().top ?? 0;\n const y = e.clientY - listTop;\n let over = drag.rects.length - 1;\n for (let i = 0; i < drag.rects.length; i++) {\n const r = drag.rects[i];\n if (r && y < r.bottom) {\n over = i;\n break;\n }\n }\n if (over !== drag.over) setDrag({ ...drag, over });\n };\n\n const finish = () => {\n setDrag(null);\n setArmed(null);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n if (drag && drag.from !== drag.over) {\n onReorder(moveItem(items, drag.from, drag.over));\n }\n finish();\n };\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= items.length || from === to) return;\n onReorder(moveItem(items, from, to));\n };\n\n /** Translate (px) for row `index` while a drag is in flight. */\n const translateFor = (index: number): number => {\n if (!drag) return 0;\n const { from, over, rects } = drag;\n if (from === over) return 0;\n const dragged = rects[from];\n if (!dragged) return 0;\n // Slot size = row height + the gap to its neighbour (so displaced rows\n // land exactly on the grid the dragged row vacates).\n const neighbour = rects[from + 1] ?? rects[from - 1];\n const gap = neighbour\n ? Math.max(\n 0,\n from + 1 < rects.length\n ? neighbour.top - dragged.bottom\n : dragged.top - neighbour.bottom,\n )\n : 0;\n const slot = dragged.height + gap;\n if (index === from) {\n const target = rects[over];\n if (!target) return 0;\n return over > from\n ? target.bottom - dragged.bottom\n : target.top - dragged.top;\n }\n if (from < over && index > from && index <= over) return -slot;\n if (over < from && index >= over && index < from) return slot;\n return 0;\n };\n\n if (items.length === 0) {\n if (read && read.status !== \"ready\") return <ReadEmpty read={read} />;\n return emptyState !== undefined ? (\n <div className={cn(\"text-xs text-muted-foreground\", className)}>\n {emptyState}\n </div>\n ) : null;\n }\n\n return (\n <>\n <ReadStaleNotice read={read} className=\"mb-1.5\" />\n <ul\n role=\"list\"\n aria-label={ariaLabel}\n ref={listRef}\n className={cn(\"flex flex-col gap-1.5\", className)}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {items.map((item, index) => {\n const key = getKey(item, index);\n const isDragging = drag?.from === index;\n const translate = translateFor(index);\n return (\n <li\n key={key}\n ref={(el) => {\n rowRefs.current[index] = el;\n }}\n draggable={canInteract && armed === index}\n onDragStart={handleDragStart(index)}\n onDragEnd={finish}\n style={{\n transform: translate ? `translate3d(0, ${translate}px, 0)` : undefined,\n }}\n className={cn(\n \"flex items-center gap-1.5 rounded-md border px-2 py-1.5 text-sm text-foreground\",\n \"transition-transform duration-150 ease-out will-change-transform\",\n isDragging\n ? \"border-dashed border-primary/60 bg-primary/5 shadow-inner\"\n : \"border-border bg-card\",\n itemClassName,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Drag to reorder\"\n disabled={!canInteract}\n onPointerDown={() => canInteract && setArmed(index)}\n onPointerUp={() => !drag && setArmed(null)}\n className={cn(\n \"flex h-7 w-6 shrink-0 touch-none items-center justify-center rounded text-muted-foreground\",\n canInteract\n ? \"cursor-grab hover:bg-muted hover:text-foreground active:cursor-grabbing\"\n : \"opacity-40\",\n )}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n <div\n className={cn(\n \"min-w-0 flex-1 break-words\",\n isDragging && \"opacity-40\",\n )}\n >\n {renderItem\n ? renderItem(item, { index, isDragging })\n : defaultRender(item)}\n </div>\n {(!hideArrows || onRemove) && (\n /*\n * Controls sit IN FLOW at the row's end — never floating.\n *\n * A cluster that costs no layout width must, by construction,\n * land on top of something when it appears, and it wins every\n * click there because it is the layer above. Rows here carry the\n * host component's own trailing controls (copy, edit, menus), so\n * a floating cluster covered live buttons on every consumer:\n * measured on `artisan_demo_reading_list`, it sat on \"Copy for\n * AI\" and \"Edit book\". The kit cannot know what a row draws in\n * its corner, so it takes its own width instead of borrowing the\n * row's. Ruled 2026-08-30: overlap is never worth the density.\n */\n <div\n className={cn(\n \"flex shrink-0 items-center gap-px self-start\",\n isDragging && \"opacity-40\",\n )}\n >\n {!hideArrows && (\n /* Chevrons stack so the pair costs one 20px column, not two. */\n <div className=\"flex flex-col items-center pointer-coarse:flex-row\">\n <button\n type=\"button\"\n aria-label=\"Move up\"\n disabled={!canInteract || index === 0}\n onClick={() => move(index, index - 1)}\n className=\"flex h-3.5 w-5 items-center justify-center rounded-sm text-muted-foreground/70 hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <ChevronUp className=\"h-3 w-3\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Move down\"\n disabled={!canInteract || index === items.length - 1}\n onClick={() => move(index, index + 1)}\n className=\"flex h-3.5 w-5 items-center justify-center rounded-sm text-muted-foreground/70 hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n disabled={!canInteract}\n onClick={() => onRemove(item, index)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/70 hover:bg-muted hover:text-destructive disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </>\n );\n}\n","/**\n * The kit's nine glyphs, inlined (C19: a package ships its own SVGs, no icon-library\n * dependency). Paths are Lucide's (ISC licence); stroke and size come from the\n * `className` the caller passes, exactly as a Lucide component would take it.\n */\nimport * as React from \"react\";\n\ntype IconProps = { className?: string };\n\nfunction make(name: string, children: React.ReactNode) {\n const Icon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\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 className={className}\n >\n {children}\n </svg>\n );\n Icon.displayName = name;\n return Icon;\n}\n\nexport const Loader2 = make(\"Loader2\", <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />);\nexport const MoreHorizontal = make(\n \"MoreHorizontal\",\n <>\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 </>,\n);\nexport const ChevronDown = make(\"ChevronDown\", <path d=\"m6 9 6 6 6-6\" />);\nexport const ChevronUp = make(\"ChevronUp\", <path d=\"m18 15-6-6-6 6\" />);\nexport const GripVertical = make(\n \"GripVertical\",\n <>\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\n </>,\n);\nexport const X = make(\n \"X\",\n <>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </>,\n);\nexport const Check = make(\"Check\", <path d=\"M20 6 9 17l-5-5\" />);\nexport const Pencil = make(\n \"Pencil\",\n <>\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </>,\n);\nexport const Plus = make(\n \"Plus\",\n <>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </>,\n);\n","\"use client\";\n\n/**\n * The kit's HOST SLOTS. The kit never imports app code; the three things it cannot own are\n * handed in once by the host through `setKindKitHost`:\n * - `CopyButtons` the copy bar `KindHeaderBar` renders for its `copy` prop;\n * - `ReadEmpty` what `SortableList` / `TagList` show instead of an empty state while a\n * read has not succeeded;\n * - `ReadStaleNotice` the notice above rows left on screen by a failed refresh.\n * Each default is honest and working: a plain Copy button, and text that says what happened.\n * State lives on globalThis under a Symbol.for key so two copies of the package share one host.\n */\nimport * as React from \"react\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport type { MatrxCopyMenuProps } from \"@ai-matrx/alchemy/react/workspace\";\n\n/**\n * The copy bar's props: exactly the design system's `MatrxCopyMenuProps`, so a host registers its\n * own `CopyButtons` (which takes that shape) with no adapter. Type-only: no runtime import.\n */\nexport type KindKitCopyProps = MatrxCopyMenuProps;\n\nexport type ReadStatus = \"loading\" | \"error\" | \"ready\";\n\n/** A read's outcome, handed to a list primitive's `read` prop. */\nexport interface ReadOutcome {\n status: ReadStatus;\n /** The failure itself, or a truthy flag when the read only says it failed. */\n error?: unknown;\n onRetry?: (() => void) | undefined;\n /** What was read, in the reader's words: \"your tasks\". */\n what?: string | undefined;\n /** A successful read has already produced a value. */\n hasData?: boolean | undefined;\n}\n\nexport interface KindKitReadEmptyProps {\n read?: ReadOutcome | undefined;\n loading?: React.ReactNode;\n children?: React.ReactNode;\n}\nexport interface KindKitReadStaleNoticeProps {\n read?: ReadOutcome | undefined;\n className?: string;\n}\n\nexport interface KindKitHost {\n CopyButtons: React.ComponentType<KindKitCopyProps>;\n ReadEmpty: React.ComponentType<KindKitReadEmptyProps>;\n ReadStaleNotice: React.ComponentType<KindKitReadStaleNoticeProps>;\n}\n\nconst KEY = Symbol.for(\"ai-matrx.content-ir-react.kind-kit-host\");\ntype Store = { [KEY]?: Partial<KindKitHost> };\n\nfunction resolveText(human: KindKitCopyProps[\"human\"], json: KindKitCopyProps[\"json\"]): string {\n if (typeof human === \"function\") return human();\n if (typeof human === \"string\") return human;\n if (json !== undefined) return JSON.stringify(typeof json === \"function\" ? (json as () => unknown)() : json, null, 2);\n return \"\";\n}\n\n/** Default copy bar: one \"Copy\" button that writes the `human` text (else the JSON) to the clipboard. */\nexport function DefaultCopyButtons({ label, human, json, size, className }: KindKitCopyProps) {\n const [state, setState] = React.useState<\"idle\" | \"copied\" | \"failed\">(\"idle\");\n const onClick = async () => {\n setState((await copyText(resolveText(human, json))) ? \"copied\" : \"failed\");\n setTimeout(() => setState(\"idle\"), 1500);\n };\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={`Copy ${label}`}\n aria-label={`Copy ${label}`}\n className={\n className ??\n `inline-flex items-center rounded-md border border-border px-2 text-xs text-foreground hover:bg-muted ${size === \"icon\" ? \"h-7\" : \"h-8\"}`\n }\n >\n {state === \"copied\" ? \"Copied\" : state === \"failed\" ? \"Copy failed\" : \"Copy\"}\n </button>\n );\n}\n\nfunction RetryButton({ onRetry }: { onRetry: (() => void) | undefined }) {\n if (!onRetry) return null;\n return (\n <button type=\"button\" onClick={onRetry} className=\"ml-2 underline underline-offset-2\">\n Try again\n </button>\n );\n}\n\n/** Default: loading says it is loading; an error says what failed (with retry); ready shows the host's empty state. */\nexport function DefaultReadEmpty({ read, loading, children }: KindKitReadEmptyProps) {\n const status = read?.status ?? \"ready\";\n const what = read?.what ?? \"this list\";\n if (status === \"loading\") return <>{loading ?? <div role=\"status\" className=\"text-xs text-muted-foreground\">{`Loading ${what}…`}</div>}</>;\n if (status === \"error\") {\n return (\n <div role=\"alert\" className=\"text-xs text-destructive\">\n {`Could not load ${what}.`}\n <RetryButton onRetry={read?.onRetry} />\n </div>\n );\n }\n return <>{children ?? null}</>;\n}\n\n/** Default: when the latest read failed, the rows on screen may be out of date; says so, with retry. */\nexport function DefaultReadStaleNotice({ read, className }: KindKitReadStaleNoticeProps) {\n if (read?.status !== \"error\") return null;\n return (\n <div role=\"alert\" className={`text-xs text-muted-foreground ${className ?? \"\"}`}>\n {`Showing earlier ${read.what ?? \"results\"}; the latest refresh failed.`}\n <RetryButton onRetry={read.onRetry} />\n </div>\n );\n}\n\nconst DEFAULTS: KindKitHost = {\n CopyButtons: DefaultCopyButtons,\n ReadEmpty: DefaultReadEmpty,\n ReadStaleNotice: DefaultReadStaleNotice,\n};\n\n/** Register the host's copy bar and read notices. Call once at boot; a slot left out keeps its default. */\nexport function setKindKitHost(host: Partial<KindKitHost>): void {\n (globalThis as Store)[KEY] = { ...(globalThis as Store)[KEY], ...host };\n}\n\n/** The slots in force: the host's where registered, the defaults elsewhere. */\nexport function getKindKitHost(): KindKitHost {\n return { ...DEFAULTS, ...(globalThis as Store)[KEY] };\n}\n\n/** Clear every registered slot (tests, hot reload). */\nexport function resetKindKitHost(): void {\n delete (globalThis as Store)[KEY];\n}\n","\"use client\";\n\n/**\n * KindPanelGrid — content-aware responsive grid for side-by-side panels.\n *\n * Never more columns than the content can afford: every track is at least\n * `minColumnWidth` (default 280px) wide, the column count is whatever fits\n * (`auto-fit`), and every panel in a row stretches to the same height so the\n * panels' footers line up. Pair with `KindPanel` (its `footer` is pinned to\n * the bottom). Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\n\nconst GAP_PX = { sm: 8, md: 12, lg: 16 } as const;\nconst GAP_CLASS = { sm: \"gap-2\", md: \"gap-3\", lg: \"gap-4\" } as const;\n\nexport interface KindPanelGridProps {\n children: React.ReactNode;\n /** Minimum width (px) of a column before the grid drops a column. Default 280. */\n minColumnWidth?: number;\n /** Hard ceiling on columns, however wide the container is. */\n maxColumns?: number;\n /** Space between panels. Default \"md\" (12px). */\n gap?: keyof typeof GAP_PX;\n /**\n * \"auto-fit\" (default): a short last row lets panels grow to fill the width.\n * \"auto-fill\": tracks stay the same width and the row is left short.\n */\n fill?: \"auto-fit\" | \"auto-fill\";\n className?: string;\n}\n\nexport function KindPanelGrid({\n children,\n minColumnWidth = 280,\n maxColumns,\n gap = \"md\",\n fill = \"auto-fit\",\n className,\n}: KindPanelGridProps) {\n const min = `min(100%, ${minColumnWidth}px)`;\n // With a column ceiling, each track must also be at least 1/n of the row —\n // which caps the count at n while still never going under minColumnWidth.\n const track =\n maxColumns && maxColumns > 0\n ? `max(${min}, calc((100% - ${GAP_PX[gap] * (maxColumns - 1)}px) / ${maxColumns}))`\n : min;\n return (\n <div\n className={cn(\"grid items-stretch\", GAP_CLASS[gap], className)}\n style={{ gridTemplateColumns: `repeat(${fill}, minmax(${track}, 1fr))` }}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * KindPanel — the standard panel for a kind component's sub-sections (a\n * keyword bucket, an option card, a section of results).\n *\n * Layout is fixed so agent-authored panels come out right by construction:\n * - compact header: icon · title (wraps, never squeezed) · count · ≤2 inline\n * actions · an overflow menu that absorbs EVERY other control (no control\n * row ever gets crammed);\n * - full-width subline (a rationale, a hint) on its own line UNDER the\n * header — never beside the title;\n * - body;\n * - `footer` pinned to the bottom (flex column + mt-auto) so \"Add\" rows\n * line up across sibling panels in a `KindPanelGrid`.\n * Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Loader2, MoreHorizontal } from \"./icons\";\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@ai-matrx/design-system\";\n\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\n\nexport interface KindPanelMenuItem {\n label: string;\n onSelect: () => void;\n icon?: React.ComponentType<{ className?: string }>;\n disabled?: boolean;\n /** Renders in the destructive colour (delete, clear, reset). */\n destructive?: boolean;\n /** Draws a separator ABOVE this item. */\n separatorBefore?: boolean;\n}\n\nexport interface KindPanelProps {\n /** Header title. Wraps onto extra lines rather than truncating. */\n title: React.ReactNode;\n /** Lucide component or an already-created icon element shown before the title. */\n icon?: KindKitIcon;\n /** Count pill after the title (e.g. number of items). */\n count?: number | string;\n /** Any extra pill/badge after the count (a status, a score). */\n badge?: React.ReactNode;\n /** Shows a spinner in the header while this panel's data is still arriving. */\n streaming?: boolean;\n /**\n * At most one or two compact controls rendered inline on the right of the\n * header (a toggle, a tiny icon button). Put everything else in `menuItems`.\n */\n actions?: React.ReactNode;\n /** Controls collapsed into the header's overflow (⋯) menu. */\n menuItems?: KindPanelMenuItem[];\n /** Full-width line under the header — a rationale, a hint. Never beside the title. */\n subline?: React.ReactNode;\n /** Panel body. */\n children?: React.ReactNode;\n /** Pinned to the bottom of the panel (an \"Add\" row, a summary, a copy bar). */\n footer?: React.ReactNode;\n /** \"card\" (default): bordered card. \"bare\": no border/background — the host IS the chrome. */\n variant?: \"card\" | \"bare\";\n /** Tighter paddings for dense lists. */\n dense?: boolean;\n className?: string;\n /** className for the body wrapper. */\n bodyClassName?: string;\n}\n\nexport function KindPanel({\n title,\n icon,\n count,\n badge,\n streaming = false,\n actions,\n menuItems,\n subline,\n children,\n footer,\n variant = \"card\",\n dense = false,\n className,\n bodyClassName,\n}: KindPanelProps) {\n const px = dense ? \"px-2.5\" : \"px-3\";\n const menu = menuItems && menuItems.length > 0 ? menuItems : null;\n return (\n <section\n className={cn(\n \"flex h-full min-h-0 min-w-0 flex-col\",\n variant === \"card\" && \"rounded-lg border border-border bg-card\",\n className,\n )}\n >\n <header\n className={cn(\n \"flex items-start gap-2\",\n px,\n dense ? \"pt-2\" : \"pt-3\",\n variant === \"bare\" && \"px-0\",\n )}\n >\n {renderKindKitIcon(icon, \"mt-0.5 h-3.5 w-3.5 shrink-0 text-primary\")}\n <h3 className=\"min-w-0 flex-1 text-xs font-semibold uppercase leading-5 tracking-wide text-foreground break-words\">\n {title}\n </h3>\n {count !== undefined && (\n <span className=\"mt-0.5 shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-[10px] tabular-nums text-muted-foreground\">\n {count}\n </span>\n )}\n {badge !== undefined && (\n <span className=\"mt-0.5 shrink-0\">{badge}</span>\n )}\n {streaming && (\n <Loader2\n aria-label=\"Still arriving\"\n className=\"mt-1 h-3 w-3 shrink-0 animate-spin text-muted-foreground\"\n />\n )}\n {actions && (\n <div className=\"flex shrink-0 items-center gap-1\">{actions}</div>\n )}\n {menu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"More actions\"\n className=\"-mr-1 -mt-1 h-7 w-7 shrink-0 text-muted-foreground\"\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-44\">\n {menu.map((item, i) => (\n <React.Fragment key={`${i}-${item.label}`}>\n {item.separatorBefore && i > 0 && <DropdownMenuSeparator />}\n <DropdownMenuItem\n disabled={item.disabled ?? false}\n onSelect={() => item.onSelect()}\n className={cn(\n \"text-xs\",\n item.destructive &&\n \"text-destructive focus:text-destructive\",\n )}\n >\n {item.icon && <item.icon className=\"mr-2 h-3.5 w-3.5\" />}\n {item.label}\n </DropdownMenuItem>\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </header>\n {subline !== undefined && subline !== null && subline !== \"\" && (\n <div\n className={cn(\n \"pt-1 text-xs leading-snug text-muted-foreground break-words\",\n px,\n variant === \"bare\" && \"px-0\",\n )}\n >\n {subline}\n </div>\n )}\n <div\n className={cn(\n \"min-w-0 flex-1\",\n px,\n dense ? \"py-1.5\" : \"py-2\",\n variant === \"bare\" && \"px-0\",\n bodyClassName,\n )}\n >\n {children}\n </div>\n {footer !== undefined && footer !== null && (\n <div\n className={cn(\n \"mt-auto border-t border-border\",\n px,\n dense ? \"py-1.5\" : \"py-2\",\n variant === \"bare\" && \"px-0\",\n )}\n >\n {footer}\n </div>\n )}\n </section>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@ai-matrx/design-system\";\n\nexport type KindKitIcon =\n | React.ComponentType<{ className?: string }>\n | React.ReactElement<{ className?: string }>;\n\n/**\n * Babel-sandbox imports normally bind a component directly, but an ESM/CJS\n * interop boundary may hand us `{ default: Component }`. React reports that\n * wrapper as error #130 if it is passed to createElement unchanged.\n */\nfunction resolveIconType(icon: unknown): React.ElementType | null {\n if (typeof icon === \"function\") return icon as React.ElementType;\n if (typeof icon !== \"object\" || icon === null) return null;\n\n const candidate = icon as Record<PropertyKey, unknown>;\n if (typeof candidate.$$typeof === \"symbol\") {\n return icon as React.ElementType;\n }\n if (\"default\" in candidate && candidate.default !== icon) {\n return resolveIconType(candidate.default);\n }\n return null;\n}\n\n/** Render either icon authoring form without treating an element as a component type. */\nexport function renderKindKitIcon(\n icon: KindKitIcon | undefined,\n className: string,\n): React.ReactElement | null {\n if (!icon) return null;\n if (React.isValidElement<{ className?: string }>(icon)) {\n return React.cloneElement(icon, {\n className: cn(className, icon.props.className),\n });\n }\n const Icon = resolveIconType(icon);\n return Icon ? React.createElement(Icon, { className }) : null;\n}\n","\"use client\";\n\n/**\n * KindHeaderBar — the standard compact header of a kind component:\n * icon · title (the instance's `title_key` value) · at-a-glance stats · the\n * copy bar (the host's `CopyButtons` slot: Copy / Copy-for-AI / JSON / Export from builders\n * the caller supplies). One row that wraps on narrow widths; the copy bar\n * stays on the right. Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Loader2 } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { getKindKitHost, type KindKitCopyProps } from \"./kind-kit-host\";\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\n\nexport interface KindHeaderStat {\n /** Short label, e.g. \"keywords\". */\n label: string;\n /** The number/text, e.g. 42 or \"3 buckets\". */\n value: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Optional hover text. */\n title?: string;\n}\n\nexport interface KindHeaderBarProps {\n /** The instance title (usually `data[title_key]`). */\n title: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Small muted line under the title (a primary keyword, a subtitle). */\n subtitle?: React.ReactNode;\n /** At-a-glance numbers rendered as compact \"value label\" stats. */\n stats?: KindHeaderStat[];\n /** Shows a spinner + \"Streaming\" while the instance is still arriving. */\n streaming?: boolean;\n /** Word shown beside the spinner. Default \"Streaming\". */\n streamingLabel?: string;\n /**\n * The copy bar. Pass the builders you have — `human` (text), `agent`\n * (payload or string), `json` (raw record), `export` (download items) and\n * the `label` used in toasts. Omit to render no copy bar.\n */\n copy?: Omit<KindKitCopyProps, \"size\" | \"className\">;\n /** Extra controls rendered between the stats and the copy bar. */\n actions?: React.ReactNode;\n /** \"sm\" (default) for in-chat blocks; \"md\" for page-level kind surfaces. */\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nexport function KindHeaderBar({\n title,\n icon,\n subtitle,\n stats,\n streaming = false,\n streamingLabel = \"Streaming\",\n copy,\n actions,\n size = \"sm\",\n className,\n}: KindHeaderBarProps) {\n const { CopyButtons } = getKindKitHost();\n const titleCls = size === \"md\" ? \"text-base\" : \"text-sm\";\n const iconCls = size === \"md\" ? \"h-5 w-5\" : \"h-4 w-4\";\n const iconNode = renderKindKitIcon(\n icon,\n cn(\"mt-0.5 shrink-0 text-primary\", iconCls),\n );\n return (\n <div\n className={cn(\"flex flex-wrap items-center gap-x-3 gap-y-1.5\", className)}\n >\n <div className=\"flex min-w-0 flex-1 basis-48 items-start gap-2\">\n {iconNode}\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"font-semibold leading-tight text-foreground break-words\",\n titleCls,\n )}\n >\n {title}\n </div>\n {subtitle !== undefined && subtitle !== null && subtitle !== \"\" && (\n <div className=\"mt-0.5 text-xs leading-snug text-muted-foreground break-words\">\n {subtitle}\n </div>\n )}\n </div>\n </div>\n {stats && stats.length > 0 && (\n <dl className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n {stats.map((s, i) => (\n <div\n key={`${i}-${s.label}`}\n title={s.title}\n className=\"flex items-baseline gap-1 text-xs\"\n >\n {renderKindKitIcon(\n s.icon,\n \"h-3 w-3 self-center text-muted-foreground\",\n )}\n <dd className=\"font-semibold tabular-nums text-foreground\">\n {s.value}\n </dd>\n <dt className=\"text-muted-foreground\">{s.label}</dt>\n </div>\n ))}\n </dl>\n )}\n {streaming && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n {streamingLabel}\n </span>\n )}\n {(actions || copy) && (\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {actions}\n {copy && (\n <CopyButtons {...copy} size={size === \"md\" ? \"sm\" : \"icon\"} />\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * KindActionButton — the one-click door from a kind component to a host\n * Action. Wraps the component's `runAction(key, input)` prop (the ONLY\n * side-effect channel; it never throws, it returns an `{ok}` envelope), with\n * a busy state, no double fire, an optional inline confirm that states the\n * consequence, and a one-line inline error (the host already toasts).\n * Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Button, cn } from \"@ai-matrx/design-system\";\nimport { Loader2 } from \"./icons\";\nimport { renderKindKitIcon, type KindKitIcon } from \"./icon-slot\";\n\nexport type KindActionEnvelope =\n | { ok: true; result?: unknown }\n | { ok: false; error: string };\n\n/** One action: `runAction` + `action` + `input`. */\ninterface KindActionSingle {\n /** The component's `runAction` prop, passed straight through. */\n runAction: (key: string, input: unknown) => Promise<KindActionEnvelope>;\n /** Action key, e.g. \"run_shortcut\". */\n action: string;\n /** The action input, or a function that builds it at click time. */\n input: unknown | (() => unknown);\n run?: never;\n}\n\n/** A chain: `run` awaits several `runAction` calls and returns the final envelope. */\ninterface KindActionChain {\n run: () => Promise<KindActionEnvelope>;\n runAction?: never;\n action?: never;\n input?: never;\n}\n\ninterface KindActionButtonBase {\n /** Short label. Also the aria-label/tooltip when `compact`. */\n label: string;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Label while running. Defaults to `label`. */\n busyLabel?: string;\n /** One-sentence consequence. When set, the first click asks to confirm. */\n confirm?: string;\n onDone?: (result: unknown) => void;\n onError?: (error: string) => void;\n variant?:\n | \"default\"\n | \"primary\"\n | \"destructive\"\n | \"success\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"subtle\";\n /** Icon-only with tooltip + aria-label, for menus and header rows. */\n compact?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport type KindActionButtonProps = KindActionButtonBase &\n (KindActionSingle | KindActionChain);\n\nconst ERROR_MAX = 60;\n\nexport function KindActionButton({\n runAction,\n action,\n input,\n run: runChain,\n label,\n icon,\n busyLabel,\n confirm,\n onDone,\n onError,\n variant = \"outline\",\n compact = false,\n disabled = false,\n className,\n}: KindActionButtonProps) {\n const [busy, setBusy] = React.useState(false);\n const [asking, setAsking] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const inFlight = React.useRef(false);\n const mounted = React.useRef(true);\n const errorTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n if (errorTimer.current) clearTimeout(errorTimer.current);\n };\n }, []);\n\n const run = React.useCallback(async () => {\n if (inFlight.current) return;\n inFlight.current = true;\n setAsking(false);\n setError(null);\n setBusy(true);\n try {\n let res: KindActionEnvelope;\n if (runChain) {\n res = await runChain();\n } else {\n const payload = typeof input === \"function\" ? (input as () => unknown)() : input;\n res = await runAction!(action!, payload);\n }\n if (res && res.ok) {\n onDone?.(res.result);\n } else {\n const message = (res && \"error\" in res && res.error) || \"Action failed\";\n if (mounted.current) {\n setError(message);\n if (errorTimer.current) clearTimeout(errorTimer.current);\n errorTimer.current = setTimeout(() => {\n if (mounted.current) setError(null);\n }, 8000);\n }\n onError?.(message);\n }\n } catch (e) {\n // runAction promises never to throw; stay honest if a host breaks that.\n const message = e instanceof Error ? e.message : \"Action failed\";\n if (mounted.current) setError(message);\n onError?.(message);\n } finally {\n inFlight.current = false;\n if (mounted.current) setBusy(false);\n }\n }, [action, input, onDone, onError, runAction, runChain]);\n\n const onClick = () => {\n if (busy || disabled || inFlight.current) return;\n if (confirm) setAsking(true);\n else void run();\n };\n\n if (asking && !busy) {\n return (\n <span\n role=\"group\"\n aria-label={label}\n className={cn(\n \"inline-flex flex-wrap items-center gap-x-2 gap-y-1 rounded-md border border-border bg-card px-2 py-1 text-xs\",\n className,\n )}\n >\n <span className=\"text-foreground\">{confirm}</span>\n <Button type=\"button\" size=\"xs\" variant={variant === \"outline\" ? \"default\" : variant} onClick={() => void run()}>\n {label}\n </Button>\n <Button type=\"button\" size=\"xs\" variant=\"ghost\" onClick={() => setAsking(false)}>\n Cancel\n </Button>\n </span>\n );\n }\n\n const shownLabel = busy ? (busyLabel ?? label) : label;\n const glyph = busy ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n renderKindKitIcon(icon, \"h-4 w-4\")\n );\n\n return (\n <span className={cn(\"inline-flex min-w-0 items-center gap-2\", className)}>\n <Button\n type=\"button\"\n variant={variant}\n size={compact ? \"icon-sm\" : \"sm\"}\n disabled={disabled || busy}\n aria-busy={busy || undefined}\n aria-label={compact ? shownLabel : undefined}\n title={compact ? label : undefined}\n onClick={onClick}\n >\n {glyph}\n {!compact && <span>{shownLabel}</span>}\n </Button>\n {error && (\n <span\n role=\"alert\"\n title={error}\n className=\"min-w-0 text-xs text-destructive\"\n >\n {error.length > ERROR_MAX ? `${error.slice(0, ERROR_MAX - 1)}…` : error}\n </span>\n )}\n </span>\n );\n}\n","\"use client\";\n\n/**\n * StreamingSkeleton + useStreamingValue — the \"before data lands\" kit.\n *\n * A kind component receives partial `data` on every envelope flush while the\n * agent streams: fields are absent, arrays are short, strings are cut. The\n * skeleton mimics the layout the real content will have (list / cards /\n * table / text) for the instant before anything arrives; the helpers make\n * field reads tolerant so a component never crashes on a half-built\n * instance and never flickers a value away. Contract:\n * `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { cn, Skeleton } from \"@ai-matrx/design-system\";\n\nexport interface StreamingSkeletonProps {\n /** Layout to mimic. Default \"list\". */\n layout?: \"list\" | \"cards\" | \"table\" | \"text\";\n /** Rows (list/table/text lines) or cards. Default 3. */\n rows?: number;\n /** Columns for \"table\" / \"cards\". Default 3 (table) / 2 (cards). */\n columns?: number;\n /** Render a title bar line above the body. Default true. */\n header?: boolean;\n /** Accessible label. Default \"Loading\". */\n label?: string;\n className?: string;\n}\n\nexport function StreamingSkeleton({\n layout = \"list\",\n rows = 3,\n columns,\n header = true,\n label = \"Loading\",\n className,\n}: StreamingSkeletonProps) {\n const n = Math.max(1, rows);\n const cols = Math.max(1, columns ?? (layout === \"cards\" ? 2 : 3));\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label={label}\n className={cn(\"space-y-2\", className)}\n >\n {header && (\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"ml-auto h-6 w-16\" />\n </div>\n )}\n {layout === \"list\" &&\n Array.from({ length: n }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-2 rounded-md border border-border px-2 py-2\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n <Skeleton className={cn(\"h-3.5\", i % 3 === 0 ? \"w-2/3\" : i % 3 === 1 ? \"w-1/2\" : \"w-3/4\")} />\n </div>\n ))}\n {layout === \"cards\" && (\n <div\n className=\"grid gap-3\"\n style={{ gridTemplateColumns: `repeat(auto-fit, minmax(min(100%, 240px), 1fr))` }}\n >\n {Array.from({ length: Math.max(n, cols) }).map((_, i) => (\n <div key={i} className=\"space-y-2 rounded-lg border border-border p-3\">\n <Skeleton className=\"h-3.5 w-1/2\" />\n <Skeleton className=\"h-3 w-full\" />\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-5 w-12 rounded-full\" />\n </div>\n </div>\n ))}\n </div>\n )}\n {layout === \"table\" && (\n <div className=\"overflow-hidden rounded-md border border-border\">\n <div\n className=\"grid gap-2 border-b border-border bg-muted/40 px-2 py-1.5\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, c) => (\n <Skeleton key={c} className=\"h-3 w-2/3\" />\n ))}\n </div>\n {Array.from({ length: n }).map((_, r) => (\n <div\n key={r}\n className=\"grid gap-2 px-2 py-2\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, c) => (\n <Skeleton key={c} className={cn(\"h-3\", c === 0 ? \"w-3/4\" : \"w-1/2\")} />\n ))}\n </div>\n ))}\n </div>\n )}\n {layout === \"text\" &&\n Array.from({ length: n }).map((_, i) => (\n <Skeleton\n key={i}\n className={cn(\"h-3\", i === n - 1 ? \"w-2/5\" : i % 2 === 0 ? \"w-full\" : \"w-11/12\")}\n />\n ))}\n <span className=\"sr-only\">{label}</span>\n </div>\n );\n}\n\n/**\n * Sticky, tolerant read of a value that may be absent mid-stream.\n *\n * Returns the latest DEFINED value seen (so a re-parse that momentarily drops\n * a field does not blank the UI), `fallback` until one arrives, and `arrived`\n * once any real value has been observed. Implemented with the React\n * \"remember the previous render\" pattern (state updated during render), so\n * pass a FIELD READ (`data?.summary`) — never an expression that builds a\n * new object/array on every render (`data?.items ?? []`), which would\n * re-trigger the update each render.\n */\nexport function useStreamingValue<T>(\n value: T | null | undefined,\n fallback: T,\n): { value: T; arrived: boolean } {\n const [last, setLast] = React.useState<{ value: T; arrived: boolean }>({\n value: fallback,\n arrived: false,\n });\n const defined = value !== null && value !== undefined;\n if (defined && (!last.arrived || !Object.is(value, last.value))) {\n const next = { value: value as T, arrived: true };\n setLast(next);\n return next;\n }\n return last;\n}\n\n/** `value` when it is an array, else `[]` — for `data.items` that is not there yet. */\nexport function streamList<T = unknown>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\n/** `value` when it is a non-empty string, else `fallback` (\"\" by default). */\nexport function streamText(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" && value.length > 0 ? value : fallback;\n}\n","\"use client\";\n\n/**\n * KeywordChip + TagList — chips that WRAP, never truncate.\n *\n * A keyword / tag / phrase is always shown in full: the chip wraps its text\n * onto extra lines inside the chip, and the list wraps chips onto extra rows.\n * Optional select (checkbox-like toggle), remove (X) and inline edit\n * (pencil → input, Enter commits, Esc cancels). `TagList` adds an inline\n * \"Add\" input at the end when `onAdd` is given. Contract:\n * `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Check, Pencil, Plus, X } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\nimport { getKindKitHost, type ReadOutcome } from \"./kind-kit-host\";\n\nexport interface KeywordChipProps {\n /** The phrase. Rendered in full — wraps, never truncates. */\n label: string;\n /** Small trailing detail (a count, a volume, a score). */\n meta?: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Selected state; pass `onSelect` to make the chip a toggle. */\n selected?: boolean;\n /** Makes the chip a toggle; called with the next selected state. */\n onSelect?: ((selected: boolean) => void) | undefined;\n /** Adds an X control. */\n onRemove?: (() => void) | undefined;\n /** Enables inline edit (pencil control + double-click); called with the committed text. */\n onEdit?: ((next: string) => void) | undefined;\n /** Greys the chip and disables select/remove/edit. */\n disabled?: boolean | undefined;\n tone?: \"default\" | \"primary\" | \"muted\" | undefined;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nconst TONE = {\n default: \"border-border bg-background text-foreground\",\n primary: \"border-primary/40 bg-primary/5 text-foreground\",\n muted: \"border-border bg-muted text-muted-foreground\",\n} as const;\n\nexport function KeywordChip({\n label,\n meta,\n icon,\n selected = false,\n onSelect,\n onRemove,\n onEdit,\n disabled = false,\n tone = \"default\",\n size = \"sm\",\n className,\n}: KeywordChipProps) {\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState(label);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n\n const selectable = !!onSelect && !disabled;\n const editable = !!onEdit && !disabled;\n\n const startEdit = () => {\n if (!editable) return;\n setDraft(label);\n setEditing(true);\n // Focus after the input mounts.\n requestAnimationFrame(() => inputRef.current?.select());\n };\n const commit = () => {\n setEditing(false);\n const next = draft.trim();\n if (next && next !== label) onEdit?.(next);\n };\n const cancel = () => {\n setEditing(false);\n setDraft(label);\n };\n\n const pad = size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\";\n // Inputs stay >=16px on phones (no iOS zoom), shrink to the chip size on sm+.\n const inputText = size === \"md\" ? \"text-[16px] sm:text-sm\" : \"text-[16px] sm:text-xs\";\n const ctl = size === \"md\" ? \"h-4 w-4\" : \"h-3.5 w-3.5\";\n\n return (\n <span\n className={cn(\n // max-w-full + min-w-0 + break-words: the text wraps INSIDE the chip.\n \"inline-flex max-w-full min-w-0 items-center gap-1 rounded-full border leading-snug\",\n pad,\n selected ? \"border-primary bg-primary/10 text-foreground\" : TONE[tone],\n disabled && \"opacity-60\",\n className,\n )}\n >\n {selectable && (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={selected}\n aria-label={`${selected ? \"Deselect\" : \"Select\"} ${label}`}\n onClick={() => onSelect?.(!selected)}\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-sm border\",\n size === \"md\" ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n selected\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-muted-foreground/50 bg-background\",\n )}\n >\n {selected && <Check className=\"h-2.5 w-2.5\" />}\n </button>\n )}\n {renderKindKitIcon(\n icon,\n cn(\"shrink-0 text-muted-foreground\", ctl),\n )}\n {editing ? (\n <input\n ref={inputRef}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n }\n }}\n aria-label={`Edit ${label}`}\n size={Math.max(4, draft.length + 1)}\n className={cn(\"min-w-0 bg-transparent outline-none\", inputText)}\n />\n ) : (\n <span\n className=\"min-w-0 whitespace-normal break-words text-left\"\n onDoubleClick={startEdit}\n >\n {label}\n </span>\n )}\n {meta !== undefined && meta !== null && (\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">{meta}</span>\n )}\n {editable && !editing && (\n <button\n type=\"button\"\n aria-label={`Edit ${label}`}\n onClick={startEdit}\n className=\"shrink-0 rounded-full text-muted-foreground hover:text-foreground\"\n >\n <Pencil className={cn(\"h-3 w-3\", size === \"md\" && \"h-3.5 w-3.5\")} />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n disabled={disabled}\n onClick={onRemove}\n className=\"-mr-0.5 shrink-0 rounded-full text-muted-foreground hover:text-destructive disabled:pointer-events-none\"\n >\n <X className={ctl} />\n </button>\n )}\n </span>\n );\n}\n\nexport interface TagItem {\n label: string;\n /** Stable key; defaults to `label`. */\n key?: string;\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface TagListProps {\n /** Phrases, as strings or `{ label, key?, meta?, disabled? }` objects. */\n items: readonly (string | TagItem)[];\n /** Selected keys (label when no key). Pass with `onToggle` for selectable chips. */\n selected?: readonly string[];\n /** Makes chips toggles; called with (key, nextSelected). */\n onToggle?: (key: string, selected: boolean) => void;\n /** Adds an X on every chip; called with (key, index). */\n onRemove?: (key: string, index: number) => void;\n /** Enables inline edit on every chip; called with (key, index, nextLabel). */\n onEdit?: (key: string, index: number, next: string) => void;\n /** Renders an inline \"Add\" input at the end; called with the trimmed text. */\n onAdd?: (label: string) => void;\n /** Placeholder of the add input. Default \"Add…\". */\n addPlaceholder?: string;\n /** Shown when `items` is empty (and there is no add input). */\n emptyState?: React.ReactNode;\n /**\n * The outcome of the read behind the rows (RC-B12 r13). `emptyState` shows\n * only after a read that succeeded; a failed read shows the failure + retry.\n */\n read?: ReadOutcome;\n tone?: KeywordChipProps[\"tone\"];\n size?: KeywordChipProps[\"size\"];\n disabled?: boolean;\n className?: string;\n}\n\nfunction normalize(item: string | TagItem): TagItem {\n return typeof item === \"string\" ? { label: item } : item;\n}\n\nexport function TagList({\n items,\n selected,\n onToggle,\n onRemove,\n onEdit,\n onAdd,\n addPlaceholder = \"Add…\",\n emptyState,\n read,\n tone,\n size = \"sm\",\n disabled = false,\n className,\n}: TagListProps) {\n const { ReadEmpty, ReadStaleNotice } = getKindKitHost();\n const [adding, setAdding] = React.useState(false);\n const [draft, setDraft] = React.useState(\"\");\n const inputText = size === \"md\" ? \"text-[16px] sm:text-sm\" : \"text-[16px] sm:text-xs\";\n const selectedSet = new Set(selected ?? []);\n\n const commitAdd = () => {\n const next = draft.trim();\n if (next) onAdd?.(next);\n setDraft(\"\");\n setAdding(false);\n };\n\n if (items.length === 0 && read && read.status !== \"ready\") return <ReadEmpty read={read} />;\n if (items.length === 0 && !onAdd) {\n return emptyState !== undefined ? (\n <div className={cn(\"text-xs text-muted-foreground\", className)}>\n {emptyState}\n </div>\n ) : null;\n }\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1.5\", className)}>\n <ReadStaleNotice read={read} className=\"w-full\" />\n {items.map((raw, index) => {\n const item = normalize(raw);\n const key = item.key ?? item.label;\n return (\n <KeywordChip\n key={`${key}-${index}`}\n label={item.label}\n meta={item.meta}\n tone={tone}\n size={size}\n disabled={disabled || item.disabled}\n selected={selectedSet.has(key)}\n onSelect={onToggle ? (next) => onToggle(key, next) : undefined}\n onRemove={onRemove ? () => onRemove(key, index) : undefined}\n onEdit={onEdit ? (next) => onEdit(key, index, next) : undefined}\n />\n );\n })}\n {items.length === 0 && emptyState !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{emptyState}</span>\n )}\n {onAdd && !disabled && (\n adding ? (\n <span\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border border-dashed border-primary/60 bg-background\",\n size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\",\n )}\n >\n <input\n autoFocus\n value={draft}\n placeholder={addPlaceholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commitAdd}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAdd();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setDraft(\"\");\n setAdding(false);\n }\n }}\n aria-label={addPlaceholder}\n size={Math.max(6, draft.length + 1)}\n className={cn(\"min-w-0 bg-transparent outline-none placeholder:text-muted-foreground\", inputText)}\n />\n </span>\n ) : (\n <button\n type=\"button\"\n onClick={() => setAdding(true)}\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border border-dashed border-border text-muted-foreground hover:border-primary/60 hover:text-foreground\",\n size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\",\n )}\n >\n <Plus className=\"h-3 w-3\" />\n {addPlaceholder.replace(/…$/, \"\")}\n </button>\n )\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["React","React","import_jsx_runtime","import_jsx_runtime","React","import_design_system","import_jsx_runtime","React","import_design_system","React","import_design_system","import_jsx_runtime","React","import_design_system","import_jsx_runtime","React","import_design_system","import_jsx_runtime","React","import_design_system","import_jsx_runtime","_","React","import_design_system","import_jsx_runtime"]}
|
package/dist/kind-kit.js
CHANGED
|
@@ -77,6 +77,7 @@ import { cn } from "@ai-matrx/design-system";
|
|
|
77
77
|
|
|
78
78
|
// kind-kit/kind-kit-host.tsx
|
|
79
79
|
import * as React2 from "react";
|
|
80
|
+
import { copyText } from "@ai-matrx/kit/clipboard";
|
|
80
81
|
import { Fragment as Fragment2, jsx as jsx2, jsxs as jsxs2 } from "react/jsx-runtime";
|
|
81
82
|
var KEY = /* @__PURE__ */ Symbol.for("ai-matrx.content-ir-react.kind-kit-host");
|
|
82
83
|
function resolveText(human, json) {
|
|
@@ -88,12 +89,7 @@ function resolveText(human, json) {
|
|
|
88
89
|
function DefaultCopyButtons({ label, human, json, size, className }) {
|
|
89
90
|
const [state, setState] = React2.useState("idle");
|
|
90
91
|
const onClick = async () => {
|
|
91
|
-
|
|
92
|
-
await navigator.clipboard.writeText(resolveText(human, json));
|
|
93
|
-
setState("copied");
|
|
94
|
-
} catch {
|
|
95
|
-
setState("failed");
|
|
96
|
-
}
|
|
92
|
+
setState(await copyText(resolveText(human, json)) ? "copied" : "failed");
|
|
97
93
|
setTimeout(() => setState("idle"), 1500);
|
|
98
94
|
};
|
|
99
95
|
return /* @__PURE__ */ jsx2(
|
package/dist/kind-kit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../kind-kit/SortableList.tsx","../kind-kit/icons.tsx","../kind-kit/kind-kit-host.tsx","../kind-kit/KindPanelGrid.tsx","../kind-kit/KindPanel.tsx","../kind-kit/icon-slot.tsx","../kind-kit/KindHeaderBar.tsx","../kind-kit/KindActionButton.tsx","../kind-kit/StreamingSkeleton.tsx","../kind-kit/TagList.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * SortableList — drag-to-reorder list for kind components.\n *\n * The mandated reorder UX, built once: while a row is dragged, the rows it\n * passes DISPLACE (translate) out of the way and a SHADOWED placeholder marks\n * exactly where the item will land. Native HTML5 drag-and-drop (no deps); a\n * grab handle starts the drag (so text and inputs inside rows stay usable);\n * up/down buttons are the keyboard + touch fallback; `onRemove` adds an inline\n * remove control. Contract: `kind-kit/README.md`.\n *\n * Sandbox-safe by construction: imports only react, the design system,\n * and `cn`.\n */\n\nimport * as React from \"react\";\nimport { ChevronDown, ChevronUp, GripVertical, X } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { getKindKitHost, type ReadOutcome } from \"./kind-kit-host\";\n\nexport interface SortableRenderContext {\n index: number;\n /** True for the row currently being dragged (rendered as the placeholder). */\n isDragging: boolean;\n}\n\nexport interface SortableListProps<T> {\n /** Current order. Treated as read-only; the new order arrives via `onReorder`. */\n items: readonly T[];\n /**\n * Stable key per item. Default: the item itself when it is a string, else\n * `item.id` / `item.key` when present, else the index (unstable — pass one).\n */\n getKey?: (item: T, index: number) => string;\n /** Called with the full reordered array after a drop or an arrow press. */\n onReorder: (items: T[]) => void;\n /**\n * Row content. Default: the item when it is a string/number, else its\n * `label` / `title` / `name` / `text` field, else `JSON.stringify`.\n */\n renderItem?: (item: T, ctx: SortableRenderContext) => React.ReactNode;\n /** When set, every row gets an inline remove (X) control. */\n onRemove?: (item: T, index: number) => void;\n /** Disables drag, arrows and remove (rows still render). */\n disabled?: boolean;\n /** Hide the up/down arrow buttons (drag only). Default false. */\n hideArrows?: boolean;\n /** Shown when `items` is empty. */\n emptyState?: React.ReactNode;\n /**\n * The outcome of the read behind the rows (RC-B12 r13). `emptyState` shows\n * only after a read that succeeded; a failed read shows the failure + retry.\n */\n read?: ReadOutcome;\n /** Wrapper `<ul>` className. */\n className?: string;\n /** Per-row className (applied to every `<li>`). */\n itemClassName?: string;\n /** Accessible name for the list. */\n ariaLabel?: string;\n}\n\nfunction defaultKey<T>(item: T, index: number): string {\n if (typeof item === \"string\" || typeof item === \"number\") return String(item);\n if (item && typeof item === \"object\") {\n const rec = item as Record<string, unknown>;\n if (typeof rec.id === \"string\" || typeof rec.id === \"number\")\n return String(rec.id);\n if (typeof rec.key === \"string\") return rec.key;\n }\n return String(index);\n}\n\nfunction defaultRender<T>(item: T): React.ReactNode {\n if (typeof item === \"string\" || typeof item === \"number\") return String(item);\n if (item && typeof item === \"object\") {\n const rec = item as Record<string, unknown>;\n for (const k of [\"label\", \"title\", \"name\", \"text\"]) {\n if (typeof rec[k] === \"string\") return rec[k] as string;\n }\n return JSON.stringify(item);\n }\n return String(item);\n}\n\nfunction moveItem<T>(items: readonly T[], from: number, to: number): T[] {\n const next = items.slice();\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved as T);\n return next;\n}\n\ninterface DragState {\n from: number;\n over: number;\n /**\n * Row rects captured at drag start, relative to the list's top — a fixed\n * ruler: the pointer's position on it decides the landing slot, so the\n * target never depends on which (already displaced) row fires the event.\n */\n rects: { top: number; bottom: number; height: number }[];\n}\n\nexport function SortableList<T>({\n items,\n getKey = defaultKey,\n onReorder,\n renderItem,\n onRemove,\n disabled = false,\n hideArrows = false,\n emptyState,\n read,\n className,\n itemClassName,\n ariaLabel,\n}: SortableListProps<T>) {\n const { ReadEmpty, ReadStaleNotice } = getKindKitHost();\n const [drag, setDrag] = React.useState<DragState | null>(null);\n const [armed, setArmed] = React.useState<number | null>(null);\n const listRef = React.useRef<HTMLUListElement | null>(null);\n const rowRefs = React.useRef<(HTMLLIElement | null)[]>([]);\n\n const canInteract = !disabled;\n\n const handleDragStart = (index: number) => (e: React.DragEvent<HTMLLIElement>) => {\n if (!canInteract || armed !== index) {\n e.preventDefault();\n return;\n }\n e.dataTransfer.effectAllowed = \"move\";\n // Firefox requires data to start a drag.\n e.dataTransfer.setData(\"text/plain\", String(index));\n const listTop = listRef.current?.getBoundingClientRect().top ?? 0;\n const rects = rowRefs.current.slice(0, items.length).map((el) => {\n const r = el ? el.getBoundingClientRect() : new DOMRect();\n return { top: r.top - listTop, bottom: r.bottom - listTop, height: r.height };\n });\n setDrag({ from: index, over: index, rects });\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const listTop = listRef.current?.getBoundingClientRect().top ?? 0;\n const y = e.clientY - listTop;\n let over = drag.rects.length - 1;\n for (let i = 0; i < drag.rects.length; i++) {\n const r = drag.rects[i];\n if (r && y < r.bottom) {\n over = i;\n break;\n }\n }\n if (over !== drag.over) setDrag({ ...drag, over });\n };\n\n const finish = () => {\n setDrag(null);\n setArmed(null);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n if (drag && drag.from !== drag.over) {\n onReorder(moveItem(items, drag.from, drag.over));\n }\n finish();\n };\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= items.length || from === to) return;\n onReorder(moveItem(items, from, to));\n };\n\n /** Translate (px) for row `index` while a drag is in flight. */\n const translateFor = (index: number): number => {\n if (!drag) return 0;\n const { from, over, rects } = drag;\n if (from === over) return 0;\n const dragged = rects[from];\n if (!dragged) return 0;\n // Slot size = row height + the gap to its neighbour (so displaced rows\n // land exactly on the grid the dragged row vacates).\n const neighbour = rects[from + 1] ?? rects[from - 1];\n const gap = neighbour\n ? Math.max(\n 0,\n from + 1 < rects.length\n ? neighbour.top - dragged.bottom\n : dragged.top - neighbour.bottom,\n )\n : 0;\n const slot = dragged.height + gap;\n if (index === from) {\n const target = rects[over];\n if (!target) return 0;\n return over > from\n ? target.bottom - dragged.bottom\n : target.top - dragged.top;\n }\n if (from < over && index > from && index <= over) return -slot;\n if (over < from && index >= over && index < from) return slot;\n return 0;\n };\n\n if (items.length === 0) {\n if (read && read.status !== \"ready\") return <ReadEmpty read={read} />;\n return emptyState !== undefined ? (\n <div className={cn(\"text-xs text-muted-foreground\", className)}>\n {emptyState}\n </div>\n ) : null;\n }\n\n return (\n <>\n <ReadStaleNotice read={read} className=\"mb-1.5\" />\n <ul\n role=\"list\"\n aria-label={ariaLabel}\n ref={listRef}\n className={cn(\"flex flex-col gap-1.5\", className)}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {items.map((item, index) => {\n const key = getKey(item, index);\n const isDragging = drag?.from === index;\n const translate = translateFor(index);\n return (\n <li\n key={key}\n ref={(el) => {\n rowRefs.current[index] = el;\n }}\n draggable={canInteract && armed === index}\n onDragStart={handleDragStart(index)}\n onDragEnd={finish}\n style={{\n transform: translate ? `translate3d(0, ${translate}px, 0)` : undefined,\n }}\n className={cn(\n \"flex items-center gap-1.5 rounded-md border px-2 py-1.5 text-sm text-foreground\",\n \"transition-transform duration-150 ease-out will-change-transform\",\n isDragging\n ? \"border-dashed border-primary/60 bg-primary/5 shadow-inner\"\n : \"border-border bg-card\",\n itemClassName,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Drag to reorder\"\n disabled={!canInteract}\n onPointerDown={() => canInteract && setArmed(index)}\n onPointerUp={() => !drag && setArmed(null)}\n className={cn(\n \"flex h-7 w-6 shrink-0 touch-none items-center justify-center rounded text-muted-foreground\",\n canInteract\n ? \"cursor-grab hover:bg-muted hover:text-foreground active:cursor-grabbing\"\n : \"opacity-40\",\n )}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n <div\n className={cn(\n \"min-w-0 flex-1 break-words\",\n isDragging && \"opacity-40\",\n )}\n >\n {renderItem\n ? renderItem(item, { index, isDragging })\n : defaultRender(item)}\n </div>\n {(!hideArrows || onRemove) && (\n /*\n * Controls sit IN FLOW at the row's end — never floating.\n *\n * A cluster that costs no layout width must, by construction,\n * land on top of something when it appears, and it wins every\n * click there because it is the layer above. Rows here carry the\n * host component's own trailing controls (copy, edit, menus), so\n * a floating cluster covered live buttons on every consumer:\n * measured on `artisan_demo_reading_list`, it sat on \"Copy for\n * AI\" and \"Edit book\". The kit cannot know what a row draws in\n * its corner, so it takes its own width instead of borrowing the\n * row's. Ruled 2026-08-30: overlap is never worth the density.\n */\n <div\n className={cn(\n \"flex shrink-0 items-center gap-px self-start\",\n isDragging && \"opacity-40\",\n )}\n >\n {!hideArrows && (\n /* Chevrons stack so the pair costs one 20px column, not two. */\n <div className=\"flex flex-col items-center pointer-coarse:flex-row\">\n <button\n type=\"button\"\n aria-label=\"Move up\"\n disabled={!canInteract || index === 0}\n onClick={() => move(index, index - 1)}\n className=\"flex h-3.5 w-5 items-center justify-center rounded-sm text-muted-foreground/70 hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <ChevronUp className=\"h-3 w-3\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Move down\"\n disabled={!canInteract || index === items.length - 1}\n onClick={() => move(index, index + 1)}\n className=\"flex h-3.5 w-5 items-center justify-center rounded-sm text-muted-foreground/70 hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n disabled={!canInteract}\n onClick={() => onRemove(item, index)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/70 hover:bg-muted hover:text-destructive disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </>\n );\n}\n","/**\n * The kit's nine glyphs, inlined (C19: a package ships its own SVGs, no icon-library\n * dependency). Paths are Lucide's (ISC licence); stroke and size come from the\n * `className` the caller passes, exactly as a Lucide component would take it.\n */\nimport * as React from \"react\";\n\ntype IconProps = { className?: string };\n\nfunction make(name: string, children: React.ReactNode) {\n const Icon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\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 className={className}\n >\n {children}\n </svg>\n );\n Icon.displayName = name;\n return Icon;\n}\n\nexport const Loader2 = make(\"Loader2\", <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />);\nexport const MoreHorizontal = make(\n \"MoreHorizontal\",\n <>\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 </>,\n);\nexport const ChevronDown = make(\"ChevronDown\", <path d=\"m6 9 6 6 6-6\" />);\nexport const ChevronUp = make(\"ChevronUp\", <path d=\"m18 15-6-6-6 6\" />);\nexport const GripVertical = make(\n \"GripVertical\",\n <>\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\n </>,\n);\nexport const X = make(\n \"X\",\n <>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </>,\n);\nexport const Check = make(\"Check\", <path d=\"M20 6 9 17l-5-5\" />);\nexport const Pencil = make(\n \"Pencil\",\n <>\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </>,\n);\nexport const Plus = make(\n \"Plus\",\n <>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </>,\n);\n","\"use client\";\n\n/**\n * The kit's HOST SLOTS. The kit never imports app code; the three things it cannot own are\n * handed in once by the host through `setKindKitHost`:\n * - `CopyButtons` the copy bar `KindHeaderBar` renders for its `copy` prop;\n * - `ReadEmpty` what `SortableList` / `TagList` show instead of an empty state while a\n * read has not succeeded;\n * - `ReadStaleNotice` the notice above rows left on screen by a failed refresh.\n * Each default is honest and working: a plain Copy button, and text that says what happened.\n * State lives on globalThis under a Symbol.for key so two copies of the package share one host.\n */\nimport * as React from \"react\";\nimport type { MatrxCopyMenuProps } from \"@ai-matrx/alchemy/react/workspace\";\n\n/**\n * The copy bar's props: exactly the design system's `MatrxCopyMenuProps`, so a host registers its\n * own `CopyButtons` (which takes that shape) with no adapter. Type-only: no runtime import.\n */\nexport type KindKitCopyProps = MatrxCopyMenuProps;\n\nexport type ReadStatus = \"loading\" | \"error\" | \"ready\";\n\n/** A read's outcome, handed to a list primitive's `read` prop. */\nexport interface ReadOutcome {\n status: ReadStatus;\n /** The failure itself, or a truthy flag when the read only says it failed. */\n error?: unknown;\n onRetry?: (() => void) | undefined;\n /** What was read, in the reader's words: \"your tasks\". */\n what?: string | undefined;\n /** A successful read has already produced a value. */\n hasData?: boolean | undefined;\n}\n\nexport interface KindKitReadEmptyProps {\n read?: ReadOutcome | undefined;\n loading?: React.ReactNode;\n children?: React.ReactNode;\n}\nexport interface KindKitReadStaleNoticeProps {\n read?: ReadOutcome | undefined;\n className?: string;\n}\n\nexport interface KindKitHost {\n CopyButtons: React.ComponentType<KindKitCopyProps>;\n ReadEmpty: React.ComponentType<KindKitReadEmptyProps>;\n ReadStaleNotice: React.ComponentType<KindKitReadStaleNoticeProps>;\n}\n\nconst KEY = Symbol.for(\"ai-matrx.content-ir-react.kind-kit-host\");\ntype Store = { [KEY]?: Partial<KindKitHost> };\n\nfunction resolveText(human: KindKitCopyProps[\"human\"], json: KindKitCopyProps[\"json\"]): string {\n if (typeof human === \"function\") return human();\n if (typeof human === \"string\") return human;\n if (json !== undefined) return JSON.stringify(typeof json === \"function\" ? (json as () => unknown)() : json, null, 2);\n return \"\";\n}\n\n/** Default copy bar: one \"Copy\" button that writes the `human` text (else the JSON) to the clipboard. */\nexport function DefaultCopyButtons({ label, human, json, size, className }: KindKitCopyProps) {\n const [state, setState] = React.useState<\"idle\" | \"copied\" | \"failed\">(\"idle\");\n const onClick = async () => {\n try {\n await navigator.clipboard.writeText(resolveText(human, json));\n setState(\"copied\");\n } catch {\n setState(\"failed\");\n }\n setTimeout(() => setState(\"idle\"), 1500);\n };\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={`Copy ${label}`}\n aria-label={`Copy ${label}`}\n className={\n className ??\n `inline-flex items-center rounded-md border border-border px-2 text-xs text-foreground hover:bg-muted ${size === \"icon\" ? \"h-7\" : \"h-8\"}`\n }\n >\n {state === \"copied\" ? \"Copied\" : state === \"failed\" ? \"Copy failed\" : \"Copy\"}\n </button>\n );\n}\n\nfunction RetryButton({ onRetry }: { onRetry: (() => void) | undefined }) {\n if (!onRetry) return null;\n return (\n <button type=\"button\" onClick={onRetry} className=\"ml-2 underline underline-offset-2\">\n Try again\n </button>\n );\n}\n\n/** Default: loading says it is loading; an error says what failed (with retry); ready shows the host's empty state. */\nexport function DefaultReadEmpty({ read, loading, children }: KindKitReadEmptyProps) {\n const status = read?.status ?? \"ready\";\n const what = read?.what ?? \"this list\";\n if (status === \"loading\") return <>{loading ?? <div role=\"status\" className=\"text-xs text-muted-foreground\">{`Loading ${what}…`}</div>}</>;\n if (status === \"error\") {\n return (\n <div role=\"alert\" className=\"text-xs text-destructive\">\n {`Could not load ${what}.`}\n <RetryButton onRetry={read?.onRetry} />\n </div>\n );\n }\n return <>{children ?? null}</>;\n}\n\n/** Default: when the latest read failed, the rows on screen may be out of date; says so, with retry. */\nexport function DefaultReadStaleNotice({ read, className }: KindKitReadStaleNoticeProps) {\n if (read?.status !== \"error\") return null;\n return (\n <div role=\"alert\" className={`text-xs text-muted-foreground ${className ?? \"\"}`}>\n {`Showing earlier ${read.what ?? \"results\"}; the latest refresh failed.`}\n <RetryButton onRetry={read.onRetry} />\n </div>\n );\n}\n\nconst DEFAULTS: KindKitHost = {\n CopyButtons: DefaultCopyButtons,\n ReadEmpty: DefaultReadEmpty,\n ReadStaleNotice: DefaultReadStaleNotice,\n};\n\n/** Register the host's copy bar and read notices. Call once at boot; a slot left out keeps its default. */\nexport function setKindKitHost(host: Partial<KindKitHost>): void {\n (globalThis as Store)[KEY] = { ...(globalThis as Store)[KEY], ...host };\n}\n\n/** The slots in force: the host's where registered, the defaults elsewhere. */\nexport function getKindKitHost(): KindKitHost {\n return { ...DEFAULTS, ...(globalThis as Store)[KEY] };\n}\n\n/** Clear every registered slot (tests, hot reload). */\nexport function resetKindKitHost(): void {\n delete (globalThis as Store)[KEY];\n}\n","\"use client\";\n\n/**\n * KindPanelGrid — content-aware responsive grid for side-by-side panels.\n *\n * Never more columns than the content can afford: every track is at least\n * `minColumnWidth` (default 280px) wide, the column count is whatever fits\n * (`auto-fit`), and every panel in a row stretches to the same height so the\n * panels' footers line up. Pair with `KindPanel` (its `footer` is pinned to\n * the bottom). Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\n\nconst GAP_PX = { sm: 8, md: 12, lg: 16 } as const;\nconst GAP_CLASS = { sm: \"gap-2\", md: \"gap-3\", lg: \"gap-4\" } as const;\n\nexport interface KindPanelGridProps {\n children: React.ReactNode;\n /** Minimum width (px) of a column before the grid drops a column. Default 280. */\n minColumnWidth?: number;\n /** Hard ceiling on columns, however wide the container is. */\n maxColumns?: number;\n /** Space between panels. Default \"md\" (12px). */\n gap?: keyof typeof GAP_PX;\n /**\n * \"auto-fit\" (default): a short last row lets panels grow to fill the width.\n * \"auto-fill\": tracks stay the same width and the row is left short.\n */\n fill?: \"auto-fit\" | \"auto-fill\";\n className?: string;\n}\n\nexport function KindPanelGrid({\n children,\n minColumnWidth = 280,\n maxColumns,\n gap = \"md\",\n fill = \"auto-fit\",\n className,\n}: KindPanelGridProps) {\n const min = `min(100%, ${minColumnWidth}px)`;\n // With a column ceiling, each track must also be at least 1/n of the row —\n // which caps the count at n while still never going under minColumnWidth.\n const track =\n maxColumns && maxColumns > 0\n ? `max(${min}, calc((100% - ${GAP_PX[gap] * (maxColumns - 1)}px) / ${maxColumns}))`\n : min;\n return (\n <div\n className={cn(\"grid items-stretch\", GAP_CLASS[gap], className)}\n style={{ gridTemplateColumns: `repeat(${fill}, minmax(${track}, 1fr))` }}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * KindPanel — the standard panel for a kind component's sub-sections (a\n * keyword bucket, an option card, a section of results).\n *\n * Layout is fixed so agent-authored panels come out right by construction:\n * - compact header: icon · title (wraps, never squeezed) · count · ≤2 inline\n * actions · an overflow menu that absorbs EVERY other control (no control\n * row ever gets crammed);\n * - full-width subline (a rationale, a hint) on its own line UNDER the\n * header — never beside the title;\n * - body;\n * - `footer` pinned to the bottom (flex column + mt-auto) so \"Add\" rows\n * line up across sibling panels in a `KindPanelGrid`.\n * Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Loader2, MoreHorizontal } from \"./icons\";\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@ai-matrx/design-system\";\n\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\n\nexport interface KindPanelMenuItem {\n label: string;\n onSelect: () => void;\n icon?: React.ComponentType<{ className?: string }>;\n disabled?: boolean;\n /** Renders in the destructive colour (delete, clear, reset). */\n destructive?: boolean;\n /** Draws a separator ABOVE this item. */\n separatorBefore?: boolean;\n}\n\nexport interface KindPanelProps {\n /** Header title. Wraps onto extra lines rather than truncating. */\n title: React.ReactNode;\n /** Lucide component or an already-created icon element shown before the title. */\n icon?: KindKitIcon;\n /** Count pill after the title (e.g. number of items). */\n count?: number | string;\n /** Any extra pill/badge after the count (a status, a score). */\n badge?: React.ReactNode;\n /** Shows a spinner in the header while this panel's data is still arriving. */\n streaming?: boolean;\n /**\n * At most one or two compact controls rendered inline on the right of the\n * header (a toggle, a tiny icon button). Put everything else in `menuItems`.\n */\n actions?: React.ReactNode;\n /** Controls collapsed into the header's overflow (⋯) menu. */\n menuItems?: KindPanelMenuItem[];\n /** Full-width line under the header — a rationale, a hint. Never beside the title. */\n subline?: React.ReactNode;\n /** Panel body. */\n children?: React.ReactNode;\n /** Pinned to the bottom of the panel (an \"Add\" row, a summary, a copy bar). */\n footer?: React.ReactNode;\n /** \"card\" (default): bordered card. \"bare\": no border/background — the host IS the chrome. */\n variant?: \"card\" | \"bare\";\n /** Tighter paddings for dense lists. */\n dense?: boolean;\n className?: string;\n /** className for the body wrapper. */\n bodyClassName?: string;\n}\n\nexport function KindPanel({\n title,\n icon,\n count,\n badge,\n streaming = false,\n actions,\n menuItems,\n subline,\n children,\n footer,\n variant = \"card\",\n dense = false,\n className,\n bodyClassName,\n}: KindPanelProps) {\n const px = dense ? \"px-2.5\" : \"px-3\";\n const menu = menuItems && menuItems.length > 0 ? menuItems : null;\n return (\n <section\n className={cn(\n \"flex h-full min-h-0 min-w-0 flex-col\",\n variant === \"card\" && \"rounded-lg border border-border bg-card\",\n className,\n )}\n >\n <header\n className={cn(\n \"flex items-start gap-2\",\n px,\n dense ? \"pt-2\" : \"pt-3\",\n variant === \"bare\" && \"px-0\",\n )}\n >\n {renderKindKitIcon(icon, \"mt-0.5 h-3.5 w-3.5 shrink-0 text-primary\")}\n <h3 className=\"min-w-0 flex-1 text-xs font-semibold uppercase leading-5 tracking-wide text-foreground break-words\">\n {title}\n </h3>\n {count !== undefined && (\n <span className=\"mt-0.5 shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-[10px] tabular-nums text-muted-foreground\">\n {count}\n </span>\n )}\n {badge !== undefined && (\n <span className=\"mt-0.5 shrink-0\">{badge}</span>\n )}\n {streaming && (\n <Loader2\n aria-label=\"Still arriving\"\n className=\"mt-1 h-3 w-3 shrink-0 animate-spin text-muted-foreground\"\n />\n )}\n {actions && (\n <div className=\"flex shrink-0 items-center gap-1\">{actions}</div>\n )}\n {menu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"More actions\"\n className=\"-mr-1 -mt-1 h-7 w-7 shrink-0 text-muted-foreground\"\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-44\">\n {menu.map((item, i) => (\n <React.Fragment key={`${i}-${item.label}`}>\n {item.separatorBefore && i > 0 && <DropdownMenuSeparator />}\n <DropdownMenuItem\n disabled={item.disabled ?? false}\n onSelect={() => item.onSelect()}\n className={cn(\n \"text-xs\",\n item.destructive &&\n \"text-destructive focus:text-destructive\",\n )}\n >\n {item.icon && <item.icon className=\"mr-2 h-3.5 w-3.5\" />}\n {item.label}\n </DropdownMenuItem>\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </header>\n {subline !== undefined && subline !== null && subline !== \"\" && (\n <div\n className={cn(\n \"pt-1 text-xs leading-snug text-muted-foreground break-words\",\n px,\n variant === \"bare\" && \"px-0\",\n )}\n >\n {subline}\n </div>\n )}\n <div\n className={cn(\n \"min-w-0 flex-1\",\n px,\n dense ? \"py-1.5\" : \"py-2\",\n variant === \"bare\" && \"px-0\",\n bodyClassName,\n )}\n >\n {children}\n </div>\n {footer !== undefined && footer !== null && (\n <div\n className={cn(\n \"mt-auto border-t border-border\",\n px,\n dense ? \"py-1.5\" : \"py-2\",\n variant === \"bare\" && \"px-0\",\n )}\n >\n {footer}\n </div>\n )}\n </section>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@ai-matrx/design-system\";\n\nexport type KindKitIcon =\n | React.ComponentType<{ className?: string }>\n | React.ReactElement<{ className?: string }>;\n\n/**\n * Babel-sandbox imports normally bind a component directly, but an ESM/CJS\n * interop boundary may hand us `{ default: Component }`. React reports that\n * wrapper as error #130 if it is passed to createElement unchanged.\n */\nfunction resolveIconType(icon: unknown): React.ElementType | null {\n if (typeof icon === \"function\") return icon as React.ElementType;\n if (typeof icon !== \"object\" || icon === null) return null;\n\n const candidate = icon as Record<PropertyKey, unknown>;\n if (typeof candidate.$$typeof === \"symbol\") {\n return icon as React.ElementType;\n }\n if (\"default\" in candidate && candidate.default !== icon) {\n return resolveIconType(candidate.default);\n }\n return null;\n}\n\n/** Render either icon authoring form without treating an element as a component type. */\nexport function renderKindKitIcon(\n icon: KindKitIcon | undefined,\n className: string,\n): React.ReactElement | null {\n if (!icon) return null;\n if (React.isValidElement<{ className?: string }>(icon)) {\n return React.cloneElement(icon, {\n className: cn(className, icon.props.className),\n });\n }\n const Icon = resolveIconType(icon);\n return Icon ? React.createElement(Icon, { className }) : null;\n}\n","\"use client\";\n\n/**\n * KindHeaderBar — the standard compact header of a kind component:\n * icon · title (the instance's `title_key` value) · at-a-glance stats · the\n * copy bar (the host's `CopyButtons` slot: Copy / Copy-for-AI / JSON / Export from builders\n * the caller supplies). One row that wraps on narrow widths; the copy bar\n * stays on the right. Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Loader2 } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { getKindKitHost, type KindKitCopyProps } from \"./kind-kit-host\";\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\n\nexport interface KindHeaderStat {\n /** Short label, e.g. \"keywords\". */\n label: string;\n /** The number/text, e.g. 42 or \"3 buckets\". */\n value: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Optional hover text. */\n title?: string;\n}\n\nexport interface KindHeaderBarProps {\n /** The instance title (usually `data[title_key]`). */\n title: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Small muted line under the title (a primary keyword, a subtitle). */\n subtitle?: React.ReactNode;\n /** At-a-glance numbers rendered as compact \"value label\" stats. */\n stats?: KindHeaderStat[];\n /** Shows a spinner + \"Streaming\" while the instance is still arriving. */\n streaming?: boolean;\n /** Word shown beside the spinner. Default \"Streaming\". */\n streamingLabel?: string;\n /**\n * The copy bar. Pass the builders you have — `human` (text), `agent`\n * (payload or string), `json` (raw record), `export` (download items) and\n * the `label` used in toasts. Omit to render no copy bar.\n */\n copy?: Omit<KindKitCopyProps, \"size\" | \"className\">;\n /** Extra controls rendered between the stats and the copy bar. */\n actions?: React.ReactNode;\n /** \"sm\" (default) for in-chat blocks; \"md\" for page-level kind surfaces. */\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nexport function KindHeaderBar({\n title,\n icon,\n subtitle,\n stats,\n streaming = false,\n streamingLabel = \"Streaming\",\n copy,\n actions,\n size = \"sm\",\n className,\n}: KindHeaderBarProps) {\n const { CopyButtons } = getKindKitHost();\n const titleCls = size === \"md\" ? \"text-base\" : \"text-sm\";\n const iconCls = size === \"md\" ? \"h-5 w-5\" : \"h-4 w-4\";\n const iconNode = renderKindKitIcon(\n icon,\n cn(\"mt-0.5 shrink-0 text-primary\", iconCls),\n );\n return (\n <div\n className={cn(\"flex flex-wrap items-center gap-x-3 gap-y-1.5\", className)}\n >\n <div className=\"flex min-w-0 flex-1 basis-48 items-start gap-2\">\n {iconNode}\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"font-semibold leading-tight text-foreground break-words\",\n titleCls,\n )}\n >\n {title}\n </div>\n {subtitle !== undefined && subtitle !== null && subtitle !== \"\" && (\n <div className=\"mt-0.5 text-xs leading-snug text-muted-foreground break-words\">\n {subtitle}\n </div>\n )}\n </div>\n </div>\n {stats && stats.length > 0 && (\n <dl className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n {stats.map((s, i) => (\n <div\n key={`${i}-${s.label}`}\n title={s.title}\n className=\"flex items-baseline gap-1 text-xs\"\n >\n {renderKindKitIcon(\n s.icon,\n \"h-3 w-3 self-center text-muted-foreground\",\n )}\n <dd className=\"font-semibold tabular-nums text-foreground\">\n {s.value}\n </dd>\n <dt className=\"text-muted-foreground\">{s.label}</dt>\n </div>\n ))}\n </dl>\n )}\n {streaming && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n {streamingLabel}\n </span>\n )}\n {(actions || copy) && (\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {actions}\n {copy && (\n <CopyButtons {...copy} size={size === \"md\" ? \"sm\" : \"icon\"} />\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * KindActionButton — the one-click door from a kind component to a host\n * Action. Wraps the component's `runAction(key, input)` prop (the ONLY\n * side-effect channel; it never throws, it returns an `{ok}` envelope), with\n * a busy state, no double fire, an optional inline confirm that states the\n * consequence, and a one-line inline error (the host already toasts).\n * Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Button, cn } from \"@ai-matrx/design-system\";\nimport { Loader2 } from \"./icons\";\nimport { renderKindKitIcon, type KindKitIcon } from \"./icon-slot\";\n\nexport type KindActionEnvelope =\n | { ok: true; result?: unknown }\n | { ok: false; error: string };\n\n/** One action: `runAction` + `action` + `input`. */\ninterface KindActionSingle {\n /** The component's `runAction` prop, passed straight through. */\n runAction: (key: string, input: unknown) => Promise<KindActionEnvelope>;\n /** Action key, e.g. \"run_shortcut\". */\n action: string;\n /** The action input, or a function that builds it at click time. */\n input: unknown | (() => unknown);\n run?: never;\n}\n\n/** A chain: `run` awaits several `runAction` calls and returns the final envelope. */\ninterface KindActionChain {\n run: () => Promise<KindActionEnvelope>;\n runAction?: never;\n action?: never;\n input?: never;\n}\n\ninterface KindActionButtonBase {\n /** Short label. Also the aria-label/tooltip when `compact`. */\n label: string;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Label while running. Defaults to `label`. */\n busyLabel?: string;\n /** One-sentence consequence. When set, the first click asks to confirm. */\n confirm?: string;\n onDone?: (result: unknown) => void;\n onError?: (error: string) => void;\n variant?:\n | \"default\"\n | \"primary\"\n | \"destructive\"\n | \"success\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"subtle\";\n /** Icon-only with tooltip + aria-label, for menus and header rows. */\n compact?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport type KindActionButtonProps = KindActionButtonBase &\n (KindActionSingle | KindActionChain);\n\nconst ERROR_MAX = 60;\n\nexport function KindActionButton({\n runAction,\n action,\n input,\n run: runChain,\n label,\n icon,\n busyLabel,\n confirm,\n onDone,\n onError,\n variant = \"outline\",\n compact = false,\n disabled = false,\n className,\n}: KindActionButtonProps) {\n const [busy, setBusy] = React.useState(false);\n const [asking, setAsking] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const inFlight = React.useRef(false);\n const mounted = React.useRef(true);\n const errorTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n if (errorTimer.current) clearTimeout(errorTimer.current);\n };\n }, []);\n\n const run = React.useCallback(async () => {\n if (inFlight.current) return;\n inFlight.current = true;\n setAsking(false);\n setError(null);\n setBusy(true);\n try {\n let res: KindActionEnvelope;\n if (runChain) {\n res = await runChain();\n } else {\n const payload = typeof input === \"function\" ? (input as () => unknown)() : input;\n res = await runAction!(action!, payload);\n }\n if (res && res.ok) {\n onDone?.(res.result);\n } else {\n const message = (res && \"error\" in res && res.error) || \"Action failed\";\n if (mounted.current) {\n setError(message);\n if (errorTimer.current) clearTimeout(errorTimer.current);\n errorTimer.current = setTimeout(() => {\n if (mounted.current) setError(null);\n }, 8000);\n }\n onError?.(message);\n }\n } catch (e) {\n // runAction promises never to throw; stay honest if a host breaks that.\n const message = e instanceof Error ? e.message : \"Action failed\";\n if (mounted.current) setError(message);\n onError?.(message);\n } finally {\n inFlight.current = false;\n if (mounted.current) setBusy(false);\n }\n }, [action, input, onDone, onError, runAction, runChain]);\n\n const onClick = () => {\n if (busy || disabled || inFlight.current) return;\n if (confirm) setAsking(true);\n else void run();\n };\n\n if (asking && !busy) {\n return (\n <span\n role=\"group\"\n aria-label={label}\n className={cn(\n \"inline-flex flex-wrap items-center gap-x-2 gap-y-1 rounded-md border border-border bg-card px-2 py-1 text-xs\",\n className,\n )}\n >\n <span className=\"text-foreground\">{confirm}</span>\n <Button type=\"button\" size=\"xs\" variant={variant === \"outline\" ? \"default\" : variant} onClick={() => void run()}>\n {label}\n </Button>\n <Button type=\"button\" size=\"xs\" variant=\"ghost\" onClick={() => setAsking(false)}>\n Cancel\n </Button>\n </span>\n );\n }\n\n const shownLabel = busy ? (busyLabel ?? label) : label;\n const glyph = busy ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n renderKindKitIcon(icon, \"h-4 w-4\")\n );\n\n return (\n <span className={cn(\"inline-flex min-w-0 items-center gap-2\", className)}>\n <Button\n type=\"button\"\n variant={variant}\n size={compact ? \"icon-sm\" : \"sm\"}\n disabled={disabled || busy}\n aria-busy={busy || undefined}\n aria-label={compact ? shownLabel : undefined}\n title={compact ? label : undefined}\n onClick={onClick}\n >\n {glyph}\n {!compact && <span>{shownLabel}</span>}\n </Button>\n {error && (\n <span\n role=\"alert\"\n title={error}\n className=\"min-w-0 text-xs text-destructive\"\n >\n {error.length > ERROR_MAX ? `${error.slice(0, ERROR_MAX - 1)}…` : error}\n </span>\n )}\n </span>\n );\n}\n","\"use client\";\n\n/**\n * StreamingSkeleton + useStreamingValue — the \"before data lands\" kit.\n *\n * A kind component receives partial `data` on every envelope flush while the\n * agent streams: fields are absent, arrays are short, strings are cut. The\n * skeleton mimics the layout the real content will have (list / cards /\n * table / text) for the instant before anything arrives; the helpers make\n * field reads tolerant so a component never crashes on a half-built\n * instance and never flickers a value away. Contract:\n * `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { cn, Skeleton } from \"@ai-matrx/design-system\";\n\nexport interface StreamingSkeletonProps {\n /** Layout to mimic. Default \"list\". */\n layout?: \"list\" | \"cards\" | \"table\" | \"text\";\n /** Rows (list/table/text lines) or cards. Default 3. */\n rows?: number;\n /** Columns for \"table\" / \"cards\". Default 3 (table) / 2 (cards). */\n columns?: number;\n /** Render a title bar line above the body. Default true. */\n header?: boolean;\n /** Accessible label. Default \"Loading\". */\n label?: string;\n className?: string;\n}\n\nexport function StreamingSkeleton({\n layout = \"list\",\n rows = 3,\n columns,\n header = true,\n label = \"Loading\",\n className,\n}: StreamingSkeletonProps) {\n const n = Math.max(1, rows);\n const cols = Math.max(1, columns ?? (layout === \"cards\" ? 2 : 3));\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label={label}\n className={cn(\"space-y-2\", className)}\n >\n {header && (\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"ml-auto h-6 w-16\" />\n </div>\n )}\n {layout === \"list\" &&\n Array.from({ length: n }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-2 rounded-md border border-border px-2 py-2\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n <Skeleton className={cn(\"h-3.5\", i % 3 === 0 ? \"w-2/3\" : i % 3 === 1 ? \"w-1/2\" : \"w-3/4\")} />\n </div>\n ))}\n {layout === \"cards\" && (\n <div\n className=\"grid gap-3\"\n style={{ gridTemplateColumns: `repeat(auto-fit, minmax(min(100%, 240px), 1fr))` }}\n >\n {Array.from({ length: Math.max(n, cols) }).map((_, i) => (\n <div key={i} className=\"space-y-2 rounded-lg border border-border p-3\">\n <Skeleton className=\"h-3.5 w-1/2\" />\n <Skeleton className=\"h-3 w-full\" />\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-5 w-12 rounded-full\" />\n </div>\n </div>\n ))}\n </div>\n )}\n {layout === \"table\" && (\n <div className=\"overflow-hidden rounded-md border border-border\">\n <div\n className=\"grid gap-2 border-b border-border bg-muted/40 px-2 py-1.5\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, c) => (\n <Skeleton key={c} className=\"h-3 w-2/3\" />\n ))}\n </div>\n {Array.from({ length: n }).map((_, r) => (\n <div\n key={r}\n className=\"grid gap-2 px-2 py-2\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, c) => (\n <Skeleton key={c} className={cn(\"h-3\", c === 0 ? \"w-3/4\" : \"w-1/2\")} />\n ))}\n </div>\n ))}\n </div>\n )}\n {layout === \"text\" &&\n Array.from({ length: n }).map((_, i) => (\n <Skeleton\n key={i}\n className={cn(\"h-3\", i === n - 1 ? \"w-2/5\" : i % 2 === 0 ? \"w-full\" : \"w-11/12\")}\n />\n ))}\n <span className=\"sr-only\">{label}</span>\n </div>\n );\n}\n\n/**\n * Sticky, tolerant read of a value that may be absent mid-stream.\n *\n * Returns the latest DEFINED value seen (so a re-parse that momentarily drops\n * a field does not blank the UI), `fallback` until one arrives, and `arrived`\n * once any real value has been observed. Implemented with the React\n * \"remember the previous render\" pattern (state updated during render), so\n * pass a FIELD READ (`data?.summary`) — never an expression that builds a\n * new object/array on every render (`data?.items ?? []`), which would\n * re-trigger the update each render.\n */\nexport function useStreamingValue<T>(\n value: T | null | undefined,\n fallback: T,\n): { value: T; arrived: boolean } {\n const [last, setLast] = React.useState<{ value: T; arrived: boolean }>({\n value: fallback,\n arrived: false,\n });\n const defined = value !== null && value !== undefined;\n if (defined && (!last.arrived || !Object.is(value, last.value))) {\n const next = { value: value as T, arrived: true };\n setLast(next);\n return next;\n }\n return last;\n}\n\n/** `value` when it is an array, else `[]` — for `data.items` that is not there yet. */\nexport function streamList<T = unknown>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\n/** `value` when it is a non-empty string, else `fallback` (\"\" by default). */\nexport function streamText(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" && value.length > 0 ? value : fallback;\n}\n","\"use client\";\n\n/**\n * KeywordChip + TagList — chips that WRAP, never truncate.\n *\n * A keyword / tag / phrase is always shown in full: the chip wraps its text\n * onto extra lines inside the chip, and the list wraps chips onto extra rows.\n * Optional select (checkbox-like toggle), remove (X) and inline edit\n * (pencil → input, Enter commits, Esc cancels). `TagList` adds an inline\n * \"Add\" input at the end when `onAdd` is given. Contract:\n * `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Check, Pencil, Plus, X } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\nimport { getKindKitHost, type ReadOutcome } from \"./kind-kit-host\";\n\nexport interface KeywordChipProps {\n /** The phrase. Rendered in full — wraps, never truncates. */\n label: string;\n /** Small trailing detail (a count, a volume, a score). */\n meta?: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Selected state; pass `onSelect` to make the chip a toggle. */\n selected?: boolean;\n /** Makes the chip a toggle; called with the next selected state. */\n onSelect?: ((selected: boolean) => void) | undefined;\n /** Adds an X control. */\n onRemove?: (() => void) | undefined;\n /** Enables inline edit (pencil control + double-click); called with the committed text. */\n onEdit?: ((next: string) => void) | undefined;\n /** Greys the chip and disables select/remove/edit. */\n disabled?: boolean | undefined;\n tone?: \"default\" | \"primary\" | \"muted\" | undefined;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nconst TONE = {\n default: \"border-border bg-background text-foreground\",\n primary: \"border-primary/40 bg-primary/5 text-foreground\",\n muted: \"border-border bg-muted text-muted-foreground\",\n} as const;\n\nexport function KeywordChip({\n label,\n meta,\n icon,\n selected = false,\n onSelect,\n onRemove,\n onEdit,\n disabled = false,\n tone = \"default\",\n size = \"sm\",\n className,\n}: KeywordChipProps) {\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState(label);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n\n const selectable = !!onSelect && !disabled;\n const editable = !!onEdit && !disabled;\n\n const startEdit = () => {\n if (!editable) return;\n setDraft(label);\n setEditing(true);\n // Focus after the input mounts.\n requestAnimationFrame(() => inputRef.current?.select());\n };\n const commit = () => {\n setEditing(false);\n const next = draft.trim();\n if (next && next !== label) onEdit?.(next);\n };\n const cancel = () => {\n setEditing(false);\n setDraft(label);\n };\n\n const pad = size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\";\n // Inputs stay >=16px on phones (no iOS zoom), shrink to the chip size on sm+.\n const inputText = size === \"md\" ? \"text-[16px] sm:text-sm\" : \"text-[16px] sm:text-xs\";\n const ctl = size === \"md\" ? \"h-4 w-4\" : \"h-3.5 w-3.5\";\n\n return (\n <span\n className={cn(\n // max-w-full + min-w-0 + break-words: the text wraps INSIDE the chip.\n \"inline-flex max-w-full min-w-0 items-center gap-1 rounded-full border leading-snug\",\n pad,\n selected ? \"border-primary bg-primary/10 text-foreground\" : TONE[tone],\n disabled && \"opacity-60\",\n className,\n )}\n >\n {selectable && (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={selected}\n aria-label={`${selected ? \"Deselect\" : \"Select\"} ${label}`}\n onClick={() => onSelect?.(!selected)}\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-sm border\",\n size === \"md\" ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n selected\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-muted-foreground/50 bg-background\",\n )}\n >\n {selected && <Check className=\"h-2.5 w-2.5\" />}\n </button>\n )}\n {renderKindKitIcon(\n icon,\n cn(\"shrink-0 text-muted-foreground\", ctl),\n )}\n {editing ? (\n <input\n ref={inputRef}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n }\n }}\n aria-label={`Edit ${label}`}\n size={Math.max(4, draft.length + 1)}\n className={cn(\"min-w-0 bg-transparent outline-none\", inputText)}\n />\n ) : (\n <span\n className=\"min-w-0 whitespace-normal break-words text-left\"\n onDoubleClick={startEdit}\n >\n {label}\n </span>\n )}\n {meta !== undefined && meta !== null && (\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">{meta}</span>\n )}\n {editable && !editing && (\n <button\n type=\"button\"\n aria-label={`Edit ${label}`}\n onClick={startEdit}\n className=\"shrink-0 rounded-full text-muted-foreground hover:text-foreground\"\n >\n <Pencil className={cn(\"h-3 w-3\", size === \"md\" && \"h-3.5 w-3.5\")} />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n disabled={disabled}\n onClick={onRemove}\n className=\"-mr-0.5 shrink-0 rounded-full text-muted-foreground hover:text-destructive disabled:pointer-events-none\"\n >\n <X className={ctl} />\n </button>\n )}\n </span>\n );\n}\n\nexport interface TagItem {\n label: string;\n /** Stable key; defaults to `label`. */\n key?: string;\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface TagListProps {\n /** Phrases, as strings or `{ label, key?, meta?, disabled? }` objects. */\n items: readonly (string | TagItem)[];\n /** Selected keys (label when no key). Pass with `onToggle` for selectable chips. */\n selected?: readonly string[];\n /** Makes chips toggles; called with (key, nextSelected). */\n onToggle?: (key: string, selected: boolean) => void;\n /** Adds an X on every chip; called with (key, index). */\n onRemove?: (key: string, index: number) => void;\n /** Enables inline edit on every chip; called with (key, index, nextLabel). */\n onEdit?: (key: string, index: number, next: string) => void;\n /** Renders an inline \"Add\" input at the end; called with the trimmed text. */\n onAdd?: (label: string) => void;\n /** Placeholder of the add input. Default \"Add…\". */\n addPlaceholder?: string;\n /** Shown when `items` is empty (and there is no add input). */\n emptyState?: React.ReactNode;\n /**\n * The outcome of the read behind the rows (RC-B12 r13). `emptyState` shows\n * only after a read that succeeded; a failed read shows the failure + retry.\n */\n read?: ReadOutcome;\n tone?: KeywordChipProps[\"tone\"];\n size?: KeywordChipProps[\"size\"];\n disabled?: boolean;\n className?: string;\n}\n\nfunction normalize(item: string | TagItem): TagItem {\n return typeof item === \"string\" ? { label: item } : item;\n}\n\nexport function TagList({\n items,\n selected,\n onToggle,\n onRemove,\n onEdit,\n onAdd,\n addPlaceholder = \"Add…\",\n emptyState,\n read,\n tone,\n size = \"sm\",\n disabled = false,\n className,\n}: TagListProps) {\n const { ReadEmpty, ReadStaleNotice } = getKindKitHost();\n const [adding, setAdding] = React.useState(false);\n const [draft, setDraft] = React.useState(\"\");\n const inputText = size === \"md\" ? \"text-[16px] sm:text-sm\" : \"text-[16px] sm:text-xs\";\n const selectedSet = new Set(selected ?? []);\n\n const commitAdd = () => {\n const next = draft.trim();\n if (next) onAdd?.(next);\n setDraft(\"\");\n setAdding(false);\n };\n\n if (items.length === 0 && read && read.status !== \"ready\") return <ReadEmpty read={read} />;\n if (items.length === 0 && !onAdd) {\n return emptyState !== undefined ? (\n <div className={cn(\"text-xs text-muted-foreground\", className)}>\n {emptyState}\n </div>\n ) : null;\n }\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1.5\", className)}>\n <ReadStaleNotice read={read} className=\"w-full\" />\n {items.map((raw, index) => {\n const item = normalize(raw);\n const key = item.key ?? item.label;\n return (\n <KeywordChip\n key={`${key}-${index}`}\n label={item.label}\n meta={item.meta}\n tone={tone}\n size={size}\n disabled={disabled || item.disabled}\n selected={selectedSet.has(key)}\n onSelect={onToggle ? (next) => onToggle(key, next) : undefined}\n onRemove={onRemove ? () => onRemove(key, index) : undefined}\n onEdit={onEdit ? (next) => onEdit(key, index, next) : undefined}\n />\n );\n })}\n {items.length === 0 && emptyState !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{emptyState}</span>\n )}\n {onAdd && !disabled && (\n adding ? (\n <span\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border border-dashed border-primary/60 bg-background\",\n size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\",\n )}\n >\n <input\n autoFocus\n value={draft}\n placeholder={addPlaceholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commitAdd}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAdd();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setDraft(\"\");\n setAdding(false);\n }\n }}\n aria-label={addPlaceholder}\n size={Math.max(6, draft.length + 1)}\n className={cn(\"min-w-0 bg-transparent outline-none placeholder:text-muted-foreground\", inputText)}\n />\n </span>\n ) : (\n <button\n type=\"button\"\n onClick={() => setAdding(true)}\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border border-dashed border-border text-muted-foreground hover:border-primary/60 hover:text-foreground\",\n size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\",\n )}\n >\n <Plus className=\"h-3 w-3\" />\n {addPlaceholder.replace(/…$/, \"\")}\n </button>\n )\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["React","React","Fragment","jsx","jsxs","Fragment","jsx","jsxs","cn","jsx","React","cn","React","cn","jsx","jsxs","cn","cn","jsx","jsxs","cn","React","Button","cn","jsx","jsxs","cn","Button","React","cn","jsx","jsxs","_","React","cn","jsx","jsxs","cn"]}
|
|
1
|
+
{"version":3,"sources":["../kind-kit/SortableList.tsx","../kind-kit/icons.tsx","../kind-kit/kind-kit-host.tsx","../kind-kit/KindPanelGrid.tsx","../kind-kit/KindPanel.tsx","../kind-kit/icon-slot.tsx","../kind-kit/KindHeaderBar.tsx","../kind-kit/KindActionButton.tsx","../kind-kit/StreamingSkeleton.tsx","../kind-kit/TagList.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * SortableList — drag-to-reorder list for kind components.\n *\n * The mandated reorder UX, built once: while a row is dragged, the rows it\n * passes DISPLACE (translate) out of the way and a SHADOWED placeholder marks\n * exactly where the item will land. Native HTML5 drag-and-drop (no deps); a\n * grab handle starts the drag (so text and inputs inside rows stay usable);\n * up/down buttons are the keyboard + touch fallback; `onRemove` adds an inline\n * remove control. Contract: `kind-kit/README.md`.\n *\n * Sandbox-safe by construction: imports only react, the design system,\n * and `cn`.\n */\n\nimport * as React from \"react\";\nimport { ChevronDown, ChevronUp, GripVertical, X } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { getKindKitHost, type ReadOutcome } from \"./kind-kit-host\";\n\nexport interface SortableRenderContext {\n index: number;\n /** True for the row currently being dragged (rendered as the placeholder). */\n isDragging: boolean;\n}\n\nexport interface SortableListProps<T> {\n /** Current order. Treated as read-only; the new order arrives via `onReorder`. */\n items: readonly T[];\n /**\n * Stable key per item. Default: the item itself when it is a string, else\n * `item.id` / `item.key` when present, else the index (unstable — pass one).\n */\n getKey?: (item: T, index: number) => string;\n /** Called with the full reordered array after a drop or an arrow press. */\n onReorder: (items: T[]) => void;\n /**\n * Row content. Default: the item when it is a string/number, else its\n * `label` / `title` / `name` / `text` field, else `JSON.stringify`.\n */\n renderItem?: (item: T, ctx: SortableRenderContext) => React.ReactNode;\n /** When set, every row gets an inline remove (X) control. */\n onRemove?: (item: T, index: number) => void;\n /** Disables drag, arrows and remove (rows still render). */\n disabled?: boolean;\n /** Hide the up/down arrow buttons (drag only). Default false. */\n hideArrows?: boolean;\n /** Shown when `items` is empty. */\n emptyState?: React.ReactNode;\n /**\n * The outcome of the read behind the rows (RC-B12 r13). `emptyState` shows\n * only after a read that succeeded; a failed read shows the failure + retry.\n */\n read?: ReadOutcome;\n /** Wrapper `<ul>` className. */\n className?: string;\n /** Per-row className (applied to every `<li>`). */\n itemClassName?: string;\n /** Accessible name for the list. */\n ariaLabel?: string;\n}\n\nfunction defaultKey<T>(item: T, index: number): string {\n if (typeof item === \"string\" || typeof item === \"number\") return String(item);\n if (item && typeof item === \"object\") {\n const rec = item as Record<string, unknown>;\n if (typeof rec.id === \"string\" || typeof rec.id === \"number\")\n return String(rec.id);\n if (typeof rec.key === \"string\") return rec.key;\n }\n return String(index);\n}\n\nfunction defaultRender<T>(item: T): React.ReactNode {\n if (typeof item === \"string\" || typeof item === \"number\") return String(item);\n if (item && typeof item === \"object\") {\n const rec = item as Record<string, unknown>;\n for (const k of [\"label\", \"title\", \"name\", \"text\"]) {\n if (typeof rec[k] === \"string\") return rec[k] as string;\n }\n return JSON.stringify(item);\n }\n return String(item);\n}\n\nfunction moveItem<T>(items: readonly T[], from: number, to: number): T[] {\n const next = items.slice();\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved as T);\n return next;\n}\n\ninterface DragState {\n from: number;\n over: number;\n /**\n * Row rects captured at drag start, relative to the list's top — a fixed\n * ruler: the pointer's position on it decides the landing slot, so the\n * target never depends on which (already displaced) row fires the event.\n */\n rects: { top: number; bottom: number; height: number }[];\n}\n\nexport function SortableList<T>({\n items,\n getKey = defaultKey,\n onReorder,\n renderItem,\n onRemove,\n disabled = false,\n hideArrows = false,\n emptyState,\n read,\n className,\n itemClassName,\n ariaLabel,\n}: SortableListProps<T>) {\n const { ReadEmpty, ReadStaleNotice } = getKindKitHost();\n const [drag, setDrag] = React.useState<DragState | null>(null);\n const [armed, setArmed] = React.useState<number | null>(null);\n const listRef = React.useRef<HTMLUListElement | null>(null);\n const rowRefs = React.useRef<(HTMLLIElement | null)[]>([]);\n\n const canInteract = !disabled;\n\n const handleDragStart = (index: number) => (e: React.DragEvent<HTMLLIElement>) => {\n if (!canInteract || armed !== index) {\n e.preventDefault();\n return;\n }\n e.dataTransfer.effectAllowed = \"move\";\n // Firefox requires data to start a drag.\n e.dataTransfer.setData(\"text/plain\", String(index));\n const listTop = listRef.current?.getBoundingClientRect().top ?? 0;\n const rects = rowRefs.current.slice(0, items.length).map((el) => {\n const r = el ? el.getBoundingClientRect() : new DOMRect();\n return { top: r.top - listTop, bottom: r.bottom - listTop, height: r.height };\n });\n setDrag({ from: index, over: index, rects });\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n if (!drag) return;\n e.preventDefault();\n e.dataTransfer.dropEffect = \"move\";\n const listTop = listRef.current?.getBoundingClientRect().top ?? 0;\n const y = e.clientY - listTop;\n let over = drag.rects.length - 1;\n for (let i = 0; i < drag.rects.length; i++) {\n const r = drag.rects[i];\n if (r && y < r.bottom) {\n over = i;\n break;\n }\n }\n if (over !== drag.over) setDrag({ ...drag, over });\n };\n\n const finish = () => {\n setDrag(null);\n setArmed(null);\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n if (drag && drag.from !== drag.over) {\n onReorder(moveItem(items, drag.from, drag.over));\n }\n finish();\n };\n\n const move = (from: number, to: number) => {\n if (to < 0 || to >= items.length || from === to) return;\n onReorder(moveItem(items, from, to));\n };\n\n /** Translate (px) for row `index` while a drag is in flight. */\n const translateFor = (index: number): number => {\n if (!drag) return 0;\n const { from, over, rects } = drag;\n if (from === over) return 0;\n const dragged = rects[from];\n if (!dragged) return 0;\n // Slot size = row height + the gap to its neighbour (so displaced rows\n // land exactly on the grid the dragged row vacates).\n const neighbour = rects[from + 1] ?? rects[from - 1];\n const gap = neighbour\n ? Math.max(\n 0,\n from + 1 < rects.length\n ? neighbour.top - dragged.bottom\n : dragged.top - neighbour.bottom,\n )\n : 0;\n const slot = dragged.height + gap;\n if (index === from) {\n const target = rects[over];\n if (!target) return 0;\n return over > from\n ? target.bottom - dragged.bottom\n : target.top - dragged.top;\n }\n if (from < over && index > from && index <= over) return -slot;\n if (over < from && index >= over && index < from) return slot;\n return 0;\n };\n\n if (items.length === 0) {\n if (read && read.status !== \"ready\") return <ReadEmpty read={read} />;\n return emptyState !== undefined ? (\n <div className={cn(\"text-xs text-muted-foreground\", className)}>\n {emptyState}\n </div>\n ) : null;\n }\n\n return (\n <>\n <ReadStaleNotice read={read} className=\"mb-1.5\" />\n <ul\n role=\"list\"\n aria-label={ariaLabel}\n ref={listRef}\n className={cn(\"flex flex-col gap-1.5\", className)}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n >\n {items.map((item, index) => {\n const key = getKey(item, index);\n const isDragging = drag?.from === index;\n const translate = translateFor(index);\n return (\n <li\n key={key}\n ref={(el) => {\n rowRefs.current[index] = el;\n }}\n draggable={canInteract && armed === index}\n onDragStart={handleDragStart(index)}\n onDragEnd={finish}\n style={{\n transform: translate ? `translate3d(0, ${translate}px, 0)` : undefined,\n }}\n className={cn(\n \"flex items-center gap-1.5 rounded-md border px-2 py-1.5 text-sm text-foreground\",\n \"transition-transform duration-150 ease-out will-change-transform\",\n isDragging\n ? \"border-dashed border-primary/60 bg-primary/5 shadow-inner\"\n : \"border-border bg-card\",\n itemClassName,\n )}\n >\n <button\n type=\"button\"\n aria-label=\"Drag to reorder\"\n disabled={!canInteract}\n onPointerDown={() => canInteract && setArmed(index)}\n onPointerUp={() => !drag && setArmed(null)}\n className={cn(\n \"flex h-7 w-6 shrink-0 touch-none items-center justify-center rounded text-muted-foreground\",\n canInteract\n ? \"cursor-grab hover:bg-muted hover:text-foreground active:cursor-grabbing\"\n : \"opacity-40\",\n )}\n >\n <GripVertical className=\"h-4 w-4\" />\n </button>\n <div\n className={cn(\n \"min-w-0 flex-1 break-words\",\n isDragging && \"opacity-40\",\n )}\n >\n {renderItem\n ? renderItem(item, { index, isDragging })\n : defaultRender(item)}\n </div>\n {(!hideArrows || onRemove) && (\n /*\n * Controls sit IN FLOW at the row's end — never floating.\n *\n * A cluster that costs no layout width must, by construction,\n * land on top of something when it appears, and it wins every\n * click there because it is the layer above. Rows here carry the\n * host component's own trailing controls (copy, edit, menus), so\n * a floating cluster covered live buttons on every consumer:\n * measured on `artisan_demo_reading_list`, it sat on \"Copy for\n * AI\" and \"Edit book\". The kit cannot know what a row draws in\n * its corner, so it takes its own width instead of borrowing the\n * row's. Ruled 2026-08-30: overlap is never worth the density.\n */\n <div\n className={cn(\n \"flex shrink-0 items-center gap-px self-start\",\n isDragging && \"opacity-40\",\n )}\n >\n {!hideArrows && (\n /* Chevrons stack so the pair costs one 20px column, not two. */\n <div className=\"flex flex-col items-center pointer-coarse:flex-row\">\n <button\n type=\"button\"\n aria-label=\"Move up\"\n disabled={!canInteract || index === 0}\n onClick={() => move(index, index - 1)}\n className=\"flex h-3.5 w-5 items-center justify-center rounded-sm text-muted-foreground/70 hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <ChevronUp className=\"h-3 w-3\" />\n </button>\n <button\n type=\"button\"\n aria-label=\"Move down\"\n disabled={!canInteract || index === items.length - 1}\n onClick={() => move(index, index + 1)}\n className=\"flex h-3.5 w-5 items-center justify-center rounded-sm text-muted-foreground/70 hover:bg-muted hover:text-foreground disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <ChevronDown className=\"h-3 w-3\" />\n </button>\n </div>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label=\"Remove\"\n disabled={!canInteract}\n onClick={() => onRemove(item, index)}\n className=\"flex h-6 w-6 items-center justify-center rounded text-muted-foreground/70 hover:bg-muted hover:text-destructive disabled:pointer-events-none disabled:opacity-30 pointer-coarse:h-7 pointer-coarse:w-7\"\n >\n <X className=\"h-3.5 w-3.5\" />\n </button>\n )}\n </div>\n )}\n </li>\n );\n })}\n </ul>\n </>\n );\n}\n","/**\n * The kit's nine glyphs, inlined (C19: a package ships its own SVGs, no icon-library\n * dependency). Paths are Lucide's (ISC licence); stroke and size come from the\n * `className` the caller passes, exactly as a Lucide component would take it.\n */\nimport * as React from \"react\";\n\ntype IconProps = { className?: string };\n\nfunction make(name: string, children: React.ReactNode) {\n const Icon = ({ className }: IconProps) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\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 className={className}\n >\n {children}\n </svg>\n );\n Icon.displayName = name;\n return Icon;\n}\n\nexport const Loader2 = make(\"Loader2\", <path d=\"M21 12a9 9 0 1 1-6.219-8.56\" />);\nexport const MoreHorizontal = make(\n \"MoreHorizontal\",\n <>\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 </>,\n);\nexport const ChevronDown = make(\"ChevronDown\", <path d=\"m6 9 6 6 6-6\" />);\nexport const ChevronUp = make(\"ChevronUp\", <path d=\"m18 15-6-6-6 6\" />);\nexport const GripVertical = make(\n \"GripVertical\",\n <>\n <circle cx=\"9\" cy=\"12\" r=\"1\" />\n <circle cx=\"9\" cy=\"5\" r=\"1\" />\n <circle cx=\"9\" cy=\"19\" r=\"1\" />\n <circle cx=\"15\" cy=\"12\" r=\"1\" />\n <circle cx=\"15\" cy=\"5\" r=\"1\" />\n <circle cx=\"15\" cy=\"19\" r=\"1\" />\n </>,\n);\nexport const X = make(\n \"X\",\n <>\n <path d=\"M18 6 6 18\" />\n <path d=\"m6 6 12 12\" />\n </>,\n);\nexport const Check = make(\"Check\", <path d=\"M20 6 9 17l-5-5\" />);\nexport const Pencil = make(\n \"Pencil\",\n <>\n <path d=\"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z\" />\n <path d=\"m15 5 4 4\" />\n </>,\n);\nexport const Plus = make(\n \"Plus\",\n <>\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </>,\n);\n","\"use client\";\n\n/**\n * The kit's HOST SLOTS. The kit never imports app code; the three things it cannot own are\n * handed in once by the host through `setKindKitHost`:\n * - `CopyButtons` the copy bar `KindHeaderBar` renders for its `copy` prop;\n * - `ReadEmpty` what `SortableList` / `TagList` show instead of an empty state while a\n * read has not succeeded;\n * - `ReadStaleNotice` the notice above rows left on screen by a failed refresh.\n * Each default is honest and working: a plain Copy button, and text that says what happened.\n * State lives on globalThis under a Symbol.for key so two copies of the package share one host.\n */\nimport * as React from \"react\";\nimport { copyText } from \"@ai-matrx/kit/clipboard\";\nimport type { MatrxCopyMenuProps } from \"@ai-matrx/alchemy/react/workspace\";\n\n/**\n * The copy bar's props: exactly the design system's `MatrxCopyMenuProps`, so a host registers its\n * own `CopyButtons` (which takes that shape) with no adapter. Type-only: no runtime import.\n */\nexport type KindKitCopyProps = MatrxCopyMenuProps;\n\nexport type ReadStatus = \"loading\" | \"error\" | \"ready\";\n\n/** A read's outcome, handed to a list primitive's `read` prop. */\nexport interface ReadOutcome {\n status: ReadStatus;\n /** The failure itself, or a truthy flag when the read only says it failed. */\n error?: unknown;\n onRetry?: (() => void) | undefined;\n /** What was read, in the reader's words: \"your tasks\". */\n what?: string | undefined;\n /** A successful read has already produced a value. */\n hasData?: boolean | undefined;\n}\n\nexport interface KindKitReadEmptyProps {\n read?: ReadOutcome | undefined;\n loading?: React.ReactNode;\n children?: React.ReactNode;\n}\nexport interface KindKitReadStaleNoticeProps {\n read?: ReadOutcome | undefined;\n className?: string;\n}\n\nexport interface KindKitHost {\n CopyButtons: React.ComponentType<KindKitCopyProps>;\n ReadEmpty: React.ComponentType<KindKitReadEmptyProps>;\n ReadStaleNotice: React.ComponentType<KindKitReadStaleNoticeProps>;\n}\n\nconst KEY = Symbol.for(\"ai-matrx.content-ir-react.kind-kit-host\");\ntype Store = { [KEY]?: Partial<KindKitHost> };\n\nfunction resolveText(human: KindKitCopyProps[\"human\"], json: KindKitCopyProps[\"json\"]): string {\n if (typeof human === \"function\") return human();\n if (typeof human === \"string\") return human;\n if (json !== undefined) return JSON.stringify(typeof json === \"function\" ? (json as () => unknown)() : json, null, 2);\n return \"\";\n}\n\n/** Default copy bar: one \"Copy\" button that writes the `human` text (else the JSON) to the clipboard. */\nexport function DefaultCopyButtons({ label, human, json, size, className }: KindKitCopyProps) {\n const [state, setState] = React.useState<\"idle\" | \"copied\" | \"failed\">(\"idle\");\n const onClick = async () => {\n setState((await copyText(resolveText(human, json))) ? \"copied\" : \"failed\");\n setTimeout(() => setState(\"idle\"), 1500);\n };\n return (\n <button\n type=\"button\"\n onClick={onClick}\n title={`Copy ${label}`}\n aria-label={`Copy ${label}`}\n className={\n className ??\n `inline-flex items-center rounded-md border border-border px-2 text-xs text-foreground hover:bg-muted ${size === \"icon\" ? \"h-7\" : \"h-8\"}`\n }\n >\n {state === \"copied\" ? \"Copied\" : state === \"failed\" ? \"Copy failed\" : \"Copy\"}\n </button>\n );\n}\n\nfunction RetryButton({ onRetry }: { onRetry: (() => void) | undefined }) {\n if (!onRetry) return null;\n return (\n <button type=\"button\" onClick={onRetry} className=\"ml-2 underline underline-offset-2\">\n Try again\n </button>\n );\n}\n\n/** Default: loading says it is loading; an error says what failed (with retry); ready shows the host's empty state. */\nexport function DefaultReadEmpty({ read, loading, children }: KindKitReadEmptyProps) {\n const status = read?.status ?? \"ready\";\n const what = read?.what ?? \"this list\";\n if (status === \"loading\") return <>{loading ?? <div role=\"status\" className=\"text-xs text-muted-foreground\">{`Loading ${what}…`}</div>}</>;\n if (status === \"error\") {\n return (\n <div role=\"alert\" className=\"text-xs text-destructive\">\n {`Could not load ${what}.`}\n <RetryButton onRetry={read?.onRetry} />\n </div>\n );\n }\n return <>{children ?? null}</>;\n}\n\n/** Default: when the latest read failed, the rows on screen may be out of date; says so, with retry. */\nexport function DefaultReadStaleNotice({ read, className }: KindKitReadStaleNoticeProps) {\n if (read?.status !== \"error\") return null;\n return (\n <div role=\"alert\" className={`text-xs text-muted-foreground ${className ?? \"\"}`}>\n {`Showing earlier ${read.what ?? \"results\"}; the latest refresh failed.`}\n <RetryButton onRetry={read.onRetry} />\n </div>\n );\n}\n\nconst DEFAULTS: KindKitHost = {\n CopyButtons: DefaultCopyButtons,\n ReadEmpty: DefaultReadEmpty,\n ReadStaleNotice: DefaultReadStaleNotice,\n};\n\n/** Register the host's copy bar and read notices. Call once at boot; a slot left out keeps its default. */\nexport function setKindKitHost(host: Partial<KindKitHost>): void {\n (globalThis as Store)[KEY] = { ...(globalThis as Store)[KEY], ...host };\n}\n\n/** The slots in force: the host's where registered, the defaults elsewhere. */\nexport function getKindKitHost(): KindKitHost {\n return { ...DEFAULTS, ...(globalThis as Store)[KEY] };\n}\n\n/** Clear every registered slot (tests, hot reload). */\nexport function resetKindKitHost(): void {\n delete (globalThis as Store)[KEY];\n}\n","\"use client\";\n\n/**\n * KindPanelGrid — content-aware responsive grid for side-by-side panels.\n *\n * Never more columns than the content can afford: every track is at least\n * `minColumnWidth` (default 280px) wide, the column count is whatever fits\n * (`auto-fit`), and every panel in a row stretches to the same height so the\n * panels' footers line up. Pair with `KindPanel` (its `footer` is pinned to\n * the bottom). Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { cn } from \"@ai-matrx/design-system\";\n\nconst GAP_PX = { sm: 8, md: 12, lg: 16 } as const;\nconst GAP_CLASS = { sm: \"gap-2\", md: \"gap-3\", lg: \"gap-4\" } as const;\n\nexport interface KindPanelGridProps {\n children: React.ReactNode;\n /** Minimum width (px) of a column before the grid drops a column. Default 280. */\n minColumnWidth?: number;\n /** Hard ceiling on columns, however wide the container is. */\n maxColumns?: number;\n /** Space between panels. Default \"md\" (12px). */\n gap?: keyof typeof GAP_PX;\n /**\n * \"auto-fit\" (default): a short last row lets panels grow to fill the width.\n * \"auto-fill\": tracks stay the same width and the row is left short.\n */\n fill?: \"auto-fit\" | \"auto-fill\";\n className?: string;\n}\n\nexport function KindPanelGrid({\n children,\n minColumnWidth = 280,\n maxColumns,\n gap = \"md\",\n fill = \"auto-fit\",\n className,\n}: KindPanelGridProps) {\n const min = `min(100%, ${minColumnWidth}px)`;\n // With a column ceiling, each track must also be at least 1/n of the row —\n // which caps the count at n while still never going under minColumnWidth.\n const track =\n maxColumns && maxColumns > 0\n ? `max(${min}, calc((100% - ${GAP_PX[gap] * (maxColumns - 1)}px) / ${maxColumns}))`\n : min;\n return (\n <div\n className={cn(\"grid items-stretch\", GAP_CLASS[gap], className)}\n style={{ gridTemplateColumns: `repeat(${fill}, minmax(${track}, 1fr))` }}\n >\n {children}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * KindPanel — the standard panel for a kind component's sub-sections (a\n * keyword bucket, an option card, a section of results).\n *\n * Layout is fixed so agent-authored panels come out right by construction:\n * - compact header: icon · title (wraps, never squeezed) · count · ≤2 inline\n * actions · an overflow menu that absorbs EVERY other control (no control\n * row ever gets crammed);\n * - full-width subline (a rationale, a hint) on its own line UNDER the\n * header — never beside the title;\n * - body;\n * - `footer` pinned to the bottom (flex column + mt-auto) so \"Add\" rows\n * line up across sibling panels in a `KindPanelGrid`.\n * Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Loader2, MoreHorizontal } from \"./icons\";\nimport {\n Button,\n cn,\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"@ai-matrx/design-system\";\n\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\n\nexport interface KindPanelMenuItem {\n label: string;\n onSelect: () => void;\n icon?: React.ComponentType<{ className?: string }>;\n disabled?: boolean;\n /** Renders in the destructive colour (delete, clear, reset). */\n destructive?: boolean;\n /** Draws a separator ABOVE this item. */\n separatorBefore?: boolean;\n}\n\nexport interface KindPanelProps {\n /** Header title. Wraps onto extra lines rather than truncating. */\n title: React.ReactNode;\n /** Lucide component or an already-created icon element shown before the title. */\n icon?: KindKitIcon;\n /** Count pill after the title (e.g. number of items). */\n count?: number | string;\n /** Any extra pill/badge after the count (a status, a score). */\n badge?: React.ReactNode;\n /** Shows a spinner in the header while this panel's data is still arriving. */\n streaming?: boolean;\n /**\n * At most one or two compact controls rendered inline on the right of the\n * header (a toggle, a tiny icon button). Put everything else in `menuItems`.\n */\n actions?: React.ReactNode;\n /** Controls collapsed into the header's overflow (⋯) menu. */\n menuItems?: KindPanelMenuItem[];\n /** Full-width line under the header — a rationale, a hint. Never beside the title. */\n subline?: React.ReactNode;\n /** Panel body. */\n children?: React.ReactNode;\n /** Pinned to the bottom of the panel (an \"Add\" row, a summary, a copy bar). */\n footer?: React.ReactNode;\n /** \"card\" (default): bordered card. \"bare\": no border/background — the host IS the chrome. */\n variant?: \"card\" | \"bare\";\n /** Tighter paddings for dense lists. */\n dense?: boolean;\n className?: string;\n /** className for the body wrapper. */\n bodyClassName?: string;\n}\n\nexport function KindPanel({\n title,\n icon,\n count,\n badge,\n streaming = false,\n actions,\n menuItems,\n subline,\n children,\n footer,\n variant = \"card\",\n dense = false,\n className,\n bodyClassName,\n}: KindPanelProps) {\n const px = dense ? \"px-2.5\" : \"px-3\";\n const menu = menuItems && menuItems.length > 0 ? menuItems : null;\n return (\n <section\n className={cn(\n \"flex h-full min-h-0 min-w-0 flex-col\",\n variant === \"card\" && \"rounded-lg border border-border bg-card\",\n className,\n )}\n >\n <header\n className={cn(\n \"flex items-start gap-2\",\n px,\n dense ? \"pt-2\" : \"pt-3\",\n variant === \"bare\" && \"px-0\",\n )}\n >\n {renderKindKitIcon(icon, \"mt-0.5 h-3.5 w-3.5 shrink-0 text-primary\")}\n <h3 className=\"min-w-0 flex-1 text-xs font-semibold uppercase leading-5 tracking-wide text-foreground break-words\">\n {title}\n </h3>\n {count !== undefined && (\n <span className=\"mt-0.5 shrink-0 rounded-full bg-muted px-1.5 py-0.5 text-[10px] tabular-nums text-muted-foreground\">\n {count}\n </span>\n )}\n {badge !== undefined && (\n <span className=\"mt-0.5 shrink-0\">{badge}</span>\n )}\n {streaming && (\n <Loader2\n aria-label=\"Still arriving\"\n className=\"mt-1 h-3 w-3 shrink-0 animate-spin text-muted-foreground\"\n />\n )}\n {actions && (\n <div className=\"flex shrink-0 items-center gap-1\">{actions}</div>\n )}\n {menu && (\n <DropdownMenu>\n <DropdownMenuTrigger asChild>\n <Button\n type=\"button\"\n variant=\"ghost\"\n size=\"icon\"\n aria-label=\"More actions\"\n className=\"-mr-1 -mt-1 h-7 w-7 shrink-0 text-muted-foreground\"\n >\n <MoreHorizontal className=\"h-4 w-4\" />\n </Button>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className=\"min-w-44\">\n {menu.map((item, i) => (\n <React.Fragment key={`${i}-${item.label}`}>\n {item.separatorBefore && i > 0 && <DropdownMenuSeparator />}\n <DropdownMenuItem\n disabled={item.disabled ?? false}\n onSelect={() => item.onSelect()}\n className={cn(\n \"text-xs\",\n item.destructive &&\n \"text-destructive focus:text-destructive\",\n )}\n >\n {item.icon && <item.icon className=\"mr-2 h-3.5 w-3.5\" />}\n {item.label}\n </DropdownMenuItem>\n </React.Fragment>\n ))}\n </DropdownMenuContent>\n </DropdownMenu>\n )}\n </header>\n {subline !== undefined && subline !== null && subline !== \"\" && (\n <div\n className={cn(\n \"pt-1 text-xs leading-snug text-muted-foreground break-words\",\n px,\n variant === \"bare\" && \"px-0\",\n )}\n >\n {subline}\n </div>\n )}\n <div\n className={cn(\n \"min-w-0 flex-1\",\n px,\n dense ? \"py-1.5\" : \"py-2\",\n variant === \"bare\" && \"px-0\",\n bodyClassName,\n )}\n >\n {children}\n </div>\n {footer !== undefined && footer !== null && (\n <div\n className={cn(\n \"mt-auto border-t border-border\",\n px,\n dense ? \"py-1.5\" : \"py-2\",\n variant === \"bare\" && \"px-0\",\n )}\n >\n {footer}\n </div>\n )}\n </section>\n );\n}\n","import * as React from \"react\";\n\nimport { cn } from \"@ai-matrx/design-system\";\n\nexport type KindKitIcon =\n | React.ComponentType<{ className?: string }>\n | React.ReactElement<{ className?: string }>;\n\n/**\n * Babel-sandbox imports normally bind a component directly, but an ESM/CJS\n * interop boundary may hand us `{ default: Component }`. React reports that\n * wrapper as error #130 if it is passed to createElement unchanged.\n */\nfunction resolveIconType(icon: unknown): React.ElementType | null {\n if (typeof icon === \"function\") return icon as React.ElementType;\n if (typeof icon !== \"object\" || icon === null) return null;\n\n const candidate = icon as Record<PropertyKey, unknown>;\n if (typeof candidate.$$typeof === \"symbol\") {\n return icon as React.ElementType;\n }\n if (\"default\" in candidate && candidate.default !== icon) {\n return resolveIconType(candidate.default);\n }\n return null;\n}\n\n/** Render either icon authoring form without treating an element as a component type. */\nexport function renderKindKitIcon(\n icon: KindKitIcon | undefined,\n className: string,\n): React.ReactElement | null {\n if (!icon) return null;\n if (React.isValidElement<{ className?: string }>(icon)) {\n return React.cloneElement(icon, {\n className: cn(className, icon.props.className),\n });\n }\n const Icon = resolveIconType(icon);\n return Icon ? React.createElement(Icon, { className }) : null;\n}\n","\"use client\";\n\n/**\n * KindHeaderBar — the standard compact header of a kind component:\n * icon · title (the instance's `title_key` value) · at-a-glance stats · the\n * copy bar (the host's `CopyButtons` slot: Copy / Copy-for-AI / JSON / Export from builders\n * the caller supplies). One row that wraps on narrow widths; the copy bar\n * stays on the right. Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Loader2 } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport { getKindKitHost, type KindKitCopyProps } from \"./kind-kit-host\";\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\n\nexport interface KindHeaderStat {\n /** Short label, e.g. \"keywords\". */\n label: string;\n /** The number/text, e.g. 42 or \"3 buckets\". */\n value: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Optional hover text. */\n title?: string;\n}\n\nexport interface KindHeaderBarProps {\n /** The instance title (usually `data[title_key]`). */\n title: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Small muted line under the title (a primary keyword, a subtitle). */\n subtitle?: React.ReactNode;\n /** At-a-glance numbers rendered as compact \"value label\" stats. */\n stats?: KindHeaderStat[];\n /** Shows a spinner + \"Streaming\" while the instance is still arriving. */\n streaming?: boolean;\n /** Word shown beside the spinner. Default \"Streaming\". */\n streamingLabel?: string;\n /**\n * The copy bar. Pass the builders you have — `human` (text), `agent`\n * (payload or string), `json` (raw record), `export` (download items) and\n * the `label` used in toasts. Omit to render no copy bar.\n */\n copy?: Omit<KindKitCopyProps, \"size\" | \"className\">;\n /** Extra controls rendered between the stats and the copy bar. */\n actions?: React.ReactNode;\n /** \"sm\" (default) for in-chat blocks; \"md\" for page-level kind surfaces. */\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nexport function KindHeaderBar({\n title,\n icon,\n subtitle,\n stats,\n streaming = false,\n streamingLabel = \"Streaming\",\n copy,\n actions,\n size = \"sm\",\n className,\n}: KindHeaderBarProps) {\n const { CopyButtons } = getKindKitHost();\n const titleCls = size === \"md\" ? \"text-base\" : \"text-sm\";\n const iconCls = size === \"md\" ? \"h-5 w-5\" : \"h-4 w-4\";\n const iconNode = renderKindKitIcon(\n icon,\n cn(\"mt-0.5 shrink-0 text-primary\", iconCls),\n );\n return (\n <div\n className={cn(\"flex flex-wrap items-center gap-x-3 gap-y-1.5\", className)}\n >\n <div className=\"flex min-w-0 flex-1 basis-48 items-start gap-2\">\n {iconNode}\n <div className=\"min-w-0 flex-1\">\n <div\n className={cn(\n \"font-semibold leading-tight text-foreground break-words\",\n titleCls,\n )}\n >\n {title}\n </div>\n {subtitle !== undefined && subtitle !== null && subtitle !== \"\" && (\n <div className=\"mt-0.5 text-xs leading-snug text-muted-foreground break-words\">\n {subtitle}\n </div>\n )}\n </div>\n </div>\n {stats && stats.length > 0 && (\n <dl className=\"flex flex-wrap items-center gap-x-3 gap-y-1\">\n {stats.map((s, i) => (\n <div\n key={`${i}-${s.label}`}\n title={s.title}\n className=\"flex items-baseline gap-1 text-xs\"\n >\n {renderKindKitIcon(\n s.icon,\n \"h-3 w-3 self-center text-muted-foreground\",\n )}\n <dd className=\"font-semibold tabular-nums text-foreground\">\n {s.value}\n </dd>\n <dt className=\"text-muted-foreground\">{s.label}</dt>\n </div>\n ))}\n </dl>\n )}\n {streaming && (\n <span className=\"inline-flex items-center gap-1 text-xs text-muted-foreground\">\n <Loader2 className=\"h-3 w-3 animate-spin\" />\n {streamingLabel}\n </span>\n )}\n {(actions || copy) && (\n <div className=\"ml-auto flex shrink-0 items-center gap-1.5\">\n {actions}\n {copy && (\n <CopyButtons {...copy} size={size === \"md\" ? \"sm\" : \"icon\"} />\n )}\n </div>\n )}\n </div>\n );\n}\n","\"use client\";\n\n/**\n * KindActionButton — the one-click door from a kind component to a host\n * Action. Wraps the component's `runAction(key, input)` prop (the ONLY\n * side-effect channel; it never throws, it returns an `{ok}` envelope), with\n * a busy state, no double fire, an optional inline confirm that states the\n * consequence, and a one-line inline error (the host already toasts).\n * Contract: `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Button, cn } from \"@ai-matrx/design-system\";\nimport { Loader2 } from \"./icons\";\nimport { renderKindKitIcon, type KindKitIcon } from \"./icon-slot\";\n\nexport type KindActionEnvelope =\n | { ok: true; result?: unknown }\n | { ok: false; error: string };\n\n/** One action: `runAction` + `action` + `input`. */\ninterface KindActionSingle {\n /** The component's `runAction` prop, passed straight through. */\n runAction: (key: string, input: unknown) => Promise<KindActionEnvelope>;\n /** Action key, e.g. \"run_shortcut\". */\n action: string;\n /** The action input, or a function that builds it at click time. */\n input: unknown | (() => unknown);\n run?: never;\n}\n\n/** A chain: `run` awaits several `runAction` calls and returns the final envelope. */\ninterface KindActionChain {\n run: () => Promise<KindActionEnvelope>;\n runAction?: never;\n action?: never;\n input?: never;\n}\n\ninterface KindActionButtonBase {\n /** Short label. Also the aria-label/tooltip when `compact`. */\n label: string;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Label while running. Defaults to `label`. */\n busyLabel?: string;\n /** One-sentence consequence. When set, the first click asks to confirm. */\n confirm?: string;\n onDone?: (result: unknown) => void;\n onError?: (error: string) => void;\n variant?:\n | \"default\"\n | \"primary\"\n | \"destructive\"\n | \"success\"\n | \"outline\"\n | \"secondary\"\n | \"ghost\"\n | \"subtle\";\n /** Icon-only with tooltip + aria-label, for menus and header rows. */\n compact?: boolean;\n disabled?: boolean;\n className?: string;\n}\n\nexport type KindActionButtonProps = KindActionButtonBase &\n (KindActionSingle | KindActionChain);\n\nconst ERROR_MAX = 60;\n\nexport function KindActionButton({\n runAction,\n action,\n input,\n run: runChain,\n label,\n icon,\n busyLabel,\n confirm,\n onDone,\n onError,\n variant = \"outline\",\n compact = false,\n disabled = false,\n className,\n}: KindActionButtonProps) {\n const [busy, setBusy] = React.useState(false);\n const [asking, setAsking] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const inFlight = React.useRef(false);\n const mounted = React.useRef(true);\n const errorTimer = React.useRef<ReturnType<typeof setTimeout> | null>(null);\n\n React.useEffect(() => {\n mounted.current = true;\n return () => {\n mounted.current = false;\n if (errorTimer.current) clearTimeout(errorTimer.current);\n };\n }, []);\n\n const run = React.useCallback(async () => {\n if (inFlight.current) return;\n inFlight.current = true;\n setAsking(false);\n setError(null);\n setBusy(true);\n try {\n let res: KindActionEnvelope;\n if (runChain) {\n res = await runChain();\n } else {\n const payload = typeof input === \"function\" ? (input as () => unknown)() : input;\n res = await runAction!(action!, payload);\n }\n if (res && res.ok) {\n onDone?.(res.result);\n } else {\n const message = (res && \"error\" in res && res.error) || \"Action failed\";\n if (mounted.current) {\n setError(message);\n if (errorTimer.current) clearTimeout(errorTimer.current);\n errorTimer.current = setTimeout(() => {\n if (mounted.current) setError(null);\n }, 8000);\n }\n onError?.(message);\n }\n } catch (e) {\n // runAction promises never to throw; stay honest if a host breaks that.\n const message = e instanceof Error ? e.message : \"Action failed\";\n if (mounted.current) setError(message);\n onError?.(message);\n } finally {\n inFlight.current = false;\n if (mounted.current) setBusy(false);\n }\n }, [action, input, onDone, onError, runAction, runChain]);\n\n const onClick = () => {\n if (busy || disabled || inFlight.current) return;\n if (confirm) setAsking(true);\n else void run();\n };\n\n if (asking && !busy) {\n return (\n <span\n role=\"group\"\n aria-label={label}\n className={cn(\n \"inline-flex flex-wrap items-center gap-x-2 gap-y-1 rounded-md border border-border bg-card px-2 py-1 text-xs\",\n className,\n )}\n >\n <span className=\"text-foreground\">{confirm}</span>\n <Button type=\"button\" size=\"xs\" variant={variant === \"outline\" ? \"default\" : variant} onClick={() => void run()}>\n {label}\n </Button>\n <Button type=\"button\" size=\"xs\" variant=\"ghost\" onClick={() => setAsking(false)}>\n Cancel\n </Button>\n </span>\n );\n }\n\n const shownLabel = busy ? (busyLabel ?? label) : label;\n const glyph = busy ? (\n <Loader2 className=\"h-4 w-4 animate-spin\" />\n ) : (\n renderKindKitIcon(icon, \"h-4 w-4\")\n );\n\n return (\n <span className={cn(\"inline-flex min-w-0 items-center gap-2\", className)}>\n <Button\n type=\"button\"\n variant={variant}\n size={compact ? \"icon-sm\" : \"sm\"}\n disabled={disabled || busy}\n aria-busy={busy || undefined}\n aria-label={compact ? shownLabel : undefined}\n title={compact ? label : undefined}\n onClick={onClick}\n >\n {glyph}\n {!compact && <span>{shownLabel}</span>}\n </Button>\n {error && (\n <span\n role=\"alert\"\n title={error}\n className=\"min-w-0 text-xs text-destructive\"\n >\n {error.length > ERROR_MAX ? `${error.slice(0, ERROR_MAX - 1)}…` : error}\n </span>\n )}\n </span>\n );\n}\n","\"use client\";\n\n/**\n * StreamingSkeleton + useStreamingValue — the \"before data lands\" kit.\n *\n * A kind component receives partial `data` on every envelope flush while the\n * agent streams: fields are absent, arrays are short, strings are cut. The\n * skeleton mimics the layout the real content will have (list / cards /\n * table / text) for the instant before anything arrives; the helpers make\n * field reads tolerant so a component never crashes on a half-built\n * instance and never flickers a value away. Contract:\n * `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { cn, Skeleton } from \"@ai-matrx/design-system\";\n\nexport interface StreamingSkeletonProps {\n /** Layout to mimic. Default \"list\". */\n layout?: \"list\" | \"cards\" | \"table\" | \"text\";\n /** Rows (list/table/text lines) or cards. Default 3. */\n rows?: number;\n /** Columns for \"table\" / \"cards\". Default 3 (table) / 2 (cards). */\n columns?: number;\n /** Render a title bar line above the body. Default true. */\n header?: boolean;\n /** Accessible label. Default \"Loading\". */\n label?: string;\n className?: string;\n}\n\nexport function StreamingSkeleton({\n layout = \"list\",\n rows = 3,\n columns,\n header = true,\n label = \"Loading\",\n className,\n}: StreamingSkeletonProps) {\n const n = Math.max(1, rows);\n const cols = Math.max(1, columns ?? (layout === \"cards\" ? 2 : 3));\n return (\n <div\n role=\"status\"\n aria-busy=\"true\"\n aria-label={label}\n className={cn(\"space-y-2\", className)}\n >\n {header && (\n <div className=\"flex items-center gap-2\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n <Skeleton className=\"h-4 w-40\" />\n <Skeleton className=\"ml-auto h-6 w-16\" />\n </div>\n )}\n {layout === \"list\" &&\n Array.from({ length: n }).map((_, i) => (\n <div key={i} className=\"flex items-center gap-2 rounded-md border border-border px-2 py-2\">\n <Skeleton className=\"h-4 w-4 rounded\" />\n <Skeleton className={cn(\"h-3.5\", i % 3 === 0 ? \"w-2/3\" : i % 3 === 1 ? \"w-1/2\" : \"w-3/4\")} />\n </div>\n ))}\n {layout === \"cards\" && (\n <div\n className=\"grid gap-3\"\n style={{ gridTemplateColumns: `repeat(auto-fit, minmax(min(100%, 240px), 1fr))` }}\n >\n {Array.from({ length: Math.max(n, cols) }).map((_, i) => (\n <div key={i} className=\"space-y-2 rounded-lg border border-border p-3\">\n <Skeleton className=\"h-3.5 w-1/2\" />\n <Skeleton className=\"h-3 w-full\" />\n <div className=\"flex flex-wrap gap-1.5 pt-1\">\n <Skeleton className=\"h-5 w-16 rounded-full\" />\n <Skeleton className=\"h-5 w-24 rounded-full\" />\n <Skeleton className=\"h-5 w-12 rounded-full\" />\n </div>\n </div>\n ))}\n </div>\n )}\n {layout === \"table\" && (\n <div className=\"overflow-hidden rounded-md border border-border\">\n <div\n className=\"grid gap-2 border-b border-border bg-muted/40 px-2 py-1.5\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, c) => (\n <Skeleton key={c} className=\"h-3 w-2/3\" />\n ))}\n </div>\n {Array.from({ length: n }).map((_, r) => (\n <div\n key={r}\n className=\"grid gap-2 px-2 py-2\"\n style={{ gridTemplateColumns: `repeat(${cols}, minmax(0, 1fr))` }}\n >\n {Array.from({ length: cols }).map((_, c) => (\n <Skeleton key={c} className={cn(\"h-3\", c === 0 ? \"w-3/4\" : \"w-1/2\")} />\n ))}\n </div>\n ))}\n </div>\n )}\n {layout === \"text\" &&\n Array.from({ length: n }).map((_, i) => (\n <Skeleton\n key={i}\n className={cn(\"h-3\", i === n - 1 ? \"w-2/5\" : i % 2 === 0 ? \"w-full\" : \"w-11/12\")}\n />\n ))}\n <span className=\"sr-only\">{label}</span>\n </div>\n );\n}\n\n/**\n * Sticky, tolerant read of a value that may be absent mid-stream.\n *\n * Returns the latest DEFINED value seen (so a re-parse that momentarily drops\n * a field does not blank the UI), `fallback` until one arrives, and `arrived`\n * once any real value has been observed. Implemented with the React\n * \"remember the previous render\" pattern (state updated during render), so\n * pass a FIELD READ (`data?.summary`) — never an expression that builds a\n * new object/array on every render (`data?.items ?? []`), which would\n * re-trigger the update each render.\n */\nexport function useStreamingValue<T>(\n value: T | null | undefined,\n fallback: T,\n): { value: T; arrived: boolean } {\n const [last, setLast] = React.useState<{ value: T; arrived: boolean }>({\n value: fallback,\n arrived: false,\n });\n const defined = value !== null && value !== undefined;\n if (defined && (!last.arrived || !Object.is(value, last.value))) {\n const next = { value: value as T, arrived: true };\n setLast(next);\n return next;\n }\n return last;\n}\n\n/** `value` when it is an array, else `[]` — for `data.items` that is not there yet. */\nexport function streamList<T = unknown>(value: unknown): T[] {\n return Array.isArray(value) ? (value as T[]) : [];\n}\n\n/** `value` when it is a non-empty string, else `fallback` (\"\" by default). */\nexport function streamText(value: unknown, fallback = \"\"): string {\n return typeof value === \"string\" && value.length > 0 ? value : fallback;\n}\n","\"use client\";\n\n/**\n * KeywordChip + TagList — chips that WRAP, never truncate.\n *\n * A keyword / tag / phrase is always shown in full: the chip wraps its text\n * onto extra lines inside the chip, and the list wraps chips onto extra rows.\n * Optional select (checkbox-like toggle), remove (X) and inline edit\n * (pencil → input, Enter commits, Esc cancels). `TagList` adds an inline\n * \"Add\" input at the end when `onAdd` is given. Contract:\n * `kind-kit/README.md`.\n */\n\nimport * as React from \"react\";\nimport { Check, Pencil, Plus, X } from \"./icons\";\nimport { cn } from \"@ai-matrx/design-system\";\nimport {\n renderKindKitIcon,\n type KindKitIcon,\n} from \"./icon-slot\";\nimport { getKindKitHost, type ReadOutcome } from \"./kind-kit-host\";\n\nexport interface KeywordChipProps {\n /** The phrase. Rendered in full — wraps, never truncates. */\n label: string;\n /** Small trailing detail (a count, a volume, a score). */\n meta?: React.ReactNode;\n /** Lucide component or an already-created icon element. */\n icon?: KindKitIcon;\n /** Selected state; pass `onSelect` to make the chip a toggle. */\n selected?: boolean;\n /** Makes the chip a toggle; called with the next selected state. */\n onSelect?: ((selected: boolean) => void) | undefined;\n /** Adds an X control. */\n onRemove?: (() => void) | undefined;\n /** Enables inline edit (pencil control + double-click); called with the committed text. */\n onEdit?: ((next: string) => void) | undefined;\n /** Greys the chip and disables select/remove/edit. */\n disabled?: boolean | undefined;\n tone?: \"default\" | \"primary\" | \"muted\" | undefined;\n size?: \"sm\" | \"md\";\n className?: string;\n}\n\nconst TONE = {\n default: \"border-border bg-background text-foreground\",\n primary: \"border-primary/40 bg-primary/5 text-foreground\",\n muted: \"border-border bg-muted text-muted-foreground\",\n} as const;\n\nexport function KeywordChip({\n label,\n meta,\n icon,\n selected = false,\n onSelect,\n onRemove,\n onEdit,\n disabled = false,\n tone = \"default\",\n size = \"sm\",\n className,\n}: KeywordChipProps) {\n const [editing, setEditing] = React.useState(false);\n const [draft, setDraft] = React.useState(label);\n const inputRef = React.useRef<HTMLInputElement | null>(null);\n\n const selectable = !!onSelect && !disabled;\n const editable = !!onEdit && !disabled;\n\n const startEdit = () => {\n if (!editable) return;\n setDraft(label);\n setEditing(true);\n // Focus after the input mounts.\n requestAnimationFrame(() => inputRef.current?.select());\n };\n const commit = () => {\n setEditing(false);\n const next = draft.trim();\n if (next && next !== label) onEdit?.(next);\n };\n const cancel = () => {\n setEditing(false);\n setDraft(label);\n };\n\n const pad = size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\";\n // Inputs stay >=16px on phones (no iOS zoom), shrink to the chip size on sm+.\n const inputText = size === \"md\" ? \"text-[16px] sm:text-sm\" : \"text-[16px] sm:text-xs\";\n const ctl = size === \"md\" ? \"h-4 w-4\" : \"h-3.5 w-3.5\";\n\n return (\n <span\n className={cn(\n // max-w-full + min-w-0 + break-words: the text wraps INSIDE the chip.\n \"inline-flex max-w-full min-w-0 items-center gap-1 rounded-full border leading-snug\",\n pad,\n selected ? \"border-primary bg-primary/10 text-foreground\" : TONE[tone],\n disabled && \"opacity-60\",\n className,\n )}\n >\n {selectable && (\n <button\n type=\"button\"\n role=\"checkbox\"\n aria-checked={selected}\n aria-label={`${selected ? \"Deselect\" : \"Select\"} ${label}`}\n onClick={() => onSelect?.(!selected)}\n className={cn(\n \"flex shrink-0 items-center justify-center rounded-sm border\",\n size === \"md\" ? \"h-4 w-4\" : \"h-3.5 w-3.5\",\n selected\n ? \"border-primary bg-primary text-primary-foreground\"\n : \"border-muted-foreground/50 bg-background\",\n )}\n >\n {selected && <Check className=\"h-2.5 w-2.5\" />}\n </button>\n )}\n {renderKindKitIcon(\n icon,\n cn(\"shrink-0 text-muted-foreground\", ctl),\n )}\n {editing ? (\n <input\n ref={inputRef}\n value={draft}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commit}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commit();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n cancel();\n }\n }}\n aria-label={`Edit ${label}`}\n size={Math.max(4, draft.length + 1)}\n className={cn(\"min-w-0 bg-transparent outline-none\", inputText)}\n />\n ) : (\n <span\n className=\"min-w-0 whitespace-normal break-words text-left\"\n onDoubleClick={startEdit}\n >\n {label}\n </span>\n )}\n {meta !== undefined && meta !== null && (\n <span className=\"shrink-0 tabular-nums text-muted-foreground\">{meta}</span>\n )}\n {editable && !editing && (\n <button\n type=\"button\"\n aria-label={`Edit ${label}`}\n onClick={startEdit}\n className=\"shrink-0 rounded-full text-muted-foreground hover:text-foreground\"\n >\n <Pencil className={cn(\"h-3 w-3\", size === \"md\" && \"h-3.5 w-3.5\")} />\n </button>\n )}\n {onRemove && (\n <button\n type=\"button\"\n aria-label={`Remove ${label}`}\n disabled={disabled}\n onClick={onRemove}\n className=\"-mr-0.5 shrink-0 rounded-full text-muted-foreground hover:text-destructive disabled:pointer-events-none\"\n >\n <X className={ctl} />\n </button>\n )}\n </span>\n );\n}\n\nexport interface TagItem {\n label: string;\n /** Stable key; defaults to `label`. */\n key?: string;\n meta?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport interface TagListProps {\n /** Phrases, as strings or `{ label, key?, meta?, disabled? }` objects. */\n items: readonly (string | TagItem)[];\n /** Selected keys (label when no key). Pass with `onToggle` for selectable chips. */\n selected?: readonly string[];\n /** Makes chips toggles; called with (key, nextSelected). */\n onToggle?: (key: string, selected: boolean) => void;\n /** Adds an X on every chip; called with (key, index). */\n onRemove?: (key: string, index: number) => void;\n /** Enables inline edit on every chip; called with (key, index, nextLabel). */\n onEdit?: (key: string, index: number, next: string) => void;\n /** Renders an inline \"Add\" input at the end; called with the trimmed text. */\n onAdd?: (label: string) => void;\n /** Placeholder of the add input. Default \"Add…\". */\n addPlaceholder?: string;\n /** Shown when `items` is empty (and there is no add input). */\n emptyState?: React.ReactNode;\n /**\n * The outcome of the read behind the rows (RC-B12 r13). `emptyState` shows\n * only after a read that succeeded; a failed read shows the failure + retry.\n */\n read?: ReadOutcome;\n tone?: KeywordChipProps[\"tone\"];\n size?: KeywordChipProps[\"size\"];\n disabled?: boolean;\n className?: string;\n}\n\nfunction normalize(item: string | TagItem): TagItem {\n return typeof item === \"string\" ? { label: item } : item;\n}\n\nexport function TagList({\n items,\n selected,\n onToggle,\n onRemove,\n onEdit,\n onAdd,\n addPlaceholder = \"Add…\",\n emptyState,\n read,\n tone,\n size = \"sm\",\n disabled = false,\n className,\n}: TagListProps) {\n const { ReadEmpty, ReadStaleNotice } = getKindKitHost();\n const [adding, setAdding] = React.useState(false);\n const [draft, setDraft] = React.useState(\"\");\n const inputText = size === \"md\" ? \"text-[16px] sm:text-sm\" : \"text-[16px] sm:text-xs\";\n const selectedSet = new Set(selected ?? []);\n\n const commitAdd = () => {\n const next = draft.trim();\n if (next) onAdd?.(next);\n setDraft(\"\");\n setAdding(false);\n };\n\n if (items.length === 0 && read && read.status !== \"ready\") return <ReadEmpty read={read} />;\n if (items.length === 0 && !onAdd) {\n return emptyState !== undefined ? (\n <div className={cn(\"text-xs text-muted-foreground\", className)}>\n {emptyState}\n </div>\n ) : null;\n }\n\n return (\n <div className={cn(\"flex flex-wrap items-center gap-1.5\", className)}>\n <ReadStaleNotice read={read} className=\"w-full\" />\n {items.map((raw, index) => {\n const item = normalize(raw);\n const key = item.key ?? item.label;\n return (\n <KeywordChip\n key={`${key}-${index}`}\n label={item.label}\n meta={item.meta}\n tone={tone}\n size={size}\n disabled={disabled || item.disabled}\n selected={selectedSet.has(key)}\n onSelect={onToggle ? (next) => onToggle(key, next) : undefined}\n onRemove={onRemove ? () => onRemove(key, index) : undefined}\n onEdit={onEdit ? (next) => onEdit(key, index, next) : undefined}\n />\n );\n })}\n {items.length === 0 && emptyState !== undefined && (\n <span className=\"text-xs text-muted-foreground\">{emptyState}</span>\n )}\n {onAdd && !disabled && (\n adding ? (\n <span\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border border-dashed border-primary/60 bg-background\",\n size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\",\n )}\n >\n <input\n autoFocus\n value={draft}\n placeholder={addPlaceholder}\n onChange={(e) => setDraft(e.target.value)}\n onBlur={commitAdd}\n onKeyDown={(e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n commitAdd();\n } else if (e.key === \"Escape\") {\n e.preventDefault();\n setDraft(\"\");\n setAdding(false);\n }\n }}\n aria-label={addPlaceholder}\n size={Math.max(6, draft.length + 1)}\n className={cn(\"min-w-0 bg-transparent outline-none placeholder:text-muted-foreground\", inputText)}\n />\n </span>\n ) : (\n <button\n type=\"button\"\n onClick={() => setAdding(true)}\n className={cn(\n \"inline-flex items-center gap-1 rounded-full border border-dashed border-border text-muted-foreground hover:border-primary/60 hover:text-foreground\",\n size === \"md\" ? \"px-2.5 py-1 text-sm\" : \"px-2 py-0.5 text-xs\",\n )}\n >\n <Plus className=\"h-3 w-3\" />\n {addPlaceholder.replace(/…$/, \"\")}\n </button>\n )\n )}\n </div>\n );\n}\n"],"mappings":"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","names":["React","React","Fragment","jsx","jsxs","Fragment","jsx","jsxs","cn","jsx","React","cn","React","cn","jsx","jsxs","cn","cn","jsx","jsxs","cn","React","Button","cn","jsx","jsxs","cn","Button","React","cn","jsx","jsxs","_","React","cn","jsx","jsxs","cn"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ai-matrx/content-ir-react",
|
|
3
|
-
"version": "0.24.
|
|
3
|
+
"version": "0.24.5",
|
|
4
4
|
"description": "The shared AI Matrx Content IR RENDER layer: kind routing, the component resolver, provisional (streaming) rendering, the runtime-wrapper chrome, and the generic structured floor — as portable React.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.cjs",
|
|
@@ -139,8 +139,8 @@
|
|
|
139
139
|
"dependencies": {
|
|
140
140
|
"@ai-matrx/alchemy": "latest",
|
|
141
141
|
"@ai-matrx/content-ir": "latest",
|
|
142
|
-
"@ai-matrx/
|
|
143
|
-
"@ai-matrx/
|
|
142
|
+
"@ai-matrx/design-system": "latest",
|
|
143
|
+
"@ai-matrx/kit": "latest"
|
|
144
144
|
},
|
|
145
145
|
"devDependencies": {
|
|
146
146
|
"@arethetypeswrong/cli": "^0.18.5",
|
|
@@ -165,7 +165,7 @@
|
|
|
165
165
|
},
|
|
166
166
|
"sideEffects": false,
|
|
167
167
|
"scripts": {
|
|
168
|
-
"build": "pnpm clean && tsup",
|
|
168
|
+
"build": "pnpm clean && tsup && node ../scripts/check-node-env-not-inlined.mjs",
|
|
169
169
|
"clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
|
|
170
170
|
"check:package": "pnpm build && node ../scripts/check-exports-agreement.mjs && publint && pnpm verify:tarball",
|
|
171
171
|
"typecheck": "tsc -p tsconfig.json --noEmit",
|