@ai-matrx/context-menu 0.1.3 → 0.1.4
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 +6 -0
- package/dist/builder.cjs +4185 -128
- package/dist/builder.cjs.map +1 -1
- package/dist/builder.d.cts +1 -1
- package/dist/builder.d.ts +1 -1
- package/dist/builder.js +4193 -136
- package/dist/builder.js.map +1 -1
- package/dist/design-store.cjs.map +1 -1
- package/dist/design-store.d.cts +1 -1
- package/dist/design-store.d.ts +1 -1
- package/dist/design-store.js.map +1 -1
- package/dist/index.cjs +202 -82
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +7 -3
- package/dist/index.d.ts +7 -3
- package/dist/index.js +203 -83
- package/dist/index.js.map +1 -1
- package/dist/{model-CkLCR6WY.d.cts → model-C_7QZRE0.d.cts} +46 -4
- package/dist/{model-CkLCR6WY.d.ts → model-C_7QZRE0.d.ts} +46 -4
- package/package.json +4 -4
package/dist/builder.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/builder/MenuBuilder.tsx","../src/design/catalog.ts","../src/design/MenuPreview.tsx","../src/design/model.ts","../src/design/starters.ts","../src/builder/icons.tsx"],"sourcesContent":["// src/builder/MenuBuilder.tsx — @ai-matrx/context-menu/builder: THE DRAG-AND-DROP MENU DESIGNER.\n//\n// Three columns: the option palette (everything the menu offers today, plus ready-made blocks), the\n// structure (drag to reorder, drop onto a section or submenu to nest), and the live menu with its\n// look and the selected entry's settings. Save writes a new version to the design store; every\n// version stays openable. The working copy is also kept in this browser between reloads.\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type PointerEvent as ReactPointerEvent, type ReactNode } from \"react\";\nimport { CATALOG, CATALOG_GROUPS, SLOT_SOURCES, TEMPLATES, catalogOption, slotOptions, slotSource, type CatalogOption } from \"../design/catalog\";\nimport { MenuPreview } from \"../design/MenuPreview\";\nimport {\n DEFAULT_LOOK,\n canMove,\n MENU_SURFACES,\n countItems,\n duplicateNode,\n catalogUseCounts,\n emptyDesign,\n insertNode,\n placedCatalogIds,\n isContainer,\n locate,\n moveNode,\n newId,\n parseDesign,\n removeNode,\n serializeDesign,\n unwrapNode,\n updateNode,\n wrapNode,\n type MenuDesign,\n type MenuItemNode,\n type MenuNode,\n} from \"../design/model\";\nimport type { DesignStore, SavedDesignVersion } from \"../design/store\";\nimport { STARTER_DESIGNS, type StarterDesign } from \"../design/starters\";\nimport {\n Badge,\n Button,\n ControlRow,\n DisclosureHeader,\n EmptyState,\n Field,\n NumberStepper,\n RegionSkeleton,\n RowGroup,\n SearchField,\n SegmentedControl,\n Select,\n SettingRow,\n Switch,\n Textarea,\n Tile,\n} from \"@ai-matrx/design-system/controls\";\nimport { ICON_NAMES, renderLucide } from \"./icons\";\n\nexport interface MenuBuilderProps {\n store: DesignStore;\n /** A short line naming where saves go (\"Live data · admin@admin.com\"). */\n storeLabel: string;\n /** Opens with this design instead of the browser's working copy. */\n initialDesign?: MenuDesign;\n /** The host's account control (who saves), shown beside Save. */\n accountSlot?: ReactNode;\n}\n\nconst SURFACE_LABELS: Record<MenuDesign[\"surface\"], string> = {\n \"text-selection\": \"Opens on selected text\",\n \"editable-field\": \"Opens in an editable field\",\n \"table-row\": \"Opens on a table row\",\n page: \"Opens on the page\",\n \"chat-message\": \"Opens on a chat message\",\n file: \"Opens on a file\",\n anywhere: \"Opens anywhere\",\n};\nconst SURFACE_OPTIONS = MENU_SURFACES.map((value) => ({ value, label: SURFACE_LABELS[value] }));\n\n/** The design being edited, for panels that need the whole tree (a placeholder's contents). */\nconst DesignContext = createContext<MenuDesign | null>(null);\n\nconst DRAFT_KEY = \"matrx.context-menu.builder.draft.v1\";\n\ntype DragPayload =\n | { type: \"catalog\"; id: string }\n | { type: \"template\"; id: string }\n | { type: \"new\"; kind: \"section\" | \"submenu\" | \"divider\" | \"item\" | \"slot-items\" | \"slot-menu\" }\n | { type: \"move\"; id: string };\n\ntype DropPos = \"before\" | \"after\" | \"inside\";\n\ntype Over = { id: string | null; pos: DropPos };\ntype StartDrag = (e: ReactPointerEvent, payload: DragPayload, label: string) => void;\n\n/**\n * Pointer-driven drag: works with a mouse, a pen and a finger, unlike the browser's own drag and\n * drop. A press that moves less than 4px stays a click. Drop targets are elements carrying\n * `data-drop` (an entry id, or \"root\") and `data-container` when they accept children.\n */\nfunction usePointerDrag(onDrop: (payload: DragPayload, over: Over) => void) {\n const [ghost, setGhost] = useState<{ label: string; x: number; y: number } | null>(null);\n const [over, setOver] = useState<Over | null>(null);\n const suppressClick = useRef(false);\n\n const start: StartDrag = (e, payload, label) => {\n if (e.button !== 0) return;\n const x0 = e.clientX;\n const y0 = e.clientY;\n let active = false;\n let current: Over | null = null;\n const move = (ev: PointerEvent) => {\n if (!active && Math.hypot(ev.clientX - x0, ev.clientY - y0) < 4) return;\n if (!active) {\n active = true;\n document.body.style.userSelect = \"none\";\n document.body.style.cursor = \"grabbing\";\n }\n setGhost({ label, x: ev.clientX, y: ev.clientY });\n const el = (document.elementFromPoint(ev.clientX, ev.clientY) as HTMLElement | null)?.closest<HTMLElement>(\"[data-drop]\");\n if (!el) {\n current = null;\n } else if (el.dataset.drop === \"root\") {\n current = { id: null, pos: \"after\" };\n } else {\n const r = el.getBoundingClientRect();\n const y = (ev.clientY - r.top) / r.height;\n const pos: DropPos = el.dataset.container ? (y < 0.28 ? \"before\" : y > 0.72 ? \"after\" : \"inside\") : y < 0.5 ? \"before\" : \"after\";\n current = { id: el.dataset.drop ?? null, pos };\n }\n setOver(current);\n };\n const up = () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", up);\n document.body.style.userSelect = \"\";\n document.body.style.cursor = \"\";\n if (active) {\n suppressClick.current = true;\n setTimeout(() => (suppressClick.current = false), 0);\n if (current) onDrop(payload, current);\n }\n setGhost(null);\n setOver(null);\n };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", up);\n };\n /** Wrap a click handler so the click that ends a drag does nothing. */\n const click = (fn: () => void) => () => {\n if (!suppressClick.current) fn();\n };\n return { start, click, ghost, over };\n}\n\nfunction nodeFromPayload(p: DragPayload): MenuNode | null {\n if (p.type === \"catalog\") {\n const c = catalogOption(p.id);\n if (!c) return null;\n return {\n id: newId(\"i\"),\n kind: \"item\",\n catalogId: c.id,\n label: c.label,\n icon: c.icon,\n ...(c.shortcut ? { shortcut: c.shortcut } : {}),\n ...(c.danger ? { danger: true } : {}),\n ...(c.ai ? { ai: true } : {}),\n };\n }\n if (p.type === \"template\") return TEMPLATES.find((t) => t.id === p.id)?.build() ?? null;\n if (p.type === \"new\") {\n if (p.kind === \"section\") return { id: newId(\"s\"), kind: \"section\", label: \"New section\", children: [] };\n if (p.kind === \"submenu\") return { id: newId(\"m\"), kind: \"submenu\", label: \"More\", icon: \"Ellipsis\", children: [] };\n if (p.kind === \"divider\") return { id: newId(\"d\"), kind: \"divider\" };\n if (p.kind === \"slot-items\") return { id: newId(\"p\"), kind: \"slot\", shape: \"items\", fills: \"any\", label: \"Everything else\" };\n if (p.kind === \"slot-menu\") return { id: newId(\"p\"), kind: \"slot\", shape: \"submenu\", fills: \"any\", label: \"More\", icon: \"Ellipsis\" };\n return { id: newId(\"i\"), kind: \"item\", label: \"New option\", icon: \"Circle\" };\n }\n return null;\n}\n\nfunction readDraft(): MenuDesign | null {\n try {\n const raw = globalThis.localStorage?.getItem(DRAFT_KEY);\n return raw ? parseDesign(raw) : null;\n } catch {\n return null;\n }\n}\n\n// ── history (undo / redo) ────────────────────────────────────────────────────\n\nfunction useHistory(initial: MenuDesign) {\n const [state, setState] = useState({ past: [] as MenuDesign[], present: initial, future: [] as MenuDesign[] });\n const set = useCallback((next: MenuDesign | ((d: MenuDesign) => MenuDesign), opts?: { replace?: boolean }) => {\n setState((s) => {\n const value = typeof next === \"function\" ? next(s.present) : next;\n if (value === s.present) return s;\n if (opts?.replace) return { past: [], present: value, future: [] };\n return { past: [...s.past.slice(-99), s.present], present: value, future: [] };\n });\n }, []);\n const undo = useCallback(() => setState((s) => (s.past.length ? { past: s.past.slice(0, -1), present: s.past[s.past.length - 1] as MenuDesign, future: [s.present, ...s.future] } : s)), []);\n const redo = useCallback(() => setState((s) => (s.future.length ? { past: [...s.past, s.present], present: s.future[0] as MenuDesign, future: s.future.slice(1) } : s)), []);\n return { design: state.present, set, undo, redo, canUndo: state.past.length > 0, canRedo: state.future.length > 0 };\n}\n\n// ── the builder ──────────────────────────────────────────────────────────────\n\nexport function MenuBuilder({ store, storeLabel, initialDesign, accountSlot }: MenuBuilderProps) {\n const { design, set, undo, redo, canUndo, canRedo } = useHistory(initialDesign ?? readDraft() ?? emptyDesign());\n const [selected, setSelected] = useState<string | null>(null);\n const [versions, setVersions] = useState<SavedDesignVersion[] | null>(null);\n const [status, setStatus] = useState<{ tone: \"ok\" | \"error\" | \"info\"; text: string } | null>(null);\n const [saving, setSaving] = useState(false);\n const [note, setNote] = useState(\"\");\n const [lastSaved, setLastSaved] = useState<string | null>(null);\n\n const designRef = useRef(design);\n designRef.current = design;\n\n // keep the working copy in this browser\n useEffect(() => {\n try {\n globalThis.localStorage?.setItem(DRAFT_KEY, serializeDesign(design));\n } catch {\n /* storage blocked: nothing to keep */\n }\n }, [design]);\n\n const refresh = useCallback(async () => {\n try {\n const all = await store.list();\n setVersions(all);\n // The working copy equals a stored version → it is saved; otherwise it is not.\n const now = serializeDesign(designRef.current);\n setLastSaved(all.some((v) => serializeDesign(v.design) === now) ? now : null);\n } catch (e) {\n setStatus({ tone: \"error\", text: `Could not read saved designs: ${e instanceof Error ? e.message : String(e)}` });\n }\n }, [store]);\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const dirty = lastSaved !== serializeDesign(design);\n\n const save = async () => {\n setSaving(true);\n try {\n const saved = await store.save(design, note.trim());\n setLastSaved(serializeDesign(design));\n setNote(\"\");\n setStatus({ tone: \"ok\", text: `Saved “${saved.name}” v${saved.version}` });\n await refresh();\n } catch (e) {\n setStatus({ tone: \"error\", text: `Save failed: ${e instanceof Error ? e.message : String(e)}` });\n } finally {\n setSaving(false);\n }\n };\n\n // Opening a version is an ordinary edit: ⌘Z brings back whatever was on screen before.\n const open = (v: SavedDesignVersion) => {\n set(v.design);\n setLastSaved(serializeDesign(v.design));\n setSelected(null);\n setStatus({ tone: \"info\", text: `Opened “${v.name}” v${v.version}${dirty ? \" — ⌘Z brings back your unsaved changes\" : \"\"}` });\n };\n\n // structure edits\n const addNode = (node: MenuNode) => {\n set((d) => {\n const sel = selected ? locate(d.nodes, selected) : null;\n // An option clicked while a section or submenu is selected goes into it; a container goes after it.\n const nests = sel && isContainer(sel.node) && !isContainer(node);\n if (sel && nests && isContainer(sel.node)) return { ...d, nodes: insertNode(d.nodes, sel.node.id, sel.node.children.length, node) };\n if (sel) return { ...d, nodes: insertNode(d.nodes, sel.parentId, sel.index + 1, node) };\n return { ...d, nodes: [...d.nodes, node] };\n });\n setSelected(node.id);\n };\n\n const drop = (p: DragPayload, { id: targetId, pos }: Over) => {\n if (p.type === \"move\" && p.id === targetId) return;\n if (p.type === \"move\" && targetId) {\n const at = locate(design.nodes, targetId);\n const parentId = at ? (pos === \"inside\" && isContainer(at.node) ? at.node.id : at.parentId) : null;\n if (!canMove(design.nodes, p.id, parentId)) {\n setStatus({ tone: \"error\", text: \"Can't move a section or submenu inside itself\" });\n return;\n }\n }\n const fresh = p.type === \"move\" ? null : nodeFromPayload(p);\n set((d) => {\n let parentId: string | null = null;\n let index = d.nodes.length;\n if (targetId) {\n const at = locate(d.nodes, targetId);\n if (!at) return d;\n if (pos === \"inside\" && isContainer(at.node)) {\n parentId = at.node.id;\n index = at.node.children.length;\n } else {\n parentId = at.parentId;\n index = at.index + (pos === \"after\" ? 1 : 0);\n }\n }\n if (p.type === \"move\") return { ...d, nodes: moveNode(d.nodes, p.id, parentId, index) };\n return fresh ? { ...d, nodes: insertNode(d.nodes, parentId, index, fresh) } : d;\n });\n if (fresh) setSelected(fresh.id);\n else if (p.type === \"move\") setSelected(p.id);\n };\n const dnd = usePointerDrag(drop);\n\n const remove = (id: string) => {\n set((d) => ({ ...d, nodes: removeNode(d.nodes, id) }));\n if (selected === id) setSelected(null);\n };\n\n // keyboard\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const typing = e.target instanceof HTMLElement && /^(INPUT|TEXTAREA|SELECT)$/.test(e.target.tagName);\n const mod = e.metaKey || e.ctrlKey;\n if (mod && e.key.toLowerCase() === \"s\") {\n e.preventDefault();\n void save();\n return;\n }\n if (typing) return;\n if (mod && e.key.toLowerCase() === \"z\") {\n e.preventDefault();\n if (e.shiftKey) redo();\n else undo();\n } else if (mod && e.key.toLowerCase() === \"d\" && selected) {\n e.preventDefault();\n set((d) => ({ ...d, nodes: duplicateNode(d.nodes, selected) }));\n } else if ((e.key === \"Delete\" || e.key === \"Backspace\") && selected) {\n e.preventDefault();\n remove(selected);\n } else if (e.key === \"Escape\") setSelected(null);\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n });\n\n const selectedNode = selected ? locate(design.nodes, selected)?.node ?? null : null;\n const designs = useMemo(() => {\n const byId = new Map<string, SavedDesignVersion[]>();\n for (const v of versions ?? []) byId.set(v.designId, [...(byId.get(v.designId) ?? []), v]);\n return [...byId.values()];\n }, [versions]);\n\n return (\n <DesignContext.Provider value={design}>\n <div className=\"flex h-dvh flex-col bg-background text-foreground\">\n {/* top bar */}\n <header className=\"flex flex-wrap items-center gap-y-1 border-b border-border px-3 py-2\">\n <ControlRow className=\"min-w-0 flex-1\">\n <Field aria-label=\"Design name\" width=\"lg\" value={design.name} onChange={(e) => set((d) => ({ ...d, name: e.target.value }))} />\n <Select\n aria-label=\"Where this menu opens\"\n value={design.surface}\n options={SURFACE_OPTIONS}\n onValueChange={(surface) => set((d) => ({ ...d, surface }))}\n />\n <Badge>{countItems(design.nodes)} options</Badge>\n <Button variant=\"quiet\" icon={renderLucide(\"Undo2\")} aria-label=\"Undo (⌘Z)\" title=\"Undo (⌘Z)\" onClick={undo} disabled={!canUndo} />\n <Button variant=\"quiet\" icon={renderLucide(\"Redo2\")} aria-label=\"Redo (⇧⌘Z)\" title=\"Redo (⇧⌘Z)\" onClick={redo} disabled={!canRedo} />\n <Button\n variant=\"quiet\"\n icon={renderLucide(\"FilePlus2\")}\n onClick={() => {\n set(emptyDesign(), { replace: true });\n setLastSaved(null);\n setSelected(null);\n }}\n >\n New\n </Button>\n <Button\n variant=\"quiet\"\n icon={renderLucide(\"CopyPlus\")}\n title=\"Keep this menu as a separate design\"\n onClick={() => set((d) => ({ ...d, designId: newId(\"d\"), name: `${d.name} (copy)` }))}\n >\n Save as new design\n </Button>\n <Button\n variant=\"quiet\"\n icon={renderLucide(\"Braces\")}\n onClick={() => {\n void navigator.clipboard?.writeText(serializeDesign(design));\n setStatus({ tone: \"info\", text: \"Design JSON copied\" });\n }}\n >\n Copy JSON\n </Button>\n </ControlRow>\n <ControlRow>\n {accountSlot ?? <Badge>{storeLabel}</Badge>}\n <Field aria-label=\"Version note\" width=\"md\" placeholder=\"Version note\" value={note} onChange={(e) => setNote(e.target.value)} />\n <Button variant=\"primary\" icon={renderLucide(\"Save\")} meta=\"⌘S\" onClick={() => void save()} disabled={saving || !dirty}>\n {saving ? \"Saving…\" : dirty ? \"Save version\" : \"Saved\"}\n </Button>\n </ControlRow>\n </header>\n {status && (\n <div className={`border-b border-border px-3 py-1 text-xs ${status.tone === \"error\" ? \"text-destructive\" : \"text-muted-foreground\"}`}>{status.text}</div>\n )}\n\n <div className=\"grid min-h-0 flex-1 grid-cols-[minmax(200px,240px)_minmax(0,1fr)_minmax(0,1.1fr)]\">\n <Palette onAdd={addNode} startDrag={dnd.start} click={dnd.click} />\n <Structure\n nodes={design.nodes}\n selected={selected}\n onSelect={setSelected}\n startDrag={dnd.start}\n click={dnd.click}\n over={dnd.over}\n onRemove={remove}\n onDuplicate={(id) => set((d) => ({ ...d, nodes: duplicateNode(d.nodes, id) }))}\n onWrap={(id, kind) => set((d) => ({ ...d, nodes: wrapNode(d.nodes, id, kind) }))}\n onUnwrap={(id) => set((d) => ({ ...d, nodes: unwrapNode(d.nodes, id) }))}\n versions={versions === null ? null : designs}\n currentDesignId={design.designId}\n onOpen={open}\n onStart={(st) => {\n // A starting point opens as a NEW design of yours: saving never touches the starter.\n const copy = { ...st.design, designId: newId(\"d\") };\n set(copy);\n setLastSaved(null);\n setSelected(null);\n setStatus({ tone: \"info\", text: `Started from “${st.design.name}”${dirty ? \" — ⌘Z brings back your unsaved changes\" : \"\"}` });\n }}\n onArchive={(v) => {\n void store\n .remove(v.rowId)\n .then(refresh)\n .then(() => setStatus({ tone: \"info\", text: `Archived “${v.name}” v${v.version}` }))\n .catch((e: unknown) => setStatus({ tone: \"error\", text: `Archive failed: ${e instanceof Error ? e.message : String(e)}` }));\n }}\n />\n <aside className=\"flex min-h-0 min-w-0 flex-col overflow-x-hidden overflow-y-auto border-l border-border\">\n <Stage design={design} selected={selected} onSelect={setSelected} />\n {selectedNode ? (\n <Inspector\n key={selectedNode.id}\n node={selectedNode}\n onChange={(patch) => set((d) => ({ ...d, nodes: updateNode(d.nodes, selectedNode.id, patch) }))}\n />\n ) : (\n <Panel title=\"Notes for the build\">\n {/* ui-exception: ProTextarea lives in matrx-frontend; a package playground has only the package Textarea */}\n <Textarea\n aria-label=\"Notes for the build\"\n value={design.notes}\n onChange={(e) => set((d) => ({ ...d, notes: e.target.value }))}\n rows={4}\n autoGrow\n placeholder=\"Anything the builder of this menu should know\"\n />\n </Panel>\n )}\n <Look design={design} onChange={(look) => set((d) => ({ ...d, look }))} />\n </aside>\n </div>\n {dnd.ghost && (\n <div\n className=\"pointer-events-none fixed z-50 rounded-md border border-primary bg-popover px-2 py-1 text-sm shadow-lg\"\n style={{ left: dnd.ghost.x + 12, top: dnd.ghost.y + 8 }}\n >\n {dnd.ghost.label}\n </div>\n )}\n </div>\n </DesignContext.Provider>\n );\n}\n\n// ── pieces ───────────────────────────────────────────────────────────────────\n\nfunction Panel({ title, children, right }: { title: string; children: ReactNode; right?: ReactNode }) {\n return (\n <section className=\"border-b border-border p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <h2 className=\"type-meta uppercase\">{title}</h2>\n {right}\n </div>\n {children}\n </section>\n );\n}\n\nfunction Palette({ onAdd, startDrag, click }: { onAdd: (n: MenuNode) => void; startDrag: StartDrag; click: (fn: () => void) => () => void }) {\n const [q, setQ] = useState(\"\");\n const query = q.trim().toLowerCase();\n const shown = (c: CatalogOption) => !query || c.label.toLowerCase().includes(query) || c.id.toLowerCase().includes(query) || c.group.toLowerCase().includes(query);\n const add = (p: DragPayload) => {\n const n = nodeFromPayload(p);\n if (n) onAdd(n);\n };\n // Options already in the design: shaded, last in their group, with how many times — still addable.\n const design = useContext(DesignContext);\n const uses = useMemo(() => catalogUseCounts(design?.nodes ?? []), [design?.nodes]);\n const Option = ({ p, icon, label, end, dimmed }: { p: DragPayload; icon: string; label: string; end?: ReactNode; dimmed?: boolean }) => (\n <Tile\n layout=\"row\"\n variant=\"quiet\"\n icon={renderLucide(icon)}\n title={label}\n end={end}\n dimmed={dimmed === true}\n onPointerDown={(e) => startDrag(e, p, label)}\n onClick={click(() => add(p))}\n />\n );\n return (\n <aside className=\"flex min-h-0 flex-col border-r border-border\">\n <div className=\"border-b border-border p-2\">\n <SearchField aria-label=\"Search options\" placeholder=\"Search options\" value={q} onChange={(e) => setQ(e.target.value)} />\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-2\">\n {!query && (\n <>\n <RowGroup title=\"Building blocks\">\n <Option p={{ type: \"new\", kind: \"section\" }} icon=\"Rows3\" label=\"Section\" />\n <Option p={{ type: \"new\", kind: \"submenu\" }} icon=\"ChevronsRight\" label=\"Submenu\" />\n <Option p={{ type: \"new\", kind: \"divider\" }} icon=\"Minus\" label=\"Divider\" />\n <Option p={{ type: \"new\", kind: \"item\" }} icon=\"Plus\" label=\"Custom option\" />\n <Option p={{ type: \"new\", kind: \"slot-items\" }} icon=\"ListPlus\" label=\"Placeholder — items\" />\n <Option p={{ type: \"new\", kind: \"slot-menu\" }} icon=\"FolderPlus\" label=\"Placeholder — submenu\" />\n </RowGroup>\n <RowGroup title=\"Ready-made\">\n {TEMPLATES.map((t) => (\n <Option key={t.id} p={{ type: \"template\", id: t.id }} icon={t.icon} label={t.label} />\n ))}\n </RowGroup>\n </>\n )}\n {CATALOG_GROUPS.map((g) => {\n const matching = CATALOG.filter((c) => c.group === g && shown(c));\n const items = [...matching.filter((c) => !uses.has(c.id)), ...matching.filter((c) => uses.has(c.id))];\n if (items.length === 0) return null;\n return (\n <RowGroup key={g} title={g}>\n {items.map((c) => (\n <Option\n key={c.id}\n p={{ type: \"catalog\", id: c.id }}\n icon={c.icon}\n label={c.label}\n dimmed={uses.has(c.id)}\n {...(uses.has(c.id)\n ? { end: <Badge>{(uses.get(c.id) ?? 0) > 1 ? `used ×${uses.get(c.id)}` : \"used\"}</Badge> }\n : c.status === \"proposed\"\n ? { end: <Badge>new</Badge> }\n : {})}\n />\n ))}\n </RowGroup>\n );\n })}\n </div>\n </aside>\n );\n}\n\ninterface StructureProps {\n nodes: MenuNode[];\n selected: string | null;\n onSelect: (id: string | null) => void;\n startDrag: StartDrag;\n click: (fn: () => void) => () => void;\n over: Over | null;\n onRemove: (id: string) => void;\n onDuplicate: (id: string) => void;\n onWrap: (id: string, kind: \"section\" | \"submenu\") => void;\n onUnwrap: (id: string) => void;\n versions: SavedDesignVersion[][] | null;\n currentDesignId: string;\n onOpen: (v: SavedDesignVersion) => void;\n onArchive: (v: SavedDesignVersion) => void;\n onStart: (s: StarterDesign) => void;\n}\n\nfunction Structure(props: StructureProps) {\n const rootOver = props.over !== null && props.over.id === null;\n return (\n <main className=\"flex min-h-0 flex-col overflow-hidden\">\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-3 py-2\">\n <h2 className=\"type-meta shrink-0 uppercase\">Structure</h2>\n <span className=\"type-meta min-w-0 truncate\">Drag to reorder · drop on a section or submenu to nest</span>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-2\" onClick={(e) => e.target === e.currentTarget && props.onSelect(null)}>\n <Rows {...props} list={props.nodes} depth={0} />\n <div\n data-drop=\"root\"\n className={`mt-1 flex h-14 items-center justify-center rounded-md border border-dashed text-xs text-muted-foreground ${rootOver ? \"border-primary bg-primary/5\" : \"border-border\"}`}\n >\n {props.nodes.length === 0 ? \"Drag options here to start the menu\" : \"Drop here to add at the end\"}\n </div>\n </div>\n <Versions versions={props.versions} currentDesignId={props.currentDesignId} onOpen={props.onOpen} onArchive={props.onArchive} onStart={props.onStart} />\n </main>\n );\n}\n\nfunction Rows(props: StructureProps & { list: MenuNode[]; depth: number }) {\n const { list, depth, over, selected, onSelect, startDrag, click } = props;\n return (\n <>\n {list.map((node) => {\n const container = isContainer(node);\n const isOver = over?.id === node.id;\n const label =\n node.kind === \"divider\" ? \"──── divider ────\" : node.label || (node.kind === \"section\" ? \"(unlabelled section)\" : \"(no label)\");\n const icon =\n node.kind === \"item\" || node.kind === \"submenu\"\n ? node.icon\n : node.kind === \"slot\"\n ? node.icon ?? slotSource(node.fills)?.icon ?? \"Ellipsis\"\n : node.kind === \"section\"\n ? \"Rows3\"\n : \"Minus\";\n return (\n <div key={node.id}>\n <div\n data-drop={node.id}\n {...(container ? { \"data-container\": \"1\" } : {})}\n onPointerDown={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) return;\n startDrag(e, { type: \"move\", id: node.id }, label);\n }}\n onClick={click(() => onSelect(node.id))}\n style={{ marginLeft: depth * 18 }}\n className={[\n \"group relative flex h-8 cursor-grab touch-none items-center gap-2 rounded-md border px-2 text-sm\",\n selected === node.id ? \"border-primary bg-primary/5\" : \"border-transparent hover:bg-accent\",\n isOver && over?.pos === \"inside\" ? \"ring-2 ring-primary\" : \"\",\n container ? \"font-medium\" : \"\",\n ].join(\" \")}\n >\n {isOver && over?.pos === \"before\" && <span className=\"pointer-events-none absolute inset-x-0 -top-px h-0.5 rounded bg-primary\" />}\n {isOver && over?.pos === \"after\" && <span className=\"pointer-events-none absolute inset-x-0 -bottom-px h-0.5 rounded bg-primary\" />}\n <span className=\"text-muted-foreground\">⋮⋮</span>\n {icon && <span className=\"text-muted-foreground\">{renderLucide(icon, \"size-4\")}</span>}\n <span className={`min-w-0 flex-1 truncate ${node.kind === \"divider\" ? \"text-xs text-muted-foreground\" : \"\"}`}>{label}</span>\n {node.kind === \"submenu\" && <span className=\"text-[10px] text-muted-foreground\">submenu</span>}\n {node.kind === \"slot\" && <Badge>{node.shape === \"submenu\" ? \"placeholder submenu\" : \"placeholder\"}</Badge>}\n {node.kind === \"section\" && <span className=\"text-[10px] text-muted-foreground\">{node.layout && node.layout !== \"list\" ? `${node.layout} section` : \"section\"}</span>}\n {node.kind === \"item\" && node.shortcut && <kbd className=\"text-[10px] text-muted-foreground\">{node.shortcut}</kbd>}\n <span className=\"hidden items-center gap-0.5 group-hover:flex\">\n <RowAction title=\"Duplicate\" onClick={() => props.onDuplicate(node.id)} icon=\"CopyPlus\" />\n {container ? (\n <RowAction title=\"Unwrap (keep its options)\" onClick={() => props.onUnwrap(node.id)} icon=\"Ungroup\" />\n ) : (\n <>\n <RowAction title=\"Put in a new section\" onClick={() => props.onWrap(node.id, \"section\")} icon=\"Rows3\" />\n <RowAction title=\"Put in a new submenu\" onClick={() => props.onWrap(node.id, \"submenu\")} icon=\"ChevronsRight\" />\n </>\n )}\n <RowAction title=\"Delete\" onClick={() => props.onRemove(node.id)} icon=\"Trash2\" />\n </span>\n </div>\n {container && (\n <>\n {node.children.length === 0 ? (\n <div style={{ marginLeft: (depth + 1) * 18 }} className=\"my-0.5 rounded-md border border-dashed border-border px-2 py-1 text-[11px] text-muted-foreground\">\n Empty — drop options onto “{node.label || \"section\"}”\n </div>\n ) : (\n <Rows {...props} list={node.children} depth={depth + 1} />\n )}\n </>\n )}\n </div>\n );\n })}\n </>\n );\n}\n\nfunction RowAction({ title, onClick, icon }: { title: string; onClick: () => void; icon: string }) {\n return (\n <Button\n variant=\"quiet\"\n icon={renderLucide(icon)}\n aria-label={title}\n title={title}\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n />\n );\n}\n\nfunction Versions({\n versions,\n currentDesignId,\n onOpen,\n onArchive,\n onStart,\n}: {\n versions: SavedDesignVersion[][] | null;\n currentDesignId: string;\n onOpen: (v: SavedDesignVersion) => void;\n onArchive: (v: SavedDesignVersion) => void;\n onStart: (s: StarterDesign) => void;\n}) {\n const [openId, setOpenId] = useState<string | null>(null);\n const [startersOpen, setStartersOpen] = useState(false);\n return (\n <div className=\"max-h-[45%] min-h-0 overflow-y-auto border-t border-border p-2\">\n <DisclosureHeader open={startersOpen} onClick={() => setStartersOpen((o) => !o)} title=\"Starting points\" meta={`${STARTER_DESIGNS.length}`} />\n {startersOpen &&\n ([\"Live today\", \"Proposal\"] as const).map((group) => (\n <RowGroup key={group} title={group}>\n {STARTER_DESIGNS.filter((st) => st.group === group).map((st) => (\n <Tile key={st.id} layout=\"row\" variant=\"quiet\" icon={renderLucide(group === \"Live today\" ? \"Radio\" : \"Lightbulb\")} title={st.design.name} line={st.source} onClick={() => { onStart(st); setStartersOpen(false); }} />\n ))}\n </RowGroup>\n ))}\n <RowGroup title=\"Saved designs\">\n {versions === null && <RegionSkeleton shape=\"rows\" />}\n {versions?.length === 0 && <EmptyState icon={renderLucide(\"Save\")} title=\"Nothing saved yet\" line=\"⌘S saves a version\" />}\n {(versions ?? []).map((group) => {\n const latest = group[0] as SavedDesignVersion;\n const expanded = openId === latest.designId;\n return (\n <div key={latest.designId}>\n <DisclosureHeader\n open={expanded}\n onClick={() => setOpenId(expanded ? null : latest.designId)}\n title={latest.name}\n meta={`${group.length} version${group.length === 1 ? \"\" : \"s\"}${latest.designId === currentDesignId ? \" · open\" : \"\"}`}\n />\n {expanded &&\n group.map((v) => (\n <div key={v.rowId} className=\"flex items-center pl-5\">\n <Tile\n className=\"min-w-0 flex-1\"\n layout=\"row\"\n variant=\"quiet\"\n title={`v${v.version}${v.note ? ` — ${v.note}` : \"\"}`}\n line={v.savedAt ? new Date(v.savedAt).toLocaleString() : undefined}\n onClick={() => onOpen(v)}\n />\n <RowAction title=\"Archive this version\" onClick={() => onArchive(v)} icon=\"Archive\" />\n </div>\n ))}\n </div>\n );\n })}\n </RowGroup>\n </div>\n );\n}\n\nfunction Stage({ design, selected, onSelect }: { design: MenuDesign; selected: string | null; onSelect: (id: string) => void }) {\n const [at, setAt] = useState<{ x: number; y: number } | null>(null);\n const [picked, setPicked] = useState<string | null>(null);\n const ref = useRef<HTMLDivElement>(null);\n return (\n <Panel title=\"Live menu\" right={<span className=\"text-[11px] text-muted-foreground\">Right-click the grey area to open it there</span>}>\n <div\n ref={ref}\n onContextMenu={(e) => {\n e.preventDefault();\n const r = ref.current?.getBoundingClientRect();\n // Open at the pointer, kept inside the stage the way a real menu flips at a screen edge.\n if (r) setAt({ x: Math.max(8, Math.min(e.clientX - r.left, r.width - design.look.width - 8)), y: Math.max(8, Math.min(e.clientY - r.top, r.height - (ref.current?.querySelector(\".cm-menu\")?.getBoundingClientRect().height ?? 160) - 8)) });\n }}\n onClick={(e) => {\n if (e.target === e.currentTarget) setAt(null);\n }}\n data-menu-bounds=\"\"\n className=\"relative min-h-[300px] overflow-visible rounded-lg bg-muted/60 p-4\"\n >\n {at ? (\n <MenuPreview\n design={design}\n renderIcon={renderLucide}\n highlightId={selected}\n onSelectNode={onSelect}\n onPick={(i) => setPicked(i.label)}\n style={{ position: \"absolute\", left: at.x, top: at.y, zIndex: 20 }}\n />\n ) : (\n <MenuPreview design={design} renderIcon={renderLucide} highlightId={selected} onSelectNode={onSelect} onPick={(i) => setPicked(i.label)} />\n )}\n {picked && <div className=\"absolute right-3 bottom-2 text-xs text-muted-foreground\">Picked: {picked}</div>}\n </div>\n </Panel>\n );\n}\n\nconst DENSITY_OPTIONS = [\n { value: \"comfortable\", label: \"Comfortable\" },\n { value: \"compact\", label: \"Compact\" },\n] as const;\n\nfunction Look({ design, onChange }: { design: MenuDesign; onChange: (look: MenuDesign[\"look\"]) => void }) {\n const look = design.look;\n const toggle = (k: \"showIcons\" | \"showShortcuts\" | \"showHints\" | \"search\", label: string) => (\n <SettingRow label={label}>\n <Switch aria-label={label} checked={look[k]} onCheckedChange={(v) => onChange({ ...look, [k]: v })} />\n </SettingRow>\n );\n return (\n <Panel title=\"Look\" right={<Button variant=\"quiet\" onClick={() => onChange({ ...DEFAULT_LOOK })}>Reset</Button>}>\n <SettingRow label=\"Density\">\n <SegmentedControl aria-label=\"Density\" value={look.density} data={DENSITY_OPTIONS} onValueChange={(density) => onChange({ ...look, density })} />\n </SettingRow>\n <SettingRow label=\"Width\">\n <NumberStepper value={look.width} min={180} max={420} step={10} onChange={(width) => onChange({ ...look, width })} />\n </SettingRow>\n {toggle(\"showIcons\", \"Icons\")}\n {toggle(\"showShortcuts\", \"Shortcuts\")}\n {toggle(\"showHints\", \"Hints\")}\n {toggle(\"search\", \"Search box\")}\n </Panel>\n );\n}\n\nconst LAYOUT_OPTIONS = [\n { value: \"list\", label: \"List\" },\n { value: \"row\", label: \"Icon row\" },\n { value: \"grid\", label: \"Icon grid\" },\n] as const;\n\nconst FLAGS = [\n [\"ai\", \"AI\"],\n [\"danger\", \"Destructive\"],\n [\"toggle\", \"Checkbox\"],\n [\"disabled\", \"Disabled\"],\n] as const;\n\nfunction Inspector({ node, onChange }: { node: MenuNode; onChange: (patch: Partial<MenuNode>) => void }) {\n const catalog = node.catalogId ? catalogOption(node.catalogId) : undefined;\n return (\n <Panel title={`Selected ${node.kind === \"slot\" ? \"placeholder\" : node.kind}`} right={catalog ? <Badge>{catalog.id}</Badge> : undefined}>\n {node.kind === \"divider\" ? (\n <p className=\"type-secondary\">A divider has no settings.</p>\n ) : (\n <>\n <Labelled label=\"Label\">\n <Field aria-label=\"Label\" value={node.label} onChange={(e) => onChange({ label: e.target.value } as Partial<MenuNode>)} />\n </Labelled>\n {node.kind === \"slot\" && <SlotSettings node={node} onChange={onChange} />}\n {(node.kind === \"item\" || node.kind === \"submenu\") && (\n <>\n <Labelled label=\"Icon\">\n <IconPicker value={node.icon ?? \"\"} onChange={(icon) => onChange({ icon } as Partial<MenuNode>)} />\n </Labelled>\n <Labelled label=\"Hint\">\n <Field aria-label=\"Hint\" value={node.hint ?? \"\"} onChange={(e) => onChange({ hint: e.target.value } as Partial<MenuNode>)} />\n </Labelled>\n </>\n )}\n {node.kind === \"item\" && (\n <>\n <Labelled label=\"Shortcut\">\n <Field aria-label=\"Shortcut\" value={node.shortcut ?? \"\"} placeholder=\"⌘K\" onChange={(e) => onChange({ shortcut: e.target.value } as Partial<MenuItemNode>)} />\n </Labelled>\n {FLAGS.map(([k, label]) => (\n <SettingRow key={k} label={label}>\n <Switch aria-label={label} checked={Boolean(node[k])} onCheckedChange={(v) => onChange({ [k]: v } as Partial<MenuItemNode>)} />\n </SettingRow>\n ))}\n </>\n )}\n {node.kind === \"section\" && (\n <>\n <SettingRow label=\"Layout\">\n <SegmentedControl aria-label=\"Layout\" value={node.layout ?? \"list\"} data={LAYOUT_OPTIONS} onValueChange={(layout) => onChange({ layout } as Partial<MenuNode>)} />\n </SettingRow>\n <SettingRow label=\"Starts folded\">\n <Switch aria-label=\"Starts folded\" checked={Boolean(node.collapsible)} onCheckedChange={(v) => onChange({ collapsible: v } as Partial<MenuNode>)} />\n </SettingRow>\n </>\n )}\n </>\n )}\n <Labelled label=\"Note for the build\">\n {/* ui-exception: ProTextarea lives in matrx-frontend; a package playground has only the package Textarea */}\n <Textarea aria-label=\"Note for the build\" rows={2} autoGrow value={node.note ?? \"\"} onChange={(e) => onChange({ note: e.target.value })} />\n </Labelled>\n </Panel>\n );\n}\n\nconst SLOT_SHAPES = [\n { value: \"items\", label: \"Rows here\" },\n { value: \"submenu\", label: \"One submenu\" },\n] as const;\n\nconst SLOT_OPTIONS = SLOT_SOURCES.map((src) => ({ value: src.id, label: src.label }));\n\n/** A placeholder's settings: what it holds, how, and what the rest of the design leaves for it. */\nfunction SlotSettings({ node, onChange }: { node: Extract<MenuNode, { kind: \"slot\" }>; onChange: (patch: Partial<MenuNode>) => void }) {\n const source = slotSource(node.fills);\n return (\n <>\n <Labelled label=\"Holds\">\n <Select\n aria-label=\"What this placeholder holds\"\n value={node.fills}\n options={SLOT_OPTIONS}\n onValueChange={(fills) => {\n // Keep a hand-written label; replace only the previous source's own wording.\n const relabel = !node.label || node.label === source?.phrase || node.label === \"Everything else\" || node.label === \"More\";\n onChange({ fills, ...(relabel ? { label: slotSource(fills)?.phrase ?? node.label } : {}) } as Partial<MenuNode>);\n }}\n />\n </Labelled>\n <SettingRow label=\"Shows as\">\n <SegmentedControl aria-label=\"Shows as\" value={node.shape} data={SLOT_SHAPES} onValueChange={(shape) => onChange({ shape } as Partial<MenuNode>)} />\n </SettingRow>\n <SlotContents fills={node.fills} />\n </>\n );\n}\n\nfunction SlotContents({ fills }: { fills: string }) {\n const source = slotSource(fills);\n const design = useContext(DesignContext);\n const left = useMemo(() => (design ? slotOptions(fills, placedCatalogIds(design.nodes)) : []), [design, fills]);\n if (source?.runtime) return <p className=\"type-secondary mt-2\">Filled by the live menu at runtime.</p>;\n return (\n <p className=\"type-secondary mt-2\">\n {left.length === 0 ? \"Nothing left — every option of this kind is already placed.\" : `Holds ${left.length}: ${left.slice(0, 6).map((o) => o.label).join(\", \")}${left.length > 6 ? \"…\" : \"\"}`}\n </p>\n );\n}\n\nfunction Labelled({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"mt-2 grid gap-1\">\n <span className=\"type-meta\">{label}</span>\n {children}\n </div>\n );\n}\n\nfunction IconPicker({ value, onChange }: { value: string; onChange: (v: string) => void }) {\n const [q, setQ] = useState(\"\");\n const [open, setOpen] = useState(false);\n const shown = useMemo(() => {\n const s = q.trim().toLowerCase();\n return (s ? ICON_NAMES.filter((n) => n.toLowerCase().includes(s)) : ICON_NAMES).slice(0, 96);\n }, [q]);\n return (\n <div className=\"relative\">\n <Button\n variant=\"outline\"\n icon={value ? renderLucide(value) : undefined}\n iconEnd={renderLucide(\"ChevronDown\")}\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n {value || \"No icon\"}\n </Button>\n {open && (\n <div className=\"absolute z-30 mt-1 w-full rounded-md border border-border bg-popover p-2 shadow-lg\">\n <SearchField autoFocus aria-label=\"Search icons\" placeholder={`Search ${ICON_NAMES.length} icons`} value={q} onChange={(e) => setQ(e.target.value)} />\n <div className=\"mt-2 grid max-h-56 grid-cols-8 overflow-y-auto\">\n <Button variant=\"quiet\" icon={renderLucide(\"Ban\")} aria-label=\"No icon\" title=\"No icon\" pressed={!value} onClick={() => { onChange(\"\"); setOpen(false); }} />\n {shown.map((n) => (\n <Button\n key={n}\n variant=\"quiet\"\n icon={renderLucide(n)}\n aria-label={n}\n title={n}\n pressed={n === value}\n onClick={() => {\n onChange(n);\n setOpen(false);\n }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","// src/design/catalog.ts — @ai-matrx/context-menu: EVERY OPTION A MENU CAN OFFER, as a palette.\n//\n// The builder's left column. Each entry is something the live menu shows somewhere today, taken\n// from the real menu's own lists in matrx-frontend (features/context-menu-v3):\n// - regroup/engine-rows.ts → the engine rows (`cm:*`)\n// - regroup/proposed-grouping.ts → the 13 \"grouped by what you get\" groups and their rules\n// - proposed/proposed-arrangement.ts → the three icon strips and the object-first submenus\n// - the page rows the demos show (notes, quiz row, table row, chat message)\n// Ids are the live menu's ids wherever one exists, so a saved design names the real row.\n// When the menu source moves into this package, this list is generated from it instead.\n\nimport type { MenuNode } from \"./model\";\n\nexport type CatalogGroup =\n | \"Clipboard\"\n | \"Edit\"\n | \"AI\"\n | \"Save & export\"\n | \"Share & publish\"\n | \"Organize\"\n | \"History & compare\"\n | \"Listen\"\n | \"Page: notes\"\n | \"Page: record\"\n | \"Page: chat message\"\n | \"Tools & admin\";\n\nexport interface CatalogOption {\n /** The live menu's id where one exists (`cm:copy`), else this catalog's own. */\n id: string;\n label: string;\n icon: string;\n group: CatalogGroup;\n shortcut?: string;\n hint?: string;\n danger?: boolean;\n ai?: boolean;\n /** \"Live\" = drawn by today's menu; \"Proposed\" = only in a proposal page so far. */\n status: \"live\" | \"proposed\";\n}\n\nconst o = (\n id: string,\n label: string,\n icon: string,\n group: CatalogGroup,\n extra: Partial<Omit<CatalogOption, \"id\" | \"label\" | \"icon\" | \"group\">> = {},\n): CatalogOption => ({ id, label, icon, group, status: \"live\", ...extra });\n\nexport const CATALOG: readonly CatalogOption[] = [\n // Clipboard — the verb strip\n o(\"cm:copy\", \"Copy\", \"Copy\", \"Clipboard\", { shortcut: \"⌘C\" }),\n o(\"cm:cut\", \"Cut\", \"Scissors\", \"Clipboard\", { shortcut: \"⌘X\" }),\n o(\"cm:paste\", \"Paste\", \"ClipboardPaste\", \"Clipboard\", { shortcut: \"⌘V\" }),\n o(\"cm:undo\", \"Undo\", \"Undo2\", \"Clipboard\", { shortcut: \"⌘Z\" }),\n o(\"cm:redo\", \"Redo\", \"Redo2\", \"Clipboard\", { shortcut: \"⇧⌘Z\" }),\n o(\"cm:find\", \"Find & Replace\", \"Search\", \"Clipboard\", { shortcut: \"⌘F\" }),\n o(\"cm:select-all\", \"Select All\", \"TextSelect\", \"Clipboard\", { shortcut: \"⌘A\" }),\n o(\"cm:copy-as\", \"Copy as…\", \"CopyPlus\", \"Clipboard\"),\n o(\"cm:json\", \"Copy as JSON\", \"Braces\", \"Clipboard\"),\n o(\"copy-html-page\", \"Copy as HTML page\", \"FileCode\", \"Clipboard\"),\n o(\"cm:insert-reference\", \"Insert / Copy reference…\", \"AtSign\", \"Clipboard\"),\n\n // Edit\n o(\"cm:save\", \"Save\", \"Save\", \"Edit\", { shortcut: \"⌘S\" }),\n o(\"duplicate\", \"Duplicate\", \"CopyPlus\", \"Edit\"),\n o(\"rename\", \"Rename\", \"PenLine\", \"Edit\"),\n o(\"edit\", \"Edit\", \"Pencil\", \"Edit\"),\n o(\"favorite\", \"Add to favorites\", \"Star\", \"Edit\"),\n o(\"archive\", \"Archive\", \"Archive\", \"Edit\", { danger: true }),\n o(\"cm:delete\", \"Delete\", \"Trash2\", \"Edit\", { danger: true }),\n\n // AI\n o(\"cm:chat\", \"Chat about this\", \"MessageSquare\", \"AI\", { ai: true }),\n o(\"cm:quick-actions\", \"Quick Actions\", \"Zap\", \"AI\", { ai: true }),\n o(\"cm:placement:ai-action\", \"AI Actions\", \"Sparkles\", \"AI\", { ai: true }),\n o(\"cm:placement:content-block\", \"Content blocks\", \"Blocks\", \"AI\", { ai: true }),\n o(\"cm:placement:organization-tool\", \"Org Items\", \"Building2\", \"AI\", { ai: true }),\n o(\"cm:placement:user-tool\", \"My Items\", \"User\", \"AI\", { ai: true }),\n o(\"cm:placement:quick-action\", \"Quick actions (placement)\", \"Zap\", \"AI\", { ai: true }),\n o(\"cm:placement:bound-agent\", \"Agents\", \"Bot\", \"AI\", { ai: true }),\n o(\"send-to-agent\", \"Send to agent…\", \"Send\", \"AI\", { ai: true }),\n o(\"continue-in-chat\", \"Continue in chat\", \"MessagesSquare\", \"AI\", { ai: true }),\n o(\"regenerate-response\", \"Regenerate\", \"RefreshCw\", \"AI\", { ai: true }),\n o(\"code-block-chart\", \"Make a chart\", \"ChartColumn\", \"AI\", { ai: true }),\n o(\"ai-improve\", \"Improve writing\", \"Wand2\", \"AI\", { ai: true, status: \"proposed\" }),\n o(\"ai-summarize\", \"Summarize\", \"ListCollapse\", \"AI\", { ai: true, status: \"proposed\" }),\n o(\"ai-explain\", \"Explain\", \"Lightbulb\", \"AI\", { ai: true, status: \"proposed\" }),\n o(\"ai-translate\", \"Translate…\", \"Languages\", \"AI\", { ai: true, status: \"proposed\" }),\n\n // Save & export\n o(\"cm:export\", \"Export\", \"FileOutput\", \"Save & export\"),\n o(\"cm:convert\", \"Convert to…\", \"ArrowRightLeft\", \"Save & export\"),\n o(\"save-as-file\", \"Save as file\", \"FileDown\", \"Save & export\"),\n o(\"download-pdf\", \"Download PDF\", \"FileText\", \"Save & export\"),\n o(\"download-docx\", \"Download Word\", \"FileType\", \"Save & export\"),\n o(\"download-html\", \"Download HTML\", \"FileCode2\", \"Save & export\"),\n o(\"print\", \"Print\", \"Printer\", \"Save & export\", { shortcut: \"⌘P\" }),\n\n // Share & publish\n o(\"cm:share\", \"Share…\", \"Share2\", \"Share & publish\"),\n o(\"share-link\", \"Copy share link\", \"Link\", \"Share & publish\"),\n o(\"send-google-doc\", \"Send to Google Docs\", \"FileUp\", \"Share & publish\"),\n o(\"email-to-me\", \"Email to me\", \"Mail\", \"Share & publish\"),\n o(\"html-preview\", \"Preview as web page\", \"Eye\", \"Share & publish\"),\n o(\"share-webpage\", \"Publish as web page\", \"Globe\", \"Share & publish\"),\n\n // Organize\n o(\"cm:attach\", \"Attach to…\", \"Paperclip\", \"Organize\"),\n o(\"set-context-value\", \"Set as context\", \"Pin\", \"Organize\"),\n o(\"pin-message\", \"Pin\", \"Pin\", \"Organize\"),\n o(\"notes-and-comments\", \"Notes & comments\", \"StickyNote\", \"Organize\"),\n o(\"move\", \"Move to folder…\", \"FolderInput\", \"Organize\"),\n o(\"tags\", \"Tags…\", \"Tags\", \"Organize\"),\n\n // History & compare\n o(\"cm:view-history\", \"View history\", \"History\", \"History & compare\"),\n o(\"edit-history\", \"Edit history\", \"GitCommitVertical\", \"History & compare\"),\n o(\"fork-at-message\", \"Fork from here\", \"GitBranch\", \"History & compare\"),\n o(\"cm:compare\", \"Compare…\", \"GitCompareArrows\", \"History & compare\"),\n o(\"compare-with-clipboard\", \"Compare with clipboard\", \"ClipboardList\", \"History & compare\"),\n o(\"set-compare-base\", \"Set as compare base\", \"Flag\", \"History & compare\"),\n\n // Listen\n o(\"cm:speak\", \"Read aloud\", \"Volume2\", \"Listen\"),\n o(\"cm:listen\", \"Dictate\", \"Mic\", \"Listen\"),\n o(\"tts-voice-settings\", \"Voice settings\", \"AudioLines\", \"Listen\"),\n\n // Page rows: notes\n o(\"notes:close-tab\", \"Close tab\", \"X\", \"Page: notes\"),\n o(\"notes:close-others\", \"Close other tabs\", \"PanelTopClose\", \"Page: notes\"),\n o(\"notes:export-md\", \"Export as Markdown\", \"FileDown\", \"Page: notes\"),\n o(\"notes:share-clipboard\", \"Copy to clipboard\", \"ClipboardCopy\", \"Page: notes\"),\n o(\"notes:convert-artifacts\", \"Convert to artifacts\", \"Shapes\", \"Page: notes\"),\n o(\"notes:trash\", \"Move to Trash\", \"Trash2\", \"Page: notes\", { danger: true }),\n\n // Page rows: a record (quiz row, table row)\n o(\"row:open\", \"Open\", \"SquareArrowOutUpRight\", \"Page: record\"),\n o(\"row:open-tab\", \"Open in new tab\", \"ExternalLink\", \"Page: record\"),\n o(\"row:take\", \"Take\", \"Play\", \"Page: record\"),\n o(\"row:results\", \"Results\", \"ChartBar\", \"Page: record\"),\n o(\"row:manage\", \"Manage\", \"Settings2\", \"Page: record\"),\n o(\"row:restore\", \"Restore\", \"ArchiveRestore\", \"Page: record\"),\n\n // Page rows: chat message\n o(\"regenerate-latest\", \"Regenerate latest\", \"RotateCcw\", \"Page: chat message\", { ai: true }),\n o(\"fork-and-regenerate\", \"Fork and regenerate\", \"GitFork\", \"Page: chat message\", { ai: true }),\n o(\"feedback-up\", \"Good response\", \"ThumbsUp\", \"Page: chat message\"),\n o(\"feedback-down\", \"Bad response\", \"ThumbsDown\", \"Page: chat message\"),\n\n // Tools & admin\n o(\"cm:x:surface\", \"This page (location, context, agents)\", \"MapPin\", \"Tools & admin\"),\n o(\"cm:admin\", \"Admin tools\", \"Shield\", \"Tools & admin\"),\n o(\"feedback\", \"Send feedback\", \"MessageSquareWarning\", \"Tools & admin\"),\n o(\"keyboard-shortcuts\", \"Keyboard shortcuts\", \"Keyboard\", \"Tools & admin\", { status: \"proposed\" }),\n];\n\nexport const CATALOG_GROUPS: readonly CatalogGroup[] = [...new Set(CATALOG.map((c) => c.group))];\n\nexport function catalogOption(id: string): CatalogOption | undefined {\n return CATALOG.find((c) => c.id === id);\n}\n\n/** Ready-made pieces: dropping one inserts the whole block. */\nexport interface CatalogTemplate {\n id: string;\n label: string;\n icon: string;\n build: () => MenuNode;\n}\n\nlet seq = 0;\nconst tid = (p: string) => `${p}_t${Date.now().toString(36)}${(seq++).toString(36)}`;\n\nfunction itemFrom(id: string): MenuNode {\n const c = catalogOption(id);\n return {\n id: tid(\"i\"),\n kind: \"item\",\n catalogId: id,\n label: c?.label ?? id,\n icon: c?.icon ?? \"Circle\",\n ...(c?.shortcut ? { shortcut: c.shortcut } : {}),\n ...(c?.danger ? { danger: true } : {}),\n ...(c?.ai ? { ai: true } : {}),\n };\n}\n\nconst strip = (label: string, ids: string[]): MenuNode => ({\n id: tid(\"s\"),\n kind: \"section\",\n label,\n layout: \"row\",\n children: ids.map(itemFrom),\n});\n\nconst sub = (label: string, icon: string, ids: string[]): MenuNode => ({\n id: tid(\"m\"),\n kind: \"submenu\",\n label,\n icon,\n children: ids.map(itemFrom),\n});\n\nexport const TEMPLATES: readonly CatalogTemplate[] = [\n { id: \"strip-thing\", label: \"Icon strip — a thing\", icon: \"Rows2\", build: () => strip(\"\", [\"cm:copy\", \"cm:share\", \"duplicate\", \"favorite\", \"save-as-file\", \"archive\"]) },\n { id: \"strip-edit\", label: \"Icon strip — editable text\", icon: \"Rows2\", build: () => strip(\"\", [\"cm:cut\", \"cm:copy\", \"cm:paste\", \"cm:undo\", \"cm:redo\", \"cm:find\"]) },\n { id: \"strip-read\", label: \"Icon strip — read-only text\", icon: \"Rows2\", build: () => strip(\"\", [\"cm:copy\", \"cm:speak\", \"cm:find\", \"cm:share\"]) },\n { id: \"sub-intelligence\", label: \"Intelligence ▸\", icon: \"Sparkles\", build: () => sub(\"Intelligence\", \"Sparkles\", [\"cm:chat\", \"cm:placement:ai-action\", \"cm:placement:bound-agent\", \"send-to-agent\"]) },\n { id: \"sub-save-share\", label: \"Save & share ▸\", icon: \"Share2\", build: () => sub(\"Save & share\", \"Share2\", [\"cm:copy-as\", \"save-as-file\", \"cm:convert\", \"share-webpage\", \"cm:share\"]) },\n { id: \"sub-organize\", label: \"Organize ▸\", icon: \"Tags\", build: () => sub(\"Organize\", \"Tags\", [\"cm:attach\", \"pin-message\", \"cm:view-history\", \"cm:compare\"]) },\n { id: \"sub-tools\", label: \"Tools ▸\", icon: \"Wrench\", build: () => sub(\"Tools\", \"Wrench\", [\"cm:speak\", \"cm:quick-actions\", \"feedback\", \"cm:x:surface\", \"cm:admin\"]) },\n];\n\n// ── placeholders ─────────────────────────────────────────────────────────────\n\n/** What a placeholder can hold. A catalog group holds that group's options the design has not placed. */\nexport interface SlotSource {\n id: string;\n label: string;\n /** The default placeholder wording (\"All other AI items\"). */\n phrase: string;\n icon: string;\n /** Filled by the live menu from data (agents, a page's own rows) — the preview cannot list them. */\n runtime?: boolean;\n}\n\nexport const SLOT_SOURCES: readonly SlotSource[] = [\n { id: \"any\", label: \"Everything not placed\", phrase: \"Everything else\", icon: \"Ellipsis\" },\n { id: \"agents\", label: \"Agents & shortcuts (library)\", phrase: \"All other agents\", icon: \"Bot\", runtime: true },\n { id: \"page-rows\", label: \"This page's own rows\", phrase: \"All of this page's actions\", icon: \"PanelTop\", runtime: true },\n ...CATALOG_GROUPS.map((g) => ({\n id: `group:${g}`,\n label: g,\n phrase: g === \"AI\" ? \"All other AI items\" : `All other ${g.toLowerCase()} options`,\n icon: CATALOG.find((c) => c.group === g)?.icon ?? \"Circle\",\n })),\n];\n\nexport function slotSource(id: string): SlotSource | undefined {\n return SLOT_SOURCES.find((s) => s.id === id);\n}\n\n/** The catalog options a placeholder stands for: its kind, minus every option the design already places. */\nexport function slotOptions(fills: string, placed: ReadonlySet<string>): CatalogOption[] {\n if (fills === \"agents\" || fills === \"page-rows\") return [];\n const pool = fills === \"any\" ? CATALOG : CATALOG.filter((c) => `group:${c.group}` === fills);\n return pool.filter((c) => !placed.has(c.id));\n}\n","// src/design/MenuPreview.tsx — @ai-matrx/context-menu: DRAWS A DESIGN AS THE MENU IT DESCRIBES.\n//\n// The same component draws the builder's live preview and the right-click test menu, so what the\n// designer sees is what opens. Icons come from the host (`renderIcon`), so this file has no icon set.\n\nimport { useMemo, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { slotOptions, slotSource } from \"./catalog\";\nimport { isContainer, placedCatalogIds, type MenuDesign, type MenuItemNode, type MenuNode, type MenuSlotNode, type MenuSubmenuNode } from \"./model\";\n\nexport interface MenuPreviewProps {\n design: MenuDesign;\n renderIcon: (name: string, className?: string) => ReactNode;\n /** The entry highlighted as \"selected in the builder\". */\n highlightId?: string | null;\n /** A click on any entry. */\n onSelectNode?: (id: string) => void;\n /** A click on an item (the menu's action). */\n onPick?: (item: MenuItemNode) => void;\n className?: string;\n style?: CSSProperties;\n}\n\nfunction matches(node: MenuNode, q: string): boolean {\n if (!q) return true;\n if (node.kind === \"divider\") return false;\n if (node.kind === \"item\" || node.kind === \"slot\") return node.label.toLowerCase().includes(q);\n return node.label.toLowerCase().includes(q) || node.children.some((c) => matches(c, q));\n}\n\n/** While searching: one flat list of matching items, the way a command palette reads. */\nfunction flatten(nodes: readonly MenuNode[], q: string, out: MenuItemNode[] = []): MenuItemNode[] {\n for (const n of nodes) {\n if (n.kind === \"item\" && matches(n, q)) out.push(n);\n else if (isContainer(n)) flatten(n.children, q, out);\n }\n return out;\n}\n\nexport function MenuPreview({ design, renderIcon, highlightId, onSelectNode, onPick, className, style }: MenuPreviewProps) {\n const [query, setQuery] = useState(\"\");\n const q = query.trim().toLowerCase();\n const { look } = design;\n const results = useMemo(() => (q ? flatten(design.nodes, q) : null), [design.nodes, q]);\n const placed = useMemo(() => placedCatalogIds(design.nodes), [design.nodes]);\n const ctx: Ctx = { design, renderIcon, highlightId, onSelectNode, onPick, placed };\n\n return (\n <div\n role=\"menu\"\n data-density={look.density}\n className={`cm-menu ${className ?? \"\"}`}\n style={{ width: look.width, ...style }}\n >\n {look.search && (\n <div className=\"cm-search\">\n {renderIcon(\"Search\", \"cm-icon\")}\n {/* ui-exception: the menu's own filter row — this file IS the menu component */}\n <input value={query} onChange={(e) => setQuery(e.target.value)} placeholder=\"Type to filter…\" aria-label=\"Filter menu\" />\n </div>\n )}\n {results ? (\n results.length === 0 ? (\n <div className=\"cm-empty\">No matches</div>\n ) : (\n results.map((n) => <Item key={n.id} node={n} ctx={ctx} />)\n )\n ) : design.nodes.length === 0 ? (\n <div className=\"cm-empty\">Empty menu — drag options in</div>\n ) : (\n <Nodes nodes={design.nodes} ctx={ctx} />\n )}\n </div>\n );\n}\n\ninterface Ctx {\n design: MenuDesign;\n renderIcon: MenuPreviewProps[\"renderIcon\"];\n highlightId: string | null | undefined;\n onSelectNode: MenuPreviewProps[\"onSelectNode\"];\n onPick: MenuPreviewProps[\"onPick\"];\n /** Catalog options the design places — a placeholder holds the rest. */\n placed: ReadonlySet<string>;\n}\n\nfunction Nodes({ nodes, ctx }: { nodes: readonly MenuNode[]; ctx: Ctx }) {\n return (\n <>\n {nodes.map((n) => {\n if (n.kind === \"divider\") return <div key={n.id} role=\"separator\" className=\"cm-divider\" />;\n if (n.kind === \"item\") return <Item key={n.id} node={n} ctx={ctx} />;\n if (n.kind === \"submenu\") return <Submenu key={n.id} node={n} ctx={ctx} />;\n if (n.kind === \"slot\") return <Slot key={n.id} node={n} ctx={ctx} />;\n return <Section key={n.id} node={n} ctx={ctx} />;\n })}\n </>\n );\n}\n\nfunction Section({ node, ctx }: { node: Extract<MenuNode, { kind: \"section\" }>; ctx: Ctx }) {\n const [open, setOpen] = useState(!node.collapsible);\n const layout = node.layout ?? \"list\";\n return (\n <div className={`cm-section ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`} data-layout={layout}>\n {node.label && (\n // ui-exception: a menu row of the menu component itself\n <button\n type=\"button\"\n className=\"cm-section-label\"\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n if (node.collapsible) setOpen((o) => !o);\n }}\n >\n {node.label}\n {node.collapsible && <span className=\"cm-caret\">{open ? \"▾\" : \"▸\"}</span>}\n </button>\n )}\n {open && (\n <div className=\"cm-section-body\">\n {layout === \"list\" ? (\n <Nodes nodes={node.children} ctx={ctx} />\n ) : (\n node.children.map((c) =>\n c.kind === \"item\" ? <Tile key={c.id} node={c} ctx={ctx} /> : <Nodes key={c.id} nodes={[c]} ctx={ctx} />,\n )\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction Tile({ node, ctx }: { node: MenuItemNode; ctx: Ctx }) {\n return (\n // ui-exception: a menu row of the menu component itself\n <button\n type=\"button\"\n role=\"menuitem\"\n title={node.label + (node.shortcut ? ` ${node.shortcut}` : \"\")}\n disabled={node.disabled}\n className={`cm-tile ${node.danger ? \"cm-danger\" : \"\"} ${node.ai ? \"cm-ai\" : \"\"} ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`}\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n ctx.onPick?.(node);\n }}\n >\n {ctx.renderIcon(node.icon ?? \"Circle\", \"cm-icon\")}\n </button>\n );\n}\n\nfunction Item({ node, ctx }: { node: MenuItemNode; ctx: Ctx }) {\n const { look } = ctx.design;\n const [checked, setChecked] = useState(false);\n return (\n // ui-exception: a menu row of the menu component itself\n <button\n type=\"button\"\n role={node.toggle ? \"menuitemcheckbox\" : \"menuitem\"}\n aria-checked={node.toggle ? checked : undefined}\n disabled={node.disabled}\n className={`cm-item ${node.danger ? \"cm-danger\" : \"\"} ${node.ai ? \"cm-ai\" : \"\"} ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`}\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n if (node.toggle) setChecked((c) => !c);\n ctx.onPick?.(node);\n }}\n >\n {look.showIcons && <span className=\"cm-icon-slot\">{node.toggle ? (checked ? ctx.renderIcon(\"Check\", \"cm-icon\") : null) : node.icon ? ctx.renderIcon(node.icon, \"cm-icon\") : null}</span>}\n <span className=\"cm-text\">\n <span className=\"cm-label\">{node.label}</span>\n {look.showHints && node.hint && <span className=\"cm-hint\">{node.hint}</span>}\n </span>\n {look.showShortcuts && node.shortcut && <kbd className=\"cm-shortcut\">{node.shortcut}</kbd>}\n </button>\n );\n}\n\nfunction Submenu({ node, ctx }: { node: MenuSubmenuNode; ctx: Ctx }) {\n const { look } = ctx.design;\n const [open, setOpen] = useState(false);\n const [side, setSide] = useState<FlyoutSide>(\"right\");\n const show = (el: HTMLElement) => {\n setSide(flyoutSide(el, look.width));\n setOpen(true);\n };\n return (\n <div className=\"cm-sub\" onMouseEnter={(e) => show(e.currentTarget)} onMouseLeave={() => setOpen(false)}>\n {/* ui-exception: a menu row of the menu component itself */}\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n className={`cm-item ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`}\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n setOpen(true);\n }}\n >\n {look.showIcons && <span className=\"cm-icon-slot\">{node.icon ? ctx.renderIcon(node.icon, \"cm-icon\") : null}</span>}\n <span className=\"cm-text\">\n <span className=\"cm-label\">{node.label}</span>\n {look.showHints && node.hint && <span className=\"cm-hint\">{node.hint}</span>}\n </span>\n {ctx.renderIcon(\"ChevronRight\", \"cm-icon cm-chev\")}\n </button>\n {open && (\n <div role=\"menu\" className=\"cm-menu cm-flyout\" data-side={side} data-density={look.density} style={{ width: look.width }}>\n {node.children.length === 0 ? <div className=\"cm-empty\">Empty submenu</div> : <Nodes nodes={node.children} ctx={ctx} />}\n </div>\n )}\n </div>\n );\n}\n\ntype FlyoutSide = \"right\" | \"left\" | \"below\";\n\n/**\n * Where a submenu opens: right when it fits, else left, else just under its row (a narrow panel).\n * \"Fits\" is measured against the nearest `[data-menu-bounds]` box (a panel that clips), else the window.\n */\nfunction flyoutSide(row: HTMLElement, width: number): FlyoutSide {\n const r = row.getBoundingClientRect();\n const bounds = row.closest<HTMLElement>(\"[data-menu-bounds]\")?.getBoundingClientRect() ?? { left: 0, right: window.innerWidth };\n if (r.right + width + 8 <= bounds.right) return \"right\";\n if (r.left - width - 8 >= bounds.left) return \"left\";\n return \"below\";\n}\n\n/** A placeholder: a dashed row naming where the rest go; as a submenu it opens onto them. */\nfunction Slot({ node, ctx }: { node: MenuSlotNode; ctx: Ctx }) {\n const { look } = ctx.design;\n const source = slotSource(node.fills);\n const options = slotOptions(node.fills, ctx.placed);\n const [open, setOpen] = useState(false);\n const [side, setSide] = useState<FlyoutSide>(\"right\");\n const count = source?.runtime ? \"live\" : String(options.length);\n const row = (\n // ui-exception: a menu row of the menu component itself\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-haspopup={node.shape === \"submenu\" ? \"menu\" : undefined}\n title={source ? `Placeholder: ${source.label}` : \"Placeholder\"}\n className={`cm-item cm-slot ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`}\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n if (node.shape === \"submenu\") setOpen(true);\n }}\n >\n {look.showIcons && <span className=\"cm-icon-slot\">{ctx.renderIcon(node.icon ?? source?.icon ?? \"Ellipsis\", \"cm-icon\")}</span>}\n <span className=\"cm-text\">\n <span className=\"cm-label\">{node.label}</span>\n </span>\n <span className=\"cm-count\">{count}</span>\n {node.shape === \"submenu\" && ctx.renderIcon(\"ChevronRight\", \"cm-icon cm-chev\")}\n </button>\n );\n if (node.shape === \"items\") return row;\n return (\n <div\n className=\"cm-sub\"\n onMouseEnter={(e) => {\n setSide(flyoutSide(e.currentTarget, look.width));\n setOpen(true);\n }}\n onMouseLeave={() => setOpen(false)}\n >\n {row}\n {open && (\n <div role=\"menu\" className=\"cm-menu cm-flyout\" data-side={side} data-density={look.density} style={{ width: look.width }}>\n {source?.runtime ? (\n <div className=\"cm-runtime\">Filled at runtime: {source.label}</div>\n ) : options.length === 0 ? (\n <div className=\"cm-empty\">Nothing left — every option of this kind is placed</div>\n ) : (\n options.map((o) => (\n <Item key={o.id} node={{ id: `slot-${node.id}-${o.id}`, kind: \"item\", label: o.label, icon: o.icon, catalogId: o.id, ...(o.shortcut ? { shortcut: o.shortcut } : {}), ...(o.ai ? { ai: true } : {}), ...(o.danger ? { danger: true } : {}) }} ctx={ctx} />\n ))\n )}\n </div>\n )}\n </div>\n );\n}\n","// src/design/model.ts — @ai-matrx/context-menu: THE MENU DESIGN.\n//\n// A design is the whole menu a person drew in the builder: an ordered tree of items, sections,\n// submenus and dividers, plus the few presentation choices that change how it reads. It is plain\n// JSON (no functions, no React) so it saves as one record, travels in a URL or a chat, and is the\n// exact thing the real menu is later built from. Every edit is a pure function returning a new\n// design; nothing here mutates.\n\nexport type MenuNodeKind = \"item\" | \"section\" | \"submenu\" | \"divider\" | \"slot\";\n\ninterface NodeBase {\n /** Stable within the design. */\n id: string;\n /** The catalog option this was dragged from, when it came from one. */\n catalogId?: string;\n /** A designer's note on this one entry (\"only on a table row\", \"merge with Copy\"). */\n note?: string;\n}\n\nexport interface MenuItemNode extends NodeBase {\n kind: \"item\";\n label: string;\n /** A lucide icon name (`Sparkles`, `Copy`). */\n icon?: string;\n /** Shown right-aligned (`⌘C`). */\n shortcut?: string;\n /** One short line under the label. */\n hint?: string;\n /** Shown greyed out — the design says \"this exists here but is unavailable now\". */\n disabled?: boolean;\n /** Red, for actions that remove or discard. */\n danger?: boolean;\n /** A checkbox-style toggle item. */\n toggle?: boolean;\n /** Drawn as a highlighted, AI-flavoured item. */\n ai?: boolean;\n}\n\nexport interface MenuSectionNode extends NodeBase {\n kind: \"section\";\n /** The small heading. Empty = an unlabelled group. */\n label: string;\n children: MenuNode[];\n /** Starts folded; a click on the heading opens it. */\n collapsible?: boolean;\n /** How the section's items are laid out. */\n layout?: \"list\" | \"grid\" | \"row\";\n}\n\nexport interface MenuSubmenuNode extends NodeBase {\n kind: \"submenu\";\n label: string;\n icon?: string;\n hint?: string;\n children: MenuNode[];\n}\n\nexport interface MenuDividerNode extends NodeBase {\n kind: \"divider\";\n}\n\n/**\n * A PLACEHOLDER: \"every other option of this kind goes here\". `shape: \"items\"` lays them out as rows\n * where the placeholder sits; `shape: \"submenu\"` gathers them into one submenu. `fills` names the\n * kind (a catalog group, the agent library, the page's own rows, or everything not placed).\n */\nexport interface MenuSlotNode extends NodeBase {\n kind: \"slot\";\n label: string;\n fills: string;\n shape: \"items\" | \"submenu\";\n icon?: string;\n}\n\nexport type MenuNode = MenuItemNode | MenuSectionNode | MenuSubmenuNode | MenuDividerNode | MenuSlotNode;\nexport type MenuContainerNode = MenuSectionNode | MenuSubmenuNode;\n\n/** Where the menu opens; the builder previews each the way it appears there. */\nexport const MENU_SURFACES = [\n \"text-selection\",\n \"editable-field\",\n \"table-row\",\n \"page\",\n \"chat-message\",\n \"file\",\n \"anywhere\",\n] as const;\nexport type MenuSurface = (typeof MENU_SURFACES)[number];\n\nexport interface MenuLook {\n density: \"compact\" | \"comfortable\";\n width: number;\n showIcons: boolean;\n showShortcuts: boolean;\n showHints: boolean;\n /** A search box at the top of the menu. */\n search: boolean;\n}\n\nexport const DEFAULT_LOOK: MenuLook = {\n density: \"comfortable\",\n width: 280,\n showIcons: true,\n showShortcuts: true,\n showHints: false,\n search: false,\n};\n\nexport interface MenuDesign {\n /** The design's identity; every version shares it. */\n designId: string;\n name: string;\n surface: MenuSurface;\n look: MenuLook;\n nodes: MenuNode[];\n /** Free notes for whoever builds it. */\n notes: string;\n}\n\nexport const DESIGN_FORMAT = 1;\n\n// ── ids ──────────────────────────────────────────────────────────────────────\n\nexport function newId(prefix = \"n\"): string {\n const rnd =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID().slice(0, 8)\n : Math.random().toString(36).slice(2, 10);\n return `${prefix}_${rnd}`;\n}\n\nexport function emptyDesign(name = \"Untitled menu\"): MenuDesign {\n return { designId: newId(\"d\"), name, surface: \"anywhere\", look: { ...DEFAULT_LOOK }, nodes: [], notes: \"\" };\n}\n\nexport function isContainer(node: MenuNode): node is MenuContainerNode {\n return node.kind === \"section\" || node.kind === \"submenu\";\n}\n\n/** Every catalog option the design already places (so a placeholder holds only the rest). */\nexport function placedCatalogIds(nodes: readonly MenuNode[], out = new Set<string>()): Set<string> {\n for (const n of nodes) {\n if (n.catalogId) out.add(n.catalogId);\n if (isContainer(n)) placedCatalogIds(n.children, out);\n }\n return out;\n}\n\n/** How many times each catalog option appears in the design (a duplicate counts twice). */\nexport function catalogUseCounts(nodes: readonly MenuNode[], out = new Map<string, number>()): Map<string, number> {\n for (const n of nodes) {\n if (n.catalogId) out.set(n.catalogId, (out.get(n.catalogId) ?? 0) + 1);\n if (isContainer(n)) catalogUseCounts(n.children, out);\n }\n return out;\n}\n\n/** A deep copy with every id renewed — what a duplicate or a second drop of a template gets. */\nexport function cloneNode<N extends MenuNode>(node: N): N {\n const copy = { ...node, id: newId(node.kind[0]) } as N;\n if (isContainer(copy)) (copy as MenuContainerNode).children = (copy as MenuContainerNode).children.map(cloneNode);\n return copy;\n}\n\n// ── reading the tree ─────────────────────────────────────────────────────────\n\nexport interface Located {\n node: MenuNode;\n /** The container's id, or null at the top. */\n parentId: string | null;\n index: number;\n depth: number;\n}\n\nexport function locate(nodes: readonly MenuNode[], id: string, parentId: string | null = null, depth = 0): Located | null {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i] as MenuNode;\n if (node.id === id) return { node, parentId, index: i, depth };\n if (isContainer(node)) {\n const inner = locate(node.children, id, node.id, depth + 1);\n if (inner) return inner;\n }\n }\n return null;\n}\n\nexport function contains(node: MenuNode, id: string): boolean {\n if (node.id === id) return true;\n return isContainer(node) && node.children.some((c) => contains(c, id));\n}\n\nexport function countItems(nodes: readonly MenuNode[]): number {\n let n = 0;\n for (const node of nodes) {\n if (node.kind === \"item\" || node.kind === \"slot\") n += 1;\n else if (isContainer(node)) n += countItems(node.children) + (node.kind === \"submenu\" ? 1 : 0);\n }\n return n;\n}\n\n// ── editing the tree (pure) ──────────────────────────────────────────────────\n\nfunction mapChildren(nodes: readonly MenuNode[], parentId: string | null, fn: (list: MenuNode[]) => MenuNode[]): MenuNode[] {\n if (parentId === null) return fn([...nodes]);\n return nodes.map((node) => {\n if (!isContainer(node)) return node;\n if (node.id === parentId) return { ...node, children: fn([...node.children]) };\n return { ...node, children: mapChildren(node.children, parentId, fn) };\n });\n}\n\nexport function insertNode(nodes: readonly MenuNode[], parentId: string | null, index: number, node: MenuNode): MenuNode[] {\n return mapChildren(nodes, parentId, (list) => {\n list.splice(Math.max(0, Math.min(index, list.length)), 0, node);\n return list;\n });\n}\n\nexport function removeNode(nodes: readonly MenuNode[], id: string): MenuNode[] {\n return nodes\n .filter((n) => n.id !== id)\n .map((n) => (isContainer(n) ? { ...n, children: removeNode(n.children, id) } : n));\n}\n\nexport function updateNode(nodes: readonly MenuNode[], id: string, patch: Partial<MenuNode>): MenuNode[] {\n return nodes.map((n) => {\n if (n.id === id) return { ...n, ...patch, id: n.id, kind: n.kind } as MenuNode;\n if (isContainer(n)) return { ...n, children: updateNode(n.children, id, patch) };\n return n;\n });\n}\n\n/**\n * Move `id` to `index` inside `parentId`. Refuses (returns the tree unchanged) a move into itself\n * or its own descendant. `index` is in the destination list as it reads BEFORE the move.\n */\nexport function canMove(nodes: readonly MenuNode[], id: string, parentId: string | null): boolean {\n const from = locate(nodes, id);\n return Boolean(from) && (parentId === null || !contains((from as Located).node, parentId));\n}\n\nexport function moveNode(nodes: readonly MenuNode[], id: string, parentId: string | null, index: number): MenuNode[] {\n const from = locate(nodes, id);\n // A refused move answers the SAME array, so a caller can tell \"nothing happened\" by identity.\n if (!from) return nodes as MenuNode[];\n if (parentId !== null && contains(from.node, parentId)) return nodes as MenuNode[];\n let target = index;\n if (from.parentId === parentId && from.index < index) target -= 1;\n return insertNode(removeNode(nodes, id), parentId, target, from.node);\n}\n\nexport function duplicateNode(nodes: readonly MenuNode[], id: string): MenuNode[] {\n const at = locate(nodes, id);\n if (!at) return [...nodes];\n return insertNode(nodes, at.parentId, at.index + 1, cloneNode(at.node));\n}\n\n/** Wrap a node into a new section (or submenu) in its place. */\nexport function wrapNode(nodes: readonly MenuNode[], id: string, kind: \"section\" | \"submenu\"): MenuNode[] {\n const at = locate(nodes, id);\n if (!at) return [...nodes];\n const wrapper: MenuContainerNode =\n kind === \"section\"\n ? { id: newId(\"s\"), kind: \"section\", label: \"New section\", children: [at.node] }\n : { id: newId(\"m\"), kind: \"submenu\", label: \"More\", icon: \"ChevronRight\", children: [at.node] };\n return insertNode(removeNode(nodes, id), at.parentId, at.index, wrapper);\n}\n\n/** Replace a container by its children. */\nexport function unwrapNode(nodes: readonly MenuNode[], id: string): MenuNode[] {\n const at = locate(nodes, id);\n if (!at || !isContainer(at.node)) return [...nodes];\n let out = removeNode(nodes, id);\n at.node.children.forEach((child, i) => {\n out = insertNode(out, at.parentId, at.index + i, child);\n });\n return out;\n}\n\n// ── reading a saved design defensively ──────────────────────────────────────\n\n/** A saved document back into a design; anything unreadable becomes an empty design, never a throw. */\nexport function parseDesign(raw: unknown): MenuDesign {\n let value: unknown = raw;\n if (typeof raw === \"string\") {\n try {\n value = JSON.parse(raw);\n } catch {\n return emptyDesign(\"Unreadable design\");\n }\n }\n const v = (value ?? {}) as Partial<MenuDesign> & { design?: MenuDesign };\n const d = v.design ?? v;\n return {\n designId: typeof d.designId === \"string\" ? d.designId : newId(\"d\"),\n name: typeof d.name === \"string\" ? d.name : \"Untitled menu\",\n surface: MENU_SURFACES.includes(d.surface as MenuSurface) ? (d.surface as MenuSurface) : \"anywhere\",\n look: { ...DEFAULT_LOOK, ...(d.look ?? {}) },\n nodes: Array.isArray(d.nodes) ? (d.nodes as MenuNode[]) : [],\n notes: typeof d.notes === \"string\" ? d.notes : \"\",\n };\n}\n\nexport function serializeDesign(design: MenuDesign): string {\n return JSON.stringify({ format: DESIGN_FORMAT, design });\n}\n","// src/design/starters.ts — @ai-matrx/context-menu: READY STARTING POINTS for the builder.\n//\n// Each starter reproduces a menu that exists today on the live site, or one a proposal demo page\n// sets up, as plain MenuDesign data. Open one, change it, save it. Labels, order, sections,\n// submenus and icons follow the real source (engine rows, PROPOSED_MENU_GROUPING,\n// proposed-arrangement, the notes / quiz / data-table row builders). Rows the live menu fills at\n// runtime (agents, shortcuts, content blocks) appear as representative `ai` items with a note.\n\nimport { catalogOption } from \"./catalog\";\nimport { DEFAULT_LOOK, type MenuDesign, type MenuLook, type MenuNode, type MenuSurface } from \"./model\";\n\nexport interface StarterDesign {\n id: string;\n group: \"Live today\" | \"Proposal\";\n /** Where it comes from, e.g. \"/demos/context-menu-designs — a thing\". */\n source: string;\n design: MenuDesign;\n}\n\ntype ItemExtras = Partial<{\n label: string;\n icon: string;\n shortcut: string;\n hint: string;\n disabled: boolean;\n danger: boolean;\n toggle: boolean;\n ai: boolean;\n note: string;\n}>;\n\n/** A per-design node builder: every node id is `<slug>-<n>`, in drawing order. */\nfunction maker(slug: string) {\n let n = 0;\n const nid = () => `${slug}-${++n}`;\n const clean = <T extends object>(o: T): T => JSON.parse(JSON.stringify(o)) as T;\n\n /** An item from a catalog row (label / icon / shortcut / danger / ai come from it). */\n const item = (catalogId: string, extra: ItemExtras = {}): MenuNode => {\n const c = catalogOption(catalogId);\n if (!c) throw new Error(`starters: no catalog row ${catalogId}`);\n return clean({\n id: nid(),\n kind: \"item\" as const,\n catalogId,\n label: c.label,\n icon: c.icon,\n ...(c.shortcut ? { shortcut: c.shortcut } : {}),\n ...(c.danger ? { danger: true } : {}),\n ...(c.ai ? { ai: true } : {}),\n ...extra,\n });\n };\n /** An item with no catalog row (a page's own row). */\n const own = (label: string, icon: string, extra: ItemExtras = {}): MenuNode =>\n clean({ id: nid(), kind: \"item\" as const, label, icon, ...extra });\n const section = (label: string, children: MenuNode[], layout: \"list\" | \"row\" | \"grid\" = \"list\"): MenuNode => ({\n id: nid(),\n kind: \"section\",\n label,\n layout,\n children,\n });\n const strip = (children: MenuNode[]): MenuNode => section(\"\", children, \"row\");\n const sub = (label: string, icon: string, children: MenuNode[], extra: { hint?: string; note?: string } = {}): MenuNode =>\n clean({ id: nid(), kind: \"submenu\" as const, label, icon, ...extra, children });\n const divider = (): MenuNode => ({ id: nid(), kind: \"divider\" });\n return { item, own, section, strip, sub, divider };\n}\ntype Maker = ReturnType<typeof maker>;\n\nfunction design(\n slug: string,\n name: string,\n surface: MenuSurface,\n notes: string,\n nodes: MenuNode[],\n look: Partial<MenuLook> = {},\n): MenuDesign {\n return { designId: `starter-${slug}`, name, surface, look: { ...DEFAULT_LOOK, ...look }, nodes, notes };\n}\n\nconst RUNTIME = \"Filled from the agent library at runtime.\";\n\n// ── shared pieces ────────────────────────────────────────────────────────────\n\n/** The AI placements the live menu shows: each is a runtime-filled list. */\nfunction aiPlacements(m: Maker): MenuNode[] {\n return [\n m.item(\"cm:placement:ai-action\", {\n note: `${RUNTIME} Live: a submenu of AI actions (agent shortcuts) that fit the selection.`,\n }),\n m.item(\"cm:placement:content-block\", { note: \"Filled at runtime with the content blocks that can be inserted here.\" }),\n m.item(\"cm:placement:user-tool\", { note: \"Filled at runtime with this person's own shortcuts.\" }),\n m.item(\"cm:placement:organization-tool\", { note: \"Filled at runtime with the organization's shared shortcuts.\" }),\n m.item(\"cm:placement:bound-agent\", { note: \"Filled at runtime with the agents bound to this page.\" }),\n ];\n}\n\n/** The four \"Intelligence\" children the object-first proposal shows (AI_ORDER in proposed-arrangement). */\nfunction intelligence(m: Maker): MenuNode {\n return m.sub(\"Intelligence\", \"Sparkles\", [\n m.item(\"cm:chat\"),\n m.item(\"cm:placement:ai-action\", { note: RUNTIME }),\n m.item(\"cm:placement:bound-agent\", { note: RUNTIME }),\n m.item(\"cm:placement:user-tool\", { note: RUNTIME }),\n m.item(\"cm:placement:organization-tool\", { note: RUNTIME }),\n m.item(\"cm:placement:content-block\", { note: RUNTIME }),\n ], { note: \"Every AI entry in one row, on every menu.\" });\n}\n\nfunction saveShare(m: Maker): MenuNode {\n return m.sub(\"Save & share\", \"Share2\", [\n m.item(\"cm:copy-as\", { note: \"Copy block: every form the content can land on the clipboard in.\" }),\n m.divider(),\n m.item(\"cm:export\", { label: \"Download\", icon: \"Download\", note: \"Download block: PDF, Word, HTML, Markdown, print.\" }),\n m.divider(),\n m.item(\"cm:convert\", { label: \"Convert to…\", note: \"Convert block: becomes a new thing in the app (note, task, document…).\" }),\n m.divider(),\n m.item(\"share-webpage\", { label: \"Publish\", icon: \"Globe\", note: \"Publish block: public web page.\" }),\n m.divider(),\n m.item(\"cm:share\", { label: \"Share\", note: \"Share block: people and places. Copy link folds into this dialog.\" }),\n ]);\n}\n\nfunction organize(m: Maker): MenuNode {\n return m.sub(\"Organize\", \"FolderTree\", [\n m.item(\"cm:attach\"),\n m.item(\"pin-message\", { label: \"Pin\" }),\n m.item(\"cm:view-history\", { label: \"History\" }),\n m.item(\"cm:compare\", { label: \"Compare\" }),\n ]);\n}\n\nfunction tools(m: Maker): MenuNode {\n return m.sub(\"Tools\", \"Wrench\", [\n m.item(\"cm:speak\", { label: \"Read aloud\" }),\n m.item(\"cm:quick-actions\"),\n m.item(\"feedback\", { label: \"Feedback\" }),\n m.item(\"cm:x:surface\", { label: \"This page\" }),\n m.item(\"cm:admin\", { label: \"Admin\", note: \"Admins only.\" }),\n ]);\n}\n\nconst TIER_STRIP = (m: Maker): MenuNode =>\n m.strip([m.item(\"cm:copy\"), m.item(\"cm:cut\"), m.item(\"cm:paste\"), m.item(\"cm:undo\"), m.item(\"cm:redo\"), m.item(\"cm:find\")]);\n\n// ── Live today ───────────────────────────────────────────────────────────────\n\nfunction liveEditableField(): MenuDesign {\n const m = maker(\"live-editable-field\");\n return design(\n \"live-editable-field\",\n \"Editable text field (selection in a textarea)\",\n \"editable-field\",\n \"Live today: the right-click menu on an editable field. Source: engine/ContextMenuV3, command layout (platform default since 2026-08-22).\",\n [\n TIER_STRIP(m),\n m.item(\"cm:select-all\"),\n m.divider(),\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"cm:quick-actions\", { note: \"A submenu of quick tools.\" }),\n m.divider(),\n m.item(\"cm:listen\"),\n m.item(\"cm:speak\"),\n m.item(\"cm:copy-as\"),\n m.item(\"cm:insert-reference\"),\n m.divider(),\n m.sub(\"History\", \"History\", [m.item(\"cm:undo\"), m.item(\"cm:redo\"), m.item(\"cm:view-history\"), m.item(\"cm:compare\")], {\n note: \"In the tiered and command layouts History groups these four.\",\n }),\n m.item(\"cm:export\"),\n m.item(\"cm:convert\"),\n m.item(\"cm:share\"),\n m.item(\"cm:attach\"),\n m.divider(),\n m.item(\"cm:x:surface\"),\n m.item(\"cm:admin\", { note: \"Admins only.\" }),\n ],\n { search: true },\n );\n}\n\nfunction liveReadOnlyMessage(): MenuDesign {\n const m = maker(\"live-chat-message\");\n return design(\n \"live-chat-message\",\n \"Read-only text / chat message\",\n \"chat-message\",\n \"Live today: right-click on read-only text and on a chat message. Source: engine/NonEditableContextMenu plus the chat message rows.\",\n [\n m.strip([m.item(\"cm:copy\"), m.item(\"cm:find\"), m.item(\"cm:speak\", { label: \"Read aloud\" })]),\n m.item(\"cm:select-all\"),\n m.divider(),\n m.section(\"Message\", [\n m.item(\"regenerate-response\", { note: \"Assistant messages only.\" }),\n m.item(\"fork-at-message\"),\n m.item(\"continue-in-chat\"),\n m.item(\"pin-message\"),\n m.item(\"feedback-up\"),\n m.item(\"feedback-down\"),\n ]),\n m.divider(),\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"cm:quick-actions\"),\n m.divider(),\n m.item(\"cm:copy-as\"),\n m.item(\"cm:json\"),\n m.item(\"cm:export\"),\n m.item(\"cm:convert\"),\n m.item(\"cm:share\"),\n m.item(\"cm:attach\"),\n m.divider(),\n m.item(\"cm:x:surface\"),\n m.item(\"cm:admin\", { note: \"Admins only.\" }),\n ],\n );\n}\n\nfunction liveNotesEditor(): MenuDesign {\n const m = maker(\"live-notes-editor\");\n return design(\n \"live-notes-editor\",\n \"Notes editor\",\n \"editable-field\",\n \"Live today: right-click in a note. Source: features/notes/agent-context/notesEditorExtraSections (the Note section) on top of the standard editable menu.\",\n [\n TIER_STRIP(m),\n m.item(\"cm:select-all\"),\n m.divider(),\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"cm:quick-actions\"),\n m.divider(),\n m.section(\"Note\", [\n m.item(\"cm:save\", { hint: \"Greyed when the note has no unsaved changes.\" }),\n m.item(\"duplicate\"),\n m.item(\"notes:export-md\"),\n m.item(\"share-link\", { label: \"Share link…\" }),\n m.item(\"notes:share-clipboard\"),\n m.item(\"notes:convert-artifacts\", { label: \"Convert blocks to artifacts\", note: \"Only on notes that can be saved.\" }),\n m.sub(\"Move to folder…\", \"FolderInput\", [\n m.own(\"Inbox\", \"FolderClosed\", { note: \"One row per folder the person has; the current folder is greyed.\" }),\n m.own(\"Projects\", \"FolderClosed\"),\n m.divider(),\n m.own(\"New folder…\", \"FolderPlus\"),\n m.own(\"Choose folder…\", \"FolderInput\"),\n ]),\n m.sub(\"Tabs\", \"X\", [\n m.item(\"notes:close-tab\", { label: \"Close Tab\" }),\n m.own(\"Close Other Tabs\", \"X\", { note: \"Greyed with one tab open.\" }),\n m.own(\"Close All Tabs\", \"X\"),\n ]),\n m.divider(),\n m.item(\"notes:trash\", { note: \"Always last, red.\" }),\n ]),\n m.divider(),\n m.item(\"cm:copy-as\"),\n m.item(\"cm:export\"),\n m.item(\"cm:convert\"),\n m.item(\"cm:share\"),\n m.item(\"cm:attach\"),\n m.item(\"cm:x:surface\"),\n m.item(\"cm:admin\", { note: \"Admins only.\" }),\n ],\n { search: true },\n );\n}\n\nfunction liveQuizRow(): MenuDesign {\n const m = maker(\"live-quiz-row\");\n return design(\n \"live-quiz-row\",\n \"Quiz row\",\n \"table-row\",\n \"Live today: a quiz / practice-test row. Source: features/education/assessment/components/home/useAssessmentRowActions.\",\n [\n m.section(\"\", [m.item(\"row:open\"), m.item(\"row:open-tab\")]),\n m.section(\"Quiz\", [\n m.item(\"row:take\", { note: \"Greyed when archived or the quiz has no questions.\" }),\n m.item(\"edit\", { label: \"Edit questions\", note: \"Only where the person may edit.\" }),\n m.item(\"row:results\", { note: \"Only once the person has a result.\" }),\n ]),\n m.section(\"Manage\", [\n m.item(\"archive\", { note: \"Shows Restore (ArchiveRestore) instead when the quiz is archived. Only for editors.\" }),\n ]),\n ],\n );\n}\n\nfunction liveTableRow(): MenuDesign {\n const m = maker(\"live-table-row\");\n return design(\n \"live-table-row\",\n \"Data table row (/data)\",\n \"table-row\",\n \"Live today: a row on the Data home. Source: /demos/context-menu-designs TableRowsPanel, the 'today' side.\",\n [\n m.section(\"\", [m.item(\"row:open\"), m.item(\"row:open-tab\")]),\n m.section(\"\", [m.item(\"favorite\")]),\n ],\n );\n}\n\n// ── Proposal: grouped by what you get ───────────────────────────────────────\n\nfunction regroupDesign(): MenuDesign {\n const m = maker(\"proposal-grouped\");\n return design(\n \"proposal-grouped\",\n \"Grouped by what you get (13 groups)\",\n \"text-selection\",\n \"Proposal: /demos/context-menu-regroup, PROPOSED_MENU_GROUPING v2. Strip and universal verbs stay on top; everything else is filed under 13 outcome submenus.\",\n [\n TIER_STRIP(m),\n m.item(\"cm:select-all\"),\n m.item(\"cm:quick-actions\"),\n m.item(\"cm:save\", { note: \"An editor's own Save / Delete stay one click away.\" }),\n m.item(\"cm:delete\"),\n m.divider(),\n m.sub(\"Edit\", \"Pencil\", [\n m.item(\"edit\"),\n m.own(\"Replace selection\", \"Replace\"),\n m.own(\"Insert below\", \"ArrowDownToLine\"),\n m.item(\"rename\"),\n ], { hint: \"Change this item where it is.\" }),\n m.sub(\"Copy\", \"Copy\", [\n m.item(\"cm:copy-as\"),\n m.item(\"cm:json\"),\n m.item(\"copy-html-page\"),\n m.item(\"cm:insert-reference\"),\n ], { hint: \"Lands on your clipboard.\" }),\n m.sub(\"Download\", \"Download\", [\n m.item(\"cm:export\"),\n m.item(\"save-as-file\"),\n m.item(\"download-pdf\"),\n m.item(\"download-docx\"),\n m.item(\"download-html\"),\n m.item(\"print\"),\n ], { hint: \"Becomes a file outside the app.\" }),\n m.sub(\"Convert to\", \"ArrowRightLeft\", [\n m.item(\"cm:convert\", { label: \"Convert to…\" }),\n m.own(\"Note\", \"StickyNote\"),\n m.own(\"Document\", \"FileText\"),\n m.own(\"Task\", \"SquareCheck\"),\n m.own(\"Flashcards\", \"Layers\"),\n m.own(\"Quiz\", \"CircleHelp\"),\n ], { hint: \"Becomes a new thing inside the app.\" }),\n m.sub(\"Publish\", \"Globe\", [m.item(\"html-preview\"), m.item(\"share-webpage\")], { hint: \"Goes out to the world.\" }),\n m.sub(\"Share\", \"Share2\", [m.item(\"cm:share\"), m.item(\"send-google-doc\"), m.item(\"email-to-me\")], {\n hint: \"Goes to specific people or places.\",\n }),\n m.sub(\"Organize\", \"Tags\", [\n m.item(\"cm:attach\"),\n m.item(\"set-context-value\"),\n m.item(\"pin-message\", { label: \"Pin\" }),\n m.item(\"notes-and-comments\"),\n ], { hint: \"Filed, not changed.\" }),\n m.sub(\"History\", \"History\", [m.item(\"cm:view-history\"), m.item(\"edit-history\"), m.item(\"fork-at-message\")], {\n hint: \"Earlier versions.\",\n }),\n m.sub(\"AI\", \"Bot\", [\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"send-to-agent\"),\n m.item(\"continue-in-chat\"),\n m.item(\"regenerate-response\"),\n m.item(\"code-block-chart\"),\n ], { hint: \"An AI works on it.\" }),\n m.sub(\"Read aloud\", \"Volume2\", [m.item(\"cm:speak\"), m.item(\"cm:listen\"), m.item(\"tts-voice-settings\")], { hint: \"You hear it.\" }),\n m.sub(\"Compare\", \"GitCompareArrows\", [m.item(\"cm:compare\"), m.item(\"compare-with-clipboard\"), m.item(\"set-compare-base\")], {\n hint: \"Side by side.\",\n }),\n m.sub(\"Feedback\", \"ThumbsUp\", [m.item(\"feedback-up\"), m.item(\"feedback-down\"), m.item(\"feedback\")], { hint: \"Tell us how it went.\" }),\n m.sub(\"Admin\", \"Shield\", [m.item(\"cm:admin\")], { hint: \"Admins only.\" }),\n m.divider(),\n m.item(\"cm:x:surface\"),\n ],\n );\n}\n\n// ── Proposal: object-first ───────────────────────────────────────────────────\n\nfunction objectFirstThing(): MenuDesign {\n const m = maker(\"proposal-object-thing\");\n return design(\n \"proposal-object-thing\",\n \"Object-first: a thing (data table row)\",\n \"table-row\",\n \"Proposal: /demos/context-menu-designs, proposed-arrangement for a clicked thing (the data-table row on that page).\",\n [\n m.strip([\n m.item(\"cm:copy\"),\n m.item(\"cm:share\"),\n m.item(\"duplicate\"),\n m.item(\"favorite\", { label: \"Favorite\" }),\n m.item(\"save-as-file\", { label: \"Download\", icon: \"Download\" }),\n m.item(\"archive\"),\n ]),\n m.item(\"row:open\"),\n m.item(\"row:open-tab\"),\n m.item(\"rename\"),\n m.item(\"move\", { label: \"Move to…\" }),\n m.sub(\"More table options\", \"Ellipsis\", [\n m.own(\"Add column\", \"Columns3\"),\n m.own(\"Import\", \"Upload\"),\n m.own(\"Settings\", \"Settings\"),\n m.item(\"cm:view-history\"),\n ], { note: \"The thing's own rows beyond the first four.\" }),\n intelligence(m),\n saveShare(m),\n organize(m),\n tools(m),\n ],\n { search: true },\n );\n}\n\nfunction objectFirstEditable(): MenuDesign {\n const m = maker(\"proposal-object-editable\");\n return design(\n \"proposal-object-editable\",\n \"Object-first: editable text\",\n \"editable-field\",\n \"Proposal: /demos/context-menu-designs, proposed-arrangement for editable text (Cut, Copy, Paste, Undo, Redo, Find on top).\",\n [\n TIER_STRIP(m),\n m.item(\"cm:select-all\"),\n m.item(\"cm:save\"),\n m.item(\"cm:delete\"),\n m.item(\"edit\"),\n intelligence(m),\n saveShare(m),\n organize(m),\n tools(m),\n ],\n { search: true },\n );\n}\n\nfunction objectFirstReadOnly(): MenuDesign {\n const m = maker(\"proposal-object-readonly\");\n return design(\n \"proposal-object-readonly\",\n \"Object-first: read-only text\",\n \"text-selection\",\n \"Proposal: /demos/context-menu-designs, proposed-arrangement for read-only text (Copy, Read aloud, Find, Share on top).\",\n [\n m.strip([m.item(\"cm:copy\"), m.item(\"cm:speak\", { label: \"Read aloud\" }), m.item(\"cm:find\"), m.item(\"cm:share\")]),\n intelligence(m),\n saveShare(m),\n organize(m),\n tools(m),\n ],\n { search: true },\n );\n}\n\n// ── Proposal: layouts (the same notes menu, arranged three more ways) ───────\n\n/** The notes menu rows that every layout carries, flat (what Classic shows). */\nfunction notesRows(m: Maker): MenuNode[] {\n return [\n m.item(\"cm:select-all\"),\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"cm:quick-actions\"),\n m.item(\"cm:listen\"),\n m.item(\"cm:speak\"),\n m.item(\"cm:copy-as\"),\n m.item(\"cm:json\"),\n m.item(\"cm:export\"),\n m.item(\"cm:convert\"),\n m.item(\"cm:share\"),\n m.item(\"cm:attach\"),\n m.item(\"cm:save\"),\n m.item(\"duplicate\"),\n m.item(\"notes:export-md\"),\n m.item(\"share-link\", { label: \"Share link…\" }),\n m.item(\"notes:share-clipboard\"),\n m.item(\"move\", { label: \"Move to folder…\" }),\n m.item(\"notes:close-tab\", { label: \"Tabs\" }),\n m.item(\"notes:trash\"),\n m.item(\"cm:x:surface\"),\n m.item(\"cm:admin\"),\n ];\n}\n\nfunction layoutCompact(): MenuDesign {\n const m = maker(\"proposal-layout-compact\");\n return design(\n \"proposal-layout-compact\",\n \"Layout: Classic, compact rows\",\n \"editable-field\",\n \"Proposal: /demos/context-menu/layouts panel 2. Classic structure (every row at the top level), tighter rows and icons.\",\n [\n m.item(\"cm:copy\"),\n m.item(\"cm:cut\"),\n m.item(\"cm:paste\"),\n m.item(\"cm:undo\"),\n m.item(\"cm:redo\"),\n m.item(\"cm:find\"),\n m.item(\"cm:view-history\"),\n m.item(\"cm:compare\"),\n m.divider(),\n ...notesRows(m),\n ],\n { density: \"compact\", width: 260 },\n );\n}\n\nfunction tieredNodes(m: Maker): MenuNode[] {\n return [\n TIER_STRIP(m),\n m.sub(\"History\", \"History\", [m.item(\"cm:undo\"), m.item(\"cm:redo\"), m.item(\"cm:view-history\"), m.item(\"cm:compare\")], {\n note: \"The one grouping the tiered layout adds; every other row keeps its Classic name and place.\",\n }),\n m.divider(),\n ...notesRows(m).filter((n) => n.kind !== \"item\" || n.label !== \"Tabs\"),\n m.sub(\"Tabs\", \"X\", [m.item(\"notes:close-tab\", { label: \"Close Tab\" }), m.item(\"notes:close-others\")]),\n ];\n}\n\nfunction layoutTiered(): MenuDesign {\n const m = maker(\"proposal-layout-tiered\");\n return design(\n \"proposal-layout-tiered\",\n \"Layout: Tiered (icon strip, nothing lost)\",\n \"editable-field\",\n \"Proposal: /demos/context-menu/layouts panel 3. Icon strip on top, every other row keeps its Classic name; History groups Undo / Redo / View History / Compare.\",\n tieredNodes(m),\n );\n}\n\nfunction layoutCommand(): MenuDesign {\n const m = maker(\"proposal-layout-command\");\n return design(\n \"proposal-layout-command\",\n \"Layout: Command (tiered + type to filter)\",\n \"editable-field\",\n \"Proposal: /demos/context-menu/layouts panel 4, the platform default. Tiered plus a filter box that flattens every action into one ranked list.\",\n tieredNodes(m),\n { search: true },\n );\n}\n\nexport const STARTER_DESIGNS: readonly StarterDesign[] = [\n { id: \"live-editable-field\", group: \"Live today\", source: \"Engine ContextMenuV3 — editable text field\", design: liveEditableField() },\n { id: \"live-chat-message\", group: \"Live today\", source: \"Engine NonEditableContextMenu — read-only text and chat message\", design: liveReadOnlyMessage() },\n { id: \"live-notes-editor\", group: \"Live today\", source: \"/notes — notesEditorExtraSections\", design: liveNotesEditor() },\n { id: \"live-quiz-row\", group: \"Live today\", source: \"/education/quizzes — useAssessmentRowActions\", design: liveQuizRow() },\n { id: \"live-table-row\", group: \"Live today\", source: \"/data row — /demos/context-menu-designs TableRowsPanel (today)\", design: liveTableRow() },\n { id: \"proposal-grouped\", group: \"Proposal\", source: \"/demos/context-menu-regroup — grouped by what you get\", design: regroupDesign() },\n { id: \"proposal-object-thing\", group: \"Proposal\", source: \"/demos/context-menu-designs — a thing\", design: objectFirstThing() },\n { id: \"proposal-object-editable\", group: \"Proposal\", source: \"/demos/context-menu-designs — editable text\", design: objectFirstEditable() },\n { id: \"proposal-object-readonly\", group: \"Proposal\", source: \"/demos/context-menu-designs — read-only text\", design: objectFirstReadOnly() },\n { id: \"proposal-layout-compact\", group: \"Proposal\", source: \"/demos/context-menu/layouts — compact\", design: layoutCompact() },\n { id: \"proposal-layout-tiered\", group: \"Proposal\", source: \"/demos/context-menu/layouts — tiered\", design: layoutTiered() },\n { id: \"proposal-layout-command\", group: \"Proposal\", source: \"/demos/context-menu/layouts — command\", design: layoutCommand() },\n];\n","// src/builder/icons.tsx — the builder's icon set: every lucide icon, by name. Builder-only (it pulls\n// the whole set; the live menu takes its icons from the host instead).\nimport * as Lucide from \"lucide-react\";\nimport type { ComponentType, ReactNode } from \"react\";\n\ntype IconComponent = ComponentType<{ className?: string | undefined; strokeWidth?: number }>;\n\nconst table = Lucide as unknown as Record<string, unknown>;\n\nexport const ICON_NAMES: readonly string[] = Object.keys(table)\n .filter((k) => /^[A-Z]/.test(k) && !k.endsWith(\"Icon\") && !k.startsWith(\"Lucide\") && k !== \"Icon\" && k !== \"createLucideIcon\")\n .sort();\n\nexport function renderLucide(name: string, className?: string): ReactNode {\n const Found = table[name] as IconComponent | undefined;\n const Icon = (typeof Found === \"function\" || (typeof Found === \"object\" && Found !== null) ? Found : table.CircleHelp) as IconComponent;\n return <Icon className={className} strokeWidth={1.75} />;\n}\n"],"mappings":";;;AAOA,SAAS,eAAe,aAAa,YAAY,WAAW,WAAAA,UAAS,QAAQ,YAAAC,iBAAwE;;;ACkCrJ,IAAM,IAAI,CACR,IACA,OACA,MACA,OACA,QAAyE,CAAC,OACvD,EAAE,IAAI,OAAO,MAAM,OAAO,QAAQ,QAAQ,GAAG,MAAM;AAEjE,IAAM,UAAoC;AAAA;AAAA,EAE/C,EAAE,WAAW,QAAQ,QAAQ,aAAa,EAAE,UAAU,UAAK,CAAC;AAAA,EAC5D,EAAE,UAAU,OAAO,YAAY,aAAa,EAAE,UAAU,UAAK,CAAC;AAAA,EAC9D,EAAE,YAAY,SAAS,kBAAkB,aAAa,EAAE,UAAU,UAAK,CAAC;AAAA,EACxE,EAAE,WAAW,QAAQ,SAAS,aAAa,EAAE,UAAU,UAAK,CAAC;AAAA,EAC7D,EAAE,WAAW,QAAQ,SAAS,aAAa,EAAE,UAAU,gBAAM,CAAC;AAAA,EAC9D,EAAE,WAAW,kBAAkB,UAAU,aAAa,EAAE,UAAU,UAAK,CAAC;AAAA,EACxE,EAAE,iBAAiB,cAAc,cAAc,aAAa,EAAE,UAAU,UAAK,CAAC;AAAA,EAC9E,EAAE,cAAc,iBAAY,YAAY,WAAW;AAAA,EACnD,EAAE,WAAW,gBAAgB,UAAU,WAAW;AAAA,EAClD,EAAE,kBAAkB,qBAAqB,YAAY,WAAW;AAAA,EAChE,EAAE,uBAAuB,iCAA4B,UAAU,WAAW;AAAA;AAAA,EAG1E,EAAE,WAAW,QAAQ,QAAQ,QAAQ,EAAE,UAAU,UAAK,CAAC;AAAA,EACvD,EAAE,aAAa,aAAa,YAAY,MAAM;AAAA,EAC9C,EAAE,UAAU,UAAU,WAAW,MAAM;AAAA,EACvC,EAAE,QAAQ,QAAQ,UAAU,MAAM;AAAA,EAClC,EAAE,YAAY,oBAAoB,QAAQ,MAAM;AAAA,EAChD,EAAE,WAAW,WAAW,WAAW,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAAA,EAC3D,EAAE,aAAa,UAAU,UAAU,QAAQ,EAAE,QAAQ,KAAK,CAAC;AAAA;AAAA,EAG3D,EAAE,WAAW,mBAAmB,iBAAiB,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EACnE,EAAE,oBAAoB,iBAAiB,OAAO,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EAChE,EAAE,0BAA0B,cAAc,YAAY,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EACxE,EAAE,8BAA8B,kBAAkB,UAAU,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EAC9E,EAAE,kCAAkC,aAAa,aAAa,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EAChF,EAAE,0BAA0B,YAAY,QAAQ,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EAClE,EAAE,6BAA6B,6BAA6B,OAAO,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EACrF,EAAE,4BAA4B,UAAU,OAAO,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EACjE,EAAE,iBAAiB,uBAAkB,QAAQ,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EAC/D,EAAE,oBAAoB,oBAAoB,kBAAkB,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EAC9E,EAAE,uBAAuB,cAAc,aAAa,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EACtE,EAAE,oBAAoB,gBAAgB,eAAe,MAAM,EAAE,IAAI,KAAK,CAAC;AAAA,EACvE,EAAE,cAAc,mBAAmB,SAAS,MAAM,EAAE,IAAI,MAAM,QAAQ,WAAW,CAAC;AAAA,EAClF,EAAE,gBAAgB,aAAa,gBAAgB,MAAM,EAAE,IAAI,MAAM,QAAQ,WAAW,CAAC;AAAA,EACrF,EAAE,cAAc,WAAW,aAAa,MAAM,EAAE,IAAI,MAAM,QAAQ,WAAW,CAAC;AAAA,EAC9E,EAAE,gBAAgB,mBAAc,aAAa,MAAM,EAAE,IAAI,MAAM,QAAQ,WAAW,CAAC;AAAA;AAAA,EAGnF,EAAE,aAAa,UAAU,cAAc,eAAe;AAAA,EACtD,EAAE,cAAc,oBAAe,kBAAkB,eAAe;AAAA,EAChE,EAAE,gBAAgB,gBAAgB,YAAY,eAAe;AAAA,EAC7D,EAAE,gBAAgB,gBAAgB,YAAY,eAAe;AAAA,EAC7D,EAAE,iBAAiB,iBAAiB,YAAY,eAAe;AAAA,EAC/D,EAAE,iBAAiB,iBAAiB,aAAa,eAAe;AAAA,EAChE,EAAE,SAAS,SAAS,WAAW,iBAAiB,EAAE,UAAU,UAAK,CAAC;AAAA;AAAA,EAGlE,EAAE,YAAY,eAAU,UAAU,iBAAiB;AAAA,EACnD,EAAE,cAAc,mBAAmB,QAAQ,iBAAiB;AAAA,EAC5D,EAAE,mBAAmB,uBAAuB,UAAU,iBAAiB;AAAA,EACvE,EAAE,eAAe,eAAe,QAAQ,iBAAiB;AAAA,EACzD,EAAE,gBAAgB,uBAAuB,OAAO,iBAAiB;AAAA,EACjE,EAAE,iBAAiB,uBAAuB,SAAS,iBAAiB;AAAA;AAAA,EAGpE,EAAE,aAAa,mBAAc,aAAa,UAAU;AAAA,EACpD,EAAE,qBAAqB,kBAAkB,OAAO,UAAU;AAAA,EAC1D,EAAE,eAAe,OAAO,OAAO,UAAU;AAAA,EACzC,EAAE,sBAAsB,oBAAoB,cAAc,UAAU;AAAA,EACpE,EAAE,QAAQ,wBAAmB,eAAe,UAAU;AAAA,EACtD,EAAE,QAAQ,cAAS,QAAQ,UAAU;AAAA;AAAA,EAGrC,EAAE,mBAAmB,gBAAgB,WAAW,mBAAmB;AAAA,EACnE,EAAE,gBAAgB,gBAAgB,qBAAqB,mBAAmB;AAAA,EAC1E,EAAE,mBAAmB,kBAAkB,aAAa,mBAAmB;AAAA,EACvE,EAAE,cAAc,iBAAY,oBAAoB,mBAAmB;AAAA,EACnE,EAAE,0BAA0B,0BAA0B,iBAAiB,mBAAmB;AAAA,EAC1F,EAAE,oBAAoB,uBAAuB,QAAQ,mBAAmB;AAAA;AAAA,EAGxE,EAAE,YAAY,cAAc,WAAW,QAAQ;AAAA,EAC/C,EAAE,aAAa,WAAW,OAAO,QAAQ;AAAA,EACzC,EAAE,sBAAsB,kBAAkB,cAAc,QAAQ;AAAA;AAAA,EAGhE,EAAE,mBAAmB,aAAa,KAAK,aAAa;AAAA,EACpD,EAAE,sBAAsB,oBAAoB,iBAAiB,aAAa;AAAA,EAC1E,EAAE,mBAAmB,sBAAsB,YAAY,aAAa;AAAA,EACpE,EAAE,yBAAyB,qBAAqB,iBAAiB,aAAa;AAAA,EAC9E,EAAE,2BAA2B,wBAAwB,UAAU,aAAa;AAAA,EAC5E,EAAE,eAAe,iBAAiB,UAAU,eAAe,EAAE,QAAQ,KAAK,CAAC;AAAA;AAAA,EAG3E,EAAE,YAAY,QAAQ,yBAAyB,cAAc;AAAA,EAC7D,EAAE,gBAAgB,mBAAmB,gBAAgB,cAAc;AAAA,EACnE,EAAE,YAAY,QAAQ,QAAQ,cAAc;AAAA,EAC5C,EAAE,eAAe,WAAW,YAAY,cAAc;AAAA,EACtD,EAAE,cAAc,UAAU,aAAa,cAAc;AAAA,EACrD,EAAE,eAAe,WAAW,kBAAkB,cAAc;AAAA;AAAA,EAG5D,EAAE,qBAAqB,qBAAqB,aAAa,sBAAsB,EAAE,IAAI,KAAK,CAAC;AAAA,EAC3F,EAAE,uBAAuB,uBAAuB,WAAW,sBAAsB,EAAE,IAAI,KAAK,CAAC;AAAA,EAC7F,EAAE,eAAe,iBAAiB,YAAY,oBAAoB;AAAA,EAClE,EAAE,iBAAiB,gBAAgB,cAAc,oBAAoB;AAAA;AAAA,EAGrE,EAAE,gBAAgB,yCAAyC,UAAU,eAAe;AAAA,EACpF,EAAE,YAAY,eAAe,UAAU,eAAe;AAAA,EACtD,EAAE,YAAY,iBAAiB,wBAAwB,eAAe;AAAA,EACtE,EAAE,sBAAsB,sBAAsB,YAAY,iBAAiB,EAAE,QAAQ,WAAW,CAAC;AACnG;AAEO,IAAM,iBAA0C,CAAC,GAAG,IAAI,IAAI,QAAQ,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAExF,SAAS,cAAc,IAAuC;AACnE,SAAO,QAAQ,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AACxC;AAUA,IAAI,MAAM;AACV,IAAM,MAAM,CAAC,MAAc,GAAG,CAAC,KAAK,KAAK,IAAI,EAAE,SAAS,EAAE,CAAC,IAAI,OAAO,SAAS,EAAE,CAAC;AAElF,SAAS,SAAS,IAAsB;AACtC,QAAM,IAAI,cAAc,EAAE;AAC1B,SAAO;AAAA,IACL,IAAI,IAAI,GAAG;AAAA,IACX,MAAM;AAAA,IACN,WAAW;AAAA,IACX,OAAO,GAAG,SAAS;AAAA,IACnB,MAAM,GAAG,QAAQ;AAAA,IACjB,GAAI,GAAG,WAAW,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC;AAAA,IAC9C,GAAI,GAAG,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,IACpC,GAAI,GAAG,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;AAAA,EAC9B;AACF;AAEA,IAAM,QAAQ,CAAC,OAAe,SAA6B;AAAA,EACzD,IAAI,IAAI,GAAG;AAAA,EACX,MAAM;AAAA,EACN;AAAA,EACA,QAAQ;AAAA,EACR,UAAU,IAAI,IAAI,QAAQ;AAC5B;AAEA,IAAM,MAAM,CAAC,OAAe,MAAc,SAA6B;AAAA,EACrE,IAAI,IAAI,GAAG;AAAA,EACX,MAAM;AAAA,EACN;AAAA,EACA;AAAA,EACA,UAAU,IAAI,IAAI,QAAQ;AAC5B;AAEO,IAAM,YAAwC;AAAA,EACnD,EAAE,IAAI,eAAe,OAAO,6BAAwB,MAAM,SAAS,OAAO,MAAM,MAAM,IAAI,CAAC,WAAW,YAAY,aAAa,YAAY,gBAAgB,SAAS,CAAC,EAAE;AAAA,EACvK,EAAE,IAAI,cAAc,OAAO,mCAA8B,MAAM,SAAS,OAAO,MAAM,MAAM,IAAI,CAAC,UAAU,WAAW,YAAY,WAAW,WAAW,SAAS,CAAC,EAAE;AAAA,EACnK,EAAE,IAAI,cAAc,OAAO,oCAA+B,MAAM,SAAS,OAAO,MAAM,MAAM,IAAI,CAAC,WAAW,YAAY,WAAW,UAAU,CAAC,EAAE;AAAA,EAChJ,EAAE,IAAI,oBAAoB,OAAO,uBAAkB,MAAM,YAAY,OAAO,MAAM,IAAI,gBAAgB,YAAY,CAAC,WAAW,0BAA0B,4BAA4B,eAAe,CAAC,EAAE;AAAA,EACtM,EAAE,IAAI,kBAAkB,OAAO,uBAAkB,MAAM,UAAU,OAAO,MAAM,IAAI,gBAAgB,UAAU,CAAC,cAAc,gBAAgB,cAAc,iBAAiB,UAAU,CAAC,EAAE;AAAA,EACvL,EAAE,IAAI,gBAAgB,OAAO,mBAAc,MAAM,QAAQ,OAAO,MAAM,IAAI,YAAY,QAAQ,CAAC,aAAa,eAAe,mBAAmB,YAAY,CAAC,EAAE;AAAA,EAC7J,EAAE,IAAI,aAAa,OAAO,gBAAW,MAAM,UAAU,OAAO,MAAM,IAAI,SAAS,UAAU,CAAC,YAAY,oBAAoB,YAAY,gBAAgB,UAAU,CAAC,EAAE;AACrK;AAeO,IAAM,eAAsC;AAAA,EACjD,EAAE,IAAI,OAAO,OAAO,yBAAyB,QAAQ,mBAAmB,MAAM,WAAW;AAAA,EACzF,EAAE,IAAI,UAAU,OAAO,gCAAgC,QAAQ,oBAAoB,MAAM,OAAO,SAAS,KAAK;AAAA,EAC9G,EAAE,IAAI,aAAa,OAAO,wBAAwB,QAAQ,8BAA8B,MAAM,YAAY,SAAS,KAAK;AAAA,EACxH,GAAG,eAAe,IAAI,CAAC,OAAO;AAAA,IAC5B,IAAI,SAAS,CAAC;AAAA,IACd,OAAO;AAAA,IACP,QAAQ,MAAM,OAAO,uBAAuB,aAAa,EAAE,YAAY,CAAC;AAAA,IACxE,MAAM,QAAQ,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,GAAG,QAAQ;AAAA,EACpD,EAAE;AACJ;AAEO,SAAS,WAAW,IAAoC;AAC7D,SAAO,aAAa,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE;AAC7C;AAGO,SAAS,YAAY,OAAe,QAA8C;AACvF,MAAI,UAAU,YAAY,UAAU,YAAa,QAAO,CAAC;AACzD,QAAM,OAAO,UAAU,QAAQ,UAAU,QAAQ,OAAO,CAAC,MAAM,SAAS,EAAE,KAAK,OAAO,KAAK;AAC3F,SAAO,KAAK,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC;AAC7C;;;ACnPA,SAAS,SAAS,gBAAoD;;;ACyE/D,IAAM,gBAAgB;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAaO,IAAM,eAAyB;AAAA,EACpC,SAAS;AAAA,EACT,OAAO;AAAA,EACP,WAAW;AAAA,EACX,eAAe;AAAA,EACf,WAAW;AAAA,EACX,QAAQ;AACV;AAaO,IAAM,gBAAgB;AAItB,SAAS,MAAM,SAAS,KAAa;AAC1C,QAAM,MACJ,OAAO,WAAW,eAAe,gBAAgB,SAC7C,OAAO,WAAW,EAAE,MAAM,GAAG,CAAC,IAC9B,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,MAAM,GAAG,EAAE;AAC5C,SAAO,GAAG,MAAM,IAAI,GAAG;AACzB;AAEO,SAAS,YAAY,OAAO,iBAA6B;AAC9D,SAAO,EAAE,UAAU,MAAM,GAAG,GAAG,MAAM,SAAS,YAAY,MAAM,EAAE,GAAG,aAAa,GAAG,OAAO,CAAC,GAAG,OAAO,GAAG;AAC5G;AAEO,SAAS,YAAY,MAA2C;AACrE,SAAO,KAAK,SAAS,aAAa,KAAK,SAAS;AAClD;AAGO,SAAS,iBAAiB,OAA4B,MAAM,oBAAI,IAAY,GAAgB;AACjG,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,UAAW,KAAI,IAAI,EAAE,SAAS;AACpC,QAAI,YAAY,CAAC,EAAG,kBAAiB,EAAE,UAAU,GAAG;AAAA,EACtD;AACA,SAAO;AACT;AAGO,SAAS,iBAAiB,OAA4B,MAAM,oBAAI,IAAoB,GAAwB;AACjH,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,UAAW,KAAI,IAAI,EAAE,YAAY,IAAI,IAAI,EAAE,SAAS,KAAK,KAAK,CAAC;AACrE,QAAI,YAAY,CAAC,EAAG,kBAAiB,EAAE,UAAU,GAAG;AAAA,EACtD;AACA,SAAO;AACT;AAGO,SAAS,UAA8B,MAAY;AACxD,QAAM,OAAO,EAAE,GAAG,MAAM,IAAI,MAAM,KAAK,KAAK,CAAC,CAAC,EAAE;AAChD,MAAI,YAAY,IAAI,EAAG,CAAC,KAA2B,WAAY,KAA2B,SAAS,IAAI,SAAS;AAChH,SAAO;AACT;AAYO,SAAS,OAAO,OAA4B,IAAY,WAA0B,MAAM,QAAQ,GAAmB;AACxH,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,UAAM,OAAO,MAAM,CAAC;AACpB,QAAI,KAAK,OAAO,GAAI,QAAO,EAAE,MAAM,UAAU,OAAO,GAAG,MAAM;AAC7D,QAAI,YAAY,IAAI,GAAG;AACrB,YAAM,QAAQ,OAAO,KAAK,UAAU,IAAI,KAAK,IAAI,QAAQ,CAAC;AAC1D,UAAI,MAAO,QAAO;AAAA,IACpB;AAAA,EACF;AACA,SAAO;AACT;AAEO,SAAS,SAAS,MAAgB,IAAqB;AAC5D,MAAI,KAAK,OAAO,GAAI,QAAO;AAC3B,SAAO,YAAY,IAAI,KAAK,KAAK,SAAS,KAAK,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AACvE;AAEO,SAAS,WAAW,OAAoC;AAC7D,MAAI,IAAI;AACR,aAAW,QAAQ,OAAO;AACxB,QAAI,KAAK,SAAS,UAAU,KAAK,SAAS,OAAQ,MAAK;AAAA,aAC9C,YAAY,IAAI,EAAG,MAAK,WAAW,KAAK,QAAQ,KAAK,KAAK,SAAS,YAAY,IAAI;AAAA,EAC9F;AACA,SAAO;AACT;AAIA,SAAS,YAAY,OAA4B,UAAyB,IAAkD;AAC1H,MAAI,aAAa,KAAM,QAAO,GAAG,CAAC,GAAG,KAAK,CAAC;AAC3C,SAAO,MAAM,IAAI,CAAC,SAAS;AACzB,QAAI,CAAC,YAAY,IAAI,EAAG,QAAO;AAC/B,QAAI,KAAK,OAAO,SAAU,QAAO,EAAE,GAAG,MAAM,UAAU,GAAG,CAAC,GAAG,KAAK,QAAQ,CAAC,EAAE;AAC7E,WAAO,EAAE,GAAG,MAAM,UAAU,YAAY,KAAK,UAAU,UAAU,EAAE,EAAE;AAAA,EACvE,CAAC;AACH;AAEO,SAAS,WAAW,OAA4B,UAAyB,OAAe,MAA4B;AACzH,SAAO,YAAY,OAAO,UAAU,CAAC,SAAS;AAC5C,SAAK,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,OAAO,KAAK,MAAM,CAAC,GAAG,GAAG,IAAI;AAC9D,WAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,WAAW,OAA4B,IAAwB;AAC7E,SAAO,MACJ,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,EACzB,IAAI,CAAC,MAAO,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,UAAU,WAAW,EAAE,UAAU,EAAE,EAAE,IAAI,CAAE;AACrF;AAEO,SAAS,WAAW,OAA4B,IAAY,OAAsC;AACvG,SAAO,MAAM,IAAI,CAAC,MAAM;AACtB,QAAI,EAAE,OAAO,GAAI,QAAO,EAAE,GAAG,GAAG,GAAG,OAAO,IAAI,EAAE,IAAI,MAAM,EAAE,KAAK;AACjE,QAAI,YAAY,CAAC,EAAG,QAAO,EAAE,GAAG,GAAG,UAAU,WAAW,EAAE,UAAU,IAAI,KAAK,EAAE;AAC/E,WAAO;AAAA,EACT,CAAC;AACH;AAMO,SAAS,QAAQ,OAA4B,IAAY,UAAkC;AAChG,QAAM,OAAO,OAAO,OAAO,EAAE;AAC7B,SAAO,QAAQ,IAAI,MAAM,aAAa,QAAQ,CAAC,SAAU,KAAiB,MAAM,QAAQ;AAC1F;AAEO,SAAS,SAAS,OAA4B,IAAY,UAAyB,OAA2B;AACnH,QAAM,OAAO,OAAO,OAAO,EAAE;AAE7B,MAAI,CAAC,KAAM,QAAO;AAClB,MAAI,aAAa,QAAQ,SAAS,KAAK,MAAM,QAAQ,EAAG,QAAO;AAC/D,MAAI,SAAS;AACb,MAAI,KAAK,aAAa,YAAY,KAAK,QAAQ,MAAO,WAAU;AAChE,SAAO,WAAW,WAAW,OAAO,EAAE,GAAG,UAAU,QAAQ,KAAK,IAAI;AACtE;AAEO,SAAS,cAAc,OAA4B,IAAwB;AAChF,QAAM,KAAK,OAAO,OAAO,EAAE;AAC3B,MAAI,CAAC,GAAI,QAAO,CAAC,GAAG,KAAK;AACzB,SAAO,WAAW,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,IAAI,CAAC;AACxE;AAGO,SAAS,SAAS,OAA4B,IAAY,MAAyC;AACxG,QAAM,KAAK,OAAO,OAAO,EAAE;AAC3B,MAAI,CAAC,GAAI,QAAO,CAAC,GAAG,KAAK;AACzB,QAAM,UACJ,SAAS,YACL,EAAE,IAAI,MAAM,GAAG,GAAG,MAAM,WAAW,OAAO,eAAe,UAAU,CAAC,GAAG,IAAI,EAAE,IAC7E,EAAE,IAAI,MAAM,GAAG,GAAG,MAAM,WAAW,OAAO,QAAQ,MAAM,gBAAgB,UAAU,CAAC,GAAG,IAAI,EAAE;AAClG,SAAO,WAAW,WAAW,OAAO,EAAE,GAAG,GAAG,UAAU,GAAG,OAAO,OAAO;AACzE;AAGO,SAAS,WAAW,OAA4B,IAAwB;AAC7E,QAAM,KAAK,OAAO,OAAO,EAAE;AAC3B,MAAI,CAAC,MAAM,CAAC,YAAY,GAAG,IAAI,EAAG,QAAO,CAAC,GAAG,KAAK;AAClD,MAAI,MAAM,WAAW,OAAO,EAAE;AAC9B,KAAG,KAAK,SAAS,QAAQ,CAAC,OAAO,MAAM;AACrC,UAAM,WAAW,KAAK,GAAG,UAAU,GAAG,QAAQ,GAAG,KAAK;AAAA,EACxD,CAAC;AACD,SAAO;AACT;AAKO,SAAS,YAAY,KAA0B;AACpD,MAAI,QAAiB;AACrB,MAAI,OAAO,QAAQ,UAAU;AAC3B,QAAI;AACF,cAAQ,KAAK,MAAM,GAAG;AAAA,IACxB,QAAQ;AACN,aAAO,YAAY,mBAAmB;AAAA,IACxC;AAAA,EACF;AACA,QAAM,IAAK,SAAS,CAAC;AACrB,QAAM,IAAI,EAAE,UAAU;AACtB,SAAO;AAAA,IACL,UAAU,OAAO,EAAE,aAAa,WAAW,EAAE,WAAW,MAAM,GAAG;AAAA,IACjE,MAAM,OAAO,EAAE,SAAS,WAAW,EAAE,OAAO;AAAA,IAC5C,SAAS,cAAc,SAAS,EAAE,OAAsB,IAAK,EAAE,UAA0B;AAAA,IACzF,MAAM,EAAE,GAAG,cAAc,GAAI,EAAE,QAAQ,CAAC,EAAG;AAAA,IAC3C,OAAO,MAAM,QAAQ,EAAE,KAAK,IAAK,EAAE,QAAuB,CAAC;AAAA,IAC3D,OAAO,OAAO,EAAE,UAAU,WAAW,EAAE,QAAQ;AAAA,EACjD;AACF;AAEO,SAAS,gBAAgBC,SAA4B;AAC1D,SAAO,KAAK,UAAU,EAAE,QAAQ,eAAe,QAAAA,QAAO,CAAC;AACzD;;;AD3PQ,SAiCJ,UA9BM,KAHF;AAhCR,SAAS,QAAQ,MAAgB,GAAoB;AACnD,MAAI,CAAC,EAAG,QAAO;AACf,MAAI,KAAK,SAAS,UAAW,QAAO;AACpC,MAAI,KAAK,SAAS,UAAU,KAAK,SAAS,OAAQ,QAAO,KAAK,MAAM,YAAY,EAAE,SAAS,CAAC;AAC5F,SAAO,KAAK,MAAM,YAAY,EAAE,SAAS,CAAC,KAAK,KAAK,SAAS,KAAK,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC;AACxF;AAGA,SAAS,QAAQ,OAA4B,GAAW,MAAsB,CAAC,GAAmB;AAChG,aAAW,KAAK,OAAO;AACrB,QAAI,EAAE,SAAS,UAAU,QAAQ,GAAG,CAAC,EAAG,KAAI,KAAK,CAAC;AAAA,aACzC,YAAY,CAAC,EAAG,SAAQ,EAAE,UAAU,GAAG,GAAG;AAAA,EACrD;AACA,SAAO;AACT;AAEO,SAAS,YAAY,EAAE,QAAAC,SAAQ,YAAY,aAAa,cAAc,QAAQ,WAAW,MAAM,GAAqB;AACzH,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,EAAE;AACrC,QAAM,IAAI,MAAM,KAAK,EAAE,YAAY;AACnC,QAAM,EAAE,KAAK,IAAIA;AACjB,QAAM,UAAU,QAAQ,MAAO,IAAI,QAAQA,QAAO,OAAO,CAAC,IAAI,MAAO,CAACA,QAAO,OAAO,CAAC,CAAC;AACtF,QAAM,SAAS,QAAQ,MAAM,iBAAiBA,QAAO,KAAK,GAAG,CAACA,QAAO,KAAK,CAAC;AAC3E,QAAM,MAAW,EAAE,QAAAA,SAAQ,YAAY,aAAa,cAAc,QAAQ,OAAO;AAEjF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,gBAAc,KAAK;AAAA,MACnB,WAAW,WAAW,aAAa,EAAE;AAAA,MACrC,OAAO,EAAE,OAAO,KAAK,OAAO,GAAG,MAAM;AAAA,MAEpC;AAAA,aAAK,UACJ,qBAAC,SAAI,WAAU,aACZ;AAAA,qBAAW,UAAU,SAAS;AAAA,UAE/B,oBAAC,WAAM,OAAO,OAAO,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,KAAK,GAAG,aAAY,wBAAkB,cAAW,eAAc;AAAA,WACzH;AAAA,QAED,UACC,QAAQ,WAAW,IACjB,oBAAC,SAAI,WAAU,YAAW,wBAAU,IAEpC,QAAQ,IAAI,CAAC,MAAM,oBAAC,QAAgB,MAAM,GAAG,OAAf,EAAE,EAAuB,CAAE,IAEzDA,QAAO,MAAM,WAAW,IAC1B,oBAAC,SAAI,WAAU,YAAW,+CAA4B,IAEtD,oBAAC,SAAM,OAAOA,QAAO,OAAO,KAAU;AAAA;AAAA;AAAA,EAE1C;AAEJ;AAYA,SAAS,MAAM,EAAE,OAAO,IAAI,GAA6C;AACvE,SACE,gCACG,gBAAM,IAAI,CAAC,MAAM;AAChB,QAAI,EAAE,SAAS,UAAW,QAAO,oBAAC,SAAe,MAAK,aAAY,WAAU,gBAAjC,EAAE,EAA4C;AACzF,QAAI,EAAE,SAAS,OAAQ,QAAO,oBAAC,QAAgB,MAAM,GAAG,OAAf,EAAE,EAAuB;AAClE,QAAI,EAAE,SAAS,UAAW,QAAO,oBAAC,WAAmB,MAAM,GAAG,OAAf,EAAE,EAAuB;AACxE,QAAI,EAAE,SAAS,OAAQ,QAAO,oBAAC,QAAgB,MAAM,GAAG,OAAf,EAAE,EAAuB;AAClE,WAAO,oBAAC,WAAmB,MAAM,GAAG,OAAf,EAAE,EAAuB;AAAA,EAChD,CAAC,GACH;AAEJ;AAEA,SAAS,QAAQ,EAAE,MAAM,IAAI,GAA+D;AAC1F,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,CAAC,KAAK,WAAW;AAClD,QAAM,SAAS,KAAK,UAAU;AAC9B,SACE,qBAAC,SAAI,WAAW,cAAc,IAAI,gBAAgB,KAAK,KAAK,UAAU,EAAE,IAAI,eAAa,QACtF;AAAA,SAAK;AAAA,IAEJ;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAU;AAAA,QACV,SAAS,MAAM;AACb,cAAI,eAAe,KAAK,EAAE;AAC1B,cAAI,KAAK,YAAa,SAAQ,CAACC,OAAM,CAACA,EAAC;AAAA,QACzC;AAAA,QAEC;AAAA,eAAK;AAAA,UACL,KAAK,eAAe,oBAAC,UAAK,WAAU,YAAY,iBAAO,WAAM,UAAI;AAAA;AAAA;AAAA,IACpE;AAAA,IAED,QACC,oBAAC,SAAI,WAAU,mBACZ,qBAAW,SACV,oBAAC,SAAM,OAAO,KAAK,UAAU,KAAU,IAEvC,KAAK,SAAS;AAAA,MAAI,CAAC,MACjB,EAAE,SAAS,SAAS,oBAAC,QAAgB,MAAM,GAAG,OAAf,EAAE,EAAuB,IAAK,oBAAC,SAAiB,OAAO,CAAC,CAAC,GAAG,OAAlB,EAAE,EAA0B;AAAA,IACvG,GAEJ;AAAA,KAEJ;AAEJ;AAEA,SAAS,KAAK,EAAE,MAAM,IAAI,GAAqC;AAC7D;AAAA;AAAA,IAEE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,OAAO,KAAK,SAAS,KAAK,WAAW,KAAK,KAAK,QAAQ,KAAK;AAAA,QAC5D,UAAU,KAAK;AAAA,QACf,WAAW,WAAW,KAAK,SAAS,cAAc,EAAE,IAAI,KAAK,KAAK,UAAU,EAAE,IAAI,IAAI,gBAAgB,KAAK,KAAK,UAAU,EAAE;AAAA,QAC5H,SAAS,MAAM;AACb,cAAI,eAAe,KAAK,EAAE;AAC1B,cAAI,SAAS,IAAI;AAAA,QACnB;AAAA,QAEC,cAAI,WAAW,KAAK,QAAQ,UAAU,SAAS;AAAA;AAAA,IAClD;AAAA;AAEJ;AAEA,SAAS,KAAK,EAAE,MAAM,IAAI,GAAqC;AAC7D,QAAM,EAAE,KAAK,IAAI,IAAI;AACrB,QAAM,CAAC,SAAS,UAAU,IAAI,SAAS,KAAK;AAC5C;AAAA;AAAA,IAEE;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAM,KAAK,SAAS,qBAAqB;AAAA,QACzC,gBAAc,KAAK,SAAS,UAAU;AAAA,QACtC,UAAU,KAAK;AAAA,QACf,WAAW,WAAW,KAAK,SAAS,cAAc,EAAE,IAAI,KAAK,KAAK,UAAU,EAAE,IAAI,IAAI,gBAAgB,KAAK,KAAK,UAAU,EAAE;AAAA,QAC5H,SAAS,MAAM;AACb,cAAI,eAAe,KAAK,EAAE;AAC1B,cAAI,KAAK,OAAQ,YAAW,CAAC,MAAM,CAAC,CAAC;AACrC,cAAI,SAAS,IAAI;AAAA,QACnB;AAAA,QAEC;AAAA,eAAK,aAAa,oBAAC,UAAK,WAAU,gBAAgB,eAAK,SAAU,UAAU,IAAI,WAAW,SAAS,SAAS,IAAI,OAAQ,KAAK,OAAO,IAAI,WAAW,KAAK,MAAM,SAAS,IAAI,MAAK;AAAA,UACjL,qBAAC,UAAK,WAAU,WACd;AAAA,gCAAC,UAAK,WAAU,YAAY,eAAK,OAAM;AAAA,YACtC,KAAK,aAAa,KAAK,QAAQ,oBAAC,UAAK,WAAU,WAAW,eAAK,MAAK;AAAA,aACvE;AAAA,UACC,KAAK,iBAAiB,KAAK,YAAY,oBAAC,SAAI,WAAU,eAAe,eAAK,UAAS;AAAA;AAAA;AAAA,IACtF;AAAA;AAEJ;AAEA,SAAS,QAAQ,EAAE,MAAM,IAAI,GAAwC;AACnE,QAAM,EAAE,KAAK,IAAI,IAAI;AACrB,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAqB,OAAO;AACpD,QAAM,OAAO,CAAC,OAAoB;AAChC,YAAQ,WAAW,IAAI,KAAK,KAAK,CAAC;AAClC,YAAQ,IAAI;AAAA,EACd;AACA,SACE,qBAAC,SAAI,WAAU,UAAS,cAAc,CAAC,MAAM,KAAK,EAAE,aAAa,GAAG,cAAc,MAAM,QAAQ,KAAK,GAEnG;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,WAAW,WAAW,IAAI,gBAAgB,KAAK,KAAK,UAAU,EAAE;AAAA,QAChE,SAAS,MAAM;AACb,cAAI,eAAe,KAAK,EAAE;AAC1B,kBAAQ,IAAI;AAAA,QACd;AAAA,QAEC;AAAA,eAAK,aAAa,oBAAC,UAAK,WAAU,gBAAgB,eAAK,OAAO,IAAI,WAAW,KAAK,MAAM,SAAS,IAAI,MAAK;AAAA,UAC3G,qBAAC,UAAK,WAAU,WACd;AAAA,gCAAC,UAAK,WAAU,YAAY,eAAK,OAAM;AAAA,YACtC,KAAK,aAAa,KAAK,QAAQ,oBAAC,UAAK,WAAU,WAAW,eAAK,MAAK;AAAA,aACvE;AAAA,UACC,IAAI,WAAW,gBAAgB,iBAAiB;AAAA;AAAA;AAAA,IACnD;AAAA,IACC,QACC,oBAAC,SAAI,MAAK,QAAO,WAAU,qBAAoB,aAAW,MAAM,gBAAc,KAAK,SAAS,OAAO,EAAE,OAAO,KAAK,MAAM,GACpH,eAAK,SAAS,WAAW,IAAI,oBAAC,SAAI,WAAU,YAAW,2BAAa,IAAS,oBAAC,SAAM,OAAO,KAAK,UAAU,KAAU,GACvH;AAAA,KAEJ;AAEJ;AAQA,SAAS,WAAW,KAAkB,OAA2B;AAC/D,QAAM,IAAI,IAAI,sBAAsB;AACpC,QAAM,SAAS,IAAI,QAAqB,oBAAoB,GAAG,sBAAsB,KAAK,EAAE,MAAM,GAAG,OAAO,OAAO,WAAW;AAC9H,MAAI,EAAE,QAAQ,QAAQ,KAAK,OAAO,MAAO,QAAO;AAChD,MAAI,EAAE,OAAO,QAAQ,KAAK,OAAO,KAAM,QAAO;AAC9C,SAAO;AACT;AAGA,SAAS,KAAK,EAAE,MAAM,IAAI,GAAqC;AAC7D,QAAM,EAAE,KAAK,IAAI,IAAI;AACrB,QAAM,SAAS,WAAW,KAAK,KAAK;AACpC,QAAM,UAAU,YAAY,KAAK,OAAO,IAAI,MAAM;AAClD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAqB,OAAO;AACpD,QAAM,QAAQ,QAAQ,UAAU,SAAS,OAAO,QAAQ,MAAM;AAC9D,QAAM;AAAA;AAAA,IAEJ;AAAA,MAAC;AAAA;AAAA,QACC,MAAK;AAAA,QACL,MAAK;AAAA,QACL,iBAAe,KAAK,UAAU,YAAY,SAAS;AAAA,QACnD,OAAO,SAAS,gBAAgB,OAAO,KAAK,KAAK;AAAA,QACjD,WAAW,mBAAmB,IAAI,gBAAgB,KAAK,KAAK,UAAU,EAAE;AAAA,QACxE,SAAS,MAAM;AACb,cAAI,eAAe,KAAK,EAAE;AAC1B,cAAI,KAAK,UAAU,UAAW,SAAQ,IAAI;AAAA,QAC5C;AAAA,QAEC;AAAA,eAAK,aAAa,oBAAC,UAAK,WAAU,gBAAgB,cAAI,WAAW,KAAK,QAAQ,QAAQ,QAAQ,YAAY,SAAS,GAAE;AAAA,UACtH,oBAAC,UAAK,WAAU,WACd,8BAAC,UAAK,WAAU,YAAY,eAAK,OAAM,GACzC;AAAA,UACA,oBAAC,UAAK,WAAU,YAAY,iBAAM;AAAA,UACjC,KAAK,UAAU,aAAa,IAAI,WAAW,gBAAgB,iBAAiB;AAAA;AAAA;AAAA,IAC/E;AAAA;AAEF,MAAI,KAAK,UAAU,QAAS,QAAO;AACnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAU;AAAA,MACV,cAAc,CAAC,MAAM;AACnB,gBAAQ,WAAW,EAAE,eAAe,KAAK,KAAK,CAAC;AAC/C,gBAAQ,IAAI;AAAA,MACd;AAAA,MACA,cAAc,MAAM,QAAQ,KAAK;AAAA,MAEhC;AAAA;AAAA,QACA,QACC,oBAAC,SAAI,MAAK,QAAO,WAAU,qBAAoB,aAAW,MAAM,gBAAc,KAAK,SAAS,OAAO,EAAE,OAAO,KAAK,MAAM,GACpH,kBAAQ,UACP,qBAAC,SAAI,WAAU,cAAa;AAAA;AAAA,UAAoB,OAAO;AAAA,WAAM,IAC3D,QAAQ,WAAW,IACrB,oBAAC,SAAI,WAAU,YAAW,qEAAkD,IAE5E,QAAQ,IAAI,CAACA,OACX,oBAAC,QAAgB,MAAM,EAAE,IAAI,QAAQ,KAAK,EAAE,IAAIA,GAAE,EAAE,IAAI,MAAM,QAAQ,OAAOA,GAAE,OAAO,MAAMA,GAAE,MAAM,WAAWA,GAAE,IAAI,GAAIA,GAAE,WAAW,EAAE,UAAUA,GAAE,SAAS,IAAI,CAAC,GAAI,GAAIA,GAAE,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC,GAAI,GAAIA,GAAE,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC,EAAG,GAAG,OAAnOA,GAAE,EAA2O,CACzP,GAEL;AAAA;AAAA;AAAA,EAEJ;AAEJ;;;AE9PA,SAAS,MAAM,MAAc;AAC3B,MAAI,IAAI;AACR,QAAM,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;AAChC,QAAM,QAAQ,CAAmBC,OAAY,KAAK,MAAM,KAAK,UAAUA,EAAC,CAAC;AAGzE,QAAM,OAAO,CAAC,WAAmB,QAAoB,CAAC,MAAgB;AACpE,UAAM,IAAI,cAAc,SAAS;AACjC,QAAI,CAAC,EAAG,OAAM,IAAI,MAAM,4BAA4B,SAAS,EAAE;AAC/D,WAAO,MAAM;AAAA,MACX,IAAI,IAAI;AAAA,MACR,MAAM;AAAA,MACN;AAAA,MACA,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,GAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC;AAAA,MAC7C,GAAI,EAAE,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,MACnC,GAAI,EAAE,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;AAAA,MAC3B,GAAG;AAAA,IACL,CAAC;AAAA,EACH;AAEA,QAAM,MAAM,CAAC,OAAe,MAAc,QAAoB,CAAC,MAC7D,MAAM,EAAE,IAAI,IAAI,GAAG,MAAM,QAAiB,OAAO,MAAM,GAAG,MAAM,CAAC;AACnE,QAAM,UAAU,CAAC,OAAe,UAAsB,SAAkC,YAAsB;AAAA,IAC5G,IAAI,IAAI;AAAA,IACR,MAAM;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,QAAMC,SAAQ,CAAC,aAAmC,QAAQ,IAAI,UAAU,KAAK;AAC7E,QAAMC,OAAM,CAAC,OAAe,MAAc,UAAsB,QAA0C,CAAC,MACzG,MAAM,EAAE,IAAI,IAAI,GAAG,MAAM,WAAoB,OAAO,MAAM,GAAG,OAAO,SAAS,CAAC;AAChF,QAAM,UAAU,OAAiB,EAAE,IAAI,IAAI,GAAG,MAAM,UAAU;AAC9D,SAAO,EAAE,MAAM,KAAK,SAAS,OAAAD,QAAO,KAAAC,MAAK,QAAQ;AACnD;AAGA,SAAS,OACP,MACA,MACA,SACA,OACA,OACA,OAA0B,CAAC,GACf;AACZ,SAAO,EAAE,UAAU,WAAW,IAAI,IAAI,MAAM,SAAS,MAAM,EAAE,GAAG,cAAc,GAAG,KAAK,GAAG,OAAO,MAAM;AACxG;AAEA,IAAM,UAAU;AAKhB,SAAS,aAAa,GAAsB;AAC1C,SAAO;AAAA,IACL,EAAE,KAAK,0BAA0B;AAAA,MAC/B,MAAM,GAAG,OAAO;AAAA,IAClB,CAAC;AAAA,IACD,EAAE,KAAK,8BAA8B,EAAE,MAAM,uEAAuE,CAAC;AAAA,IACrH,EAAE,KAAK,0BAA0B,EAAE,MAAM,sDAAsD,CAAC;AAAA,IAChG,EAAE,KAAK,kCAAkC,EAAE,MAAM,8DAA8D,CAAC;AAAA,IAChH,EAAE,KAAK,4BAA4B,EAAE,MAAM,wDAAwD,CAAC;AAAA,EACtG;AACF;AAGA,SAAS,aAAa,GAAoB;AACxC,SAAO,EAAE,IAAI,gBAAgB,YAAY;AAAA,IACvC,EAAE,KAAK,SAAS;AAAA,IAChB,EAAE,KAAK,0BAA0B,EAAE,MAAM,QAAQ,CAAC;AAAA,IAClD,EAAE,KAAK,4BAA4B,EAAE,MAAM,QAAQ,CAAC;AAAA,IACpD,EAAE,KAAK,0BAA0B,EAAE,MAAM,QAAQ,CAAC;AAAA,IAClD,EAAE,KAAK,kCAAkC,EAAE,MAAM,QAAQ,CAAC;AAAA,IAC1D,EAAE,KAAK,8BAA8B,EAAE,MAAM,QAAQ,CAAC;AAAA,EACxD,GAAG,EAAE,MAAM,4CAA4C,CAAC;AAC1D;AAEA,SAAS,UAAU,GAAoB;AACrC,SAAO,EAAE,IAAI,gBAAgB,UAAU;AAAA,IACrC,EAAE,KAAK,cAAc,EAAE,MAAM,mEAAmE,CAAC;AAAA,IACjG,EAAE,QAAQ;AAAA,IACV,EAAE,KAAK,aAAa,EAAE,OAAO,YAAY,MAAM,YAAY,MAAM,oDAAoD,CAAC;AAAA,IACtH,EAAE,QAAQ;AAAA,IACV,EAAE,KAAK,cAAc,EAAE,OAAO,oBAAe,MAAM,8EAAyE,CAAC;AAAA,IAC7H,EAAE,QAAQ;AAAA,IACV,EAAE,KAAK,iBAAiB,EAAE,OAAO,WAAW,MAAM,SAAS,MAAM,kCAAkC,CAAC;AAAA,IACpG,EAAE,QAAQ;AAAA,IACV,EAAE,KAAK,YAAY,EAAE,OAAO,SAAS,MAAM,oEAAoE,CAAC;AAAA,EAClH,CAAC;AACH;AAEA,SAAS,SAAS,GAAoB;AACpC,SAAO,EAAE,IAAI,YAAY,cAAc;AAAA,IACrC,EAAE,KAAK,WAAW;AAAA,IAClB,EAAE,KAAK,eAAe,EAAE,OAAO,MAAM,CAAC;AAAA,IACtC,EAAE,KAAK,mBAAmB,EAAE,OAAO,UAAU,CAAC;AAAA,IAC9C,EAAE,KAAK,cAAc,EAAE,OAAO,UAAU,CAAC;AAAA,EAC3C,CAAC;AACH;AAEA,SAAS,MAAM,GAAoB;AACjC,SAAO,EAAE,IAAI,SAAS,UAAU;AAAA,IAC9B,EAAE,KAAK,YAAY,EAAE,OAAO,aAAa,CAAC;AAAA,IAC1C,EAAE,KAAK,kBAAkB;AAAA,IACzB,EAAE,KAAK,YAAY,EAAE,OAAO,WAAW,CAAC;AAAA,IACxC,EAAE,KAAK,gBAAgB,EAAE,OAAO,YAAY,CAAC;AAAA,IAC7C,EAAE,KAAK,YAAY,EAAE,OAAO,SAAS,MAAM,eAAe,CAAC;AAAA,EAC7D,CAAC;AACH;AAEA,IAAM,aAAa,CAAC,MAClB,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,QAAQ,GAAG,EAAE,KAAK,UAAU,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC;AAI5H,SAAS,oBAAgC;AACvC,QAAM,IAAI,MAAM,qBAAqB;AACrC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,CAAC;AAAA,MACZ,EAAE,KAAK,eAAe;AAAA,MACtB,EAAE,QAAQ;AAAA,MACV,EAAE,KAAK,SAAS;AAAA,MAChB,GAAG,aAAa,CAAC;AAAA,MACjB,EAAE,KAAK,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAAA,MAChE,EAAE,QAAQ;AAAA,MACV,EAAE,KAAK,WAAW;AAAA,MAClB,EAAE,KAAK,UAAU;AAAA,MACjB,EAAE,KAAK,YAAY;AAAA,MACnB,EAAE,KAAK,qBAAqB;AAAA,MAC5B,EAAE,QAAQ;AAAA,MACV,EAAE,IAAI,WAAW,WAAW,CAAC,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,iBAAiB,GAAG,EAAE,KAAK,YAAY,CAAC,GAAG;AAAA,QACnH,MAAM;AAAA,MACR,CAAC;AAAA,MACD,EAAE,KAAK,WAAW;AAAA,MAClB,EAAE,KAAK,YAAY;AAAA,MACnB,EAAE,KAAK,UAAU;AAAA,MACjB,EAAE,KAAK,WAAW;AAAA,MAClB,EAAE,QAAQ;AAAA,MACV,EAAE,KAAK,cAAc;AAAA,MACrB,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAAA,IAC7C;AAAA,IACA,EAAE,QAAQ,KAAK;AAAA,EACjB;AACF;AAEA,SAAS,sBAAkC;AACzC,QAAM,IAAI,MAAM,mBAAmB;AACnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,YAAY,EAAE,OAAO,aAAa,CAAC,CAAC,CAAC;AAAA,MAC3F,EAAE,KAAK,eAAe;AAAA,MACtB,EAAE,QAAQ;AAAA,MACV,EAAE,QAAQ,WAAW;AAAA,QACnB,EAAE,KAAK,uBAAuB,EAAE,MAAM,2BAA2B,CAAC;AAAA,QAClE,EAAE,KAAK,iBAAiB;AAAA,QACxB,EAAE,KAAK,kBAAkB;AAAA,QACzB,EAAE,KAAK,aAAa;AAAA,QACpB,EAAE,KAAK,aAAa;AAAA,QACpB,EAAE,KAAK,eAAe;AAAA,MACxB,CAAC;AAAA,MACD,EAAE,QAAQ;AAAA,MACV,EAAE,KAAK,SAAS;AAAA,MAChB,GAAG,aAAa,CAAC;AAAA,MACjB,EAAE,KAAK,kBAAkB;AAAA,MACzB,EAAE,QAAQ;AAAA,MACV,EAAE,KAAK,YAAY;AAAA,MACnB,EAAE,KAAK,SAAS;AAAA,MAChB,EAAE,KAAK,WAAW;AAAA,MAClB,EAAE,KAAK,YAAY;AAAA,MACnB,EAAE,KAAK,UAAU;AAAA,MACjB,EAAE,KAAK,WAAW;AAAA,MAClB,EAAE,QAAQ;AAAA,MACV,EAAE,KAAK,cAAc;AAAA,MACrB,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAAA,IAC7C;AAAA,EACF;AACF;AAEA,SAAS,kBAA8B;AACrC,QAAM,IAAI,MAAM,mBAAmB;AACnC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,CAAC;AAAA,MACZ,EAAE,KAAK,eAAe;AAAA,MACtB,EAAE,QAAQ;AAAA,MACV,EAAE,KAAK,SAAS;AAAA,MAChB,GAAG,aAAa,CAAC;AAAA,MACjB,EAAE,KAAK,kBAAkB;AAAA,MACzB,EAAE,QAAQ;AAAA,MACV,EAAE,QAAQ,QAAQ;AAAA,QAChB,EAAE,KAAK,WAAW,EAAE,MAAM,+CAA+C,CAAC;AAAA,QAC1E,EAAE,KAAK,WAAW;AAAA,QAClB,EAAE,KAAK,iBAAiB;AAAA,QACxB,EAAE,KAAK,cAAc,EAAE,OAAO,mBAAc,CAAC;AAAA,QAC7C,EAAE,KAAK,uBAAuB;AAAA,QAC9B,EAAE,KAAK,2BAA2B,EAAE,OAAO,+BAA+B,MAAM,mCAAmC,CAAC;AAAA,QACpH,EAAE,IAAI,wBAAmB,eAAe;AAAA,UACtC,EAAE,IAAI,SAAS,gBAAgB,EAAE,MAAM,mEAAmE,CAAC;AAAA,UAC3G,EAAE,IAAI,YAAY,cAAc;AAAA,UAChC,EAAE,QAAQ;AAAA,UACV,EAAE,IAAI,oBAAe,YAAY;AAAA,UACjC,EAAE,IAAI,uBAAkB,aAAa;AAAA,QACvC,CAAC;AAAA,QACD,EAAE,IAAI,QAAQ,KAAK;AAAA,UACjB,EAAE,KAAK,mBAAmB,EAAE,OAAO,YAAY,CAAC;AAAA,UAChD,EAAE,IAAI,oBAAoB,KAAK,EAAE,MAAM,4BAA4B,CAAC;AAAA,UACpE,EAAE,IAAI,kBAAkB,GAAG;AAAA,QAC7B,CAAC;AAAA,QACD,EAAE,QAAQ;AAAA,QACV,EAAE,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAAA,MACrD,CAAC;AAAA,MACD,EAAE,QAAQ;AAAA,MACV,EAAE,KAAK,YAAY;AAAA,MACnB,EAAE,KAAK,WAAW;AAAA,MAClB,EAAE,KAAK,YAAY;AAAA,MACnB,EAAE,KAAK,UAAU;AAAA,MACjB,EAAE,KAAK,WAAW;AAAA,MAClB,EAAE,KAAK,cAAc;AAAA,MACrB,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAAA,IAC7C;AAAA,IACA,EAAE,QAAQ,KAAK;AAAA,EACjB;AACF;AAEA,SAAS,cAA0B;AACjC,QAAM,IAAI,MAAM,eAAe;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,EAAE,QAAQ,IAAI,CAAC,EAAE,KAAK,UAAU,GAAG,EAAE,KAAK,cAAc,CAAC,CAAC;AAAA,MAC1D,EAAE,QAAQ,QAAQ;AAAA,QAChB,EAAE,KAAK,YAAY,EAAE,MAAM,qDAAqD,CAAC;AAAA,QACjF,EAAE,KAAK,QAAQ,EAAE,OAAO,kBAAkB,MAAM,kCAAkC,CAAC;AAAA,QACnF,EAAE,KAAK,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAAA,MACtE,CAAC;AAAA,MACD,EAAE,QAAQ,UAAU;AAAA,QAClB,EAAE,KAAK,WAAW,EAAE,MAAM,sFAAsF,CAAC;AAAA,MACnH,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,eAA2B;AAClC,QAAM,IAAI,MAAM,gBAAgB;AAChC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,EAAE,QAAQ,IAAI,CAAC,EAAE,KAAK,UAAU,GAAG,EAAE,KAAK,cAAc,CAAC,CAAC;AAAA,MAC1D,EAAE,QAAQ,IAAI,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC;AAAA,IACpC;AAAA,EACF;AACF;AAIA,SAAS,gBAA4B;AACnC,QAAM,IAAI,MAAM,kBAAkB;AAClC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,CAAC;AAAA,MACZ,EAAE,KAAK,eAAe;AAAA,MACtB,EAAE,KAAK,kBAAkB;AAAA,MACzB,EAAE,KAAK,WAAW,EAAE,MAAM,qDAAqD,CAAC;AAAA,MAChF,EAAE,KAAK,WAAW;AAAA,MAClB,EAAE,QAAQ;AAAA,MACV,EAAE,IAAI,QAAQ,UAAU;AAAA,QACtB,EAAE,KAAK,MAAM;AAAA,QACb,EAAE,IAAI,qBAAqB,SAAS;AAAA,QACpC,EAAE,IAAI,gBAAgB,iBAAiB;AAAA,QACvC,EAAE,KAAK,QAAQ;AAAA,MACjB,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAAA,MAC5C,EAAE,IAAI,QAAQ,QAAQ;AAAA,QACpB,EAAE,KAAK,YAAY;AAAA,QACnB,EAAE,KAAK,SAAS;AAAA,QAChB,EAAE,KAAK,gBAAgB;AAAA,QACvB,EAAE,KAAK,qBAAqB;AAAA,MAC9B,GAAG,EAAE,MAAM,2BAA2B,CAAC;AAAA,MACvC,EAAE,IAAI,YAAY,YAAY;AAAA,QAC5B,EAAE,KAAK,WAAW;AAAA,QAClB,EAAE,KAAK,cAAc;AAAA,QACrB,EAAE,KAAK,cAAc;AAAA,QACrB,EAAE,KAAK,eAAe;AAAA,QACtB,EAAE,KAAK,eAAe;AAAA,QACtB,EAAE,KAAK,OAAO;AAAA,MAChB,GAAG,EAAE,MAAM,kCAAkC,CAAC;AAAA,MAC9C,EAAE,IAAI,cAAc,kBAAkB;AAAA,QACpC,EAAE,KAAK,cAAc,EAAE,OAAO,mBAAc,CAAC;AAAA,QAC7C,EAAE,IAAI,QAAQ,YAAY;AAAA,QAC1B,EAAE,IAAI,YAAY,UAAU;AAAA,QAC5B,EAAE,IAAI,QAAQ,aAAa;AAAA,QAC3B,EAAE,IAAI,cAAc,QAAQ;AAAA,QAC5B,EAAE,IAAI,QAAQ,YAAY;AAAA,MAC5B,GAAG,EAAE,MAAM,sCAAsC,CAAC;AAAA,MAClD,EAAE,IAAI,WAAW,SAAS,CAAC,EAAE,KAAK,cAAc,GAAG,EAAE,KAAK,eAAe,CAAC,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAAA,MAC/G,EAAE,IAAI,SAAS,UAAU,CAAC,EAAE,KAAK,UAAU,GAAG,EAAE,KAAK,iBAAiB,GAAG,EAAE,KAAK,aAAa,CAAC,GAAG;AAAA,QAC/F,MAAM;AAAA,MACR,CAAC;AAAA,MACD,EAAE,IAAI,YAAY,QAAQ;AAAA,QACxB,EAAE,KAAK,WAAW;AAAA,QAClB,EAAE,KAAK,mBAAmB;AAAA,QAC1B,EAAE,KAAK,eAAe,EAAE,OAAO,MAAM,CAAC;AAAA,QACtC,EAAE,KAAK,oBAAoB;AAAA,MAC7B,GAAG,EAAE,MAAM,sBAAsB,CAAC;AAAA,MAClC,EAAE,IAAI,WAAW,WAAW,CAAC,EAAE,KAAK,iBAAiB,GAAG,EAAE,KAAK,cAAc,GAAG,EAAE,KAAK,iBAAiB,CAAC,GAAG;AAAA,QAC1G,MAAM;AAAA,MACR,CAAC;AAAA,MACD,EAAE,IAAI,MAAM,OAAO;AAAA,QACjB,EAAE,KAAK,SAAS;AAAA,QAChB,GAAG,aAAa,CAAC;AAAA,QACjB,EAAE,KAAK,eAAe;AAAA,QACtB,EAAE,KAAK,kBAAkB;AAAA,QACzB,EAAE,KAAK,qBAAqB;AAAA,QAC5B,EAAE,KAAK,kBAAkB;AAAA,MAC3B,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAAA,MACjC,EAAE,IAAI,cAAc,WAAW,CAAC,EAAE,KAAK,UAAU,GAAG,EAAE,KAAK,WAAW,GAAG,EAAE,KAAK,oBAAoB,CAAC,GAAG,EAAE,MAAM,eAAe,CAAC;AAAA,MAChI,EAAE,IAAI,WAAW,oBAAoB,CAAC,EAAE,KAAK,YAAY,GAAG,EAAE,KAAK,wBAAwB,GAAG,EAAE,KAAK,kBAAkB,CAAC,GAAG;AAAA,QACzH,MAAM;AAAA,MACR,CAAC;AAAA,MACD,EAAE,IAAI,YAAY,YAAY,CAAC,EAAE,KAAK,aAAa,GAAG,EAAE,KAAK,eAAe,GAAG,EAAE,KAAK,UAAU,CAAC,GAAG,EAAE,MAAM,uBAAuB,CAAC;AAAA,MACpI,EAAE,IAAI,SAAS,UAAU,CAAC,EAAE,KAAK,UAAU,CAAC,GAAG,EAAE,MAAM,eAAe,CAAC;AAAA,MACvE,EAAE,QAAQ;AAAA,MACV,EAAE,KAAK,cAAc;AAAA,IACvB;AAAA,EACF;AACF;AAIA,SAAS,mBAA+B;AACtC,QAAM,IAAI,MAAM,uBAAuB;AACvC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,EAAE,MAAM;AAAA,QACN,EAAE,KAAK,SAAS;AAAA,QAChB,EAAE,KAAK,UAAU;AAAA,QACjB,EAAE,KAAK,WAAW;AAAA,QAClB,EAAE,KAAK,YAAY,EAAE,OAAO,WAAW,CAAC;AAAA,QACxC,EAAE,KAAK,gBAAgB,EAAE,OAAO,YAAY,MAAM,WAAW,CAAC;AAAA,QAC9D,EAAE,KAAK,SAAS;AAAA,MAClB,CAAC;AAAA,MACD,EAAE,KAAK,UAAU;AAAA,MACjB,EAAE,KAAK,cAAc;AAAA,MACrB,EAAE,KAAK,QAAQ;AAAA,MACf,EAAE,KAAK,QAAQ,EAAE,OAAO,gBAAW,CAAC;AAAA,MACpC,EAAE,IAAI,sBAAsB,YAAY;AAAA,QACtC,EAAE,IAAI,cAAc,UAAU;AAAA,QAC9B,EAAE,IAAI,UAAU,QAAQ;AAAA,QACxB,EAAE,IAAI,YAAY,UAAU;AAAA,QAC5B,EAAE,KAAK,iBAAiB;AAAA,MAC1B,GAAG,EAAE,MAAM,8CAA8C,CAAC;AAAA,MAC1D,aAAa,CAAC;AAAA,MACd,UAAU,CAAC;AAAA,MACX,SAAS,CAAC;AAAA,MACV,MAAM,CAAC;AAAA,IACT;AAAA,IACA,EAAE,QAAQ,KAAK;AAAA,EACjB;AACF;AAEA,SAAS,sBAAkC;AACzC,QAAM,IAAI,MAAM,0BAA0B;AAC1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,WAAW,CAAC;AAAA,MACZ,EAAE,KAAK,eAAe;AAAA,MACtB,EAAE,KAAK,SAAS;AAAA,MAChB,EAAE,KAAK,WAAW;AAAA,MAClB,EAAE,KAAK,MAAM;AAAA,MACb,aAAa,CAAC;AAAA,MACd,UAAU,CAAC;AAAA,MACX,SAAS,CAAC;AAAA,MACV,MAAM,CAAC;AAAA,IACT;AAAA,IACA,EAAE,QAAQ,KAAK;AAAA,EACjB;AACF;AAEA,SAAS,sBAAkC;AACzC,QAAM,IAAI,MAAM,0BAA0B;AAC1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,EAAE,MAAM,CAAC,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,YAAY,EAAE,OAAO,aAAa,CAAC,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,UAAU,CAAC,CAAC;AAAA,MAC/G,aAAa,CAAC;AAAA,MACd,UAAU,CAAC;AAAA,MACX,SAAS,CAAC;AAAA,MACV,MAAM,CAAC;AAAA,IACT;AAAA,IACA,EAAE,QAAQ,KAAK;AAAA,EACjB;AACF;AAKA,SAAS,UAAU,GAAsB;AACvC,SAAO;AAAA,IACL,EAAE,KAAK,eAAe;AAAA,IACtB,EAAE,KAAK,SAAS;AAAA,IAChB,GAAG,aAAa,CAAC;AAAA,IACjB,EAAE,KAAK,kBAAkB;AAAA,IACzB,EAAE,KAAK,WAAW;AAAA,IAClB,EAAE,KAAK,UAAU;AAAA,IACjB,EAAE,KAAK,YAAY;AAAA,IACnB,EAAE,KAAK,SAAS;AAAA,IAChB,EAAE,KAAK,WAAW;AAAA,IAClB,EAAE,KAAK,YAAY;AAAA,IACnB,EAAE,KAAK,UAAU;AAAA,IACjB,EAAE,KAAK,WAAW;AAAA,IAClB,EAAE,KAAK,SAAS;AAAA,IAChB,EAAE,KAAK,WAAW;AAAA,IAClB,EAAE,KAAK,iBAAiB;AAAA,IACxB,EAAE,KAAK,cAAc,EAAE,OAAO,mBAAc,CAAC;AAAA,IAC7C,EAAE,KAAK,uBAAuB;AAAA,IAC9B,EAAE,KAAK,QAAQ,EAAE,OAAO,uBAAkB,CAAC;AAAA,IAC3C,EAAE,KAAK,mBAAmB,EAAE,OAAO,OAAO,CAAC;AAAA,IAC3C,EAAE,KAAK,aAAa;AAAA,IACpB,EAAE,KAAK,cAAc;AAAA,IACrB,EAAE,KAAK,UAAU;AAAA,EACnB;AACF;AAEA,SAAS,gBAA4B;AACnC,QAAM,IAAI,MAAM,yBAAyB;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,MACE,EAAE,KAAK,SAAS;AAAA,MAChB,EAAE,KAAK,QAAQ;AAAA,MACf,EAAE,KAAK,UAAU;AAAA,MACjB,EAAE,KAAK,SAAS;AAAA,MAChB,EAAE,KAAK,SAAS;AAAA,MAChB,EAAE,KAAK,SAAS;AAAA,MAChB,EAAE,KAAK,iBAAiB;AAAA,MACxB,EAAE,KAAK,YAAY;AAAA,MACnB,EAAE,QAAQ;AAAA,MACV,GAAG,UAAU,CAAC;AAAA,IAChB;AAAA,IACA,EAAE,SAAS,WAAW,OAAO,IAAI;AAAA,EACnC;AACF;AAEA,SAAS,YAAY,GAAsB;AACzC,SAAO;AAAA,IACL,WAAW,CAAC;AAAA,IACZ,EAAE,IAAI,WAAW,WAAW,CAAC,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,SAAS,GAAG,EAAE,KAAK,iBAAiB,GAAG,EAAE,KAAK,YAAY,CAAC,GAAG;AAAA,MACnH,MAAM;AAAA,IACR,CAAC;AAAA,IACD,EAAE,QAAQ;AAAA,IACV,GAAG,UAAU,CAAC,EAAE,OAAO,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,UAAU,MAAM;AAAA,IACrE,EAAE,IAAI,QAAQ,KAAK,CAAC,EAAE,KAAK,mBAAmB,EAAE,OAAO,YAAY,CAAC,GAAG,EAAE,KAAK,oBAAoB,CAAC,CAAC;AAAA,EACtG;AACF;AAEA,SAAS,eAA2B;AAClC,QAAM,IAAI,MAAM,wBAAwB;AACxC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,CAAC;AAAA,EACf;AACF;AAEA,SAAS,gBAA4B;AACnC,QAAM,IAAI,MAAM,yBAAyB;AACzC,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,CAAC;AAAA,IACb,EAAE,QAAQ,KAAK;AAAA,EACjB;AACF;AAEO,IAAM,kBAA4C;AAAA,EACvD,EAAE,IAAI,uBAAuB,OAAO,cAAc,QAAQ,mDAA8C,QAAQ,kBAAkB,EAAE;AAAA,EACpI,EAAE,IAAI,qBAAqB,OAAO,cAAc,QAAQ,wEAAmE,QAAQ,oBAAoB,EAAE;AAAA,EACzJ,EAAE,IAAI,qBAAqB,OAAO,cAAc,QAAQ,0CAAqC,QAAQ,gBAAgB,EAAE;AAAA,EACvH,EAAE,IAAI,iBAAiB,OAAO,cAAc,QAAQ,qDAAgD,QAAQ,YAAY,EAAE;AAAA,EAC1H,EAAE,IAAI,kBAAkB,OAAO,cAAc,QAAQ,uEAAkE,QAAQ,aAAa,EAAE;AAAA,EAC9I,EAAE,IAAI,oBAAoB,OAAO,YAAY,QAAQ,8DAAyD,QAAQ,cAAc,EAAE;AAAA,EACtI,EAAE,IAAI,yBAAyB,OAAO,YAAY,QAAQ,8CAAyC,QAAQ,iBAAiB,EAAE;AAAA,EAC9H,EAAE,IAAI,4BAA4B,OAAO,YAAY,QAAQ,oDAA+C,QAAQ,oBAAoB,EAAE;AAAA,EAC1I,EAAE,IAAI,4BAA4B,OAAO,YAAY,QAAQ,qDAAgD,QAAQ,oBAAoB,EAAE;AAAA,EAC3I,EAAE,IAAI,2BAA2B,OAAO,YAAY,QAAQ,8CAAyC,QAAQ,cAAc,EAAE;AAAA,EAC7H,EAAE,IAAI,0BAA0B,OAAO,YAAY,QAAQ,6CAAwC,QAAQ,aAAa,EAAE;AAAA,EAC1H,EAAE,IAAI,2BAA2B,OAAO,YAAY,QAAQ,8CAAyC,QAAQ,cAAc,EAAE;AAC/H;;;AJ7gBA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAAC;AAAA,OACK;;;AKnDP,YAAY,YAAY;AAcf,gBAAAC,YAAA;AATT,IAAM,QAAQ;AAEP,IAAM,aAAgC,OAAO,KAAK,KAAK,EAC3D,OAAO,CAAC,MAAM,SAAS,KAAK,CAAC,KAAK,CAAC,EAAE,SAAS,MAAM,KAAK,CAAC,EAAE,WAAW,QAAQ,KAAK,MAAM,UAAU,MAAM,kBAAkB,EAC5H,KAAK;AAED,SAAS,aAAa,MAAc,WAA+B;AACxE,QAAM,QAAQ,MAAM,IAAI;AACxB,QAAM,OAAQ,OAAO,UAAU,cAAe,OAAO,UAAU,YAAY,UAAU,OAAQ,QAAQ,MAAM;AAC3G,SAAO,gBAAAA,KAAC,QAAK,WAAsB,aAAa,MAAM;AACxD;;;ALyVU,SAqKA,YAAAC,WArKA,OAAAC,MAOA,QAAAC,aAPA;AAxSV,IAAM,iBAAwD;AAAA,EAC5D,kBAAkB;AAAA,EAClB,kBAAkB;AAAA,EAClB,aAAa;AAAA,EACb,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,MAAM;AAAA,EACN,UAAU;AACZ;AACA,IAAM,kBAAkB,cAAc,IAAI,CAAC,WAAW,EAAE,OAAO,OAAO,eAAe,KAAK,EAAE,EAAE;AAG9F,IAAM,gBAAgB,cAAiC,IAAI;AAE3D,IAAM,YAAY;AAkBlB,SAAS,eAAe,QAAoD;AAC1E,QAAM,CAAC,OAAO,QAAQ,IAAIC,UAAyD,IAAI;AACvF,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAsB,IAAI;AAClD,QAAM,gBAAgB,OAAO,KAAK;AAElC,QAAM,QAAmB,CAAC,GAAG,SAAS,UAAU;AAC9C,QAAI,EAAE,WAAW,EAAG;AACpB,UAAM,KAAK,EAAE;AACb,UAAM,KAAK,EAAE;AACb,QAAI,SAAS;AACb,QAAI,UAAuB;AAC3B,UAAM,OAAO,CAAC,OAAqB;AACjC,UAAI,CAAC,UAAU,KAAK,MAAM,GAAG,UAAU,IAAI,GAAG,UAAU,EAAE,IAAI,EAAG;AACjE,UAAI,CAAC,QAAQ;AACX,iBAAS;AACT,iBAAS,KAAK,MAAM,aAAa;AACjC,iBAAS,KAAK,MAAM,SAAS;AAAA,MAC/B;AACA,eAAS,EAAE,OAAO,GAAG,GAAG,SAAS,GAAG,GAAG,QAAQ,CAAC;AAChD,YAAM,KAAM,SAAS,iBAAiB,GAAG,SAAS,GAAG,OAAO,GAA0B,QAAqB,aAAa;AACxH,UAAI,CAAC,IAAI;AACP,kBAAU;AAAA,MACZ,WAAW,GAAG,QAAQ,SAAS,QAAQ;AACrC,kBAAU,EAAE,IAAI,MAAM,KAAK,QAAQ;AAAA,MACrC,OAAO;AACL,cAAM,IAAI,GAAG,sBAAsB;AACnC,cAAM,KAAK,GAAG,UAAU,EAAE,OAAO,EAAE;AACnC,cAAM,MAAe,GAAG,QAAQ,YAAa,IAAI,OAAO,WAAW,IAAI,OAAO,UAAU,WAAY,IAAI,MAAM,WAAW;AACzH,kBAAU,EAAE,IAAI,GAAG,QAAQ,QAAQ,MAAM,IAAI;AAAA,MAC/C;AACA,cAAQ,OAAO;AAAA,IACjB;AACA,UAAM,KAAK,MAAM;AACf,aAAO,oBAAoB,eAAe,IAAI;AAC9C,aAAO,oBAAoB,aAAa,EAAE;AAC1C,aAAO,oBAAoB,iBAAiB,EAAE;AAC9C,eAAS,KAAK,MAAM,aAAa;AACjC,eAAS,KAAK,MAAM,SAAS;AAC7B,UAAI,QAAQ;AACV,sBAAc,UAAU;AACxB,mBAAW,MAAO,cAAc,UAAU,OAAQ,CAAC;AACnD,YAAI,QAAS,QAAO,SAAS,OAAO;AAAA,MACtC;AACA,eAAS,IAAI;AACb,cAAQ,IAAI;AAAA,IACd;AACA,WAAO,iBAAiB,eAAe,IAAI;AAC3C,WAAO,iBAAiB,aAAa,EAAE;AACvC,WAAO,iBAAiB,iBAAiB,EAAE;AAAA,EAC7C;AAEA,QAAM,QAAQ,CAAC,OAAmB,MAAM;AACtC,QAAI,CAAC,cAAc,QAAS,IAAG;AAAA,EACjC;AACA,SAAO,EAAE,OAAO,OAAO,OAAO,KAAK;AACrC;AAEA,SAAS,gBAAgB,GAAiC;AACxD,MAAI,EAAE,SAAS,WAAW;AACxB,UAAM,IAAI,cAAc,EAAE,EAAE;AAC5B,QAAI,CAAC,EAAG,QAAO;AACf,WAAO;AAAA,MACL,IAAI,MAAM,GAAG;AAAA,MACb,MAAM;AAAA,MACN,WAAW,EAAE;AAAA,MACb,OAAO,EAAE;AAAA,MACT,MAAM,EAAE;AAAA,MACR,GAAI,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,IAAI,CAAC;AAAA,MAC7C,GAAI,EAAE,SAAS,EAAE,QAAQ,KAAK,IAAI,CAAC;AAAA,MACnC,GAAI,EAAE,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;AAAA,IAC7B;AAAA,EACF;AACA,MAAI,EAAE,SAAS,WAAY,QAAO,UAAU,KAAK,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,MAAM,KAAK;AACnF,MAAI,EAAE,SAAS,OAAO;AACpB,QAAI,EAAE,SAAS,UAAW,QAAO,EAAE,IAAI,MAAM,GAAG,GAAG,MAAM,WAAW,OAAO,eAAe,UAAU,CAAC,EAAE;AACvG,QAAI,EAAE,SAAS,UAAW,QAAO,EAAE,IAAI,MAAM,GAAG,GAAG,MAAM,WAAW,OAAO,QAAQ,MAAM,YAAY,UAAU,CAAC,EAAE;AAClH,QAAI,EAAE,SAAS,UAAW,QAAO,EAAE,IAAI,MAAM,GAAG,GAAG,MAAM,UAAU;AACnE,QAAI,EAAE,SAAS,aAAc,QAAO,EAAE,IAAI,MAAM,GAAG,GAAG,MAAM,QAAQ,OAAO,SAAS,OAAO,OAAO,OAAO,kBAAkB;AAC3H,QAAI,EAAE,SAAS,YAAa,QAAO,EAAE,IAAI,MAAM,GAAG,GAAG,MAAM,QAAQ,OAAO,WAAW,OAAO,OAAO,OAAO,QAAQ,MAAM,WAAW;AACnI,WAAO,EAAE,IAAI,MAAM,GAAG,GAAG,MAAM,QAAQ,OAAO,cAAc,MAAM,SAAS;AAAA,EAC7E;AACA,SAAO;AACT;AAEA,SAAS,YAA+B;AACtC,MAAI;AACF,UAAM,MAAM,WAAW,cAAc,QAAQ,SAAS;AACtD,WAAO,MAAM,YAAY,GAAG,IAAI;AAAA,EAClC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAIA,SAAS,WAAW,SAAqB;AACvC,QAAM,CAAC,OAAO,QAAQ,IAAIA,UAAS,EAAE,MAAM,CAAC,GAAmB,SAAS,SAAS,QAAQ,CAAC,EAAkB,CAAC;AAC7G,QAAM,MAAM,YAAY,CAAC,MAAoD,SAAiC;AAC5G,aAAS,CAAC,MAAM;AACd,YAAM,QAAQ,OAAO,SAAS,aAAa,KAAK,EAAE,OAAO,IAAI;AAC7D,UAAI,UAAU,EAAE,QAAS,QAAO;AAChC,UAAI,MAAM,QAAS,QAAO,EAAE,MAAM,CAAC,GAAG,SAAS,OAAO,QAAQ,CAAC,EAAE;AACjE,aAAO,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,MAAM,GAAG,GAAG,EAAE,OAAO,GAAG,SAAS,OAAO,QAAQ,CAAC,EAAE;AAAA,IAC/E,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AACL,QAAM,OAAO,YAAY,MAAM,SAAS,CAAC,MAAO,EAAE,KAAK,SAAS,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,SAAS,CAAC,GAAiB,QAAQ,CAAC,EAAE,SAAS,GAAG,EAAE,MAAM,EAAE,IAAI,CAAE,GAAG,CAAC,CAAC;AAC3L,QAAM,OAAO,YAAY,MAAM,SAAS,CAAC,MAAO,EAAE,OAAO,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAG,SAAS,EAAE,OAAO,CAAC,GAAiB,QAAQ,EAAE,OAAO,MAAM,CAAC,EAAE,IAAI,CAAE,GAAG,CAAC,CAAC;AAC3K,SAAO,EAAE,QAAQ,MAAM,SAAS,KAAK,MAAM,MAAM,SAAS,MAAM,KAAK,SAAS,GAAG,SAAS,MAAM,OAAO,SAAS,EAAE;AACpH;AAIO,SAAS,YAAY,EAAE,OAAO,YAAY,eAAe,YAAY,GAAqB;AAC/F,QAAM,EAAE,QAAAC,SAAQ,KAAK,MAAM,MAAM,SAAS,QAAQ,IAAI,WAAW,iBAAiB,UAAU,KAAK,YAAY,CAAC;AAC9G,QAAM,CAAC,UAAU,WAAW,IAAID,UAAwB,IAAI;AAC5D,QAAM,CAAC,UAAU,WAAW,IAAIA,UAAsC,IAAI;AAC1E,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAiE,IAAI;AACjG,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAS,KAAK;AAC1C,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,EAAE;AACnC,QAAM,CAAC,WAAW,YAAY,IAAIA,UAAwB,IAAI;AAE9D,QAAM,YAAY,OAAOC,OAAM;AAC/B,YAAU,UAAUA;AAGpB,YAAU,MAAM;AACd,QAAI;AACF,iBAAW,cAAc,QAAQ,WAAW,gBAAgBA,OAAM,CAAC;AAAA,IACrE,QAAQ;AAAA,IAER;AAAA,EACF,GAAG,CAACA,OAAM,CAAC;AAEX,QAAM,UAAU,YAAY,YAAY;AACtC,QAAI;AACF,YAAM,MAAM,MAAM,MAAM,KAAK;AAC7B,kBAAY,GAAG;AAEf,YAAM,MAAM,gBAAgB,UAAU,OAAO;AAC7C,mBAAa,IAAI,KAAK,CAAC,MAAM,gBAAgB,EAAE,MAAM,MAAM,GAAG,IAAI,MAAM,IAAI;AAAA,IAC9E,SAAS,GAAG;AACV,gBAAU,EAAE,MAAM,SAAS,MAAM,iCAAiC,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,GAAG,CAAC;AAAA,IAClH;AAAA,EACF,GAAG,CAAC,KAAK,CAAC;AACV,YAAU,MAAM;AACd,SAAK,QAAQ;AAAA,EACf,GAAG,CAAC,OAAO,CAAC;AAEZ,QAAM,QAAQ,cAAc,gBAAgBA,OAAM;AAElD,QAAM,OAAO,YAAY;AACvB,cAAU,IAAI;AACd,QAAI;AACF,YAAM,QAAQ,MAAM,MAAM,KAAKA,SAAQ,KAAK,KAAK,CAAC;AAClD,mBAAa,gBAAgBA,OAAM,CAAC;AACpC,cAAQ,EAAE;AACV,gBAAU,EAAE,MAAM,MAAM,MAAM,eAAU,MAAM,IAAI,WAAM,MAAM,OAAO,GAAG,CAAC;AACzE,YAAM,QAAQ;AAAA,IAChB,SAAS,GAAG;AACV,gBAAU,EAAE,MAAM,SAAS,MAAM,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,GAAG,CAAC;AAAA,IACjG,UAAE;AACA,gBAAU,KAAK;AAAA,IACjB;AAAA,EACF;AAGA,QAAM,OAAO,CAAC,MAA0B;AACtC,QAAI,EAAE,MAAM;AACZ,iBAAa,gBAAgB,EAAE,MAAM,CAAC;AACtC,gBAAY,IAAI;AAChB,cAAU,EAAE,MAAM,QAAQ,MAAM,gBAAW,EAAE,IAAI,WAAM,EAAE,OAAO,GAAG,QAAQ,qDAA2C,EAAE,GAAG,CAAC;AAAA,EAC9H;AAGA,QAAM,UAAU,CAAC,SAAmB;AAClC,QAAI,CAAC,MAAM;AACT,YAAM,MAAM,WAAW,OAAO,EAAE,OAAO,QAAQ,IAAI;AAEnD,YAAM,QAAQ,OAAO,YAAY,IAAI,IAAI,KAAK,CAAC,YAAY,IAAI;AAC/D,UAAI,OAAO,SAAS,YAAY,IAAI,IAAI,EAAG,QAAO,EAAE,GAAG,GAAG,OAAO,WAAW,EAAE,OAAO,IAAI,KAAK,IAAI,IAAI,KAAK,SAAS,QAAQ,IAAI,EAAE;AAClI,UAAI,IAAK,QAAO,EAAE,GAAG,GAAG,OAAO,WAAW,EAAE,OAAO,IAAI,UAAU,IAAI,QAAQ,GAAG,IAAI,EAAE;AACtF,aAAO,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,OAAO,IAAI,EAAE;AAAA,IAC3C,CAAC;AACD,gBAAY,KAAK,EAAE;AAAA,EACrB;AAEA,QAAM,OAAO,CAAC,GAAgB,EAAE,IAAI,UAAU,IAAI,MAAY;AAC5D,QAAI,EAAE,SAAS,UAAU,EAAE,OAAO,SAAU;AAC5C,QAAI,EAAE,SAAS,UAAU,UAAU;AACjC,YAAM,KAAK,OAAOA,QAAO,OAAO,QAAQ;AACxC,YAAM,WAAW,KAAM,QAAQ,YAAY,YAAY,GAAG,IAAI,IAAI,GAAG,KAAK,KAAK,GAAG,WAAY;AAC9F,UAAI,CAAC,QAAQA,QAAO,OAAO,EAAE,IAAI,QAAQ,GAAG;AAC1C,kBAAU,EAAE,MAAM,SAAS,MAAM,gDAAgD,CAAC;AAClF;AAAA,MACF;AAAA,IACF;AACA,UAAM,QAAQ,EAAE,SAAS,SAAS,OAAO,gBAAgB,CAAC;AAC1D,QAAI,CAAC,MAAM;AACT,UAAI,WAA0B;AAC9B,UAAI,QAAQ,EAAE,MAAM;AACpB,UAAI,UAAU;AACZ,cAAM,KAAK,OAAO,EAAE,OAAO,QAAQ;AACnC,YAAI,CAAC,GAAI,QAAO;AAChB,YAAI,QAAQ,YAAY,YAAY,GAAG,IAAI,GAAG;AAC5C,qBAAW,GAAG,KAAK;AACnB,kBAAQ,GAAG,KAAK,SAAS;AAAA,QAC3B,OAAO;AACL,qBAAW,GAAG;AACd,kBAAQ,GAAG,SAAS,QAAQ,UAAU,IAAI;AAAA,QAC5C;AAAA,MACF;AACA,UAAI,EAAE,SAAS,OAAQ,QAAO,EAAE,GAAG,GAAG,OAAO,SAAS,EAAE,OAAO,EAAE,IAAI,UAAU,KAAK,EAAE;AACtF,aAAO,QAAQ,EAAE,GAAG,GAAG,OAAO,WAAW,EAAE,OAAO,UAAU,OAAO,KAAK,EAAE,IAAI;AAAA,IAChF,CAAC;AACD,QAAI,MAAO,aAAY,MAAM,EAAE;AAAA,aACtB,EAAE,SAAS,OAAQ,aAAY,EAAE,EAAE;AAAA,EAC9C;AACA,QAAM,MAAM,eAAe,IAAI;AAE/B,QAAM,SAAS,CAAC,OAAe;AAC7B,QAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;AACrD,QAAI,aAAa,GAAI,aAAY,IAAI;AAAA,EACvC;AAGA,YAAU,MAAM;AACd,UAAM,QAAQ,CAAC,MAAqB;AAClC,YAAM,SAAS,EAAE,kBAAkB,eAAe,4BAA4B,KAAK,EAAE,OAAO,OAAO;AACnG,YAAM,MAAM,EAAE,WAAW,EAAE;AAC3B,UAAI,OAAO,EAAE,IAAI,YAAY,MAAM,KAAK;AACtC,UAAE,eAAe;AACjB,aAAK,KAAK;AACV;AAAA,MACF;AACA,UAAI,OAAQ;AACZ,UAAI,OAAO,EAAE,IAAI,YAAY,MAAM,KAAK;AACtC,UAAE,eAAe;AACjB,YAAI,EAAE,SAAU,MAAK;AAAA,YAChB,MAAK;AAAA,MACZ,WAAW,OAAO,EAAE,IAAI,YAAY,MAAM,OAAO,UAAU;AACzD,UAAE,eAAe;AACjB,YAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,cAAc,EAAE,OAAO,QAAQ,EAAE,EAAE;AAAA,MAChE,YAAY,EAAE,QAAQ,YAAY,EAAE,QAAQ,gBAAgB,UAAU;AACpE,UAAE,eAAe;AACjB,eAAO,QAAQ;AAAA,MACjB,WAAW,EAAE,QAAQ,SAAU,aAAY,IAAI;AAAA,IACjD;AACA,WAAO,iBAAiB,WAAW,KAAK;AACxC,WAAO,MAAM,OAAO,oBAAoB,WAAW,KAAK;AAAA,EAC1D,CAAC;AAED,QAAM,eAAe,WAAW,OAAOA,QAAO,OAAO,QAAQ,GAAG,QAAQ,OAAO;AAC/E,QAAM,UAAUC,SAAQ,MAAM;AAC5B,UAAM,OAAO,oBAAI,IAAkC;AACnD,eAAW,KAAK,YAAY,CAAC,EAAG,MAAK,IAAI,EAAE,UAAU,CAAC,GAAI,KAAK,IAAI,EAAE,QAAQ,KAAK,CAAC,GAAI,CAAC,CAAC;AACzF,WAAO,CAAC,GAAG,KAAK,OAAO,CAAC;AAAA,EAC1B,GAAG,CAAC,QAAQ,CAAC;AAEb,SACE,gBAAAJ,KAAC,cAAc,UAAd,EAAuB,OAAOG,SAC/B,0BAAAF,MAAC,SAAI,WAAU,qDAEb;AAAA,oBAAAA,MAAC,YAAO,WAAU,wEAChB;AAAA,sBAAAA,MAAC,cAAW,WAAU,kBACpB;AAAA,wBAAAD,KAAC,SAAM,cAAW,eAAc,OAAM,MAAK,OAAOG,QAAO,MAAM,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,EAAE,OAAO,MAAM,EAAE,GAAG;AAAA,QAC9H,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,OAAOG,QAAO;AAAA,YACd,SAAS;AAAA,YACT,eAAe,CAAC,YAAY,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,EAAE;AAAA;AAAA,QAC5D;AAAA,QACA,gBAAAF,MAAC,SAAO;AAAA,qBAAWE,QAAO,KAAK;AAAA,UAAE;AAAA,WAAQ;AAAA,QACzC,gBAAAH,KAAC,UAAO,SAAQ,SAAQ,MAAM,aAAa,OAAO,GAAG,cAAW,kBAAY,OAAM,kBAAY,SAAS,MAAM,UAAU,CAAC,SAAS;AAAA,QACjI,gBAAAA,KAAC,UAAO,SAAQ,SAAQ,MAAM,aAAa,OAAO,GAAG,cAAW,wBAAa,OAAM,wBAAa,SAAS,MAAM,UAAU,CAAC,SAAS;AAAA,QACnI,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAM,aAAa,WAAW;AAAA,YAC9B,SAAS,MAAM;AACb,kBAAI,YAAY,GAAG,EAAE,SAAS,KAAK,CAAC;AACpC,2BAAa,IAAI;AACjB,0BAAY,IAAI;AAAA,YAClB;AAAA,YACD;AAAA;AAAA,QAED;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAM,aAAa,UAAU;AAAA,YAC7B,OAAM;AAAA,YACN,SAAS,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,UAAU,MAAM,GAAG,GAAG,MAAM,GAAG,EAAE,IAAI,UAAU,EAAE;AAAA,YACrF;AAAA;AAAA,QAED;AAAA,QACA,gBAAAA;AAAA,UAAC;AAAA;AAAA,YACC,SAAQ;AAAA,YACR,MAAM,aAAa,QAAQ;AAAA,YAC3B,SAAS,MAAM;AACb,mBAAK,UAAU,WAAW,UAAU,gBAAgBG,OAAM,CAAC;AAC3D,wBAAU,EAAE,MAAM,QAAQ,MAAM,qBAAqB,CAAC;AAAA,YACxD;AAAA,YACD;AAAA;AAAA,QAED;AAAA,SACF;AAAA,MACA,gBAAAF,MAAC,cACE;AAAA,uBAAe,gBAAAD,KAAC,SAAO,sBAAW;AAAA,QACnC,gBAAAA,KAAC,SAAM,cAAW,gBAAe,OAAM,MAAK,aAAY,gBAAe,OAAO,MAAM,UAAU,CAAC,MAAM,QAAQ,EAAE,OAAO,KAAK,GAAG;AAAA,QAC9H,gBAAAA,KAAC,UAAO,SAAQ,WAAU,MAAM,aAAa,MAAM,GAAG,MAAK,WAAK,SAAS,MAAM,KAAK,KAAK,GAAG,UAAU,UAAU,CAAC,OAC9G,mBAAS,iBAAY,QAAQ,iBAAiB,SACjD;AAAA,SACF;AAAA,OACF;AAAA,IACC,UACC,gBAAAA,KAAC,SAAI,WAAW,4CAA4C,OAAO,SAAS,UAAU,qBAAqB,uBAAuB,IAAK,iBAAO,MAAK;AAAA,IAGrJ,gBAAAC,MAAC,SAAI,WAAU,qFACb;AAAA,sBAAAD,KAAC,WAAQ,OAAO,SAAS,WAAW,IAAI,OAAO,OAAO,IAAI,OAAO;AAAA,MACjE,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,OAAOG,QAAO;AAAA,UACd;AAAA,UACA,UAAU;AAAA,UACV,WAAW,IAAI;AAAA,UACf,OAAO,IAAI;AAAA,UACX,MAAM,IAAI;AAAA,UACV,UAAU;AAAA,UACV,aAAa,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,cAAc,EAAE,OAAO,EAAE,EAAE,EAAE;AAAA,UAC7E,QAAQ,CAAC,IAAI,SAAS,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,SAAS,EAAE,OAAO,IAAI,IAAI,EAAE,EAAE;AAAA,UAC/E,UAAU,CAAC,OAAO,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,WAAW,EAAE,OAAO,EAAE,EAAE,EAAE;AAAA,UACvE,UAAU,aAAa,OAAO,OAAO;AAAA,UACrC,iBAAiBA,QAAO;AAAA,UACxB,QAAQ;AAAA,UACR,SAAS,CAAC,OAAO;AAEf,kBAAM,OAAO,EAAE,GAAG,GAAG,QAAQ,UAAU,MAAM,GAAG,EAAE;AAClD,gBAAI,IAAI;AACR,yBAAa,IAAI;AACjB,wBAAY,IAAI;AAChB,sBAAU,EAAE,MAAM,QAAQ,MAAM,sBAAiB,GAAG,OAAO,IAAI,SAAI,QAAQ,qDAA2C,EAAE,GAAG,CAAC;AAAA,UAC9H;AAAA,UACA,WAAW,CAAC,MAAM;AAChB,iBAAK,MACF,OAAO,EAAE,KAAK,EACd,KAAK,OAAO,EACZ,KAAK,MAAM,UAAU,EAAE,MAAM,QAAQ,MAAM,kBAAa,EAAE,IAAI,WAAM,EAAE,OAAO,GAAG,CAAC,CAAC,EAClF,MAAM,CAAC,MAAe,UAAU,EAAE,MAAM,SAAS,MAAM,mBAAmB,aAAa,QAAQ,EAAE,UAAU,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;AAAA,UAC9H;AAAA;AAAA,MACF;AAAA,MACA,gBAAAF,MAAC,WAAM,WAAU,0FACf;AAAA,wBAAAD,KAAC,SAAM,QAAQG,SAAQ,UAAoB,UAAU,aAAa;AAAA,QACjE,eACC,gBAAAH;AAAA,UAAC;AAAA;AAAA,YAEC,MAAM;AAAA,YACN,UAAU,CAAC,UAAU,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,WAAW,EAAE,OAAO,aAAa,IAAI,KAAK,EAAE,EAAE;AAAA;AAAA,UAFzF,aAAa;AAAA,QAGpB,IAEA,gBAAAA,KAAC,SAAM,OAAM,uBAEX,0BAAAA;AAAA,UAAC;AAAA;AAAA,YACC,cAAW;AAAA,YACX,OAAOG,QAAO;AAAA,YACd,UAAU,CAAC,MAAM,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,OAAO,EAAE,OAAO,MAAM,EAAE;AAAA,YAC7D,MAAM;AAAA,YACN,UAAQ;AAAA,YACR,aAAY;AAAA;AAAA,QACd,GACF;AAAA,QAEF,gBAAAH,KAAC,QAAK,QAAQG,SAAQ,UAAU,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,KAAK,EAAE,GAAG;AAAA,SAC1E;AAAA,OACF;AAAA,IACC,IAAI,SACH,gBAAAH;AAAA,MAAC;AAAA;AAAA,QACC,WAAU;AAAA,QACV,OAAO,EAAE,MAAM,IAAI,MAAM,IAAI,IAAI,KAAK,IAAI,MAAM,IAAI,EAAE;AAAA,QAErD,cAAI,MAAM;AAAA;AAAA,IACb;AAAA,KAEJ,GACA;AAEJ;AAIA,SAAS,MAAM,EAAE,OAAO,UAAU,MAAM,GAA8D;AACpG,SACE,gBAAAC,MAAC,aAAQ,WAAU,8BACjB;AAAA,oBAAAA,MAAC,SAAI,WAAU,0CACb;AAAA,sBAAAD,KAAC,QAAG,WAAU,uBAAuB,iBAAM;AAAA,MAC1C;AAAA,OACH;AAAA,IACC;AAAA,KACH;AAEJ;AAEA,SAAS,QAAQ,EAAE,OAAO,WAAW,MAAM,GAAkG;AAC3I,QAAM,CAAC,GAAG,IAAI,IAAIE,UAAS,EAAE;AAC7B,QAAM,QAAQ,EAAE,KAAK,EAAE,YAAY;AACnC,QAAM,QAAQ,CAAC,MAAqB,CAAC,SAAS,EAAE,MAAM,YAAY,EAAE,SAAS,KAAK,KAAK,EAAE,GAAG,YAAY,EAAE,SAAS,KAAK,KAAK,EAAE,MAAM,YAAY,EAAE,SAAS,KAAK;AACjK,QAAM,MAAM,CAAC,MAAmB;AAC9B,UAAM,IAAI,gBAAgB,CAAC;AAC3B,QAAI,EAAG,OAAM,CAAC;AAAA,EAChB;AAEA,QAAMC,UAAS,WAAW,aAAa;AACvC,QAAM,OAAOC,SAAQ,MAAM,iBAAiBD,SAAQ,SAAS,CAAC,CAAC,GAAG,CAACA,SAAQ,KAAK,CAAC;AACjF,QAAM,SAAS,CAAC,EAAE,GAAG,MAAM,OAAO,KAAK,OAAO,MAC5C,gBAAAH;AAAA,IAACK;AAAA,IAAA;AAAA,MACC,QAAO;AAAA,MACP,SAAQ;AAAA,MACR,MAAM,aAAa,IAAI;AAAA,MACvB,OAAO;AAAA,MACP;AAAA,MACA,QAAQ,WAAW;AAAA,MACnB,eAAe,CAAC,MAAM,UAAU,GAAG,GAAG,KAAK;AAAA,MAC3C,SAAS,MAAM,MAAM,IAAI,CAAC,CAAC;AAAA;AAAA,EAC7B;AAEF,SACE,gBAAAJ,MAAC,WAAM,WAAU,gDACf;AAAA,oBAAAD,KAAC,SAAI,WAAU,8BACb,0BAAAA,KAAC,eAAY,cAAW,kBAAiB,aAAY,kBAAiB,OAAO,GAAG,UAAU,CAAC,MAAM,KAAK,EAAE,OAAO,KAAK,GAAG,GACzH;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,sCACZ;AAAA,OAAC,SACA,gBAAAA,MAAAF,WAAA,EACE;AAAA,wBAAAE,MAAC,YAAS,OAAM,mBACd;AAAA,0BAAAD,KAAC,UAAO,GAAG,EAAE,MAAM,OAAO,MAAM,UAAU,GAAG,MAAK,SAAQ,OAAM,WAAU;AAAA,UAC1E,gBAAAA,KAAC,UAAO,GAAG,EAAE,MAAM,OAAO,MAAM,UAAU,GAAG,MAAK,iBAAgB,OAAM,WAAU;AAAA,UAClF,gBAAAA,KAAC,UAAO,GAAG,EAAE,MAAM,OAAO,MAAM,UAAU,GAAG,MAAK,SAAQ,OAAM,WAAU;AAAA,UAC1E,gBAAAA,KAAC,UAAO,GAAG,EAAE,MAAM,OAAO,MAAM,OAAO,GAAG,MAAK,QAAO,OAAM,iBAAgB;AAAA,UAC5E,gBAAAA,KAAC,UAAO,GAAG,EAAE,MAAM,OAAO,MAAM,aAAa,GAAG,MAAK,YAAW,OAAM,4BAAsB;AAAA,UAC5F,gBAAAA,KAAC,UAAO,GAAG,EAAE,MAAM,OAAO,MAAM,YAAY,GAAG,MAAK,cAAa,OAAM,8BAAwB;AAAA,WACjG;AAAA,QACA,gBAAAA,KAAC,YAAS,OAAM,cACb,oBAAU,IAAI,CAAC,MACd,gBAAAA,KAAC,UAAkB,GAAG,EAAE,MAAM,YAAY,IAAI,EAAE,GAAG,GAAG,MAAM,EAAE,MAAM,OAAO,EAAE,SAAhE,EAAE,EAAqE,CACrF,GACH;AAAA,SACF;AAAA,MAED,eAAe,IAAI,CAAC,MAAM;AACzB,cAAM,WAAW,QAAQ,OAAO,CAAC,MAAM,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC;AAChE,cAAM,QAAQ,CAAC,GAAG,SAAS,OAAO,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,SAAS,OAAO,CAAC,MAAM,KAAK,IAAI,EAAE,EAAE,CAAC,CAAC;AACpG,YAAI,MAAM,WAAW,EAAG,QAAO;AAC/B,eACE,gBAAAA,KAAC,YAAiB,OAAO,GACtB,gBAAM,IAAI,CAAC,MACV,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,GAAG,EAAE,MAAM,WAAW,IAAI,EAAE,GAAG;AAAA,YAC/B,MAAM,EAAE;AAAA,YACR,OAAO,EAAE;AAAA,YACT,QAAQ,KAAK,IAAI,EAAE,EAAE;AAAA,YACpB,GAAI,KAAK,IAAI,EAAE,EAAE,IACd,EAAE,KAAK,gBAAAA,KAAC,SAAQ,gBAAK,IAAI,EAAE,EAAE,KAAK,KAAK,IAAI,YAAS,KAAK,IAAI,EAAE,EAAE,CAAC,KAAK,QAAO,EAAS,IACvF,EAAE,WAAW,aACX,EAAE,KAAK,gBAAAA,KAAC,SAAM,iBAAG,EAAS,IAC1B,CAAC;AAAA;AAAA,UATF,EAAE;AAAA,QAUT,CACD,KAdY,CAef;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,KACF;AAEJ;AAoBA,SAAS,UAAU,OAAuB;AACxC,QAAM,WAAW,MAAM,SAAS,QAAQ,MAAM,KAAK,OAAO;AAC1D,SACE,gBAAAC,MAAC,UAAK,WAAU,yCACd;AAAA,oBAAAA,MAAC,SAAI,WAAU,4EACb;AAAA,sBAAAD,KAAC,QAAG,WAAU,gCAA+B,uBAAS;AAAA,MACtD,gBAAAA,KAAC,UAAK,WAAU,8BAA6B,uEAAsD;AAAA,OACrG;AAAA,IACA,gBAAAC,MAAC,SAAI,WAAU,sCAAqC,SAAS,CAAC,MAAM,EAAE,WAAW,EAAE,iBAAiB,MAAM,SAAS,IAAI,GACrH;AAAA,sBAAAD,KAAC,QAAM,GAAG,OAAO,MAAM,MAAM,OAAO,OAAO,GAAG;AAAA,MAC9C,gBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAU;AAAA,UACV,WAAW,4GAA4G,WAAW,gCAAgC,eAAe;AAAA,UAEhL,gBAAM,MAAM,WAAW,IAAI,wCAAwC;AAAA;AAAA,MACtE;AAAA,OACF;AAAA,IACA,gBAAAA,KAAC,YAAS,UAAU,MAAM,UAAU,iBAAiB,MAAM,iBAAiB,QAAQ,MAAM,QAAQ,WAAW,MAAM,WAAW,SAAS,MAAM,SAAS;AAAA,KACxJ;AAEJ;AAEA,SAAS,KAAK,OAA6D;AACzE,QAAM,EAAE,MAAM,OAAO,MAAM,UAAU,UAAU,WAAW,MAAM,IAAI;AACpE,SACE,gBAAAA,KAAAD,WAAA,EACG,eAAK,IAAI,CAAC,SAAS;AAClB,UAAM,YAAY,YAAY,IAAI;AAClC,UAAM,SAAS,MAAM,OAAO,KAAK;AACjC,UAAM,QACJ,KAAK,SAAS,YAAY,8DAAsB,KAAK,UAAU,KAAK,SAAS,YAAY,yBAAyB;AACpH,UAAM,OACJ,KAAK,SAAS,UAAU,KAAK,SAAS,YAClC,KAAK,OACL,KAAK,SAAS,SACZ,KAAK,QAAQ,WAAW,KAAK,KAAK,GAAG,QAAQ,aAC7C,KAAK,SAAS,YACZ,UACA;AACV,WACE,gBAAAE,MAAC,SACC;AAAA,sBAAAA;AAAA,QAAC;AAAA;AAAA,UACC,aAAW,KAAK;AAAA,UACf,GAAI,YAAY,EAAE,kBAAkB,IAAI,IAAI,CAAC;AAAA,UAC9C,eAAe,CAAC,MAAM;AACpB,gBAAK,EAAE,OAAuB,QAAQ,QAAQ,EAAG;AACjD,sBAAU,GAAG,EAAE,MAAM,QAAQ,IAAI,KAAK,GAAG,GAAG,KAAK;AAAA,UACnD;AAAA,UACA,SAAS,MAAM,MAAM,SAAS,KAAK,EAAE,CAAC;AAAA,UACtC,OAAO,EAAE,YAAY,QAAQ,GAAG;AAAA,UAChC,WAAW;AAAA,YACT;AAAA,YACA,aAAa,KAAK,KAAK,gCAAgC;AAAA,YACvD,UAAU,MAAM,QAAQ,WAAW,wBAAwB;AAAA,YAC3D,YAAY,gBAAgB;AAAA,UAC9B,EAAE,KAAK,GAAG;AAAA,UAET;AAAA,sBAAU,MAAM,QAAQ,YAAY,gBAAAD,KAAC,UAAK,WAAU,2EAA0E;AAAA,YAC9H,UAAU,MAAM,QAAQ,WAAW,gBAAAA,KAAC,UAAK,WAAU,8EAA6E;AAAA,YACjI,gBAAAA,KAAC,UAAK,WAAU,yBAAwB,0BAAE;AAAA,YACzC,QAAQ,gBAAAA,KAAC,UAAK,WAAU,yBAAyB,uBAAa,MAAM,QAAQ,GAAE;AAAA,YAC/E,gBAAAA,KAAC,UAAK,WAAW,2BAA2B,KAAK,SAAS,YAAY,kCAAkC,EAAE,IAAK,iBAAM;AAAA,YACpH,KAAK,SAAS,aAAa,gBAAAA,KAAC,UAAK,WAAU,qCAAoC,qBAAO;AAAA,YACtF,KAAK,SAAS,UAAU,gBAAAA,KAAC,SAAO,eAAK,UAAU,YAAY,wBAAwB,eAAc;AAAA,YACjG,KAAK,SAAS,aAAa,gBAAAA,KAAC,UAAK,WAAU,qCAAqC,eAAK,UAAU,KAAK,WAAW,SAAS,GAAG,KAAK,MAAM,aAAa,WAAU;AAAA,YAC7J,KAAK,SAAS,UAAU,KAAK,YAAY,gBAAAA,KAAC,SAAI,WAAU,qCAAqC,eAAK,UAAS;AAAA,YAC5G,gBAAAC,MAAC,UAAK,WAAU,gDACd;AAAA,8BAAAD,KAAC,aAAU,OAAM,aAAY,SAAS,MAAM,MAAM,YAAY,KAAK,EAAE,GAAG,MAAK,YAAW;AAAA,cACvF,YACC,gBAAAA,KAAC,aAAU,OAAM,6BAA4B,SAAS,MAAM,MAAM,SAAS,KAAK,EAAE,GAAG,MAAK,WAAU,IAEpG,gBAAAC,MAAAF,WAAA,EACE;AAAA,gCAAAC,KAAC,aAAU,OAAM,wBAAuB,SAAS,MAAM,MAAM,OAAO,KAAK,IAAI,SAAS,GAAG,MAAK,SAAQ;AAAA,gBACtG,gBAAAA,KAAC,aAAU,OAAM,wBAAuB,SAAS,MAAM,MAAM,OAAO,KAAK,IAAI,SAAS,GAAG,MAAK,iBAAgB;AAAA,iBAChH;AAAA,cAEF,gBAAAA,KAAC,aAAU,OAAM,UAAS,SAAS,MAAM,MAAM,SAAS,KAAK,EAAE,GAAG,MAAK,UAAS;AAAA,eAClF;AAAA;AAAA;AAAA,MACF;AAAA,MACC,aACC,gBAAAA,KAAAD,WAAA,EACG,eAAK,SAAS,WAAW,IACxB,gBAAAE,MAAC,SAAI,OAAO,EAAE,aAAa,QAAQ,KAAK,GAAG,GAAG,WAAU,oGAAmG;AAAA;AAAA,QAC7H,KAAK,SAAS;AAAA,QAAU;AAAA,SACtD,IAEA,gBAAAD,KAAC,QAAM,GAAG,OAAO,MAAM,KAAK,UAAU,OAAO,QAAQ,GAAG,GAE5D;AAAA,SAhDM,KAAK,EAkDf;AAAA,EAEJ,CAAC,GACH;AAEJ;AAEA,SAAS,UAAU,EAAE,OAAO,SAAS,KAAK,GAAyD;AACjG,SACE,gBAAAA;AAAA,IAAC;AAAA;AAAA,MACC,SAAQ;AAAA,MACR,MAAM,aAAa,IAAI;AAAA,MACvB,cAAY;AAAA,MACZ;AAAA,MACA,SAAS,CAAC,MAAM;AACd,UAAE,gBAAgB;AAClB,gBAAQ;AAAA,MACV;AAAA;AAAA,EACF;AAEJ;AAEA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,CAAC,QAAQ,SAAS,IAAIE,UAAwB,IAAI;AACxD,QAAM,CAAC,cAAc,eAAe,IAAIA,UAAS,KAAK;AACtD,SACE,gBAAAD,MAAC,SAAI,WAAU,kEACb;AAAA,oBAAAD,KAAC,oBAAiB,MAAM,cAAc,SAAS,MAAM,gBAAgB,CAACM,OAAM,CAACA,EAAC,GAAG,OAAM,mBAAkB,MAAM,GAAG,gBAAgB,MAAM,IAAI;AAAA,IAC3I,gBACE,CAAC,cAAc,UAAU,EAAY,IAAI,CAAC,UACzC,gBAAAN,KAAC,YAAqB,OAAO,OAC1B,0BAAgB,OAAO,CAAC,OAAO,GAAG,UAAU,KAAK,EAAE,IAAI,CAAC,OACvD,gBAAAA,KAACK,OAAA,EAAiB,QAAO,OAAM,SAAQ,SAAQ,MAAM,aAAa,UAAU,eAAe,UAAU,WAAW,GAAG,OAAO,GAAG,OAAO,MAAM,MAAM,GAAG,QAAQ,SAAS,MAAM;AAAE,cAAQ,EAAE;AAAG,sBAAgB,KAAK;AAAA,IAAG,KAAtM,GAAG,EAAsM,CACrN,KAHY,KAIf,CACD;AAAA,IACH,gBAAAJ,MAAC,YAAS,OAAM,iBACb;AAAA,mBAAa,QAAQ,gBAAAD,KAAC,kBAAe,OAAM,QAAO;AAAA,MAClD,UAAU,WAAW,KAAK,gBAAAA,KAAC,cAAW,MAAM,aAAa,MAAM,GAAG,OAAM,qBAAoB,MAAK,2BAAqB;AAAA,OACrH,YAAY,CAAC,GAAG,IAAI,CAAC,UAAU;AAC/B,cAAM,SAAS,MAAM,CAAC;AACtB,cAAM,WAAW,WAAW,OAAO;AACnC,eACE,gBAAAC,MAAC,SACC;AAAA,0BAAAD;AAAA,YAAC;AAAA;AAAA,cACC,MAAM;AAAA,cACN,SAAS,MAAM,UAAU,WAAW,OAAO,OAAO,QAAQ;AAAA,cAC1D,OAAO,OAAO;AAAA,cACd,MAAM,GAAG,MAAM,MAAM,WAAW,MAAM,WAAW,IAAI,KAAK,GAAG,GAAG,OAAO,aAAa,kBAAkB,eAAY,EAAE;AAAA;AAAA,UACtH;AAAA,UACC,YACC,MAAM,IAAI,CAAC,MACT,gBAAAC,MAAC,SAAkB,WAAU,0BAC3B;AAAA,4BAAAD;AAAA,cAACK;AAAA,cAAA;AAAA,gBACC,WAAU;AAAA,gBACV,QAAO;AAAA,gBACP,SAAQ;AAAA,gBACR,OAAO,IAAI,EAAE,OAAO,GAAG,EAAE,OAAO,WAAM,EAAE,IAAI,KAAK,EAAE;AAAA,gBACnD,MAAM,EAAE,UAAU,IAAI,KAAK,EAAE,OAAO,EAAE,eAAe,IAAI;AAAA,gBACzD,SAAS,MAAM,OAAO,CAAC;AAAA;AAAA,YACzB;AAAA,YACA,gBAAAL,KAAC,aAAU,OAAM,wBAAuB,SAAS,MAAM,UAAU,CAAC,GAAG,MAAK,WAAU;AAAA,eAT5E,EAAE,KAUZ,CACD;AAAA,aApBK,OAAO,QAqBjB;AAAA,MAEJ,CAAC;AAAA,OACH;AAAA,KACF;AAEJ;AAEA,SAAS,MAAM,EAAE,QAAAG,SAAQ,UAAU,SAAS,GAAoF;AAC9H,QAAM,CAAC,IAAI,KAAK,IAAID,UAA0C,IAAI;AAClE,QAAM,CAAC,QAAQ,SAAS,IAAIA,UAAwB,IAAI;AACxD,QAAM,MAAM,OAAuB,IAAI;AACvC,SACE,gBAAAF,KAAC,SAAM,OAAM,aAAY,OAAO,gBAAAA,KAAC,UAAK,WAAU,qCAAoC,wDAA0C,GAC5H,0BAAAC;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,eAAe,CAAC,MAAM;AACpB,UAAE,eAAe;AACjB,cAAM,IAAI,IAAI,SAAS,sBAAsB;AAE7C,YAAI,EAAG,OAAM,EAAE,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQE,QAAO,KAAK,QAAQ,CAAC,CAAC,GAAG,GAAG,KAAK,IAAI,GAAG,KAAK,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,SAAS,cAAc,UAAU,GAAG,sBAAsB,EAAE,UAAU,OAAO,CAAC,CAAC,EAAE,CAAC;AAAA,MAC7O;AAAA,MACA,SAAS,CAAC,MAAM;AACd,YAAI,EAAE,WAAW,EAAE,cAAe,OAAM,IAAI;AAAA,MAC9C;AAAA,MACA,oBAAiB;AAAA,MACjB,WAAU;AAAA,MAET;AAAA,aACC,gBAAAH;AAAA,UAAC;AAAA;AAAA,YACC,QAAQG;AAAA,YACR,YAAY;AAAA,YACZ,aAAa;AAAA,YACb,cAAc;AAAA,YACd,QAAQ,CAAC,MAAM,UAAU,EAAE,KAAK;AAAA,YAChC,OAAO,EAAE,UAAU,YAAY,MAAM,GAAG,GAAG,KAAK,GAAG,GAAG,QAAQ,GAAG;AAAA;AAAA,QACnE,IAEA,gBAAAH,KAAC,eAAY,QAAQG,SAAQ,YAAY,cAAc,aAAa,UAAU,cAAc,UAAU,QAAQ,CAAC,MAAM,UAAU,EAAE,KAAK,GAAG;AAAA,QAE1I,UAAU,gBAAAF,MAAC,SAAI,WAAU,2DAA0D;AAAA;AAAA,UAAS;AAAA,WAAO;AAAA;AAAA;AAAA,EACtG,GACF;AAEJ;AAEA,IAAM,kBAAkB;AAAA,EACtB,EAAE,OAAO,eAAe,OAAO,cAAc;AAAA,EAC7C,EAAE,OAAO,WAAW,OAAO,UAAU;AACvC;AAEA,SAAS,KAAK,EAAE,QAAAE,SAAQ,SAAS,GAAyE;AACxG,QAAM,OAAOA,QAAO;AACpB,QAAM,SAAS,CAAC,GAA2D,UACzE,gBAAAH,KAAC,cAAW,OACV,0BAAAA,KAAC,UAAO,cAAY,OAAO,SAAS,KAAK,CAAC,GAAG,iBAAiB,CAAC,MAAM,SAAS,EAAE,GAAG,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,GAAG,GACtG;AAEF,SACE,gBAAAC,MAAC,SAAM,OAAM,QAAO,OAAO,gBAAAD,KAAC,UAAO,SAAQ,SAAQ,SAAS,MAAM,SAAS,EAAE,GAAG,aAAa,CAAC,GAAG,mBAAK,GACpG;AAAA,oBAAAA,KAAC,cAAW,OAAM,WAChB,0BAAAA,KAAC,oBAAiB,cAAW,WAAU,OAAO,KAAK,SAAS,MAAM,iBAAiB,eAAe,CAAC,YAAY,SAAS,EAAE,GAAG,MAAM,QAAQ,CAAC,GAAG,GACjJ;AAAA,IACA,gBAAAA,KAAC,cAAW,OAAM,SAChB,0BAAAA,KAAC,iBAAc,OAAO,KAAK,OAAO,KAAK,KAAK,KAAK,KAAK,MAAM,IAAI,UAAU,CAAC,UAAU,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,GAAG,GACrH;AAAA,IACC,OAAO,aAAa,OAAO;AAAA,IAC3B,OAAO,iBAAiB,WAAW;AAAA,IACnC,OAAO,aAAa,OAAO;AAAA,IAC3B,OAAO,UAAU,YAAY;AAAA,KAChC;AAEJ;AAEA,IAAM,iBAAiB;AAAA,EACrB,EAAE,OAAO,QAAQ,OAAO,OAAO;AAAA,EAC/B,EAAE,OAAO,OAAO,OAAO,WAAW;AAAA,EAClC,EAAE,OAAO,QAAQ,OAAO,YAAY;AACtC;AAEA,IAAM,QAAQ;AAAA,EACZ,CAAC,MAAM,IAAI;AAAA,EACX,CAAC,UAAU,aAAa;AAAA,EACxB,CAAC,UAAU,UAAU;AAAA,EACrB,CAAC,YAAY,UAAU;AACzB;AAEA,SAAS,UAAU,EAAE,MAAM,SAAS,GAAqE;AACvG,QAAM,UAAU,KAAK,YAAY,cAAc,KAAK,SAAS,IAAI;AACjE,SACE,gBAAAC,MAAC,SAAM,OAAO,YAAY,KAAK,SAAS,SAAS,gBAAgB,KAAK,IAAI,IAAI,OAAO,UAAU,gBAAAD,KAAC,SAAO,kBAAQ,IAAG,IAAW,QAC1H;AAAA,SAAK,SAAS,YACb,gBAAAA,KAAC,OAAE,WAAU,kBAAiB,wCAA0B,IAExD,gBAAAC,MAAAF,WAAA,EACE;AAAA,sBAAAC,KAAC,YAAS,OAAM,SACd,0BAAAA,KAAC,SAAM,cAAW,SAAQ,OAAO,KAAK,OAAO,UAAU,CAAC,MAAM,SAAS,EAAE,OAAO,EAAE,OAAO,MAAM,CAAsB,GAAG,GAC1H;AAAA,MACC,KAAK,SAAS,UAAU,gBAAAA,KAAC,gBAAa,MAAY,UAAoB;AAAA,OACrE,KAAK,SAAS,UAAU,KAAK,SAAS,cACtC,gBAAAC,MAAAF,WAAA,EACE;AAAA,wBAAAC,KAAC,YAAS,OAAM,QACd,0BAAAA,KAAC,cAAW,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,SAAS,SAAS,EAAE,KAAK,CAAsB,GAAG,GACnG;AAAA,QACA,gBAAAA,KAAC,YAAS,OAAM,QACd,0BAAAA,KAAC,SAAM,cAAW,QAAO,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,SAAS,EAAE,MAAM,EAAE,OAAO,MAAM,CAAsB,GAAG,GAC7H;AAAA,SACF;AAAA,MAED,KAAK,SAAS,UACb,gBAAAC,MAAAF,WAAA,EACE;AAAA,wBAAAC,KAAC,YAAS,OAAM,YACd,0BAAAA,KAAC,SAAM,cAAW,YAAW,OAAO,KAAK,YAAY,IAAI,aAAY,WAAK,UAAU,CAAC,MAAM,SAAS,EAAE,UAAU,EAAE,OAAO,MAAM,CAA0B,GAAG,GAC9J;AAAA,QACC,MAAM,IAAI,CAAC,CAAC,GAAG,KAAK,MACnB,gBAAAA,KAAC,cAAmB,OAClB,0BAAAA,KAAC,UAAO,cAAY,OAAO,SAAS,QAAQ,KAAK,CAAC,CAAC,GAAG,iBAAiB,CAAC,MAAM,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAA0B,GAAG,KAD9G,CAEjB,CACD;AAAA,SACH;AAAA,MAED,KAAK,SAAS,aACb,gBAAAC,MAAAF,WAAA,EACE;AAAA,wBAAAC,KAAC,cAAW,OAAM,UAChB,0BAAAA,KAAC,oBAAiB,cAAW,UAAS,OAAO,KAAK,UAAU,QAAQ,MAAM,gBAAgB,eAAe,CAAC,WAAW,SAAS,EAAE,OAAO,CAAsB,GAAG,GAClK;AAAA,QACA,gBAAAA,KAAC,cAAW,OAAM,iBAChB,0BAAAA,KAAC,UAAO,cAAW,iBAAgB,SAAS,QAAQ,KAAK,WAAW,GAAG,iBAAiB,CAAC,MAAM,SAAS,EAAE,aAAa,EAAE,CAAsB,GAAG,GACpJ;AAAA,SACF;AAAA,OAEJ;AAAA,IAEF,gBAAAA,KAAC,YAAS,OAAM,sBAEd,0BAAAA,KAAC,YAAS,cAAW,sBAAqB,MAAM,GAAG,UAAQ,MAAC,OAAO,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,SAAS,EAAE,MAAM,EAAE,OAAO,MAAM,CAAC,GAAG,GAC3I;AAAA,KACF;AAEJ;AAEA,IAAM,cAAc;AAAA,EAClB,EAAE,OAAO,SAAS,OAAO,YAAY;AAAA,EACrC,EAAE,OAAO,WAAW,OAAO,cAAc;AAC3C;AAEA,IAAM,eAAe,aAAa,IAAI,CAAC,SAAS,EAAE,OAAO,IAAI,IAAI,OAAO,IAAI,MAAM,EAAE;AAGpF,SAAS,aAAa,EAAE,MAAM,SAAS,GAAgG;AACrI,QAAM,SAAS,WAAW,KAAK,KAAK;AACpC,SACE,gBAAAC,MAAAF,WAAA,EACE;AAAA,oBAAAC,KAAC,YAAS,OAAM,SACd,0BAAAA;AAAA,MAAC;AAAA;AAAA,QACC,cAAW;AAAA,QACX,OAAO,KAAK;AAAA,QACZ,SAAS;AAAA,QACT,eAAe,CAAC,UAAU;AAExB,gBAAM,UAAU,CAAC,KAAK,SAAS,KAAK,UAAU,QAAQ,UAAU,KAAK,UAAU,qBAAqB,KAAK,UAAU;AACnH,mBAAS,EAAE,OAAO,GAAI,UAAU,EAAE,OAAO,WAAW,KAAK,GAAG,UAAU,KAAK,MAAM,IAAI,CAAC,EAAG,CAAsB;AAAA,QACjH;AAAA;AAAA,IACF,GACF;AAAA,IACA,gBAAAA,KAAC,cAAW,OAAM,YAChB,0BAAAA,KAAC,oBAAiB,cAAW,YAAW,OAAO,KAAK,OAAO,MAAM,aAAa,eAAe,CAAC,UAAU,SAAS,EAAE,MAAM,CAAsB,GAAG,GACpJ;AAAA,IACA,gBAAAA,KAAC,gBAAa,OAAO,KAAK,OAAO;AAAA,KACnC;AAEJ;AAEA,SAAS,aAAa,EAAE,MAAM,GAAsB;AAClD,QAAM,SAAS,WAAW,KAAK;AAC/B,QAAMG,UAAS,WAAW,aAAa;AACvC,QAAM,OAAOC,SAAQ,MAAOD,UAAS,YAAY,OAAO,iBAAiBA,QAAO,KAAK,CAAC,IAAI,CAAC,GAAI,CAACA,SAAQ,KAAK,CAAC;AAC9G,MAAI,QAAQ,QAAS,QAAO,gBAAAH,KAAC,OAAE,WAAU,uBAAsB,iDAAmC;AAClG,SACE,gBAAAA,KAAC,OAAE,WAAU,uBACV,eAAK,WAAW,IAAI,qEAAgE,SAAS,KAAK,MAAM,KAAK,KAAK,MAAM,GAAG,CAAC,EAAE,IAAI,CAACM,OAAMA,GAAE,KAAK,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,SAAS,IAAI,WAAM,EAAE,IAC5L;AAEJ;AAEA,SAAS,SAAS,EAAE,OAAO,SAAS,GAA2C;AAC7E,SACE,gBAAAL,MAAC,SAAI,WAAU,mBACb;AAAA,oBAAAD,KAAC,UAAK,WAAU,aAAa,iBAAM;AAAA,IAClC;AAAA,KACH;AAEJ;AAEA,SAAS,WAAW,EAAE,OAAO,SAAS,GAAqD;AACzF,QAAM,CAAC,GAAG,IAAI,IAAIE,UAAS,EAAE;AAC7B,QAAM,CAAC,MAAM,OAAO,IAAIA,UAAS,KAAK;AACtC,QAAM,QAAQE,SAAQ,MAAM;AAC1B,UAAM,IAAI,EAAE,KAAK,EAAE,YAAY;AAC/B,YAAQ,IAAI,WAAW,OAAO,CAAC,MAAM,EAAE,YAAY,EAAE,SAAS,CAAC,CAAC,IAAI,YAAY,MAAM,GAAG,EAAE;AAAA,EAC7F,GAAG,CAAC,CAAC,CAAC;AACN,SACE,gBAAAH,MAAC,SAAI,WAAU,YACb;AAAA,oBAAAD;AAAA,MAAC;AAAA;AAAA,QACC,SAAQ;AAAA,QACR,MAAM,QAAQ,aAAa,KAAK,IAAI;AAAA,QACpC,SAAS,aAAa,aAAa;AAAA,QACnC,iBAAe;AAAA,QACf,SAAS,MAAM,QAAQ,CAACM,OAAM,CAACA,EAAC;AAAA,QAE/B,mBAAS;AAAA;AAAA,IACZ;AAAA,IACC,QACC,gBAAAL,MAAC,SAAI,WAAU,sFACb;AAAA,sBAAAD,KAAC,eAAY,WAAS,MAAC,cAAW,gBAAe,aAAa,UAAU,WAAW,MAAM,UAAU,OAAO,GAAG,UAAU,CAAC,MAAM,KAAK,EAAE,OAAO,KAAK,GAAG;AAAA,MACpJ,gBAAAC,MAAC,SAAI,WAAU,kDACb;AAAA,wBAAAD,KAAC,UAAO,SAAQ,SAAQ,MAAM,aAAa,KAAK,GAAG,cAAW,WAAU,OAAM,WAAU,SAAS,CAAC,OAAO,SAAS,MAAM;AAAE,mBAAS,EAAE;AAAG,kBAAQ,KAAK;AAAA,QAAG,GAAG;AAAA,QAC1J,MAAM,IAAI,CAAC,MACV,gBAAAA;AAAA,UAAC;AAAA;AAAA,YAEC,SAAQ;AAAA,YACR,MAAM,aAAa,CAAC;AAAA,YACpB,cAAY;AAAA,YACZ,OAAO;AAAA,YACP,SAAS,MAAM;AAAA,YACf,SAAS,MAAM;AACb,uBAAS,CAAC;AACV,sBAAQ,KAAK;AAAA,YACf;AAAA;AAAA,UATK;AAAA,QAUP,CACD;AAAA,SACH;AAAA,OACF;AAAA,KAEJ;AAEJ;","names":["useMemo","useState","design","design","o","o","strip","sub","Tile","jsx","Fragment","jsx","jsxs","useState","design","useMemo","Tile","o"]}
|
|
1
|
+
{"version":3,"sources":["../src/builder/MenuBuilder.tsx","../src/design/catalog.ts","../src/design/MenuPreview.tsx","../src/design/model.ts","../src/design/starters.ts","../src/design/audit.ts","../src/builder/icons.tsx"],"sourcesContent":["// src/builder/MenuBuilder.tsx — @ai-matrx/context-menu/builder: THE DRAG-AND-DROP MENU DESIGNER.\n//\n// Three columns: the option palette (everything the menu offers today, plus ready-made blocks), the\n// structure (drag to reorder, drop onto a section or submenu to nest), and the live menu with its\n// look and the selected entry's settings. Save writes a new version to the design store; every\n// version stays openable. The working copy is also kept in this browser between reloads.\n\nimport { createContext, useCallback, useContext, useEffect, useMemo, useRef, useState, type PointerEvent as ReactPointerEvent, type ReactNode } from \"react\";\nimport { CATALOG, CATALOG_GROUPS, SLOT_SOURCES, TEMPLATES, catalogOption, slotOptions, slotSource, type CatalogOption } from \"../design/catalog\";\nimport { MenuPreview, type AvailabilityPreview } from \"../design/MenuPreview\";\nimport {\n DEFAULT_LOOK,\n MENU_TONES,\n canMove,\n MENU_SURFACES,\n countItems,\n duplicateNode,\n catalogUseCounts,\n emptyDesign,\n insertNode,\n placedCatalogIds,\n isContainer,\n locate,\n moveNode,\n newId,\n parseDesign,\n removeNode,\n serializeDesign,\n unwrapNode,\n updateNode,\n wrapNode,\n type MenuDesign,\n type MenuItemNode,\n type MenuNode,\n type MenuTone,\n} from \"../design/model\";\nimport type { DesignStore, SavedDesignVersion } from \"../design/store\";\nimport { STARTER_DESIGNS, type StarterDesign } from \"../design/starters\";\nimport { AUDIT_FINDINGS, type AuditFinding } from \"../design/audit\";\nimport {\n Badge,\n Button,\n ControlRow,\n DisclosureHeader,\n EmptyState,\n Field,\n NumberStepper,\n RegionSkeleton,\n RowGroup,\n SearchField,\n SegmentedControl,\n Select,\n SettingRow,\n Switch,\n Textarea,\n Tile,\n} from \"@ai-matrx/design-system/controls\";\nimport { ICON_NAMES, renderLucide } from \"./icons\";\n\nexport interface MenuBuilderProps {\n store: DesignStore;\n /** A short line naming where saves go (\"Live data · admin@admin.com\"). */\n storeLabel: string;\n /** Opens with this design instead of the browser's working copy. */\n initialDesign?: MenuDesign;\n /** The host's account control (who saves), shown beside Save. */\n accountSlot?: ReactNode;\n}\n\nconst SURFACE_LABELS: Record<MenuDesign[\"surface\"], string> = {\n \"text-selection\": \"Opens on selected text\",\n \"editable-field\": \"Opens in an editable field\",\n \"table-row\": \"Opens on a table row\",\n page: \"Opens on the page\",\n \"chat-message\": \"Opens on a chat message\",\n file: \"Opens on a file\",\n anywhere: \"Opens anywhere\",\n};\nconst SURFACE_OPTIONS = MENU_SURFACES.map((value) => ({ value, label: SURFACE_LABELS[value] }));\n\n/** The design being edited, for panels that need the whole tree (a placeholder's contents). */\nconst DesignContext = createContext<MenuDesign | null>(null);\n\nconst DRAFT_KEY = \"matrx.context-menu.builder.draft.v1\";\n\ntype DragPayload =\n | { type: \"catalog\"; id: string }\n | { type: \"template\"; id: string }\n | { type: \"audit\"; id: string }\n | { type: \"new\"; kind: \"section\" | \"submenu\" | \"divider\" | \"item\" | \"slot-items\" | \"slot-menu\" | \"slot-feature\" | \"search\" }\n | { type: \"move\"; id: string };\n\ntype DropPos = \"before\" | \"after\" | \"inside\";\n\ntype Over = { id: string | null; pos: DropPos };\ntype StartDrag = (e: ReactPointerEvent, payload: DragPayload, label: string) => void;\n\n/**\n * Pointer-driven drag: works with a mouse, a pen and a finger, unlike the browser's own drag and\n * drop. A press that moves less than 4px stays a click. Drop targets are elements carrying\n * `data-drop` (an entry id, or \"root\") and `data-container` when they accept children.\n */\nfunction usePointerDrag(onDrop: (payload: DragPayload, over: Over) => void) {\n const [ghost, setGhost] = useState<{ label: string; x: number; y: number } | null>(null);\n const [over, setOver] = useState<Over | null>(null);\n const suppressClick = useRef(false);\n\n const start: StartDrag = (e, payload, label) => {\n if (e.button !== 0) return;\n const x0 = e.clientX;\n const y0 = e.clientY;\n let active = false;\n let current: Over | null = null;\n const move = (ev: PointerEvent) => {\n if (!active && Math.hypot(ev.clientX - x0, ev.clientY - y0) < 4) return;\n if (!active) {\n active = true;\n document.body.style.userSelect = \"none\";\n document.body.style.cursor = \"grabbing\";\n }\n setGhost({ label, x: ev.clientX, y: ev.clientY });\n const el = (document.elementFromPoint(ev.clientX, ev.clientY) as HTMLElement | null)?.closest<HTMLElement>(\"[data-drop]\");\n if (!el) {\n current = null;\n } else if (el.dataset.drop === \"root\") {\n current = { id: null, pos: \"after\" };\n } else {\n const r = el.getBoundingClientRect();\n const y = (ev.clientY - r.top) / r.height;\n const pos: DropPos = el.dataset.container ? (y < 0.28 ? \"before\" : y > 0.72 ? \"after\" : \"inside\") : y < 0.5 ? \"before\" : \"after\";\n current = { id: el.dataset.drop ?? null, pos };\n }\n setOver(current);\n };\n const up = () => {\n window.removeEventListener(\"pointermove\", move);\n window.removeEventListener(\"pointerup\", up);\n window.removeEventListener(\"pointercancel\", up);\n document.body.style.userSelect = \"\";\n document.body.style.cursor = \"\";\n if (active) {\n suppressClick.current = true;\n setTimeout(() => (suppressClick.current = false), 0);\n if (current) onDrop(payload, current);\n }\n setGhost(null);\n setOver(null);\n };\n window.addEventListener(\"pointermove\", move);\n window.addEventListener(\"pointerup\", up);\n window.addEventListener(\"pointercancel\", up);\n };\n /** Wrap a click handler so the click that ends a drag does nothing. */\n const click = (fn: () => void) => () => {\n if (!suppressClick.current) fn();\n };\n return { start, click, ghost, over };\n}\n\nfunction nodeFromPayload(p: DragPayload): MenuNode | null {\n if (p.type === \"catalog\") {\n const c = catalogOption(p.id);\n if (!c) return null;\n return {\n id: newId(\"i\"),\n kind: \"item\",\n catalogId: c.id,\n label: c.label,\n icon: c.icon,\n ...(c.shortcut ? { shortcut: c.shortcut } : {}),\n ...(c.danger ? { danger: true } : {}),\n ...(c.ai ? { ai: true } : {}),\n };\n }\n if (p.type === \"audit\") {\n const f = AUDIT_FINDINGS.find((a) => a.id === p.id);\n if (!f) return null;\n return {\n id: newId(\"i\"),\n kind: \"item\",\n catalogId: f.id,\n label: f.label,\n icon: \"CircleDashed\",\n note: `From the audit (${f.importance}, ${f.coverage}): ${f.feature} — today: ${f.surface} (${f.source})`,\n };\n }\n if (p.type === \"template\") return TEMPLATES.find((t) => t.id === p.id)?.build() ?? null;\n if (p.type === \"new\") {\n if (p.kind === \"section\") return { id: newId(\"s\"), kind: \"section\", label: \"New section\", children: [] };\n if (p.kind === \"submenu\") return { id: newId(\"m\"), kind: \"submenu\", label: \"More\", icon: \"Ellipsis\", children: [] };\n if (p.kind === \"divider\") return { id: newId(\"d\"), kind: \"divider\" };\n if (p.kind === \"slot-items\") return { id: newId(\"p\"), kind: \"slot\", shape: \"items\", fills: \"any\", label: \"Everything else\" };\n if (p.kind === \"slot-menu\") return { id: newId(\"p\"), kind: \"slot\", shape: \"submenu\", fills: \"any\", label: \"More\", icon: \"Ellipsis\" };\n if (p.kind === \"slot-feature\") return { id: newId(\"p\"), kind: \"slot\", shape: \"feature\", fills: \"page-rows\", label: \"THIS FEATURE NAME\", featureItems: 4 };\n if (p.kind === \"search\") return { id: newId(\"q\"), kind: \"search\", placeholder: \"Search this menu…\", autofocus: true };\n return { id: newId(\"i\"), kind: \"item\", label: \"New option\", icon: \"Circle\" };\n }\n return null;\n}\n\nfunction readDraft(): MenuDesign | null {\n try {\n const raw = globalThis.localStorage?.getItem(DRAFT_KEY);\n return raw ? parseDesign(raw) : null;\n } catch {\n return null;\n }\n}\n\n// ── history (undo / redo) ────────────────────────────────────────────────────\n\nfunction useHistory(initial: MenuDesign) {\n const [state, setState] = useState({ past: [] as MenuDesign[], present: initial, future: [] as MenuDesign[] });\n const set = useCallback((next: MenuDesign | ((d: MenuDesign) => MenuDesign), opts?: { replace?: boolean }) => {\n setState((s) => {\n const value = typeof next === \"function\" ? next(s.present) : next;\n if (value === s.present) return s;\n if (opts?.replace) return { past: [], present: value, future: [] };\n return { past: [...s.past.slice(-99), s.present], present: value, future: [] };\n });\n }, []);\n const undo = useCallback(() => setState((s) => (s.past.length ? { past: s.past.slice(0, -1), present: s.past[s.past.length - 1] as MenuDesign, future: [s.present, ...s.future] } : s)), []);\n const redo = useCallback(() => setState((s) => (s.future.length ? { past: [...s.past, s.present], present: s.future[0] as MenuDesign, future: s.future.slice(1) } : s)), []);\n return { design: state.present, set, undo, redo, canUndo: state.past.length > 0, canRedo: state.future.length > 0 };\n}\n\n// ── the builder ──────────────────────────────────────────────────────────────\n\nexport function MenuBuilder({ store, storeLabel, initialDesign, accountSlot }: MenuBuilderProps) {\n const { design, set, undo, redo, canUndo, canRedo } = useHistory(initialDesign ?? readDraft() ?? emptyDesign());\n const [selected, setSelected] = useState<string | null>(null);\n const [versions, setVersions] = useState<SavedDesignVersion[] | null>(null);\n const [status, setStatus] = useState<{ tone: \"ok\" | \"error\" | \"info\"; text: string } | null>(null);\n const [saving, setSaving] = useState(false);\n const [note, setNote] = useState(\"\");\n const [lastSaved, setLastSaved] = useState<string | null>(null);\n\n const designRef = useRef(design);\n designRef.current = design;\n\n // keep the working copy in this browser\n useEffect(() => {\n try {\n globalThis.localStorage?.setItem(DRAFT_KEY, serializeDesign(design));\n } catch {\n /* storage blocked: nothing to keep */\n }\n }, [design]);\n\n const refresh = useCallback(async () => {\n try {\n const all = await store.list();\n setVersions(all);\n // The working copy equals a stored version → it is saved; otherwise it is not.\n const now = serializeDesign(designRef.current);\n setLastSaved(all.some((v) => serializeDesign(v.design) === now) ? now : null);\n } catch (e) {\n setStatus({ tone: \"error\", text: `Could not read saved designs: ${e instanceof Error ? e.message : String(e)}` });\n }\n }, [store]);\n useEffect(() => {\n void refresh();\n }, [refresh]);\n\n const dirty = lastSaved !== serializeDesign(design);\n\n const save = async () => {\n setSaving(true);\n try {\n const saved = await store.save(design, note.trim());\n setLastSaved(serializeDesign(design));\n setNote(\"\");\n setStatus({ tone: \"ok\", text: `Saved “${saved.name}” v${saved.version}` });\n await refresh();\n } catch (e) {\n setStatus({ tone: \"error\", text: `Save failed: ${e instanceof Error ? e.message : String(e)}` });\n } finally {\n setSaving(false);\n }\n };\n\n // Opening a version is an ordinary edit: ⌘Z brings back whatever was on screen before.\n const open = (v: SavedDesignVersion) => {\n set(v.design);\n setLastSaved(serializeDesign(v.design));\n setSelected(null);\n setStatus({ tone: \"info\", text: `Opened “${v.name}” v${v.version}${dirty ? \" — ⌘Z brings back your unsaved changes\" : \"\"}` });\n };\n\n // structure edits\n const addNode = (node: MenuNode) => {\n set((d) => {\n const sel = selected ? locate(d.nodes, selected) : null;\n // An option clicked while a section or submenu is selected goes into it; a container goes after it.\n const nests = sel && isContainer(sel.node) && !isContainer(node);\n if (sel && nests && isContainer(sel.node)) return { ...d, nodes: insertNode(d.nodes, sel.node.id, sel.node.children.length, node) };\n if (sel) return { ...d, nodes: insertNode(d.nodes, sel.parentId, sel.index + 1, node) };\n return { ...d, nodes: [...d.nodes, node] };\n });\n setSelected(node.id);\n };\n\n const drop = (p: DragPayload, { id: targetId, pos }: Over) => {\n if (p.type === \"move\" && p.id === targetId) return;\n if (p.type === \"move\" && targetId) {\n const at = locate(design.nodes, targetId);\n const parentId = at ? (pos === \"inside\" && isContainer(at.node) ? at.node.id : at.parentId) : null;\n if (!canMove(design.nodes, p.id, parentId)) {\n setStatus({ tone: \"error\", text: \"Can't move a section or submenu inside itself\" });\n return;\n }\n }\n const fresh = p.type === \"move\" ? null : nodeFromPayload(p);\n set((d) => {\n let parentId: string | null = null;\n let index = d.nodes.length;\n if (targetId) {\n const at = locate(d.nodes, targetId);\n if (!at) return d;\n if (pos === \"inside\" && isContainer(at.node)) {\n parentId = at.node.id;\n index = at.node.children.length;\n } else {\n parentId = at.parentId;\n index = at.index + (pos === \"after\" ? 1 : 0);\n }\n }\n if (p.type === \"move\") return { ...d, nodes: moveNode(d.nodes, p.id, parentId, index) };\n return fresh ? { ...d, nodes: insertNode(d.nodes, parentId, index, fresh) } : d;\n });\n if (fresh) setSelected(fresh.id);\n else if (p.type === \"move\") setSelected(p.id);\n };\n const dnd = usePointerDrag(drop);\n\n const remove = (id: string) => {\n set((d) => ({ ...d, nodes: removeNode(d.nodes, id) }));\n if (selected === id) setSelected(null);\n };\n\n // keyboard\n useEffect(() => {\n const onKey = (e: KeyboardEvent) => {\n const typing = e.target instanceof HTMLElement && /^(INPUT|TEXTAREA|SELECT)$/.test(e.target.tagName);\n const mod = e.metaKey || e.ctrlKey;\n if (mod && e.key.toLowerCase() === \"s\") {\n e.preventDefault();\n void save();\n return;\n }\n if (typing) return;\n if (mod && e.key.toLowerCase() === \"z\") {\n e.preventDefault();\n if (e.shiftKey) redo();\n else undo();\n } else if (mod && e.key.toLowerCase() === \"d\" && selected) {\n e.preventDefault();\n set((d) => ({ ...d, nodes: duplicateNode(d.nodes, selected) }));\n } else if ((e.key === \"Delete\" || e.key === \"Backspace\") && selected) {\n e.preventDefault();\n remove(selected);\n } else if (e.key === \"Escape\") setSelected(null);\n };\n window.addEventListener(\"keydown\", onKey);\n return () => window.removeEventListener(\"keydown\", onKey);\n });\n\n const selectedNode = selected ? locate(design.nodes, selected)?.node ?? null : null;\n const designs = useMemo(() => {\n const byId = new Map<string, SavedDesignVersion[]>();\n for (const v of versions ?? []) byId.set(v.designId, [...(byId.get(v.designId) ?? []), v]);\n return [...byId.values()];\n }, [versions]);\n\n return (\n <DesignContext.Provider value={design}>\n <div className=\"flex h-dvh flex-col bg-background text-foreground\">\n {/* top bar */}\n <header className=\"flex flex-wrap items-center gap-y-1 border-b border-border px-3 py-2\">\n <ControlRow className=\"min-w-0 flex-1\">\n <Field aria-label=\"Design name\" width=\"lg\" value={design.name} onChange={(e) => set((d) => ({ ...d, name: e.target.value }))} />\n <Select\n aria-label=\"Where this menu opens\"\n value={design.surface}\n options={SURFACE_OPTIONS}\n onValueChange={(surface) => set((d) => ({ ...d, surface }))}\n />\n <Badge>{countItems(design.nodes)} options</Badge>\n <Button variant=\"quiet\" icon={renderLucide(\"Undo2\")} aria-label=\"Undo (⌘Z)\" title=\"Undo (⌘Z)\" onClick={undo} disabled={!canUndo} />\n <Button variant=\"quiet\" icon={renderLucide(\"Redo2\")} aria-label=\"Redo (⇧⌘Z)\" title=\"Redo (⇧⌘Z)\" onClick={redo} disabled={!canRedo} />\n <Button\n variant=\"quiet\"\n icon={renderLucide(\"FilePlus2\")}\n onClick={() => {\n set(emptyDesign(), { replace: true });\n setLastSaved(null);\n setSelected(null);\n }}\n >\n New\n </Button>\n <Button\n variant=\"quiet\"\n icon={renderLucide(\"CopyPlus\")}\n title=\"Keep this menu as a separate design\"\n onClick={() => set((d) => ({ ...d, designId: newId(\"d\"), name: `${d.name} (copy)` }))}\n >\n Save as new design\n </Button>\n <Button\n variant=\"quiet\"\n icon={renderLucide(\"Braces\")}\n onClick={() => {\n void navigator.clipboard?.writeText(serializeDesign(design));\n setStatus({ tone: \"info\", text: \"Design JSON copied\" });\n }}\n >\n Copy JSON\n </Button>\n </ControlRow>\n <ControlRow>\n {accountSlot ?? <Badge>{storeLabel}</Badge>}\n <Field aria-label=\"Version note\" width=\"md\" placeholder=\"Version note\" value={note} onChange={(e) => setNote(e.target.value)} />\n <Button variant=\"primary\" icon={renderLucide(\"Save\")} meta=\"⌘S\" onClick={() => void save()} disabled={saving || !dirty}>\n {saving ? \"Saving…\" : dirty ? \"Save version\" : \"Saved\"}\n </Button>\n </ControlRow>\n </header>\n {status && (\n <div className={`border-b border-border px-3 py-1 text-xs ${status.tone === \"error\" ? \"text-destructive\" : \"text-muted-foreground\"}`}>{status.text}</div>\n )}\n\n <div className=\"grid min-h-0 flex-1 grid-cols-[minmax(200px,240px)_minmax(0,1fr)_minmax(0,1.1fr)]\">\n <Palette onAdd={addNode} startDrag={dnd.start} click={dnd.click} />\n <Structure\n nodes={design.nodes}\n selected={selected}\n onSelect={setSelected}\n startDrag={dnd.start}\n click={dnd.click}\n over={dnd.over}\n onRemove={remove}\n onDuplicate={(id) => set((d) => ({ ...d, nodes: duplicateNode(d.nodes, id) }))}\n onWrap={(id, kind) => set((d) => ({ ...d, nodes: wrapNode(d.nodes, id, kind) }))}\n onUnwrap={(id) => set((d) => ({ ...d, nodes: unwrapNode(d.nodes, id) }))}\n versions={versions === null ? null : designs}\n currentDesignId={design.designId}\n onOpen={open}\n onStart={(st) => {\n // A starting point opens as a NEW design of yours: saving never touches the starter.\n const copy = { ...st.design, designId: newId(\"d\") };\n set(copy);\n setLastSaved(null);\n setSelected(null);\n setStatus({ tone: \"info\", text: `Started from “${st.design.name}”${dirty ? \" — ⌘Z brings back your unsaved changes\" : \"\"}` });\n }}\n onArchive={(v) => {\n void store\n .remove(v.rowId)\n .then(refresh)\n .then(() => setStatus({ tone: \"info\", text: `Archived “${v.name}” v${v.version}` }))\n .catch((e: unknown) => setStatus({ tone: \"error\", text: `Archive failed: ${e instanceof Error ? e.message : String(e)}` }));\n }}\n />\n <aside className=\"flex min-h-0 min-w-0 flex-col overflow-x-hidden overflow-y-auto border-l border-border\">\n <Stage design={design} selected={selected} onSelect={setSelected} />\n {selectedNode ? (\n <Inspector\n key={selectedNode.id}\n node={selectedNode}\n onChange={(patch) => set((d) => ({ ...d, nodes: updateNode(d.nodes, selectedNode.id, patch) }))}\n />\n ) : (\n <Panel title=\"Notes for the build\">\n {/* ui-exception: ProTextarea lives in matrx-frontend; a package playground has only the package Textarea */}\n <Textarea\n aria-label=\"Notes for the build\"\n value={design.notes}\n onChange={(e) => set((d) => ({ ...d, notes: e.target.value }))}\n rows={4}\n autoGrow\n placeholder=\"Anything the builder of this menu should know\"\n />\n </Panel>\n )}\n <Look design={design} onChange={(look) => set((d) => ({ ...d, look }))} />\n </aside>\n </div>\n {dnd.ghost && (\n <div\n className=\"pointer-events-none fixed z-50 rounded-md border border-primary bg-popover px-2 py-1 text-sm shadow-lg\"\n style={{ left: dnd.ghost.x + 12, top: dnd.ghost.y + 8 }}\n >\n {dnd.ghost.label}\n </div>\n )}\n </div>\n </DesignContext.Provider>\n );\n}\n\n// ── pieces ───────────────────────────────────────────────────────────────────\n\nfunction Panel({ title, children, right }: { title: string; children: ReactNode; right?: ReactNode }) {\n return (\n <section className=\"border-b border-border p-3\">\n <div className=\"mb-2 flex items-center justify-between\">\n <h2 className=\"type-meta uppercase\">{title}</h2>\n {right}\n </div>\n {children}\n </section>\n );\n}\n\nfunction Palette({ onAdd, startDrag, click }: { onAdd: (n: MenuNode) => void; startDrag: StartDrag; click: (fn: () => void) => () => void }) {\n const [q, setQ] = useState(\"\");\n const query = q.trim().toLowerCase();\n const shown = (c: CatalogOption) => !query || c.label.toLowerCase().includes(query) || c.id.toLowerCase().includes(query) || c.group.toLowerCase().includes(query);\n const add = (p: DragPayload) => {\n const n = nodeFromPayload(p);\n if (n) onAdd(n);\n };\n // Options already in the design: shaded, last in their group, with how many times — still addable.\n const design = useContext(DesignContext);\n const uses = useMemo(() => catalogUseCounts(design?.nodes ?? []), [design?.nodes]);\n const Option = ({ p, icon, label, end, dimmed }: { p: DragPayload; icon: string; label: string; end?: ReactNode; dimmed?: boolean }) => (\n <Tile\n layout=\"row\"\n variant=\"quiet\"\n icon={renderLucide(icon)}\n title={label}\n end={end}\n dimmed={dimmed === true}\n onPointerDown={(e) => startDrag(e, p, label)}\n onClick={click(() => add(p))}\n />\n );\n return (\n <aside className=\"flex min-h-0 flex-col border-r border-border\">\n <div className=\"border-b border-border p-2\">\n <SearchField aria-label=\"Search options\" placeholder=\"Search options\" value={q} onChange={(e) => setQ(e.target.value)} />\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-2\">\n {!query && (\n <>\n <RowGroup title=\"Building blocks\">\n <Option p={{ type: \"new\", kind: \"section\" }} icon=\"Rows3\" label=\"Section\" />\n <Option p={{ type: \"new\", kind: \"submenu\" }} icon=\"ChevronsRight\" label=\"Submenu\" />\n <Option p={{ type: \"new\", kind: \"divider\" }} icon=\"Minus\" label=\"Divider\" />\n <Option p={{ type: \"new\", kind: \"item\" }} icon=\"Plus\" label=\"Custom option\" />\n <Option p={{ type: \"new\", kind: \"slot-items\" }} icon=\"ListPlus\" label=\"Placeholder — items\" />\n <Option p={{ type: \"new\", kind: \"slot-menu\" }} icon=\"FolderPlus\" label=\"Placeholder — submenu\" />\n <Option p={{ type: \"new\", kind: \"slot-feature\" }} icon=\"PanelTop\" label=\"Feature section\" />\n <Option p={{ type: \"new\", kind: \"search\" }} icon=\"Search\" label=\"Search box\" />\n </RowGroup>\n <RowGroup title=\"Ready-made\">\n {TEMPLATES.map((t) => (\n <Option key={t.id} p={{ type: \"template\", id: t.id }} icon={t.icon} label={t.label} />\n ))}\n </RowGroup>\n </>\n )}\n <AuditPalette query={query} uses={uses} Option={Option} />\n {CATALOG_GROUPS.map((g) => {\n const matching = CATALOG.filter((c) => c.group === g && shown(c));\n const items = [...matching.filter((c) => !uses.has(c.id)), ...matching.filter((c) => uses.has(c.id))];\n if (items.length === 0) return null;\n return (\n <RowGroup key={g} title={g}>\n {items.map((c) => (\n <Option\n key={c.id}\n p={{ type: \"catalog\", id: c.id }}\n icon={c.icon}\n label={c.label}\n dimmed={uses.has(c.id)}\n {...(uses.has(c.id)\n ? { end: <Badge>{(uses.get(c.id) ?? 0) > 1 ? `used ×${uses.get(c.id)}` : \"used\"}</Badge> }\n : c.status === \"proposed\"\n ? { end: <Badge>new</Badge> }\n : {})}\n />\n ))}\n </RowGroup>\n );\n })}\n </div>\n </aside>\n );\n}\n\nconst AUDIT_HOMES = [\n { value: \"main menu\", label: \"Main menu\" },\n { value: \"feature section\", label: \"Feature\" },\n { value: \"window\", label: \"Window\" },\n] as const;\nconst AUDIT_AREAS: Record<string, string> = {\n notes: \"Notes\",\n files: \"Files & media\",\n chat: \"Chat\",\n documents: \"Code & documents\",\n tables: \"Tables & records\",\n agents: \"Agents, workflows & the engine\",\n};\nconst IMPORTANCE_ORDER = { core: 0, useful: 1, rare: 2 } as const;\n\ntype OptionComponent = (props: { p: DragPayload; icon: string; label: string; end?: ReactNode; dimmed?: boolean }) => ReactNode;\n\n/**\n * FROM THE AUDIT: every action the app's other menus offer that the design does not (yet), by where it\n * probably belongs and by area, core first. Drag one in and its note says where it lives today.\n */\nfunction AuditPalette({ query, uses, Option }: { query: string; uses: Map<string, number>; Option: OptionComponent }) {\n const [home, setHome] = useState<AuditFinding[\"home\"]>(\"main menu\");\n const [openArea, setOpenArea] = useState<string | null>(null);\n const matches = (f: AuditFinding) =>\n !query || `${f.label} ${f.feature} ${f.surface}`.toLowerCase().includes(query);\n const pool = AUDIT_FINDINGS.filter((f) => (query ? matches(f) : f.home === home));\n const placed = pool.filter((f) => uses.has(f.id)).length;\n const areas = Object.keys(AUDIT_AREAS).filter((a) => pool.some((f) => f.area === a));\n if (query && pool.length === 0) return null;\n return (\n <RowGroup title={`From the audit — ${pool.length - placed} not placed`}>\n {!query && <SegmentedControl aria-label=\"Where it belongs\" value={home} data={AUDIT_HOMES} onValueChange={setHome} fill />}\n {areas.map((a) => {\n const rows = pool\n .filter((f) => f.area === a)\n .sort((x, y) => Number(uses.has(x.id)) - Number(uses.has(y.id)) || IMPORTANCE_ORDER[x.importance] - IMPORTANCE_ORDER[y.importance]);\n const open = Boolean(query) || openArea === a;\n return (\n <div key={a}>\n <DisclosureHeader open={open} onClick={() => setOpenArea(open ? null : a)} title={AUDIT_AREAS[a] ?? a} meta={String(rows.length)} />\n {open &&\n rows.map((f) => (\n <Option\n key={f.id}\n p={{ type: \"audit\", id: f.id }}\n icon={f.importance === \"core\" ? \"CircleAlert\" : \"CircleDashed\"}\n label={f.label}\n dimmed={uses.has(f.id)}\n end={<Badge>{uses.has(f.id) ? \"used\" : f.importance}</Badge>}\n />\n ))}\n </div>\n );\n })}\n </RowGroup>\n );\n}\n\ninterface StructureProps {\n nodes: MenuNode[];\n selected: string | null;\n onSelect: (id: string | null) => void;\n startDrag: StartDrag;\n click: (fn: () => void) => () => void;\n over: Over | null;\n onRemove: (id: string) => void;\n onDuplicate: (id: string) => void;\n onWrap: (id: string, kind: \"section\" | \"submenu\") => void;\n onUnwrap: (id: string) => void;\n versions: SavedDesignVersion[][] | null;\n currentDesignId: string;\n onOpen: (v: SavedDesignVersion) => void;\n onArchive: (v: SavedDesignVersion) => void;\n onStart: (s: StarterDesign) => void;\n}\n\nfunction Structure(props: StructureProps) {\n const rootOver = props.over !== null && props.over.id === null;\n return (\n <main className=\"flex min-h-0 flex-col overflow-hidden\">\n <div className=\"flex items-center justify-between gap-3 border-b border-border px-3 py-2\">\n <h2 className=\"type-meta shrink-0 uppercase\">Structure</h2>\n <span className=\"type-meta min-w-0 truncate\">Drag to reorder · drop on a section or submenu to nest</span>\n </div>\n <div className=\"min-h-0 flex-1 overflow-y-auto p-2\" onClick={(e) => e.target === e.currentTarget && props.onSelect(null)}>\n <Rows {...props} list={props.nodes} depth={0} />\n <div\n data-drop=\"root\"\n className={`mt-1 flex h-14 items-center justify-center rounded-md border border-dashed text-xs text-muted-foreground ${rootOver ? \"border-primary bg-primary/5\" : \"border-border\"}`}\n >\n {props.nodes.length === 0 ? \"Drag options here to start the menu\" : \"Drop here to add at the end\"}\n </div>\n </div>\n <Versions versions={props.versions} currentDesignId={props.currentDesignId} onOpen={props.onOpen} onArchive={props.onArchive} onStart={props.onStart} />\n </main>\n );\n}\n\nfunction Rows(props: StructureProps & { list: MenuNode[]; depth: number }) {\n const { list, depth, over, selected, onSelect, startDrag, click } = props;\n return (\n <>\n {list.map((node) => {\n const container = isContainer(node);\n const isOver = over?.id === node.id;\n const label =\n node.kind === \"divider\"\n ? \"──── divider ────\"\n : node.kind === \"search\"\n ? `Search box — “${node.placeholder}”`\n : node.label || (node.kind === \"section\" ? \"(unlabelled section)\" : \"(no label)\");\n const icon =\n node.kind === \"item\" || node.kind === \"submenu\"\n ? node.icon\n : node.kind === \"search\"\n ? \"Search\"\n : node.kind === \"slot\"\n ? node.icon ?? slotSource(node.fills)?.icon ?? \"Ellipsis\"\n : node.kind === \"section\"\n ? \"Rows3\"\n : \"Minus\";\n return (\n <div key={node.id}>\n <div\n data-drop={node.id}\n {...(container ? { \"data-container\": \"1\" } : {})}\n onPointerDown={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) return;\n startDrag(e, { type: \"move\", id: node.id }, label);\n }}\n onClick={click(() => onSelect(node.id))}\n style={{ marginLeft: depth * 18 }}\n className={[\n \"group relative flex h-8 cursor-grab touch-none items-center gap-2 rounded-md border px-2 text-sm\",\n selected === node.id ? \"border-primary bg-primary/5\" : \"border-transparent hover:bg-accent\",\n isOver && over?.pos === \"inside\" ? \"ring-2 ring-primary\" : \"\",\n container ? \"font-medium\" : \"\",\n ].join(\" \")}\n >\n {isOver && over?.pos === \"before\" && <span className=\"pointer-events-none absolute inset-x-0 -top-px h-0.5 rounded bg-primary\" />}\n {isOver && over?.pos === \"after\" && <span className=\"pointer-events-none absolute inset-x-0 -bottom-px h-0.5 rounded bg-primary\" />}\n <span className=\"text-muted-foreground\">⋮⋮</span>\n {icon && <span className=\"text-muted-foreground\">{renderLucide(icon, \"size-4\")}</span>}\n <span className={`min-w-0 flex-1 truncate ${node.kind === \"divider\" ? \"text-xs text-muted-foreground\" : \"\"}`}>{label}</span>\n {node.kind === \"submenu\" && <span className=\"text-[10px] text-muted-foreground\">submenu</span>}\n {node.kind === \"slot\" && <Badge>{node.shape === \"submenu\" ? \"placeholder submenu\" : node.shape === \"feature\" ? \"feature section\" : \"placeholder\"}</Badge>}\n {node.unavailableWhen && <Badge>{node.unavailable === \"hide\" ? \"hides\" : node.unavailable === \"required\" ? \"required\" : \"disables\"}</Badge>}\n {node.kind === \"section\" && <span className=\"text-[10px] text-muted-foreground\">{node.layout && node.layout !== \"list\" ? `${node.layout} section` : \"section\"}</span>}\n {node.kind === \"item\" && node.shortcut && <kbd className=\"text-[10px] text-muted-foreground\">{node.shortcut}</kbd>}\n <span className=\"hidden items-center gap-0.5 group-hover:flex\">\n <RowAction title=\"Duplicate\" onClick={() => props.onDuplicate(node.id)} icon=\"CopyPlus\" />\n {container ? (\n <RowAction title=\"Unwrap (keep its options)\" onClick={() => props.onUnwrap(node.id)} icon=\"Ungroup\" />\n ) : (\n <>\n <RowAction title=\"Put in a new section\" onClick={() => props.onWrap(node.id, \"section\")} icon=\"Rows3\" />\n <RowAction title=\"Put in a new submenu\" onClick={() => props.onWrap(node.id, \"submenu\")} icon=\"ChevronsRight\" />\n </>\n )}\n <RowAction title=\"Delete\" onClick={() => props.onRemove(node.id)} icon=\"Trash2\" />\n </span>\n </div>\n {container && (\n <>\n {node.children.length === 0 ? (\n <div style={{ marginLeft: (depth + 1) * 18 }} className=\"my-0.5 rounded-md border border-dashed border-border px-2 py-1 text-[11px] text-muted-foreground\">\n Empty — drop options onto “{node.label || \"section\"}”\n </div>\n ) : (\n <Rows {...props} list={node.children} depth={depth + 1} />\n )}\n </>\n )}\n </div>\n );\n })}\n </>\n );\n}\n\nfunction RowAction({ title, onClick, icon }: { title: string; onClick: () => void; icon: string }) {\n return (\n <Button\n variant=\"quiet\"\n icon={renderLucide(icon)}\n aria-label={title}\n title={title}\n onClick={(e) => {\n e.stopPropagation();\n onClick();\n }}\n />\n );\n}\n\nfunction Versions({\n versions,\n currentDesignId,\n onOpen,\n onArchive,\n onStart,\n}: {\n versions: SavedDesignVersion[][] | null;\n currentDesignId: string;\n onOpen: (v: SavedDesignVersion) => void;\n onArchive: (v: SavedDesignVersion) => void;\n onStart: (s: StarterDesign) => void;\n}) {\n const [openId, setOpenId] = useState<string | null>(null);\n const [startersOpen, setStartersOpen] = useState(false);\n return (\n <div className=\"max-h-[45%] min-h-0 overflow-y-auto border-t border-border p-2\">\n <DisclosureHeader open={startersOpen} onClick={() => setStartersOpen((o) => !o)} title=\"Starting points\" meta={`${STARTER_DESIGNS.length}`} />\n {startersOpen &&\n ([\"Live today\", \"Proposal\"] as const).map((group) => (\n <RowGroup key={group} title={group}>\n {STARTER_DESIGNS.filter((st) => st.group === group).map((st) => (\n <Tile key={st.id} layout=\"row\" variant=\"quiet\" icon={renderLucide(group === \"Live today\" ? \"Radio\" : \"Lightbulb\")} title={st.design.name} line={st.source} onClick={() => { onStart(st); setStartersOpen(false); }} />\n ))}\n </RowGroup>\n ))}\n <RowGroup title=\"Saved designs\">\n {versions === null && <RegionSkeleton shape=\"rows\" />}\n {versions?.length === 0 && <EmptyState icon={renderLucide(\"Save\")} title=\"Nothing saved yet\" line=\"⌘S saves a version\" />}\n {(versions ?? []).map((group) => {\n const latest = group[0] as SavedDesignVersion;\n const expanded = openId === latest.designId;\n return (\n <div key={latest.designId}>\n <DisclosureHeader\n open={expanded}\n onClick={() => setOpenId(expanded ? null : latest.designId)}\n title={latest.name}\n meta={`${group.length} version${group.length === 1 ? \"\" : \"s\"}${latest.designId === currentDesignId ? \" · open\" : \"\"}`}\n />\n {expanded &&\n group.map((v) => (\n <div key={v.rowId} className=\"flex items-center pl-5\">\n <Tile\n className=\"min-w-0 flex-1\"\n layout=\"row\"\n variant=\"quiet\"\n title={`v${v.version}${v.note ? ` — ${v.note}` : \"\"}`}\n line={v.savedAt ? new Date(v.savedAt).toLocaleString() : undefined}\n onClick={() => onOpen(v)}\n />\n <RowAction title=\"Archive this version\" onClick={() => onArchive(v)} icon=\"Archive\" />\n </div>\n ))}\n </div>\n );\n })}\n </RowGroup>\n </div>\n );\n}\n\nconst AVAILABILITY_OPTIONS = [\n { value: \"available\", label: \"All available\" },\n { value: \"unavailable\", label: \"Some unavailable\" },\n] as const;\n\nfunction Stage({ design, selected, onSelect }: { design: MenuDesign; selected: string | null; onSelect: (id: string) => void }) {\n const [at, setAt] = useState<{ x: number; y: number } | null>(null);\n const [availability, setAvailability] = useState<AvailabilityPreview>(\"available\");\n const [picked, setPicked] = useState<string | null>(null);\n const ref = useRef<HTMLDivElement>(null);\n return (\n <Panel\n title=\"Live menu\"\n right={<SegmentedControl aria-label=\"Preview availability\" value={availability} data={AVAILABILITY_OPTIONS} onValueChange={setAvailability} />}\n >\n <div\n ref={ref}\n onContextMenu={(e) => {\n e.preventDefault();\n const r = ref.current?.getBoundingClientRect();\n // Open at the pointer, kept inside the stage the way a real menu flips at a screen edge.\n if (r) setAt({ x: Math.max(8, Math.min(e.clientX - r.left, r.width - design.look.width - 8)), y: Math.max(8, Math.min(e.clientY - r.top, r.height - (ref.current?.querySelector(\".cm-menu\")?.getBoundingClientRect().height ?? 160) - 8)) });\n }}\n onClick={(e) => {\n if (e.target === e.currentTarget) setAt(null);\n }}\n data-menu-bounds=\"\"\n className=\"relative min-h-[300px] overflow-visible rounded-lg bg-muted/60 p-4\"\n >\n {at ? (\n <MenuPreview\n design={design}\n renderIcon={renderLucide}\n highlightId={selected}\n onSelectNode={onSelect}\n onPick={(i) => setPicked(i.label)}\n availability={availability}\n style={{ position: \"absolute\", left: at.x, top: at.y, zIndex: 20 }}\n />\n ) : (\n <MenuPreview design={design} renderIcon={renderLucide} highlightId={selected} onSelectNode={onSelect} onPick={(i) => setPicked(i.label)} availability={availability} />\n )}\n {picked && <div className=\"type-meta absolute right-3 bottom-2\">Picked: {picked} · right-click the grey area to open the menu there</div>}\n {!picked && <div className=\"type-meta absolute right-3 bottom-2\">Right-click the grey area to open the menu there</div>}\n </div>\n </Panel>\n );\n}\n\nconst DENSITY_OPTIONS = [\n { value: \"comfortable\", label: \"Comfortable\" },\n { value: \"compact\", label: \"Compact\" },\n] as const;\n\nfunction Look({ design, onChange }: { design: MenuDesign; onChange: (look: MenuDesign[\"look\"]) => void }) {\n const look = design.look;\n const toggle = (k: \"showIcons\" | \"showShortcuts\" | \"showHints\" | \"search\", label: string) => (\n <SettingRow label={label}>\n <Switch aria-label={label} checked={look[k]} onCheckedChange={(v) => onChange({ ...look, [k]: v })} />\n </SettingRow>\n );\n return (\n <Panel title=\"Look\" right={<Button variant=\"quiet\" onClick={() => onChange({ ...DEFAULT_LOOK })}>Reset</Button>}>\n <SettingRow label=\"Density\">\n <SegmentedControl aria-label=\"Density\" value={look.density} data={DENSITY_OPTIONS} onValueChange={(density) => onChange({ ...look, density })} />\n </SettingRow>\n <SettingRow label=\"Width\">\n <NumberStepper value={look.width} min={180} max={420} step={10} onChange={(width) => onChange({ ...look, width })} />\n </SettingRow>\n {toggle(\"showIcons\", \"Icons\")}\n {toggle(\"showShortcuts\", \"Shortcuts\")}\n {toggle(\"showHints\", \"Hints\")}\n {toggle(\"search\", \"Search box\")}\n </Panel>\n );\n}\n\nconst LAYOUT_OPTIONS = [\n { value: \"list\", label: \"List\" },\n { value: \"row\", label: \"Icon row\" },\n { value: \"grid\", label: \"Icon grid\" },\n] as const;\n\nconst FLAGS = [\n [\"ai\", \"AI\"],\n [\"danger\", \"Destructive\"],\n [\"toggle\", \"Checkbox\"],\n [\"disabled\", \"Disabled\"],\n] as const;\n\nconst ROW_KINDS = [\n { value: \"action\", label: \"Action\" },\n { value: \"checkbox\", label: \"Checkbox\" },\n { value: \"switch\", label: \"Switch\" },\n] as const;\n\nconst TONE_LABELS: Record<MenuTone, string> = {\n default: \"Default\",\n primary: \"Primary\",\n success: \"Success (green)\",\n warning: \"Warning (amber)\",\n info: \"Info (blue)\",\n destructive: \"Destructive (red)\",\n sky: \"Sky\",\n blue: \"Blue\",\n indigo: \"Indigo\",\n violet: \"Violet\",\n fuchsia: \"Fuchsia\",\n rose: \"Rose\",\n orange: \"Orange\",\n amber: \"Amber\",\n lime: \"Lime\",\n emerald: \"Emerald\",\n teal: \"Teal\",\n cyan: \"Cyan\",\n slate: \"Slate\",\n};\nconst TONE_OPTIONS = MENU_TONES.map((value) => ({ value, label: TONE_LABELS[value] }));\n\nconst UNAVAILABLE_OPTIONS = [\n { value: \"disable\", label: \"Disable\" },\n { value: \"hide\", label: \"Hide\" },\n { value: \"required\", label: \"Required\" },\n] as const;\n\nfunction keywordsText(k: string[] | undefined) {\n return (k ?? []).join(\", \");\n}\nfunction keywordsFrom(text: string): string[] {\n return text\n .split(\",\")\n .map((w) => w.trim())\n .filter(Boolean);\n}\n\nfunction Inspector({ node, onChange }: { node: MenuNode; onChange: (patch: Partial<MenuNode>) => void }) {\n const catalog = node.catalogId ? catalogOption(node.catalogId) : undefined;\n const kindName = node.kind === \"slot\" ? (node.shape === \"feature\" ? \"feature section\" : \"placeholder\") : node.kind === \"search\" ? \"search box\" : node.kind;\n // A keyword list is typed as text and kept as the person typed it until they leave the field.\n const [keywordDraft, setKeywordDraft] = useState(keywordsText(node.keywords));\n return (\n <Panel title={`Selected ${kindName}`} right={catalog ? <Badge>{catalog.id}</Badge> : undefined}>\n {node.kind === \"divider\" ? (\n <p className=\"type-secondary\">A divider has no settings.</p>\n ) : node.kind === \"search\" ? (\n <>\n <Labelled label=\"Placeholder text\">\n <Field aria-label=\"Placeholder text\" value={node.placeholder} onChange={(e) => onChange({ placeholder: e.target.value } as Partial<MenuNode>)} />\n </Labelled>\n <SettingRow label=\"Takes focus when the menu opens\">\n <Switch aria-label=\"Takes focus when the menu opens\" checked={node.autofocus} onCheckedChange={(v) => onChange({ autofocus: v } as Partial<MenuNode>)} />\n </SettingRow>\n <p className=\"type-secondary mt-2\">Filters every option in the menu by its label, hint and keywords. What sits above it stays visible while searching.</p>\n </>\n ) : (\n <>\n <Labelled label={node.kind === \"slot\" && node.shape === \"feature\" ? \"Section header\" : \"Label\"}>\n <Field aria-label=\"Label\" value={node.label} onChange={(e) => onChange({ label: e.target.value } as Partial<MenuNode>)} />\n </Labelled>\n {node.kind === \"slot\" && <SlotSettings node={node} onChange={onChange} />}\n {(node.kind === \"item\" || node.kind === \"submenu\") && (\n <>\n <Labelled label=\"Icon\">\n <IconPicker value={node.icon ?? \"\"} onChange={(icon) => onChange({ icon } as Partial<MenuNode>)} />\n </Labelled>\n <Labelled label=\"Colour\">\n <Select aria-label=\"Colour\" value={node.tone ?? \"default\"} options={TONE_OPTIONS} onValueChange={(tone) => onChange({ tone } as Partial<MenuNode>)} />\n </Labelled>\n {node.tone && node.tone !== \"default\" && (\n <SettingRow label=\"Colour the label too\">\n <Switch aria-label=\"Colour the label too\" checked={Boolean(node.toneLabel)} onCheckedChange={(v) => onChange({ toneLabel: v } as Partial<MenuNode>)} />\n </SettingRow>\n )}\n <Labelled label=\"Hint\">\n <Field aria-label=\"Hint\" value={node.hint ?? \"\"} onChange={(e) => onChange({ hint: e.target.value } as Partial<MenuNode>)} />\n </Labelled>\n </>\n )}\n {node.kind === \"item\" && (\n <>\n <Labelled label=\"Shortcut\">\n <Field aria-label=\"Shortcut\" value={node.shortcut ?? \"\"} placeholder=\"⌘K\" onChange={(e) => onChange({ shortcut: e.target.value } as Partial<MenuItemNode>)} />\n </Labelled>\n <SettingRow label=\"Row is\">\n <SegmentedControl\n aria-label=\"Row is\"\n value={node.switch ? \"switch\" : node.toggle ? \"checkbox\" : \"action\"}\n data={ROW_KINDS}\n onValueChange={(k) => onChange({ toggle: k === \"checkbox\", switch: k === \"switch\" } as Partial<MenuItemNode>)}\n />\n </SettingRow>\n {(node.switch || node.toggle) && (\n <SettingRow label=\"On by default\">\n <Switch aria-label=\"On by default\" checked={Boolean(node.defaultOn)} onCheckedChange={(v) => onChange({ defaultOn: v } as Partial<MenuItemNode>)} />\n </SettingRow>\n )}\n {FLAGS.filter(([k]) => k !== \"toggle\").map(([k, label]) => (\n <SettingRow key={k} label={label}>\n <Switch aria-label={label} checked={Boolean(node[k])} onCheckedChange={(v) => onChange({ [k]: v } as Partial<MenuItemNode>)} />\n </SettingRow>\n ))}\n </>\n )}\n {node.kind === \"section\" && (\n <>\n <SettingRow label=\"Layout\">\n <SegmentedControl aria-label=\"Layout\" value={node.layout ?? \"list\"} data={LAYOUT_OPTIONS} onValueChange={(layout) => onChange({ layout } as Partial<MenuNode>)} />\n </SettingRow>\n <SettingRow label=\"Starts folded\">\n <Switch aria-label=\"Starts folded\" checked={Boolean(node.collapsible)} onCheckedChange={(v) => onChange({ collapsible: v } as Partial<MenuNode>)} />\n </SettingRow>\n </>\n )}\n <Labelled label=\"Search keywords (comma-separated)\">\n <Field\n aria-label=\"Search keywords\"\n placeholder=\"e.g. clipboard, duplicate\"\n value={keywordDraft}\n onChange={(e) => setKeywordDraft(e.target.value)}\n onBlur={() => onChange({ keywords: keywordsFrom(keywordDraft) })}\n />\n </Labelled>\n <Labelled label=\"Unavailable when\">\n <Field\n aria-label=\"Unavailable when\"\n placeholder=\"e.g. no editable text · not an org admin\"\n value={node.unavailableWhen ?? \"\"}\n onChange={(e) => onChange({ unavailableWhen: e.target.value })}\n />\n </Labelled>\n {node.unavailableWhen && (\n <SettingRow label=\"Then\">\n <SegmentedControl aria-label=\"When unavailable\" value={node.unavailable ?? \"disable\"} data={UNAVAILABLE_OPTIONS} onValueChange={(unavailable) => onChange({ unavailable })} />\n </SettingRow>\n )}\n </>\n )}\n <Labelled label=\"Note for the build\">\n {/* ui-exception: ProTextarea lives in matrx-frontend; a package playground has only the package Textarea */}\n <Textarea aria-label=\"Note for the build\" rows={2} autoGrow value={node.note ?? \"\"} onChange={(e) => onChange({ note: e.target.value })} />\n </Labelled>\n </Panel>\n );\n}\n\nconst SLOT_SHAPES = [\n { value: \"items\", label: \"Rows here\" },\n { value: \"submenu\", label: \"One submenu\" },\n { value: \"feature\", label: \"Feature section\" },\n] as const;\n\nconst SLOT_OPTIONS = SLOT_SOURCES.map((src) => ({ value: src.id, label: src.label }));\n\n/** A placeholder's settings: what it holds, how, and what the rest of the design leaves for it. */\nfunction SlotSettings({ node, onChange }: { node: Extract<MenuNode, { kind: \"slot\" }>; onChange: (patch: Partial<MenuNode>) => void }) {\n const source = slotSource(node.fills);\n return (\n <>\n <Labelled label=\"Holds\">\n <Select\n aria-label=\"What this placeholder holds\"\n value={node.fills}\n options={SLOT_OPTIONS}\n onValueChange={(fills) => {\n // Keep a hand-written label; replace only the previous source's own wording.\n const relabel = !node.label || node.label === source?.phrase || node.label === \"Everything else\" || node.label === \"More\";\n onChange({ fills, ...(relabel ? { label: slotSource(fills)?.phrase ?? node.label } : {}) } as Partial<MenuNode>);\n }}\n />\n </Labelled>\n <SettingRow label=\"Shows as\">\n <SegmentedControl aria-label=\"Shows as\" value={node.shape} data={SLOT_SHAPES} onValueChange={(shape) => onChange({ shape } as Partial<MenuNode>)} />\n </SettingRow>\n {node.shape === \"feature\" ? (\n <>\n <SettingRow label=\"Rows before “More”\">\n <NumberStepper value={node.featureItems ?? 4} min={0} max={12} onChange={(featureItems) => onChange({ featureItems } as Partial<MenuNode>)} />\n </SettingRow>\n <p className=\"type-secondary mt-2\">Where the place this menu opens on puts its own options: this header, the first rows, then the rest under “More”.</p>\n </>\n ) : (\n <SlotContents fills={node.fills} />\n )}\n </>\n );\n}\n\nfunction SlotContents({ fills }: { fills: string }) {\n const source = slotSource(fills);\n const design = useContext(DesignContext);\n const left = useMemo(() => (design ? slotOptions(fills, placedCatalogIds(design.nodes)) : []), [design, fills]);\n if (source?.runtime) return <p className=\"type-secondary mt-2\">Filled by the live menu at runtime.</p>;\n return (\n <p className=\"type-secondary mt-2\">\n {left.length === 0 ? \"Nothing left — every option of this kind is already placed.\" : `Holds ${left.length}: ${left.slice(0, 6).map((o) => o.label).join(\", \")}${left.length > 6 ? \"…\" : \"\"}`}\n </p>\n );\n}\n\nfunction Labelled({ label, children }: { label: string; children: ReactNode }) {\n return (\n <div className=\"mt-2 grid gap-1\">\n <span className=\"type-meta\">{label}</span>\n {children}\n </div>\n );\n}\n\nfunction IconPicker({ value, onChange }: { value: string; onChange: (v: string) => void }) {\n const [q, setQ] = useState(\"\");\n const [open, setOpen] = useState(false);\n const shown = useMemo(() => {\n const s = q.trim().toLowerCase();\n return (s ? ICON_NAMES.filter((n) => n.toLowerCase().includes(s)) : ICON_NAMES).slice(0, 96);\n }, [q]);\n return (\n <div className=\"relative\">\n <Button\n variant=\"outline\"\n icon={value ? renderLucide(value) : undefined}\n iconEnd={renderLucide(\"ChevronDown\")}\n aria-expanded={open}\n onClick={() => setOpen((o) => !o)}\n >\n {value || \"No icon\"}\n </Button>\n {open && (\n <div className=\"absolute z-30 mt-1 w-full rounded-md border border-border bg-popover p-2 shadow-lg\">\n <SearchField autoFocus aria-label=\"Search icons\" placeholder={`Search ${ICON_NAMES.length} icons`} value={q} onChange={(e) => setQ(e.target.value)} />\n <div className=\"mt-2 grid max-h-56 grid-cols-8 overflow-y-auto\">\n <Button variant=\"quiet\" icon={renderLucide(\"Ban\")} aria-label=\"No icon\" title=\"No icon\" pressed={!value} onClick={() => { onChange(\"\"); setOpen(false); }} />\n {shown.map((n) => (\n <Button\n key={n}\n variant=\"quiet\"\n icon={renderLucide(n)}\n aria-label={n}\n title={n}\n pressed={n === value}\n onClick={() => {\n onChange(n);\n setOpen(false);\n }}\n />\n ))}\n </div>\n </div>\n )}\n </div>\n );\n}\n","// src/design/catalog.ts — @ai-matrx/context-menu: EVERY OPTION A MENU CAN OFFER, as a palette.\n//\n// The builder's left column. Each entry is something the live menu shows somewhere today, taken\n// from the real menu's own lists in matrx-frontend (features/context-menu-v3):\n// - regroup/engine-rows.ts → the engine rows (`cm:*`)\n// - regroup/proposed-grouping.ts → the 13 \"grouped by what you get\" groups and their rules\n// - proposed/proposed-arrangement.ts → the three icon strips and the object-first submenus\n// - the page rows the demos show (notes, quiz row, table row, chat message)\n// Ids are the live menu's ids wherever one exists, so a saved design names the real row.\n// When the menu source moves into this package, this list is generated from it instead.\n\nimport type { MenuNode } from \"./model\";\n\nexport type CatalogGroup =\n | \"Clipboard\"\n | \"Edit\"\n | \"AI\"\n | \"Save & export\"\n | \"Share & publish\"\n | \"Organize\"\n | \"History & compare\"\n | \"Listen\"\n | \"Page: notes\"\n | \"Page: record\"\n | \"Page: chat message\"\n | \"Tools & admin\";\n\nexport interface CatalogOption {\n /** The live menu's id where one exists (`cm:copy`), else this catalog's own. */\n id: string;\n label: string;\n icon: string;\n group: CatalogGroup;\n shortcut?: string;\n hint?: string;\n danger?: boolean;\n ai?: boolean;\n /** \"Live\" = drawn by today's menu; \"Proposed\" = only in a proposal page so far. */\n status: \"live\" | \"proposed\";\n}\n\nconst o = (\n id: string,\n label: string,\n icon: string,\n group: CatalogGroup,\n extra: Partial<Omit<CatalogOption, \"id\" | \"label\" | \"icon\" | \"group\">> = {},\n): CatalogOption => ({ id, label, icon, group, status: \"live\", ...extra });\n\nexport const CATALOG: readonly CatalogOption[] = [\n // Clipboard — the verb strip\n o(\"cm:copy\", \"Copy\", \"Copy\", \"Clipboard\", { shortcut: \"⌘C\" }),\n o(\"cm:cut\", \"Cut\", \"Scissors\", \"Clipboard\", { shortcut: \"⌘X\" }),\n o(\"cm:paste\", \"Paste\", \"ClipboardPaste\", \"Clipboard\", { shortcut: \"⌘V\" }),\n o(\"cm:undo\", \"Undo\", \"Undo2\", \"Clipboard\", { shortcut: \"⌘Z\" }),\n o(\"cm:redo\", \"Redo\", \"Redo2\", \"Clipboard\", { shortcut: \"⇧⌘Z\" }),\n o(\"cm:find\", \"Find & Replace\", \"Search\", \"Clipboard\", { shortcut: \"⌘F\" }),\n o(\"cm:select-all\", \"Select All\", \"TextSelect\", \"Clipboard\", { shortcut: \"⌘A\" }),\n o(\"cm:copy-as\", \"Copy as…\", \"CopyPlus\", \"Clipboard\"),\n o(\"cm:json\", \"Copy as JSON\", \"Braces\", \"Clipboard\"),\n o(\"copy-html-page\", \"Copy as HTML page\", \"FileCode\", \"Clipboard\"),\n o(\"cm:insert-reference\", \"Insert / Copy reference…\", \"AtSign\", \"Clipboard\"),\n\n // Edit\n o(\"cm:save\", \"Save\", \"Save\", \"Edit\", { shortcut: \"⌘S\" }),\n o(\"duplicate\", \"Duplicate\", \"CopyPlus\", \"Edit\"),\n o(\"rename\", \"Rename\", \"PenLine\", \"Edit\"),\n o(\"edit\", \"Edit\", \"Pencil\", \"Edit\"),\n o(\"favorite\", \"Add to favorites\", \"Star\", \"Edit\"),\n o(\"archive\", \"Archive\", \"Archive\", \"Edit\", { danger: true }),\n o(\"cm:delete\", \"Delete\", \"Trash2\", \"Edit\", { danger: true }),\n\n // AI\n o(\"cm:chat\", \"Chat about this\", \"MessageSquare\", \"AI\", { ai: true }),\n o(\"cm:quick-actions\", \"Quick Actions\", \"Zap\", \"AI\", { ai: true }),\n o(\"cm:placement:ai-action\", \"AI Actions\", \"Sparkles\", \"AI\", { ai: true }),\n o(\"cm:placement:content-block\", \"Content blocks\", \"Blocks\", \"AI\", { ai: true }),\n o(\"cm:placement:organization-tool\", \"Org Items\", \"Building2\", \"AI\", { ai: true }),\n o(\"cm:placement:user-tool\", \"My Items\", \"User\", \"AI\", { ai: true }),\n o(\"cm:placement:quick-action\", \"Quick actions (placement)\", \"Zap\", \"AI\", { ai: true }),\n o(\"cm:placement:bound-agent\", \"Agents\", \"Bot\", \"AI\", { ai: true }),\n o(\"send-to-agent\", \"Send to agent…\", \"Send\", \"AI\", { ai: true }),\n o(\"continue-in-chat\", \"Continue in chat\", \"MessagesSquare\", \"AI\", { ai: true }),\n o(\"regenerate-response\", \"Regenerate\", \"RefreshCw\", \"AI\", { ai: true }),\n o(\"code-block-chart\", \"Make a chart\", \"ChartColumn\", \"AI\", { ai: true }),\n o(\"ai-improve\", \"Improve writing\", \"Wand2\", \"AI\", { ai: true, status: \"proposed\" }),\n o(\"ai-summarize\", \"Summarize\", \"ListCollapse\", \"AI\", { ai: true, status: \"proposed\" }),\n o(\"ai-explain\", \"Explain\", \"Lightbulb\", \"AI\", { ai: true, status: \"proposed\" }),\n o(\"ai-translate\", \"Translate…\", \"Languages\", \"AI\", { ai: true, status: \"proposed\" }),\n\n // Save & export\n o(\"cm:export\", \"Export\", \"FileOutput\", \"Save & export\"),\n o(\"cm:convert\", \"Convert to…\", \"ArrowRightLeft\", \"Save & export\"),\n o(\"save-as-file\", \"Save as file\", \"FileDown\", \"Save & export\"),\n o(\"download-pdf\", \"Download PDF\", \"FileText\", \"Save & export\"),\n o(\"download-docx\", \"Download Word\", \"FileType\", \"Save & export\"),\n o(\"download-html\", \"Download HTML\", \"FileCode2\", \"Save & export\"),\n o(\"print\", \"Print\", \"Printer\", \"Save & export\", { shortcut: \"⌘P\" }),\n\n // Share & publish\n o(\"cm:share\", \"Share…\", \"Share2\", \"Share & publish\"),\n o(\"share-link\", \"Copy share link\", \"Link\", \"Share & publish\"),\n o(\"send-google-doc\", \"Send to Google Docs\", \"FileUp\", \"Share & publish\"),\n o(\"email-to-me\", \"Email to me\", \"Mail\", \"Share & publish\"),\n o(\"html-preview\", \"Preview as web page\", \"Eye\", \"Share & publish\"),\n o(\"share-webpage\", \"Publish as web page\", \"Globe\", \"Share & publish\"),\n\n // Organize\n o(\"cm:attach\", \"Attach to…\", \"Paperclip\", \"Organize\"),\n o(\"set-context-value\", \"Set as context\", \"Pin\", \"Organize\"),\n o(\"pin-message\", \"Pin\", \"Pin\", \"Organize\"),\n o(\"notes-and-comments\", \"Notes & comments\", \"StickyNote\", \"Organize\"),\n o(\"move\", \"Move to folder…\", \"FolderInput\", \"Organize\"),\n o(\"tags\", \"Tags…\", \"Tags\", \"Organize\"),\n\n // History & compare\n o(\"cm:view-history\", \"View history\", \"History\", \"History & compare\"),\n o(\"edit-history\", \"Edit history\", \"GitCommitVertical\", \"History & compare\"),\n o(\"fork-at-message\", \"Fork from here\", \"GitBranch\", \"History & compare\"),\n o(\"cm:compare\", \"Compare…\", \"GitCompareArrows\", \"History & compare\"),\n o(\"compare-with-clipboard\", \"Compare with clipboard\", \"ClipboardList\", \"History & compare\"),\n o(\"set-compare-base\", \"Set as compare base\", \"Flag\", \"History & compare\"),\n\n // Listen\n o(\"cm:speak\", \"Read aloud\", \"Volume2\", \"Listen\"),\n o(\"cm:listen\", \"Dictate\", \"Mic\", \"Listen\"),\n o(\"tts-voice-settings\", \"Voice settings\", \"AudioLines\", \"Listen\"),\n\n // Page rows: notes\n o(\"notes:close-tab\", \"Close tab\", \"X\", \"Page: notes\"),\n o(\"notes:close-others\", \"Close other tabs\", \"PanelTopClose\", \"Page: notes\"),\n o(\"notes:export-md\", \"Export as Markdown\", \"FileDown\", \"Page: notes\"),\n o(\"notes:share-clipboard\", \"Copy to clipboard\", \"ClipboardCopy\", \"Page: notes\"),\n o(\"notes:convert-artifacts\", \"Convert to artifacts\", \"Shapes\", \"Page: notes\"),\n o(\"notes:trash\", \"Move to Trash\", \"Trash2\", \"Page: notes\", { danger: true }),\n\n // Page rows: a record (quiz row, table row)\n o(\"row:open\", \"Open\", \"SquareArrowOutUpRight\", \"Page: record\"),\n o(\"row:open-tab\", \"Open in new tab\", \"ExternalLink\", \"Page: record\"),\n o(\"row:take\", \"Take\", \"Play\", \"Page: record\"),\n o(\"row:results\", \"Results\", \"ChartBar\", \"Page: record\"),\n o(\"row:manage\", \"Manage\", \"Settings2\", \"Page: record\"),\n o(\"row:restore\", \"Restore\", \"ArchiveRestore\", \"Page: record\"),\n\n // Page rows: chat message\n o(\"regenerate-latest\", \"Regenerate latest\", \"RotateCcw\", \"Page: chat message\", { ai: true }),\n o(\"fork-and-regenerate\", \"Fork and regenerate\", \"GitFork\", \"Page: chat message\", { ai: true }),\n o(\"feedback-up\", \"Good response\", \"ThumbsUp\", \"Page: chat message\"),\n o(\"feedback-down\", \"Bad response\", \"ThumbsDown\", \"Page: chat message\"),\n\n // Tools & admin\n o(\"cm:x:surface\", \"This page (location, context, agents)\", \"MapPin\", \"Tools & admin\"),\n o(\"cm:admin\", \"Admin tools\", \"Shield\", \"Tools & admin\"),\n o(\"feedback\", \"Send feedback\", \"MessageSquareWarning\", \"Tools & admin\"),\n o(\"keyboard-shortcuts\", \"Keyboard shortcuts\", \"Keyboard\", \"Tools & admin\", { status: \"proposed\" }),\n];\n\nexport const CATALOG_GROUPS: readonly CatalogGroup[] = [...new Set(CATALOG.map((c) => c.group))];\n\nexport function catalogOption(id: string): CatalogOption | undefined {\n return CATALOG.find((c) => c.id === id);\n}\n\n/** Ready-made pieces: dropping one inserts the whole block. */\nexport interface CatalogTemplate {\n id: string;\n label: string;\n icon: string;\n build: () => MenuNode;\n}\n\nlet seq = 0;\nconst tid = (p: string) => `${p}_t${Date.now().toString(36)}${(seq++).toString(36)}`;\n\nfunction itemFrom(id: string): MenuNode {\n const c = catalogOption(id);\n return {\n id: tid(\"i\"),\n kind: \"item\",\n catalogId: id,\n label: c?.label ?? id,\n icon: c?.icon ?? \"Circle\",\n ...(c?.shortcut ? { shortcut: c.shortcut } : {}),\n ...(c?.danger ? { danger: true } : {}),\n ...(c?.ai ? { ai: true } : {}),\n };\n}\n\nconst strip = (label: string, ids: string[]): MenuNode => ({\n id: tid(\"s\"),\n kind: \"section\",\n label,\n layout: \"row\",\n children: ids.map(itemFrom),\n});\n\nconst sub = (label: string, icon: string, ids: string[]): MenuNode => ({\n id: tid(\"m\"),\n kind: \"submenu\",\n label,\n icon,\n children: ids.map(itemFrom),\n});\n\nexport const TEMPLATES: readonly CatalogTemplate[] = [\n { id: \"strip-thing\", label: \"Icon strip — a thing\", icon: \"Rows2\", build: () => strip(\"\", [\"cm:copy\", \"cm:share\", \"duplicate\", \"favorite\", \"save-as-file\", \"archive\"]) },\n { id: \"strip-edit\", label: \"Icon strip — editable text\", icon: \"Rows2\", build: () => strip(\"\", [\"cm:cut\", \"cm:copy\", \"cm:paste\", \"cm:undo\", \"cm:redo\", \"cm:find\"]) },\n { id: \"strip-read\", label: \"Icon strip — read-only text\", icon: \"Rows2\", build: () => strip(\"\", [\"cm:copy\", \"cm:speak\", \"cm:find\", \"cm:share\"]) },\n { id: \"sub-intelligence\", label: \"Intelligence ▸\", icon: \"Sparkles\", build: () => sub(\"Intelligence\", \"Sparkles\", [\"cm:chat\", \"cm:placement:ai-action\", \"cm:placement:bound-agent\", \"send-to-agent\"]) },\n { id: \"sub-save-share\", label: \"Save & share ▸\", icon: \"Share2\", build: () => sub(\"Save & share\", \"Share2\", [\"cm:copy-as\", \"save-as-file\", \"cm:convert\", \"share-webpage\", \"cm:share\"]) },\n { id: \"sub-organize\", label: \"Organize ▸\", icon: \"Tags\", build: () => sub(\"Organize\", \"Tags\", [\"cm:attach\", \"pin-message\", \"cm:view-history\", \"cm:compare\"]) },\n { id: \"sub-tools\", label: \"Tools ▸\", icon: \"Wrench\", build: () => sub(\"Tools\", \"Wrench\", [\"cm:speak\", \"cm:quick-actions\", \"feedback\", \"cm:x:surface\", \"cm:admin\"]) },\n];\n\n// ── placeholders ─────────────────────────────────────────────────────────────\n\n/** What a placeholder can hold. A catalog group holds that group's options the design has not placed. */\nexport interface SlotSource {\n id: string;\n label: string;\n /** The default placeholder wording (\"All other AI items\"). */\n phrase: string;\n icon: string;\n /** Filled by the live menu from data (agents, a page's own rows) — the preview cannot list them. */\n runtime?: boolean;\n}\n\nexport const SLOT_SOURCES: readonly SlotSource[] = [\n { id: \"any\", label: \"Everything not placed\", phrase: \"Everything else\", icon: \"Ellipsis\" },\n { id: \"agents\", label: \"Agents & shortcuts (library)\", phrase: \"All other agents\", icon: \"Bot\", runtime: true },\n { id: \"page-rows\", label: \"This page's own rows\", phrase: \"All of this page's actions\", icon: \"PanelTop\", runtime: true },\n ...CATALOG_GROUPS.map((g) => ({\n id: `group:${g}`,\n label: g,\n phrase: g === \"AI\" ? \"All other AI items\" : `All other ${g.toLowerCase()} options`,\n icon: CATALOG.find((c) => c.group === g)?.icon ?? \"Circle\",\n })),\n];\n\nexport function slotSource(id: string): SlotSource | undefined {\n return SLOT_SOURCES.find((s) => s.id === id);\n}\n\n/** The catalog options a placeholder stands for: its kind, minus every option the design already places. */\nexport function slotOptions(fills: string, placed: ReadonlySet<string>): CatalogOption[] {\n if (fills === \"agents\" || fills === \"page-rows\") return [];\n const pool = fills === \"any\" ? CATALOG : CATALOG.filter((c) => `group:${c.group}` === fills);\n return pool.filter((c) => !placed.has(c.id));\n}\n","// src/design/MenuPreview.tsx — @ai-matrx/context-menu: DRAWS A DESIGN AS THE MENU IT DESCRIBES.\n//\n// The same component draws the builder's live preview and the right-click test menu, so what the\n// designer sees is what opens. Icons come from the host (`renderIcon`), so this file has no icon set.\n// This file IS the menu component: its rows are the menu's own rows (hence the ui-exception marks).\n\nimport { useEffect, useMemo, useRef, useState, type CSSProperties, type ReactNode } from \"react\";\nimport { slotOptions, slotSource } from \"./catalog\";\nimport {\n isContainer,\n placedCatalogIds,\n type MenuDesign,\n type MenuItemNode,\n type MenuNode,\n type MenuSearchNode,\n type MenuSlotNode,\n type MenuSubmenuNode,\n type MenuTone,\n} from \"./model\";\n\n/** Preview what the person sees when some entries are unavailable (each by its own rule). */\nexport type AvailabilityPreview = \"available\" | \"unavailable\";\n\nexport interface MenuPreviewProps {\n design: MenuDesign;\n renderIcon: (name: string, className?: string) => ReactNode;\n /** The entry highlighted as \"selected in the builder\". */\n highlightId?: string | null;\n /** A click on any entry. */\n onSelectNode?: (id: string) => void;\n /** A click on an item (the menu's action). */\n onPick?: (item: MenuItemNode) => void;\n /** \"unavailable\": every entry with an unavailable rule shows as that rule says. Default \"available\". */\n availability?: AvailabilityPreview;\n className?: string;\n style?: CSSProperties;\n}\n\ninterface Ctx {\n design: MenuDesign;\n renderIcon: MenuPreviewProps[\"renderIcon\"];\n highlightId: string | null | undefined;\n onSelectNode: MenuPreviewProps[\"onSelectNode\"];\n onPick: MenuPreviewProps[\"onPick\"];\n /** Catalog options the design places — a placeholder holds the rest. */\n placed: ReadonlySet<string>;\n availability: AvailabilityPreview;\n query: string;\n setQuery: (q: string) => void;\n}\n\n// ── search ───────────────────────────────────────────────────────────────────\n\n/** The words an entry answers to: its label, its hint and its keywords. */\nfunction searchable(node: MenuNode): string {\n if (node.kind === \"divider\" || node.kind === \"search\") return \"\";\n const hint = node.kind === \"item\" || node.kind === \"submenu\" ? node.hint ?? \"\" : \"\";\n return [node.label, hint, ...(node.keywords ?? [])].join(\" \").toLowerCase();\n}\n\nexport interface Hit {\n node: MenuItemNode;\n /** Where it lives (\"Intelligence › AI Actions\"). */\n path: string;\n}\n\n/** While searching: every matching item, wherever it sits, with the submenus it is inside. */\nexport function searchMenu(nodes: readonly MenuNode[], q: string, trail: string[] = [], out: Hit[] = []): Hit[] {\n const words = q.split(/\\s+/).filter(Boolean);\n for (const n of nodes) {\n if (n.kind === \"item\") {\n const text = `${searchable(n)} ${trail.join(\" \").toLowerCase()}`;\n if (words.every((w) => text.includes(w))) out.push({ node: n, path: trail.join(\" › \") });\n } else if (isContainer(n)) {\n searchMenu(n.children, q, n.kind === \"submenu\" ? [...trail, n.label] : n.label ? [...trail, n.label] : trail, out);\n }\n }\n return out;\n}\n\n// ── the menu ─────────────────────────────────────────────────────────────────\n\nexport function MenuPreview({ design, renderIcon, highlightId, onSelectNode, onPick, availability = \"available\", className, style }: MenuPreviewProps) {\n const [query, setQuery] = useState(\"\");\n const q = query.trim().toLowerCase();\n const { look } = design;\n const placed = useMemo(() => placedCatalogIds(design.nodes), [design.nodes]);\n const ctx: Ctx = { design, renderIcon, highlightId, onSelectNode, onPick, placed, availability, query, setQuery };\n const searchAt = design.nodes.findIndex((n) => n.kind === \"search\");\n // The old \"search box at the top\" look switch still works when the design places no search box.\n const topSearch: MenuSearchNode | null =\n searchAt < 0 && look.search ? { id: \"look-search\", kind: \"search\", placeholder: \"Type to filter…\", autofocus: true } : null;\n const hits = useMemo(() => (q ? searchMenu(design.nodes, q) : null), [design.nodes, q]);\n\n // While searching: what sits above the search box stays (the icon strip), the rest becomes results.\n const above = searchAt >= 0 ? design.nodes.slice(0, searchAt) : [];\n return (\n <div role=\"menu\" data-density={look.density} className={`cm-menu ${className ?? \"\"}`} style={{ width: look.width, ...style }}>\n {topSearch && <SearchBox node={topSearch} ctx={ctx} />}\n {design.nodes.length === 0 && !topSearch ? (\n <div className=\"cm-empty\">Empty menu — drag options in</div>\n ) : hits ? (\n <>\n <Nodes nodes={above} ctx={ctx} />\n {searchAt >= 0 && <SearchBox node={design.nodes[searchAt] as MenuSearchNode} ctx={ctx} />}\n {hits.length === 0 ? (\n <div className=\"cm-empty\">No matches</div>\n ) : (\n hits.map((h) => <Item key={h.node.id} node={h.node} ctx={ctx} path={h.path} />)\n )}\n </>\n ) : (\n <Nodes nodes={design.nodes} ctx={ctx} />\n )}\n </div>\n );\n}\n\nfunction SearchBox({ node, ctx }: { node: MenuSearchNode; ctx: Ctx }) {\n const ref = useRef<HTMLInputElement>(null);\n useEffect(() => {\n if (node.autofocus) ref.current?.focus({ preventScroll: true });\n }, [node.autofocus]);\n return (\n <div className={`cm-search ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`} onClick={() => ctx.onSelectNode?.(node.id)}>\n {ctx.renderIcon(\"Search\", \"cm-icon\")}\n {/* ui-exception: the menu's own filter row — this file IS the menu component */}\n <input\n ref={ref}\n value={ctx.query}\n onChange={(e) => ctx.setQuery(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === \"Escape\" && ctx.query) {\n e.stopPropagation();\n ctx.setQuery(\"\");\n }\n }}\n placeholder={node.placeholder || \"Type to filter…\"}\n aria-label=\"Filter menu\"\n />\n </div>\n );\n}\n\n/** Whether an entry shows, and whether it is greyed, under the availability being previewed. */\nfunction shown(node: MenuNode, ctx: Ctx): { hidden: boolean; greyed: boolean } {\n if (ctx.availability === \"available\" || !node.unavailableWhen) {\n return { hidden: false, greyed: node.kind === \"item\" && Boolean(node.disabled) };\n }\n const mode = node.unavailable ?? \"disable\";\n if (mode === \"hide\") return { hidden: true, greyed: false };\n if (mode === \"required\") return { hidden: false, greyed: false };\n return { hidden: false, greyed: true };\n}\n\nfunction Nodes({ nodes, ctx }: { nodes: readonly MenuNode[]; ctx: Ctx }) {\n return (\n <>\n {nodes.map((n) => {\n if (shown(n, ctx).hidden) return null;\n if (n.kind === \"divider\") return <div key={n.id} role=\"separator\" className=\"cm-divider\" />;\n if (n.kind === \"item\") return <Item key={n.id} node={n} ctx={ctx} />;\n if (n.kind === \"submenu\") return <Submenu key={n.id} node={n} ctx={ctx} />;\n if (n.kind === \"slot\") return n.shape === \"feature\" ? <FeatureSlot key={n.id} node={n} ctx={ctx} /> : <Slot key={n.id} node={n} ctx={ctx} />;\n if (n.kind === \"search\") return <SearchBox key={n.id} node={n} ctx={ctx} />;\n return <Section key={n.id} node={n} ctx={ctx} />;\n })}\n </>\n );\n}\n\nfunction toneAttrs(tone: MenuTone | undefined, toneLabel: boolean | undefined) {\n return tone && tone !== \"default\" ? { \"data-tone\": tone, ...(toneLabel ? { \"data-tone-label\": \"\" } : {}) } : {};\n}\n\nfunction Section({ node, ctx }: { node: Extract<MenuNode, { kind: \"section\" }>; ctx: Ctx }) {\n const [open, setOpen] = useState(!node.collapsible);\n const layout = node.layout ?? \"list\";\n return (\n <div className={`cm-section ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`} data-layout={layout}>\n {node.label && (\n // ui-exception: a menu row of the menu component itself\n <button\n type=\"button\"\n className=\"cm-section-label\"\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n if (node.collapsible) setOpen((o) => !o);\n }}\n >\n {node.label}\n {node.collapsible && <span className=\"cm-caret\">{open ? \"▾\" : \"▸\"}</span>}\n </button>\n )}\n {open && (\n <div className=\"cm-section-body\">\n {layout === \"list\" ? (\n <Nodes nodes={node.children} ctx={ctx} />\n ) : (\n node.children.map((c) =>\n shown(c, ctx).hidden ? null : c.kind === \"item\" ? <Tile key={c.id} node={c} ctx={ctx} /> : <Nodes key={c.id} nodes={[c]} ctx={ctx} />,\n )\n )}\n </div>\n )}\n </div>\n );\n}\n\nfunction Tile({ node, ctx }: { node: MenuItemNode; ctx: Ctx }) {\n const { greyed } = shown(node, ctx);\n return (\n // ui-exception: a menu row of the menu component itself\n <button\n type=\"button\"\n role=\"menuitem\"\n title={node.label + (node.shortcut ? ` ${node.shortcut}` : \"\")}\n disabled={greyed}\n {...toneAttrs(node.tone, node.toneLabel)}\n className={`cm-tile ${node.danger ? \"cm-danger\" : \"\"} ${node.ai ? \"cm-ai\" : \"\"} ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`}\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n ctx.onPick?.(node);\n }}\n >\n {ctx.renderIcon(node.icon ?? \"Circle\", \"cm-icon\")}\n </button>\n );\n}\n\nfunction Item({ node, ctx, path }: { node: MenuItemNode; ctx: Ctx; path?: string }) {\n const { look } = ctx.design;\n const [checked, setChecked] = useState(Boolean(node.defaultOn));\n // A changed default shows at once (the designer flips \"On by default\" while looking at the row).\n useEffect(() => setChecked(Boolean(node.defaultOn)), [node.defaultOn]);\n const { greyed } = shown(node, ctx);\n const settable = node.toggle || node.switch;\n const hint = path || (look.showHints ? node.hint : undefined);\n return (\n // ui-exception: a menu row of the menu component itself\n <button\n type=\"button\"\n role={settable ? \"menuitemcheckbox\" : \"menuitem\"}\n aria-checked={settable ? checked : undefined}\n disabled={greyed}\n {...toneAttrs(node.tone, node.toneLabel)}\n className={`cm-item ${node.danger ? \"cm-danger\" : \"\"} ${node.ai ? \"cm-ai\" : \"\"} ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`}\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n if (settable) setChecked((c) => !c);\n ctx.onPick?.(node);\n }}\n >\n {look.showIcons && (\n <span className=\"cm-icon-slot\">\n {node.toggle ? (checked ? ctx.renderIcon(\"Check\", \"cm-icon\") : null) : node.icon ? ctx.renderIcon(node.icon, \"cm-icon\") : null}\n </span>\n )}\n <span className=\"cm-text\">\n <span className=\"cm-label\">{node.label}</span>\n {hint && <span className=\"cm-hint\">{hint}</span>}\n </span>\n {look.showShortcuts && node.shortcut && !node.switch && <kbd className=\"cm-shortcut\">{node.shortcut}</kbd>}\n {node.switch && <span className=\"cm-switch\" data-on={checked ? \"\" : undefined} aria-hidden=\"true\" />}\n </button>\n );\n}\n\nfunction Submenu({ node, ctx }: { node: MenuSubmenuNode; ctx: Ctx }) {\n const { look } = ctx.design;\n const [open, setOpen] = useState(false);\n const [side, setSide] = useState<FlyoutSide>(\"right\");\n const { greyed } = shown(node, ctx);\n return (\n <div\n className=\"cm-sub\"\n onMouseEnter={(e) => {\n if (greyed) return;\n setSide(flyoutSide(e.currentTarget, look.width));\n setOpen(true);\n }}\n onMouseLeave={() => setOpen(false)}\n >\n {/* ui-exception: a menu row of the menu component itself */}\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n disabled={greyed}\n {...toneAttrs(node.tone, node.toneLabel)}\n className={`cm-item ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`}\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n setOpen(true);\n }}\n >\n {look.showIcons && <span className=\"cm-icon-slot\">{node.icon ? ctx.renderIcon(node.icon, \"cm-icon\") : null}</span>}\n <span className=\"cm-text\">\n <span className=\"cm-label\">{node.label}</span>\n {look.showHints && node.hint && <span className=\"cm-hint\">{node.hint}</span>}\n </span>\n {ctx.renderIcon(\"ChevronRight\", \"cm-icon cm-chev\")}\n </button>\n {open && (\n <div role=\"menu\" className=\"cm-menu cm-flyout\" data-side={side} data-density={look.density} style={{ width: look.width }}>\n {node.children.length === 0 ? <div className=\"cm-empty\">Empty submenu</div> : <Nodes nodes={node.children} ctx={ctx} />}\n </div>\n )}\n </div>\n );\n}\n\ntype FlyoutSide = \"right\" | \"left\" | \"below\";\n\n/**\n * Where a submenu opens: right when it fits, else left, else just under its row (a narrow panel).\n * \"Fits\" is measured against the nearest `[data-menu-bounds]` box (a panel that clips), else the window.\n */\nfunction flyoutSide(row: HTMLElement, width: number): FlyoutSide {\n const r = row.getBoundingClientRect();\n const bounds = row.closest<HTMLElement>(\"[data-menu-bounds]\")?.getBoundingClientRect() ?? { left: 0, right: window.innerWidth };\n if (r.right + width + 8 <= bounds.right) return \"right\";\n if (r.left - width - 8 >= bounds.left) return \"left\";\n return \"below\";\n}\n\n/** A dashed placeholder row (never a real option). */\nfunction SlotRow({ node, ctx, label, icon, count, more, onOpen }: { node: MenuSlotNode; ctx: Ctx; label: string; icon: string; count?: string; more?: boolean; onOpen?: () => void }) {\n const { look } = ctx.design;\n const source = slotSource(node.fills);\n return (\n // ui-exception: a menu row of the menu component itself\n <button\n type=\"button\"\n role=\"menuitem\"\n aria-haspopup={more ? \"menu\" : undefined}\n title={source ? `Placeholder: ${source.label}` : \"Placeholder\"}\n className={`cm-item cm-slot ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`}\n onClick={() => {\n ctx.onSelectNode?.(node.id);\n onOpen?.();\n }}\n >\n {look.showIcons && <span className=\"cm-icon-slot\">{ctx.renderIcon(icon, \"cm-icon\")}</span>}\n <span className=\"cm-text\">\n <span className=\"cm-label\">{label}</span>\n </span>\n {count && <span className=\"cm-count\">{count}</span>}\n {more && ctx.renderIcon(\"ChevronRight\", \"cm-icon cm-chev\")}\n </button>\n );\n}\n\n/** A placeholder: a dashed row naming where the rest go; as a submenu it opens onto them. */\nfunction Slot({ node, ctx }: { node: MenuSlotNode; ctx: Ctx }) {\n const { look } = ctx.design;\n const source = slotSource(node.fills);\n const options = slotOptions(node.fills, ctx.placed);\n const [open, setOpen] = useState(false);\n const [side, setSide] = useState<FlyoutSide>(\"right\");\n const icon = node.icon ?? source?.icon ?? \"Ellipsis\";\n const count = source?.runtime ? \"live\" : String(options.length);\n if (node.shape === \"items\") return <SlotRow node={node} ctx={ctx} label={node.label} icon={icon} count={count} />;\n return (\n <div\n className=\"cm-sub\"\n onMouseEnter={(e) => {\n setSide(flyoutSide(e.currentTarget, look.width));\n setOpen(true);\n }}\n onMouseLeave={() => setOpen(false)}\n >\n <SlotRow node={node} ctx={ctx} label={node.label} icon={icon} count={count} more onOpen={() => setOpen(true)} />\n {open && (\n <div role=\"menu\" className=\"cm-menu cm-flyout\" data-side={side} data-density={look.density} style={{ width: look.width }}>\n {source?.runtime ? (\n <div className=\"cm-runtime\">Filled at runtime: {source.label}</div>\n ) : options.length === 0 ? (\n <div className=\"cm-empty\">Nothing left — every option of this kind is placed</div>\n ) : (\n options.map((o) => (\n <Item\n key={o.id}\n node={{ id: `slot-${node.id}-${o.id}`, kind: \"item\", label: o.label, icon: o.icon, catalogId: o.id, ...(o.shortcut ? { shortcut: o.shortcut } : {}), ...(o.ai ? { ai: true } : {}), ...(o.danger ? { danger: true } : {}) }}\n ctx={ctx}\n />\n ))\n )}\n </div>\n )}\n </div>\n );\n}\n\n/**\n * THE FEATURE SECTION placeholder: where the place the menu opens on puts its own options — a section\n * header (the placeholder's label), its first N options as rows, the rest in a nested \"More\" submenu.\n */\nfunction FeatureSlot({ node, ctx }: { node: MenuSlotNode; ctx: Ctx }) {\n const { look } = ctx.design;\n const n = Math.max(0, Math.min(12, node.featureItems ?? 4));\n const [open, setOpen] = useState(false);\n const [side, setSide] = useState<FlyoutSide>(\"right\");\n return (\n <div className={`cm-section ${ctx.highlightId === node.id ? \"cm-hl\" : \"\"}`} data-layout=\"list\">\n {/* ui-exception: a menu row of the menu component itself */}\n <button type=\"button\" className=\"cm-section-label cm-slot-label\" onClick={() => ctx.onSelectNode?.(node.id)}>\n {node.label || \"This feature\"}\n </button>\n <div className=\"cm-section-body\">\n {Array.from({ length: n }, (_, i) => (\n <SlotRow key={i} node={node} ctx={ctx} label={`Feature option ${i + 1}`} icon=\"Circle\" />\n ))}\n <div\n className=\"cm-sub\"\n onMouseEnter={(e) => {\n setSide(flyoutSide(e.currentTarget, look.width));\n setOpen(true);\n }}\n onMouseLeave={() => setOpen(false)}\n >\n <SlotRow node={node} ctx={ctx} label=\"More\" icon=\"Ellipsis\" more onOpen={() => setOpen(true)} />\n {open && (\n <div role=\"menu\" className=\"cm-menu cm-flyout\" data-side={side} data-density={look.density} style={{ width: look.width }}>\n <div className=\"cm-runtime\">The rest of this feature's options, filled at runtime</div>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","// src/design/model.ts — @ai-matrx/context-menu: THE MENU DESIGN.\n//\n// A design is the whole menu a person drew in the builder: an ordered tree of items, sections,\n// submenus and dividers, plus the few presentation choices that change how it reads. It is plain\n// JSON (no functions, no React) so it saves as one record, travels in a URL or a chat, and is the\n// exact thing the real menu is later built from. Every edit is a pure function returning a new\n// design; nothing here mutates.\n\nexport type MenuNodeKind = \"item\" | \"section\" | \"submenu\" | \"divider\" | \"slot\" | \"search\";\n\n/**\n * A row's colour, from the design system's tokens: the role inks (primary … destructive) and the\n * named hues (the chip palette). Light and dark come with the tokens.\n */\nexport const MENU_TONES = [\n \"default\",\n \"primary\",\n \"success\",\n \"warning\",\n \"info\",\n \"destructive\",\n \"sky\",\n \"blue\",\n \"indigo\",\n \"violet\",\n \"fuchsia\",\n \"rose\",\n \"orange\",\n \"amber\",\n \"lime\",\n \"emerald\",\n \"teal\",\n \"cyan\",\n \"slate\",\n] as const;\nexport type MenuTone = (typeof MENU_TONES)[number];\n\n/**\n * What the live menu does with an entry it cannot offer right now (no editable text, not an admin…):\n * - disable: shown greyed out;\n * - hide: left out;\n * - required: never unavailable — the host must always provide it.\n */\nexport const UNAVAILABLE_MODES = [\"disable\", \"hide\", \"required\"] as const;\nexport type UnavailableMode = (typeof UNAVAILABLE_MODES)[number];\n\ninterface NodeBase {\n /** Stable within the design. */\n id: string;\n /** The catalog option this was dragged from, when it came from one. */\n catalogId?: string;\n /** A designer's note on this one entry (\"only on a table row\", \"merge with Copy\"). */\n note?: string;\n /** Extra words the menu's search matches (besides the label and hint). */\n keywords?: string[];\n /** What happens when the entry is unavailable. Absent = disable. */\n unavailable?: UnavailableMode;\n /** When it is unavailable, in words (\"no editable text\", \"not an org admin\"). */\n unavailableWhen?: string;\n}\n\nexport interface MenuItemNode extends NodeBase {\n kind: \"item\";\n label: string;\n /** A lucide icon name (`Sparkles`, `Copy`). */\n icon?: string;\n /** Shown right-aligned (`⌘C`). */\n shortcut?: string;\n /** One short line under the label. */\n hint?: string;\n /** Shown greyed out — the design says \"this exists here but is unavailable now\". */\n disabled?: boolean;\n /** Red, for actions that remove or discard. */\n danger?: boolean;\n /** A checkbox-style toggle item. */\n toggle?: boolean;\n /** A setting the person flips right from the menu, drawn as a switch. */\n switch?: boolean;\n /** A checkbox or switch starts on. */\n defaultOn?: boolean;\n /** Drawn as a highlighted, AI-flavoured item. */\n ai?: boolean;\n /** The row's colour (icon; the label too with `toneLabel`). */\n tone?: MenuTone;\n toneLabel?: boolean;\n}\n\nexport interface MenuSectionNode extends NodeBase {\n kind: \"section\";\n /** The small heading. Empty = an unlabelled group. */\n label: string;\n children: MenuNode[];\n /** Starts folded; a click on the heading opens it. */\n collapsible?: boolean;\n /** How the section's items are laid out. */\n layout?: \"list\" | \"grid\" | \"row\";\n}\n\nexport interface MenuSubmenuNode extends NodeBase {\n kind: \"submenu\";\n label: string;\n icon?: string;\n hint?: string;\n tone?: MenuTone;\n toneLabel?: boolean;\n children: MenuNode[];\n}\n\n/** THE MENU'S SEARCH BOX: filters every option of the menu (labels, hints, keywords) as you type. */\nexport interface MenuSearchNode extends NodeBase {\n kind: \"search\";\n placeholder: string;\n /** Takes the keyboard when the menu opens. */\n autofocus: boolean;\n}\n\nexport interface MenuDividerNode extends NodeBase {\n kind: \"divider\";\n}\n\n/**\n * A PLACEHOLDER: \"every other option of this kind goes here\". `shape: \"items\"` lays them out as rows\n * where the placeholder sits; `shape: \"submenu\"` gathers them into one submenu. `fills` names the\n * kind (a catalog group, the agent library, the page's own rows, or everything not placed).\n */\nexport interface MenuSlotNode extends NodeBase {\n kind: \"slot\";\n label: string;\n fills: string;\n /**\n * items: rows where it sits · submenu: one submenu · feature: THE FEATURE SECTION — a section header\n * (the label), the first `featureItems` options as rows, the rest in a nested \"More\" submenu.\n */\n shape: \"items\" | \"submenu\" | \"feature\";\n icon?: string;\n /** feature shape: how many options show before \"More\". Default 4. */\n featureItems?: number;\n}\n\nexport type MenuNode = MenuItemNode | MenuSectionNode | MenuSubmenuNode | MenuDividerNode | MenuSlotNode | MenuSearchNode;\nexport type MenuContainerNode = MenuSectionNode | MenuSubmenuNode;\n\n/** Where the menu opens; the builder previews each the way it appears there. */\nexport const MENU_SURFACES = [\n \"text-selection\",\n \"editable-field\",\n \"table-row\",\n \"page\",\n \"chat-message\",\n \"file\",\n \"anywhere\",\n] as const;\nexport type MenuSurface = (typeof MENU_SURFACES)[number];\n\nexport interface MenuLook {\n density: \"compact\" | \"comfortable\";\n width: number;\n showIcons: boolean;\n showShortcuts: boolean;\n showHints: boolean;\n /** A search box at the top of the menu. */\n search: boolean;\n}\n\nexport const DEFAULT_LOOK: MenuLook = {\n density: \"comfortable\",\n width: 280,\n showIcons: true,\n showShortcuts: true,\n showHints: false,\n search: false,\n};\n\nexport interface MenuDesign {\n /** The design's identity; every version shares it. */\n designId: string;\n name: string;\n surface: MenuSurface;\n look: MenuLook;\n nodes: MenuNode[];\n /** Free notes for whoever builds it. */\n notes: string;\n}\n\nexport const DESIGN_FORMAT = 1;\n\n// ── ids ──────────────────────────────────────────────────────────────────────\n\nexport function newId(prefix = \"n\"): string {\n const rnd =\n typeof crypto !== \"undefined\" && \"randomUUID\" in crypto\n ? crypto.randomUUID().slice(0, 8)\n : Math.random().toString(36).slice(2, 10);\n return `${prefix}_${rnd}`;\n}\n\nexport function emptyDesign(name = \"Untitled menu\"): MenuDesign {\n return { designId: newId(\"d\"), name, surface: \"anywhere\", look: { ...DEFAULT_LOOK }, nodes: [], notes: \"\" };\n}\n\nexport function isContainer(node: MenuNode): node is MenuContainerNode {\n return node.kind === \"section\" || node.kind === \"submenu\";\n}\n\n/** Every catalog option the design already places (so a placeholder holds only the rest). */\nexport function placedCatalogIds(nodes: readonly MenuNode[], out = new Set<string>()): Set<string> {\n for (const n of nodes) {\n if (n.catalogId) out.add(n.catalogId);\n if (isContainer(n)) placedCatalogIds(n.children, out);\n }\n return out;\n}\n\n/** How many times each catalog option appears in the design (a duplicate counts twice). */\nexport function catalogUseCounts(nodes: readonly MenuNode[], out = new Map<string, number>()): Map<string, number> {\n for (const n of nodes) {\n if (n.catalogId) out.set(n.catalogId, (out.get(n.catalogId) ?? 0) + 1);\n if (isContainer(n)) catalogUseCounts(n.children, out);\n }\n return out;\n}\n\n/** A deep copy with every id renewed — what a duplicate or a second drop of a template gets. */\nexport function cloneNode<N extends MenuNode>(node: N): N {\n const copy = { ...node, id: newId(node.kind[0]) } as N;\n if (isContainer(copy)) (copy as MenuContainerNode).children = (copy as MenuContainerNode).children.map(cloneNode);\n return copy;\n}\n\n// ── reading the tree ─────────────────────────────────────────────────────────\n\nexport interface Located {\n node: MenuNode;\n /** The container's id, or null at the top. */\n parentId: string | null;\n index: number;\n depth: number;\n}\n\nexport function locate(nodes: readonly MenuNode[], id: string, parentId: string | null = null, depth = 0): Located | null {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i] as MenuNode;\n if (node.id === id) return { node, parentId, index: i, depth };\n if (isContainer(node)) {\n const inner = locate(node.children, id, node.id, depth + 1);\n if (inner) return inner;\n }\n }\n return null;\n}\n\nexport function contains(node: MenuNode, id: string): boolean {\n if (node.id === id) return true;\n return isContainer(node) && node.children.some((c) => contains(c, id));\n}\n\nexport function countItems(nodes: readonly MenuNode[]): number {\n let n = 0;\n for (const node of nodes) {\n if (node.kind === \"item\" || node.kind === \"slot\") n += 1;\n else if (isContainer(node)) n += countItems(node.children) + (node.kind === \"submenu\" ? 1 : 0);\n }\n return n;\n}\n\n// ── editing the tree (pure) ──────────────────────────────────────────────────\n\nfunction mapChildren(nodes: readonly MenuNode[], parentId: string | null, fn: (list: MenuNode[]) => MenuNode[]): MenuNode[] {\n if (parentId === null) return fn([...nodes]);\n return nodes.map((node) => {\n if (!isContainer(node)) return node;\n if (node.id === parentId) return { ...node, children: fn([...node.children]) };\n return { ...node, children: mapChildren(node.children, parentId, fn) };\n });\n}\n\nexport function insertNode(nodes: readonly MenuNode[], parentId: string | null, index: number, node: MenuNode): MenuNode[] {\n return mapChildren(nodes, parentId, (list) => {\n list.splice(Math.max(0, Math.min(index, list.length)), 0, node);\n return list;\n });\n}\n\nexport function removeNode(nodes: readonly MenuNode[], id: string): MenuNode[] {\n return nodes\n .filter((n) => n.id !== id)\n .map((n) => (isContainer(n) ? { ...n, children: removeNode(n.children, id) } : n));\n}\n\nexport function updateNode(nodes: readonly MenuNode[], id: string, patch: Partial<MenuNode>): MenuNode[] {\n return nodes.map((n) => {\n if (n.id === id) return { ...n, ...patch, id: n.id, kind: n.kind } as MenuNode;\n if (isContainer(n)) return { ...n, children: updateNode(n.children, id, patch) };\n return n;\n });\n}\n\n/**\n * Move `id` to `index` inside `parentId`. Refuses (returns the tree unchanged) a move into itself\n * or its own descendant. `index` is in the destination list as it reads BEFORE the move.\n */\nexport function canMove(nodes: readonly MenuNode[], id: string, parentId: string | null): boolean {\n const from = locate(nodes, id);\n return Boolean(from) && (parentId === null || !contains((from as Located).node, parentId));\n}\n\nexport function moveNode(nodes: readonly MenuNode[], id: string, parentId: string | null, index: number): MenuNode[] {\n const from = locate(nodes, id);\n // A refused move answers the SAME array, so a caller can tell \"nothing happened\" by identity.\n if (!from) return nodes as MenuNode[];\n if (parentId !== null && contains(from.node, parentId)) return nodes as MenuNode[];\n let target = index;\n if (from.parentId === parentId && from.index < index) target -= 1;\n return insertNode(removeNode(nodes, id), parentId, target, from.node);\n}\n\nexport function duplicateNode(nodes: readonly MenuNode[], id: string): MenuNode[] {\n const at = locate(nodes, id);\n if (!at) return [...nodes];\n return insertNode(nodes, at.parentId, at.index + 1, cloneNode(at.node));\n}\n\n/** Wrap a node into a new section (or submenu) in its place. */\nexport function wrapNode(nodes: readonly MenuNode[], id: string, kind: \"section\" | \"submenu\"): MenuNode[] {\n const at = locate(nodes, id);\n if (!at) return [...nodes];\n const wrapper: MenuContainerNode =\n kind === \"section\"\n ? { id: newId(\"s\"), kind: \"section\", label: \"New section\", children: [at.node] }\n : { id: newId(\"m\"), kind: \"submenu\", label: \"More\", icon: \"ChevronRight\", children: [at.node] };\n return insertNode(removeNode(nodes, id), at.parentId, at.index, wrapper);\n}\n\n/** Replace a container by its children. */\nexport function unwrapNode(nodes: readonly MenuNode[], id: string): MenuNode[] {\n const at = locate(nodes, id);\n if (!at || !isContainer(at.node)) return [...nodes];\n let out = removeNode(nodes, id);\n at.node.children.forEach((child, i) => {\n out = insertNode(out, at.parentId, at.index + i, child);\n });\n return out;\n}\n\n// ── reading a saved design defensively ──────────────────────────────────────\n\n/** A saved document back into a design; anything unreadable becomes an empty design, never a throw. */\nexport function parseDesign(raw: unknown): MenuDesign {\n let value: unknown = raw;\n if (typeof raw === \"string\") {\n try {\n value = JSON.parse(raw);\n } catch {\n return emptyDesign(\"Unreadable design\");\n }\n }\n const v = (value ?? {}) as Partial<MenuDesign> & { design?: MenuDesign };\n const d = v.design ?? v;\n return {\n designId: typeof d.designId === \"string\" ? d.designId : newId(\"d\"),\n name: typeof d.name === \"string\" ? d.name : \"Untitled menu\",\n surface: MENU_SURFACES.includes(d.surface as MenuSurface) ? (d.surface as MenuSurface) : \"anywhere\",\n look: { ...DEFAULT_LOOK, ...(d.look ?? {}) },\n nodes: Array.isArray(d.nodes) ? (d.nodes as MenuNode[]) : [],\n notes: typeof d.notes === \"string\" ? d.notes : \"\",\n };\n}\n\nexport function serializeDesign(design: MenuDesign): string {\n return JSON.stringify({ format: DESIGN_FORMAT, design });\n}\n","// src/design/starters.ts — @ai-matrx/context-menu: READY STARTING POINTS for the builder.\n//\n// Each starter reproduces a menu that exists today on the live site, or one a proposal demo page\n// sets up, as plain MenuDesign data. Open one, change it, save it. Labels, order, sections,\n// submenus and icons follow the real source (engine rows, PROPOSED_MENU_GROUPING,\n// proposed-arrangement, the notes / quiz / data-table row builders). Rows the live menu fills at\n// runtime (agents, shortcuts, content blocks) appear as representative `ai` items with a note.\n\nimport { catalogOption } from \"./catalog\";\nimport { DEFAULT_LOOK, type MenuDesign, type MenuLook, type MenuNode, type MenuSurface } from \"./model\";\n\nexport interface StarterDesign {\n id: string;\n group: \"Live today\" | \"Proposal\";\n /** Where it comes from, e.g. \"/demos/context-menu-designs — a thing\". */\n source: string;\n design: MenuDesign;\n}\n\ntype ItemExtras = Partial<{\n label: string;\n icon: string;\n shortcut: string;\n hint: string;\n disabled: boolean;\n danger: boolean;\n toggle: boolean;\n ai: boolean;\n note: string;\n}>;\n\n/** A per-design node builder: every node id is `<slug>-<n>`, in drawing order. */\nfunction maker(slug: string) {\n let n = 0;\n const nid = () => `${slug}-${++n}`;\n const clean = <T extends object>(o: T): T => JSON.parse(JSON.stringify(o)) as T;\n\n /** An item from a catalog row (label / icon / shortcut / danger / ai come from it). */\n const item = (catalogId: string, extra: ItemExtras = {}): MenuNode => {\n const c = catalogOption(catalogId);\n if (!c) throw new Error(`starters: no catalog row ${catalogId}`);\n return clean({\n id: nid(),\n kind: \"item\" as const,\n catalogId,\n label: c.label,\n icon: c.icon,\n ...(c.shortcut ? { shortcut: c.shortcut } : {}),\n ...(c.danger ? { danger: true } : {}),\n ...(c.ai ? { ai: true } : {}),\n ...extra,\n });\n };\n /** An item with no catalog row (a page's own row). */\n const own = (label: string, icon: string, extra: ItemExtras = {}): MenuNode =>\n clean({ id: nid(), kind: \"item\" as const, label, icon, ...extra });\n const section = (label: string, children: MenuNode[], layout: \"list\" | \"row\" | \"grid\" = \"list\"): MenuNode => ({\n id: nid(),\n kind: \"section\",\n label,\n layout,\n children,\n });\n const strip = (children: MenuNode[]): MenuNode => section(\"\", children, \"row\");\n const sub = (label: string, icon: string, children: MenuNode[], extra: { hint?: string; note?: string } = {}): MenuNode =>\n clean({ id: nid(), kind: \"submenu\" as const, label, icon, ...extra, children });\n const divider = (): MenuNode => ({ id: nid(), kind: \"divider\" });\n return { item, own, section, strip, sub, divider };\n}\ntype Maker = ReturnType<typeof maker>;\n\nfunction design(\n slug: string,\n name: string,\n surface: MenuSurface,\n notes: string,\n nodes: MenuNode[],\n look: Partial<MenuLook> = {},\n): MenuDesign {\n return { designId: `starter-${slug}`, name, surface, look: { ...DEFAULT_LOOK, ...look }, nodes, notes };\n}\n\nconst RUNTIME = \"Filled from the agent library at runtime.\";\n\n// ── shared pieces ────────────────────────────────────────────────────────────\n\n/** The AI placements the live menu shows: each is a runtime-filled list. */\nfunction aiPlacements(m: Maker): MenuNode[] {\n return [\n m.item(\"cm:placement:ai-action\", {\n note: `${RUNTIME} Live: a submenu of AI actions (agent shortcuts) that fit the selection.`,\n }),\n m.item(\"cm:placement:content-block\", { note: \"Filled at runtime with the content blocks that can be inserted here.\" }),\n m.item(\"cm:placement:user-tool\", { note: \"Filled at runtime with this person's own shortcuts.\" }),\n m.item(\"cm:placement:organization-tool\", { note: \"Filled at runtime with the organization's shared shortcuts.\" }),\n m.item(\"cm:placement:bound-agent\", { note: \"Filled at runtime with the agents bound to this page.\" }),\n ];\n}\n\n/** The four \"Intelligence\" children the object-first proposal shows (AI_ORDER in proposed-arrangement). */\nfunction intelligence(m: Maker): MenuNode {\n return m.sub(\"Intelligence\", \"Sparkles\", [\n m.item(\"cm:chat\"),\n m.item(\"cm:placement:ai-action\", { note: RUNTIME }),\n m.item(\"cm:placement:bound-agent\", { note: RUNTIME }),\n m.item(\"cm:placement:user-tool\", { note: RUNTIME }),\n m.item(\"cm:placement:organization-tool\", { note: RUNTIME }),\n m.item(\"cm:placement:content-block\", { note: RUNTIME }),\n ], { note: \"Every AI entry in one row, on every menu.\" });\n}\n\nfunction saveShare(m: Maker): MenuNode {\n return m.sub(\"Save & share\", \"Share2\", [\n m.item(\"cm:copy-as\", { note: \"Copy block: every form the content can land on the clipboard in.\" }),\n m.divider(),\n m.item(\"cm:export\", { label: \"Download\", icon: \"Download\", note: \"Download block: PDF, Word, HTML, Markdown, print.\" }),\n m.divider(),\n m.item(\"cm:convert\", { label: \"Convert to…\", note: \"Convert block: becomes a new thing in the app (note, task, document…).\" }),\n m.divider(),\n m.item(\"share-webpage\", { label: \"Publish\", icon: \"Globe\", note: \"Publish block: public web page.\" }),\n m.divider(),\n m.item(\"cm:share\", { label: \"Share\", note: \"Share block: people and places. Copy link folds into this dialog.\" }),\n ]);\n}\n\nfunction organize(m: Maker): MenuNode {\n return m.sub(\"Organize\", \"FolderTree\", [\n m.item(\"cm:attach\"),\n m.item(\"pin-message\", { label: \"Pin\" }),\n m.item(\"cm:view-history\", { label: \"History\" }),\n m.item(\"cm:compare\", { label: \"Compare\" }),\n ]);\n}\n\nfunction tools(m: Maker): MenuNode {\n return m.sub(\"Tools\", \"Wrench\", [\n m.item(\"cm:speak\", { label: \"Read aloud\" }),\n m.item(\"cm:quick-actions\"),\n m.item(\"feedback\", { label: \"Feedback\" }),\n m.item(\"cm:x:surface\", { label: \"This page\" }),\n m.item(\"cm:admin\", { label: \"Admin\", note: \"Admins only.\" }),\n ]);\n}\n\nconst TIER_STRIP = (m: Maker): MenuNode =>\n m.strip([m.item(\"cm:copy\"), m.item(\"cm:cut\"), m.item(\"cm:paste\"), m.item(\"cm:undo\"), m.item(\"cm:redo\"), m.item(\"cm:find\")]);\n\n// ── Live today ───────────────────────────────────────────────────────────────\n\nfunction liveEditableField(): MenuDesign {\n const m = maker(\"live-editable-field\");\n return design(\n \"live-editable-field\",\n \"Editable text field (selection in a textarea)\",\n \"editable-field\",\n \"Live today: the right-click menu on an editable field. Source: engine/ContextMenuV3, command layout (platform default since 2026-08-22).\",\n [\n TIER_STRIP(m),\n m.item(\"cm:select-all\"),\n m.divider(),\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"cm:quick-actions\", { note: \"A submenu of quick tools.\" }),\n m.divider(),\n m.item(\"cm:listen\"),\n m.item(\"cm:speak\"),\n m.item(\"cm:copy-as\"),\n m.item(\"cm:insert-reference\"),\n m.divider(),\n m.sub(\"History\", \"History\", [m.item(\"cm:undo\"), m.item(\"cm:redo\"), m.item(\"cm:view-history\"), m.item(\"cm:compare\")], {\n note: \"In the tiered and command layouts History groups these four.\",\n }),\n m.item(\"cm:export\"),\n m.item(\"cm:convert\"),\n m.item(\"cm:share\"),\n m.item(\"cm:attach\"),\n m.divider(),\n m.item(\"cm:x:surface\"),\n m.item(\"cm:admin\", { note: \"Admins only.\" }),\n ],\n { search: true },\n );\n}\n\nfunction liveReadOnlyMessage(): MenuDesign {\n const m = maker(\"live-chat-message\");\n return design(\n \"live-chat-message\",\n \"Read-only text / chat message\",\n \"chat-message\",\n \"Live today: right-click on read-only text and on a chat message. Source: engine/NonEditableContextMenu plus the chat message rows.\",\n [\n m.strip([m.item(\"cm:copy\"), m.item(\"cm:find\"), m.item(\"cm:speak\", { label: \"Read aloud\" })]),\n m.item(\"cm:select-all\"),\n m.divider(),\n m.section(\"Message\", [\n m.item(\"regenerate-response\", { note: \"Assistant messages only.\" }),\n m.item(\"fork-at-message\"),\n m.item(\"continue-in-chat\"),\n m.item(\"pin-message\"),\n m.item(\"feedback-up\"),\n m.item(\"feedback-down\"),\n ]),\n m.divider(),\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"cm:quick-actions\"),\n m.divider(),\n m.item(\"cm:copy-as\"),\n m.item(\"cm:json\"),\n m.item(\"cm:export\"),\n m.item(\"cm:convert\"),\n m.item(\"cm:share\"),\n m.item(\"cm:attach\"),\n m.divider(),\n m.item(\"cm:x:surface\"),\n m.item(\"cm:admin\", { note: \"Admins only.\" }),\n ],\n );\n}\n\nfunction liveNotesEditor(): MenuDesign {\n const m = maker(\"live-notes-editor\");\n return design(\n \"live-notes-editor\",\n \"Notes editor\",\n \"editable-field\",\n \"Live today: right-click in a note. Source: features/notes/agent-context/notesEditorExtraSections (the Note section) on top of the standard editable menu.\",\n [\n TIER_STRIP(m),\n m.item(\"cm:select-all\"),\n m.divider(),\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"cm:quick-actions\"),\n m.divider(),\n m.section(\"Note\", [\n m.item(\"cm:save\", { hint: \"Greyed when the note has no unsaved changes.\" }),\n m.item(\"duplicate\"),\n m.item(\"notes:export-md\"),\n m.item(\"share-link\", { label: \"Share link…\" }),\n m.item(\"notes:share-clipboard\"),\n m.item(\"notes:convert-artifacts\", { label: \"Convert blocks to artifacts\", note: \"Only on notes that can be saved.\" }),\n m.sub(\"Move to folder…\", \"FolderInput\", [\n m.own(\"Inbox\", \"FolderClosed\", { note: \"One row per folder the person has; the current folder is greyed.\" }),\n m.own(\"Projects\", \"FolderClosed\"),\n m.divider(),\n m.own(\"New folder…\", \"FolderPlus\"),\n m.own(\"Choose folder…\", \"FolderInput\"),\n ]),\n m.sub(\"Tabs\", \"X\", [\n m.item(\"notes:close-tab\", { label: \"Close Tab\" }),\n m.own(\"Close Other Tabs\", \"X\", { note: \"Greyed with one tab open.\" }),\n m.own(\"Close All Tabs\", \"X\"),\n ]),\n m.divider(),\n m.item(\"notes:trash\", { note: \"Always last, red.\" }),\n ]),\n m.divider(),\n m.item(\"cm:copy-as\"),\n m.item(\"cm:export\"),\n m.item(\"cm:convert\"),\n m.item(\"cm:share\"),\n m.item(\"cm:attach\"),\n m.item(\"cm:x:surface\"),\n m.item(\"cm:admin\", { note: \"Admins only.\" }),\n ],\n { search: true },\n );\n}\n\nfunction liveQuizRow(): MenuDesign {\n const m = maker(\"live-quiz-row\");\n return design(\n \"live-quiz-row\",\n \"Quiz row\",\n \"table-row\",\n \"Live today: a quiz / practice-test row. Source: features/education/assessment/components/home/useAssessmentRowActions.\",\n [\n m.section(\"\", [m.item(\"row:open\"), m.item(\"row:open-tab\")]),\n m.section(\"Quiz\", [\n m.item(\"row:take\", { note: \"Greyed when archived or the quiz has no questions.\" }),\n m.item(\"edit\", { label: \"Edit questions\", note: \"Only where the person may edit.\" }),\n m.item(\"row:results\", { note: \"Only once the person has a result.\" }),\n ]),\n m.section(\"Manage\", [\n m.item(\"archive\", { note: \"Shows Restore (ArchiveRestore) instead when the quiz is archived. Only for editors.\" }),\n ]),\n ],\n );\n}\n\nfunction liveTableRow(): MenuDesign {\n const m = maker(\"live-table-row\");\n return design(\n \"live-table-row\",\n \"Data table row (/data)\",\n \"table-row\",\n \"Live today: a row on the Data home. Source: /demos/context-menu-designs TableRowsPanel, the 'today' side.\",\n [\n m.section(\"\", [m.item(\"row:open\"), m.item(\"row:open-tab\")]),\n m.section(\"\", [m.item(\"favorite\")]),\n ],\n );\n}\n\n// ── Proposal: grouped by what you get ───────────────────────────────────────\n\nfunction regroupDesign(): MenuDesign {\n const m = maker(\"proposal-grouped\");\n return design(\n \"proposal-grouped\",\n \"Grouped by what you get (13 groups)\",\n \"text-selection\",\n \"Proposal: /demos/context-menu-regroup, PROPOSED_MENU_GROUPING v2. Strip and universal verbs stay on top; everything else is filed under 13 outcome submenus.\",\n [\n TIER_STRIP(m),\n m.item(\"cm:select-all\"),\n m.item(\"cm:quick-actions\"),\n m.item(\"cm:save\", { note: \"An editor's own Save / Delete stay one click away.\" }),\n m.item(\"cm:delete\"),\n m.divider(),\n m.sub(\"Edit\", \"Pencil\", [\n m.item(\"edit\"),\n m.own(\"Replace selection\", \"Replace\"),\n m.own(\"Insert below\", \"ArrowDownToLine\"),\n m.item(\"rename\"),\n ], { hint: \"Change this item where it is.\" }),\n m.sub(\"Copy\", \"Copy\", [\n m.item(\"cm:copy-as\"),\n m.item(\"cm:json\"),\n m.item(\"copy-html-page\"),\n m.item(\"cm:insert-reference\"),\n ], { hint: \"Lands on your clipboard.\" }),\n m.sub(\"Download\", \"Download\", [\n m.item(\"cm:export\"),\n m.item(\"save-as-file\"),\n m.item(\"download-pdf\"),\n m.item(\"download-docx\"),\n m.item(\"download-html\"),\n m.item(\"print\"),\n ], { hint: \"Becomes a file outside the app.\" }),\n m.sub(\"Convert to\", \"ArrowRightLeft\", [\n m.item(\"cm:convert\", { label: \"Convert to…\" }),\n m.own(\"Note\", \"StickyNote\"),\n m.own(\"Document\", \"FileText\"),\n m.own(\"Task\", \"SquareCheck\"),\n m.own(\"Flashcards\", \"Layers\"),\n m.own(\"Quiz\", \"CircleHelp\"),\n ], { hint: \"Becomes a new thing inside the app.\" }),\n m.sub(\"Publish\", \"Globe\", [m.item(\"html-preview\"), m.item(\"share-webpage\")], { hint: \"Goes out to the world.\" }),\n m.sub(\"Share\", \"Share2\", [m.item(\"cm:share\"), m.item(\"send-google-doc\"), m.item(\"email-to-me\")], {\n hint: \"Goes to specific people or places.\",\n }),\n m.sub(\"Organize\", \"Tags\", [\n m.item(\"cm:attach\"),\n m.item(\"set-context-value\"),\n m.item(\"pin-message\", { label: \"Pin\" }),\n m.item(\"notes-and-comments\"),\n ], { hint: \"Filed, not changed.\" }),\n m.sub(\"History\", \"History\", [m.item(\"cm:view-history\"), m.item(\"edit-history\"), m.item(\"fork-at-message\")], {\n hint: \"Earlier versions.\",\n }),\n m.sub(\"AI\", \"Bot\", [\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"send-to-agent\"),\n m.item(\"continue-in-chat\"),\n m.item(\"regenerate-response\"),\n m.item(\"code-block-chart\"),\n ], { hint: \"An AI works on it.\" }),\n m.sub(\"Read aloud\", \"Volume2\", [m.item(\"cm:speak\"), m.item(\"cm:listen\"), m.item(\"tts-voice-settings\")], { hint: \"You hear it.\" }),\n m.sub(\"Compare\", \"GitCompareArrows\", [m.item(\"cm:compare\"), m.item(\"compare-with-clipboard\"), m.item(\"set-compare-base\")], {\n hint: \"Side by side.\",\n }),\n m.sub(\"Feedback\", \"ThumbsUp\", [m.item(\"feedback-up\"), m.item(\"feedback-down\"), m.item(\"feedback\")], { hint: \"Tell us how it went.\" }),\n m.sub(\"Admin\", \"Shield\", [m.item(\"cm:admin\")], { hint: \"Admins only.\" }),\n m.divider(),\n m.item(\"cm:x:surface\"),\n ],\n );\n}\n\n// ── Proposal: object-first ───────────────────────────────────────────────────\n\nfunction objectFirstThing(): MenuDesign {\n const m = maker(\"proposal-object-thing\");\n return design(\n \"proposal-object-thing\",\n \"Object-first: a thing (data table row)\",\n \"table-row\",\n \"Proposal: /demos/context-menu-designs, proposed-arrangement for a clicked thing (the data-table row on that page).\",\n [\n m.strip([\n m.item(\"cm:copy\"),\n m.item(\"cm:share\"),\n m.item(\"duplicate\"),\n m.item(\"favorite\", { label: \"Favorite\" }),\n m.item(\"save-as-file\", { label: \"Download\", icon: \"Download\" }),\n m.item(\"archive\"),\n ]),\n m.item(\"row:open\"),\n m.item(\"row:open-tab\"),\n m.item(\"rename\"),\n m.item(\"move\", { label: \"Move to…\" }),\n m.sub(\"More table options\", \"Ellipsis\", [\n m.own(\"Add column\", \"Columns3\"),\n m.own(\"Import\", \"Upload\"),\n m.own(\"Settings\", \"Settings\"),\n m.item(\"cm:view-history\"),\n ], { note: \"The thing's own rows beyond the first four.\" }),\n intelligence(m),\n saveShare(m),\n organize(m),\n tools(m),\n ],\n { search: true },\n );\n}\n\nfunction objectFirstEditable(): MenuDesign {\n const m = maker(\"proposal-object-editable\");\n return design(\n \"proposal-object-editable\",\n \"Object-first: editable text\",\n \"editable-field\",\n \"Proposal: /demos/context-menu-designs, proposed-arrangement for editable text (Cut, Copy, Paste, Undo, Redo, Find on top).\",\n [\n TIER_STRIP(m),\n m.item(\"cm:select-all\"),\n m.item(\"cm:save\"),\n m.item(\"cm:delete\"),\n m.item(\"edit\"),\n intelligence(m),\n saveShare(m),\n organize(m),\n tools(m),\n ],\n { search: true },\n );\n}\n\nfunction objectFirstReadOnly(): MenuDesign {\n const m = maker(\"proposal-object-readonly\");\n return design(\n \"proposal-object-readonly\",\n \"Object-first: read-only text\",\n \"text-selection\",\n \"Proposal: /demos/context-menu-designs, proposed-arrangement for read-only text (Copy, Read aloud, Find, Share on top).\",\n [\n m.strip([m.item(\"cm:copy\"), m.item(\"cm:speak\", { label: \"Read aloud\" }), m.item(\"cm:find\"), m.item(\"cm:share\")]),\n intelligence(m),\n saveShare(m),\n organize(m),\n tools(m),\n ],\n { search: true },\n );\n}\n\n// ── Proposal: layouts (the same notes menu, arranged three more ways) ───────\n\n/** The notes menu rows that every layout carries, flat (what Classic shows). */\nfunction notesRows(m: Maker): MenuNode[] {\n return [\n m.item(\"cm:select-all\"),\n m.item(\"cm:chat\"),\n ...aiPlacements(m),\n m.item(\"cm:quick-actions\"),\n m.item(\"cm:listen\"),\n m.item(\"cm:speak\"),\n m.item(\"cm:copy-as\"),\n m.item(\"cm:json\"),\n m.item(\"cm:export\"),\n m.item(\"cm:convert\"),\n m.item(\"cm:share\"),\n m.item(\"cm:attach\"),\n m.item(\"cm:save\"),\n m.item(\"duplicate\"),\n m.item(\"notes:export-md\"),\n m.item(\"share-link\", { label: \"Share link…\" }),\n m.item(\"notes:share-clipboard\"),\n m.item(\"move\", { label: \"Move to folder…\" }),\n m.item(\"notes:close-tab\", { label: \"Tabs\" }),\n m.item(\"notes:trash\"),\n m.item(\"cm:x:surface\"),\n m.item(\"cm:admin\"),\n ];\n}\n\nfunction layoutCompact(): MenuDesign {\n const m = maker(\"proposal-layout-compact\");\n return design(\n \"proposal-layout-compact\",\n \"Layout: Classic, compact rows\",\n \"editable-field\",\n \"Proposal: /demos/context-menu/layouts panel 2. Classic structure (every row at the top level), tighter rows and icons.\",\n [\n m.item(\"cm:copy\"),\n m.item(\"cm:cut\"),\n m.item(\"cm:paste\"),\n m.item(\"cm:undo\"),\n m.item(\"cm:redo\"),\n m.item(\"cm:find\"),\n m.item(\"cm:view-history\"),\n m.item(\"cm:compare\"),\n m.divider(),\n ...notesRows(m),\n ],\n { density: \"compact\", width: 260 },\n );\n}\n\nfunction tieredNodes(m: Maker): MenuNode[] {\n return [\n TIER_STRIP(m),\n m.sub(\"History\", \"History\", [m.item(\"cm:undo\"), m.item(\"cm:redo\"), m.item(\"cm:view-history\"), m.item(\"cm:compare\")], {\n note: \"The one grouping the tiered layout adds; every other row keeps its Classic name and place.\",\n }),\n m.divider(),\n ...notesRows(m).filter((n) => n.kind !== \"item\" || n.label !== \"Tabs\"),\n m.sub(\"Tabs\", \"X\", [m.item(\"notes:close-tab\", { label: \"Close Tab\" }), m.item(\"notes:close-others\")]),\n ];\n}\n\nfunction layoutTiered(): MenuDesign {\n const m = maker(\"proposal-layout-tiered\");\n return design(\n \"proposal-layout-tiered\",\n \"Layout: Tiered (icon strip, nothing lost)\",\n \"editable-field\",\n \"Proposal: /demos/context-menu/layouts panel 3. Icon strip on top, every other row keeps its Classic name; History groups Undo / Redo / View History / Compare.\",\n tieredNodes(m),\n );\n}\n\nfunction layoutCommand(): MenuDesign {\n const m = maker(\"proposal-layout-command\");\n return design(\n \"proposal-layout-command\",\n \"Layout: Command (tiered + type to filter)\",\n \"editable-field\",\n \"Proposal: /demos/context-menu/layouts panel 4, the platform default. Tiered plus a filter box that flattens every action into one ranked list.\",\n tieredNodes(m),\n { search: true },\n );\n}\n\nexport const STARTER_DESIGNS: readonly StarterDesign[] = [\n { id: \"live-editable-field\", group: \"Live today\", source: \"Engine ContextMenuV3 — editable text field\", design: liveEditableField() },\n { id: \"live-chat-message\", group: \"Live today\", source: \"Engine NonEditableContextMenu — read-only text and chat message\", design: liveReadOnlyMessage() },\n { id: \"live-notes-editor\", group: \"Live today\", source: \"/notes — notesEditorExtraSections\", design: liveNotesEditor() },\n { id: \"live-quiz-row\", group: \"Live today\", source: \"/education/quizzes — useAssessmentRowActions\", design: liveQuizRow() },\n { id: \"live-table-row\", group: \"Live today\", source: \"/data row — /demos/context-menu-designs TableRowsPanel (today)\", design: liveTableRow() },\n { id: \"proposal-grouped\", group: \"Proposal\", source: \"/demos/context-menu-regroup — grouped by what you get\", design: regroupDesign() },\n { id: \"proposal-object-thing\", group: \"Proposal\", source: \"/demos/context-menu-designs — a thing\", design: objectFirstThing() },\n { id: \"proposal-object-editable\", group: \"Proposal\", source: \"/demos/context-menu-designs — editable text\", design: objectFirstEditable() },\n { id: \"proposal-object-readonly\", group: \"Proposal\", source: \"/demos/context-menu-designs — read-only text\", design: objectFirstReadOnly() },\n { id: \"proposal-layout-compact\", group: \"Proposal\", source: \"/demos/context-menu/layouts — compact\", design: layoutCompact() },\n { id: \"proposal-layout-tiered\", group: \"Proposal\", source: \"/demos/context-menu/layouts — tiered\", design: layoutTiered() },\n { id: \"proposal-layout-command\", group: \"Proposal\", source: \"/demos/context-menu/layouts — command\", design: layoutCommand() },\n];\n","// src/design/audit.ts — @ai-matrx/context-menu: WHAT THE OTHER MENUS DO THAT THE NEW MENU DOES NOT (YET).\n//\n// GENERATED 2026-10-10 from a six-agent audit (notes, files & media, chat, code & documents, tables &\n// records, agents & workflows) of every menu, \"…\" button, right-click and row action in matrx-frontend\n// and the packages, against Arman's design v12. Each row is one action the new menu misses or only\n// partly covers, where it lives today, and where it probably belongs: the main menu, the place-specific\n// feature section, or a Window panel. The builder shows these as a palette group so none is lost.\n// Re-run the audit and regenerate; never hand-edit rows.\n\nexport interface AuditFinding {\n id: string;\n /** Short name for the menu row. */\n label: string;\n /** What the person can do, in full. */\n feature: string;\n /** Where it lives today. */\n surface: string;\n /** file:line in matrx-frontend or the packages. */\n source: string;\n coverage: \"missing\" | \"partial\";\n home: \"main menu\" | \"feature section\" | \"window\";\n importance: \"core\" | \"useful\" | \"rare\";\n area: string;\n /** For partial coverage: the nearest entry in the design. */\n closest?: string;\n}\n\nexport const AUDIT_FINDINGS: readonly AuditFinding[] = [\n {\n \"id\": \"audit:1\",\n \"label\": \"Add to knowledge base\",\n \"feature\": \"Add to knowledge base / see if the note is indexed (label flips to Knowledge base once ingested, opens the knowledge panel)\",\n \"surface\": \"note tab ..., note row menu, right-click, phone More sheet, bulk bar\",\n \"source\": \"features/notes/components/note-actions/noteActionSet.ts:62\",\n \"coverage\": \"missing\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:2\",\n \"label\": \"Restore a note from Trash\",\n \"feature\": \"Restore a note from Trash (and see the Trash list with deleted dates)\",\n \"surface\": \"notes sidebar Trash section, delete undo toast\",\n \"source\": \"features/notes/components/NoteSidebar.tsx:1764\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"notes\",\n \"closest\": \"Archive (icon strip) covers sending to trash only; there is no Restore or Unarchive entry\"\n },\n {\n \"id\": \"audit:3\",\n \"label\": \"About this note\",\n \"feature\": \"About this note: info panel with word, character, line, paragraph counts and read time, Public chip, linked records, custom fields\",\n \"surface\": \"note tab ... and right-click, phone More sheet\",\n \"source\": \"features/notes/components/note-actions/noteActionSet.ts:76\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:4\",\n \"label\": \"Switch note view mode\",\n \"feature\": \"Switch note view mode: Write, Split, Plain, Read (phone has Write and Plain only)\",\n \"surface\": \"notes header mode capsule\",\n \"source\": \"features/notes/components/NoteViewControls.tsx:28\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:5\",\n \"label\": \"Tab management\",\n \"feature\": \"Tab management: Pin tab or Unpin tab, Move tab left, Move tab right\",\n \"surface\": \"note tab ... and right-click on tab\",\n \"source\": \"features/notes/components/NoteTabItem.tsx:396\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Organize > Pin (pins the note, not the tab; no reorder)\"\n },\n {\n \"id\": \"audit:6\",\n \"label\": \"Close tab, Close other tabs, Close all tabs\",\n \"feature\": \"Close tab, Close other tabs, Close all tabs (also Ctrl/Cmd+W)\",\n \"surface\": \"note tab ... , editor right-click Tabs submenu\",\n \"source\": \"features/notes/agent-context/notesEditorExtraSections.ts:130\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:7\",\n \"label\": \"New note tab, and pick the organization for…\",\n \"feature\": \"New note tab, and pick the organization for a new note\",\n \"surface\": \"tab bar plus button and org chooser\",\n \"source\": \"features/notes/components/NoteTabBar.tsx:294\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:8\",\n \"label\": \"Choose or change the note's organization\",\n \"feature\": \"Choose or change the note's organization / scopes (organization, project, task) and the organization's custom fields on the note\",\n \"surface\": \"info panel, metadata bar, phone Scopes dock, note context section\",\n \"source\": \"features/notes/components/NoteInfoPanel.tsx:322\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"notes\",\n \"closest\": \"Organize > Set as context and Attach to... do not cover assigning the note's own scopes or org\"\n },\n {\n \"id\": \"audit:9\",\n \"label\": \"Folder tools\",\n \"feature\": \"Folder tools: New folder, Choose folder, create-folder-and-move in one step\",\n \"surface\": \"Move to folder submenu, bulk bar, info panel\",\n \"source\": \"features/notes/agent-context/notesEditorExtraSections.ts:97\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Organize > Move to folder... (no inline New folder entry listed)\"\n },\n {\n \"id\": \"audit:10\",\n \"label\": \"Folder header actions\",\n \"feature\": \"Folder header actions: New Note in this folder, Rename Folder, Move all notes to Trash\",\n \"surface\": \"right-click on a folder header in the sidebar\",\n \"source\": \"features/notes/components/NoteSidebar.tsx:771\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:11\",\n \"label\": \"Open the print studio\",\n \"feature\": \"Open the print studio (pages, cover, table of contents, header and footer, PDF/Word/EPUB/HTML) for the note\",\n \"surface\": \"note actions Print or export as document\",\n \"source\": \"features/notes/components/note-actions/noteMenuRegistry.tsx:318\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Export & Download > Print / PDF / Word / HTML (no EPUB, no page-layout studio)\"\n },\n {\n \"id\": \"audit:12\",\n \"label\": \"Version history as a side panel, with a full…\",\n \"feature\": \"Version history as a side panel, with a full diff page between versions\",\n \"surface\": \"record tools, note actions, phone More\",\n \"source\": \"features/notes/components/NoteRecordTools.tsx:40\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Content > View history and Compare\"\n },\n {\n \"id\": \"audit:13\",\n \"label\": \"Document outline panel toggle\",\n \"feature\": \"Document outline panel toggle (jump to headings)\",\n \"surface\": \"record tools, header overflow\",\n \"source\": \"features/notes/components/NoteRecordTools.tsx:35\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Content > Outline\"\n },\n {\n \"id\": \"audit:14\",\n \"label\": \"Clean up options\",\n \"feature\": \"Clean up options: per-operation switches grouped by type, protected-region operations on JSON/code blocks, live change counts, reset to defaults, review dialog and debug inspector\",\n \"surface\": \"cleanup button popover\",\n \"source\": \"features/notes/components/cleanup/CleanupOptionsPopover.tsx:181\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Content > Cleanup (single entry, no options)\"\n },\n {\n \"id\": \"audit:15\",\n \"label\": \"Find & replace options\",\n \"feature\": \"Find & replace options: match case, whole word, regex, find everywhere across all notes (include/exclude), replace one, replace all, next/previous match (F3, Cmd+G)\",\n \"surface\": \"find bar and keyboard shortcuts\",\n \"source\": \"features/notes/components/FindReplaceBar.tsx:207\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Find & Replace (icon strip and Content)\"\n },\n {\n \"id\": \"audit:16\",\n \"label\": \"Copy as a rich note record for AI\",\n \"feature\": \"Copy as a rich note record for AI: Note with body vs Metadata only (folder, tags, context, unsaved state, save error)\",\n \"surface\": \"metadata bar copy split\",\n \"source\": \"features/notes/components/NoteMetadataBar.tsx:380\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Copy > For AI: Structured / With Context\"\n },\n {\n \"id\": \"audit:17\",\n \"label\": \"Copy a reference to this note for pasting in…\",\n \"feature\": \"Copy a reference to this note for pasting into an agent chat\",\n \"surface\": \"note actions, phone More\",\n \"source\": \"features/notes/components/note-actions/noteActionSet.ts:75\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Share & Publish > Insert / Copy reference...\"\n },\n {\n \"id\": \"audit:18\",\n \"label\": \"Tags\",\n \"feature\": \"Tags: add and remove tags on a note\",\n \"surface\": \"metadata bar, phone folder and tags sheet\",\n \"source\": \"features/notes/components/NoteMetadataBar.tsx:295\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"rare\",\n \"area\": \"notes\",\n \"closest\": \"Organize > Tags...\"\n },\n {\n \"id\": \"audit:19\",\n \"label\": \"Sidebar list view controls\",\n \"feature\": \"Sidebar list view controls: group by Default / Folder / Recent, sort by Modified / Name / Created, ascending or descending, expand or collapse all folders\",\n \"surface\": \"notes sidebar toolbar\",\n \"source\": \"features/notes/components/NoteSidebar.tsx:159\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:20\",\n \"label\": \"Selection mode and bulk actions on notes\",\n \"feature\": \"Selection mode and bulk actions on notes: select all, move to folder, add to knowledge base, export as Markdown, share (one note), move to Trash\",\n \"surface\": \"sidebar bulk bar\",\n \"source\": \"features/notes/components/NoteSidebarBulkBar.tsx:265\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:21\",\n \"label\": \"Copy or export the whole notes list\",\n \"feature\": \"Copy or export the whole notes list: for AI (this view or all notes), JSON, CSV (this view or all)\",\n \"surface\": \"sidebar toolbar copy and export buttons\",\n \"source\": \"features/notes/components/NoteSidebar.tsx:1497\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:22\",\n \"label\": \"Refresh notes list and open tabs\",\n \"feature\": \"Refresh notes list and open tabs\",\n \"surface\": \"notes header and overflow\",\n \"source\": \"features/notes/components/NotesView.tsx:192\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Content > Refresh (note only, not the list or tabs)\"\n },\n {\n \"id\": \"audit:23\",\n \"label\": \"Split view\",\n \"feature\": \"Split view: open a second note beside the first, close split\",\n \"surface\": \"split note picker in header\",\n \"source\": \"features/notes/components/SplitNotePicker.tsx:77\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:24\",\n \"label\": \"Open a note in its own floating window\",\n \"feature\": \"Open a note in its own floating window\",\n \"surface\": \"notes actions hook\",\n \"source\": \"features/notes/actions/useOpenNoteInWindow.ts\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:25\",\n \"label\": \"Notes agents door\",\n \"feature\": \"Notes agents door (open the agents attached to the Notes feature)\",\n \"surface\": \"notes header\",\n \"source\": \"features/notes/components/NotesView.tsx:173\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"notes\",\n \"closest\": \"Intelligence > Agents\"\n },\n {\n \"id\": \"audit:26\",\n \"label\": \"Recovery actions when a save fails or a conf…\",\n \"feature\": \"Recovery actions when a save fails or a conflict appears: Retry save, Copy my text, Download my text, Reload; Keep mine / Take theirs / Merge; recovered draft: View, Restore, Copy, Discard, Recover as new note\",\n \"surface\": \"save failure banner, working copy alert, draft recovery banner and list\",\n \"source\": \"features/notes/components/NoteSaveFailureBanner.tsx:134\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:27\",\n \"label\": \"Read-only note\",\n \"feature\": \"Read-only note: Duplicate to edit (create own editable copy)\",\n \"surface\": \"read-only banner in editor\",\n \"source\": \"features/notes/components/NoteContentEditor.tsx:746\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Content > Duplicate\"\n },\n {\n \"id\": \"audit:28\",\n \"label\": \"Quick capture\",\n \"feature\": \"Quick capture: save selected text or scratch text to a new note, quick notes sheet, browse and import notes from a category\",\n \"surface\": \"save selection, save to scratch, quick note save popover, category notes modal\",\n \"source\": \"features/notes/actions/SaveSelectionButton.tsx:56\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Send & Convert > Notes\"\n },\n {\n \"id\": \"audit:29\",\n \"label\": \"Phone filter sheet\",\n \"feature\": \"Phone filter sheet: sort presets, filter by folder, by tags, shared-only, reset\",\n \"surface\": \"mobile notes filter sheet\",\n \"source\": \"features/notes/components/mobile/NotesFilterSheet.tsx:43\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"notes\"\n },\n {\n \"id\": \"audit:30\",\n \"label\": \"Per-format content actions in the phone More…\",\n \"feature\": \"Per-format content actions in the phone More sheet: Plain, PDF, Word, HTML, Markdown file, Text file, Print, Transform (opens export palette)\",\n \"surface\": \"phone More sheet\",\n \"source\": \"features/notes/components/mobile/NoteEditorDock.tsx:490\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"notes\",\n \"closest\": \"Export & Download and Send & Convert > Convert to...\"\n },\n {\n \"id\": \"audit:31\",\n \"label\": \"Keyboard-only\",\n \"feature\": \"Keyboard-only: Ctrl/Cmd+Shift+F find everywhere, Ctrl+H or Cmd+Alt+F find and replace, F3 or Cmd+G next match, Ctrl/Cmd+W close tab\",\n \"surface\": \"note shortcuts\",\n \"source\": \"features/notes/utils/noteShortcuts.ts:60\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"notes\",\n \"closest\": \"Find & Replace ⌘F and Save ⌘S only show hints\"\n },\n {\n \"id\": \"audit:32\",\n \"label\": \"Preview the file\",\n \"feature\": \"Preview the file (open the viewer)\",\n \"surface\": \"file row menu, right-click, grid/table row\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:546\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:33\",\n \"label\": \"Open\",\n \"feature\": \"Open (enter) a folder\",\n \"surface\": \"folder row menu / right-click\",\n \"source\": \"matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:198\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:34\",\n \"label\": \"Download the original file as-is\",\n \"feature\": \"Download the original file as-is (one click, no format choice)\",\n \"surface\": \"file menu, preview toolbar, image/video options, single-file header\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:552\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Export & Download\"\n },\n {\n \"id\": \"audit:35\",\n \"label\": \"Open in new tab\",\n \"feature\": \"Open in new tab / Open full view (dedicated page for the file)\",\n \"surface\": \"single-file header, preview toolbar overflow, image/video options\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/single-file/SingleFileActions.tsx:140\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:36\",\n \"label\": \"View full size\",\n \"feature\": \"View full size / lightbox for images and video\",\n \"surface\": \"image and video block options menu\",\n \"source\": \"matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:724\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:37\",\n \"label\": \"View original\",\n \"feature\": \"View original (un-processed source of an image/video)\",\n \"surface\": \"image and video block options menu\",\n \"source\": \"matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:811\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:38\",\n \"label\": \"Copy image to clipboard\",\n \"feature\": \"Copy image to clipboard (pixels, not link)\",\n \"surface\": \"image block options menu\",\n \"source\": \"matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:796\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Copy submenu (text only)\"\n },\n {\n \"id\": \"audit:39\",\n \"label\": \"Download image as another format\",\n \"feature\": \"Download image as another format (JPEG, PNG, WebP, AVIF) with descriptions\",\n \"surface\": \"image block options menu, Download as submenu\",\n \"source\": \"matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:112\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:40\",\n \"label\": \"Resize and download image\",\n \"feature\": \"Resize and download image (Large 2048, Medium 1024, Small 512, Thumbnail 256) via server-side variant render\",\n \"surface\": \"image block options menu, Resize and download submenu\",\n \"source\": \"matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:140\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:41\",\n \"label\": \"Print an image directly\",\n \"feature\": \"Print an image directly\",\n \"surface\": \"image block options menu\",\n \"source\": \"matrx-frontend/features/files/blocks/image/UnifiedImageBlockRenderer.tsx:804\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"rare\",\n \"area\": \"files\",\n \"closest\": \"Print (text-oriented)\"\n },\n {\n \"id\": \"audit:42\",\n \"label\": \"Copy link to the file or folder\",\n \"feature\": \"Copy link to the file or folder (Cmd+L)\",\n \"surface\": \"file menu, folder menu, row hover buttons, preview toolbar\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:556\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Share & Publish > Copy share link\"\n },\n {\n \"id\": \"audit:43\",\n \"label\": \"Copy page reference for a specific PDF page\",\n \"feature\": \"Copy page reference for a specific PDF page (submenu of pages)\",\n \"surface\": \"PDF file menu\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FilePageReferenceMenuSub.tsx:40\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Insert / Copy reference…\"\n },\n {\n \"id\": \"audit:44\",\n \"label\": \"Set file visibility\",\n \"feature\": \"Set file visibility: Private / Shared (link) / Public\",\n \"surface\": \"file menu Visibility submenu, bulk bar, right-click\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:737\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Share & Publish\"\n },\n {\n \"id\": \"audit:45\",\n \"label\": \"Set folder visibility\",\n \"feature\": \"Set folder visibility: Private / Organization / Anyone with the link / Public\",\n \"surface\": \"folder menu Visibility submenu\",\n \"source\": \"matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:300\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Share & Publish\"\n },\n {\n \"id\": \"audit:46\",\n \"label\": \"Share links manager\",\n \"feature\": \"Share links manager: custom expiry, permissions, revoke; per-user/group grants (read/write/admin) with optional expiry; Who can see this; Copy public link (never expires); Copy external link\",\n \"surface\": \"file share tab and media share popover\",\n \"source\": \"aidream/apps/shared/media/src/share/media-share-popover.tsx:201\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Share & Publish > Share…\"\n },\n {\n \"id\": \"audit:47\",\n \"label\": \"Share a folder\",\n \"feature\": \"Share a folder (share dialog) and Share folder button in folder header\",\n \"surface\": \"folder menu, folder content header\",\n \"source\": \"matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:210\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Share & Publish > Share…\"\n },\n {\n \"id\": \"audit:48\",\n \"label\": \"Folder settings and permissions\",\n \"feature\": \"Folder settings and permissions\",\n \"surface\": \"folder content header\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/desktop/ContentHeader.tsx:191\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:49\",\n \"label\": \"Open app\",\n \"feature\": \"Open app (open the app tied to this folder)\",\n \"surface\": \"folder content header\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/desktop/ContentHeader.tsx:209\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:50\",\n \"label\": \"New folder inside this folder\",\n \"feature\": \"New folder inside this folder\",\n \"surface\": \"folder menu and New menu\",\n \"source\": \"matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:261\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:51\",\n \"label\": \"Folder info\",\n \"feature\": \"Folder info\",\n \"surface\": \"folder menu\",\n \"source\": \"matrx-frontend/features/files/components/core/FolderContextMenu/FolderContextMenu.tsx:282\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:52\",\n \"label\": \"Up to parent folder\",\n \"feature\": \"Up to parent folder\",\n \"surface\": \"folder content header\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/desktop/ContentHeader.tsx:157\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:53\",\n \"label\": \"Show details\",\n \"feature\": \"Show details (details tab) and Info dialog (Cmd+I) for a file\",\n \"surface\": \"file menu\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:655\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:54\",\n \"label\": \"Show versions\",\n \"feature\": \"Show versions (version list, restore older version)\",\n \"surface\": \"file menu, Versions tab\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:664\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Content > View history\"\n },\n {\n \"id\": \"audit:55\",\n \"label\": \"File context\",\n \"feature\": \"File context (what the file is for, used by agents)\",\n \"surface\": \"file menu\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:633\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Organize > Set as context\"\n },\n {\n \"id\": \"audit:56\",\n \"label\": \"Open in PDF surfaces\",\n \"feature\": \"Open in PDF surfaces (PDF Studio, reader and other registry surfaces), one entry per surface\",\n \"surface\": \"PDF file menu and right-click Open in… submenu\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:573\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:57\",\n \"label\": \"Edit PDF\",\n \"feature\": \"Edit PDF / Open in Studio\",\n \"surface\": \"PDF edit tab\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/single-file/PdfEditTab.tsx:194\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:58\",\n \"label\": \"Extract text from a PDF\",\n \"feature\": \"Extract text from a PDF\",\n \"surface\": \"preview toolbar\",\n \"source\": \"matrx-frontend/features/files/components/core/FilePreview/preview-actions.ts:90\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:59\",\n \"label\": \"Convert Office document to PDF\",\n \"feature\": \"Convert Office document to PDF\",\n \"surface\": \"preview toolbar\",\n \"source\": \"matrx-frontend/features/files/components/core/FilePreview/preview-actions.ts:129\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Send & Convert > Convert to…\"\n },\n {\n \"id\": \"audit:60\",\n \"label\": \"Edit file in place\",\n \"feature\": \"Edit file in place (text, code, markdown, data, PDF hand-off)\",\n \"surface\": \"preview toolbar and Edit tab\",\n \"source\": \"matrx-frontend/features/files/components/core/FilePreview/preview-actions.ts:115\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:61\",\n \"label\": \"Office preview mode switch\",\n \"feature\": \"Office preview mode switch (rendered vs extracted markdown), copy extracted markdown, jump to a slide\",\n \"surface\": \"Office previewer\",\n \"source\": \"matrx-frontend/features/files/components/core/FilePreview/previewers/OfficePreview.tsx:424\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"rare\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:62\",\n \"label\": \"Open document view\",\n \"feature\": \"Open document view (pages, cleaned text, chunks, lineage)\",\n \"surface\": \"file menu and right-click\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:707\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:63\",\n \"label\": \"Advanced Knowledge viewer\",\n \"feature\": \"Advanced Knowledge viewer\",\n \"surface\": \"file menu\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:711\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:64\",\n \"label\": \"Reprocess for Knowledge\",\n \"feature\": \"Reprocess for Knowledge (single and bulk; skips images, audio, video, virtual)\",\n \"surface\": \"file menu, right-click, bulk bar\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:715\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:65\",\n \"label\": \"Knowledge assets\",\n \"feature\": \"Knowledge assets (derived assets for this file)\",\n \"surface\": \"file menu\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:719\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:66\",\n \"label\": \"Knowledge search\",\n \"feature\": \"Knowledge search (opens search page)\",\n \"surface\": \"file menu\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:725\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:67\",\n \"label\": \"Process for Knowledge immediately\",\n \"feature\": \"Process for Knowledge immediately (upload-time toggle)\",\n \"surface\": \"New/upload menu\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/desktop/NewMenu.tsx:232\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:68\",\n \"label\": \"Restore from Trash\",\n \"feature\": \"Restore from Trash (trash-mode only action)\",\n \"surface\": \"file menu, row menus when file is deleted\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:494\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Archive (icon strip)\"\n },\n {\n \"id\": \"audit:69\",\n \"label\": \"Move to Trash with confirm\",\n \"feature\": \"Move to Trash with confirm; Backspace/Delete key, single and batch\",\n \"surface\": \"file menu, bulk bar, shortcuts\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/useFileShortcuts.ts:423\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Content > Delete\"\n },\n {\n \"id\": \"audit:70\",\n \"label\": \"Batch actions on a multi-selection\",\n \"feature\": \"Batch actions on a multi-selection: N selected header, Download N, Move N, Reprocess N, Trash N, Visibility for all\",\n \"surface\": \"file menu in multi-select and bulk actions bar\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/desktop/BulkActionsBar.tsx:326\",\n \"coverage\": \"missing\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:71\",\n \"label\": \"Select all\",\n \"feature\": \"Select all (Cmd+A) in the file list\",\n \"surface\": \"keyboard shortcut\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/useFileShortcuts.ts:379\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Copy > Select All\"\n },\n {\n \"id\": \"audit:72\",\n \"label\": \"Paste cut/copied files or folders into the c…\",\n \"feature\": \"Paste cut/copied files or folders into the current folder (Cmd+V file clipboard)\",\n \"surface\": \"file shortcuts and folder background\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/useFileShortcuts.ts:286\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Paste (text)\"\n },\n {\n \"id\": \"audit:73\",\n \"label\": \"Upload files\",\n \"feature\": \"Upload files\",\n \"surface\": \"New menu and acquisition actions\",\n \"source\": \"matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:285\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:74\",\n \"label\": \"Upload a whole folder\",\n \"feature\": \"Upload a whole folder\",\n \"surface\": \"New menu and acquisition actions\",\n \"source\": \"matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:292\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:75\",\n \"label\": \"Choose from existing Files\",\n \"feature\": \"Choose from existing Files (picker)\",\n \"surface\": \"acquisition actions\",\n \"source\": \"matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:299\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Organize > Attach to…\"\n },\n {\n \"id\": \"audit:76\",\n \"label\": \"Connect or Import from Google Drive\",\n \"feature\": \"Connect or Import from Google Drive\",\n \"surface\": \"acquisition actions\",\n \"source\": \"matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:244\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Send & Convert > Google Connections\"\n },\n {\n \"id\": \"audit:77\",\n \"label\": \"Import from OneDrive, Dropbox or Box\",\n \"feature\": \"Import from OneDrive, Dropbox or Box\",\n \"surface\": \"acquisition actions\",\n \"source\": \"matrx-frontend/features/files/components/core/FileAcquisition/FileAcquisitionActions.tsx:383\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:78\",\n \"label\": \"Create new Word, PowerPoint or Excel documen…\",\n \"feature\": \"Create new Word, PowerPoint or Excel document with AI (AI document submenu)\",\n \"surface\": \"New menu\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/desktop/NewMenu.tsx:72\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Intelligence > Send to agent…\"\n },\n {\n \"id\": \"audit:79\",\n \"label\": \"Switch file viewer tab\",\n \"feature\": \"Switch file viewer tab: Preview, Edit, Knowledge, Analysis, Share, Info, Versions\",\n \"surface\": \"file tabs radio menu\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/FileTabsBody.tsx:104\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:80\",\n \"label\": \"Analysis tab for a file\",\n \"feature\": \"Analysis tab for a file\",\n \"surface\": \"file tabs\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/FileTabsBody.tsx:114\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:81\",\n \"label\": \"View mode toggle\",\n \"feature\": \"View mode toggle (List / Grid), Show filter (Both / Folders / Files), sidebar view (Flat folders / Folder tree)\",\n \"surface\": \"files toolbar toggles\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/desktop/ViewModeToggle.tsx:23\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:82\",\n \"label\": \"Storage usage popover\",\n \"feature\": \"Storage usage popover: storage, file count, today's uploads, max file size\",\n \"surface\": \"storage quota chip\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/desktop/StorageQuotaChip.tsx:237\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:83\",\n \"label\": \"Device folder sync\",\n \"feature\": \"Device folder sync: change direction (radio), use files for knowledge toggle, Stop syncing this folder (with consequence confirm)\",\n \"surface\": \"device sync mapping row menu\",\n \"source\": \"matrx-frontend/features/files/devices/components/MappingRow.tsx:254\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:84\",\n \"label\": \"Remote device files panel\",\n \"feature\": \"Remote device files panel: New folder, Upload, Refresh, Show hidden toggle, Undo, Move to Trash\",\n \"surface\": \"device console files panel folder actions menu\",\n \"source\": \"matrx-frontend/features/files/devices/console/FilesPanel.tsx:305\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:85\",\n \"label\": \"Fleet sync health\",\n \"feature\": \"Fleet sync health (accounts over quota, mappings stopped or degraded, devices behind)\",\n \"surface\": \"sync fleet admin page\",\n \"source\": \"matrx-frontend/features/files/devices/admin/SyncFleetClient.tsx:300\",\n \"coverage\": \"missing\",\n \"home\": \"main menu\",\n \"importance\": \"rare\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:86\",\n \"label\": \"Audio player controls\",\n \"feature\": \"Audio player controls: skip back/forward 10s, mute, volume, loop\",\n \"surface\": \"audio previewer\",\n \"source\": \"matrx-frontend/features/files/components/core/FilePreview/previewers/AudioPreview.tsx:370\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:87\",\n \"label\": \"Media lightbox actions\",\n \"feature\": \"Media lightbox actions: Share, Download, Copy, Open in the shared media toolbar\",\n \"surface\": \"shared media action toolbar and lightbox\",\n \"source\": \"aidream/apps/shared/media/src/react/media-action-toolbar.tsx:36\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Share & Publish / Export & Download\"\n },\n {\n \"id\": \"audit:88\",\n \"label\": \"Linked to\",\n \"feature\": \"Linked to: attach and detach this file to other records (search to attach, detach edge)\",\n \"surface\": \"media share popover\",\n \"source\": \"aidream/apps/shared/media/src/share/media-share-popover.tsx:492\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Organize > Attach to…\"\n },\n {\n \"id\": \"audit:89\",\n \"label\": \"Markup Rendered vs Source toggle in shared v…\",\n \"feature\": \"Markup Rendered vs Source toggle in shared viewers\",\n \"surface\": \"shared media viewers chrome\",\n \"source\": \"aidream/apps/shared/media/src/viewers/markup-chrome.tsx:58\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:90\",\n \"label\": \"Remove file from a chip or attachment\",\n \"feature\": \"Remove file from a chip or attachment\",\n \"surface\": \"file resource chip in chat/attachments\",\n \"source\": \"matrx-frontend/features/files/components/preview/FileResourceChip.tsx:176\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:91\",\n \"label\": \"Import selected Google Drive file into Files…\",\n \"feature\": \"Import selected Google Drive file into Files with chosen destination path; search Drive by name or link\",\n \"surface\": \"Google Drive library page\",\n \"source\": \"matrx-frontend/features/files/google-drive/GoogleDriveLibrary.tsx:605\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:92\",\n \"label\": \"Star a file or folder\",\n \"feature\": \"Star a file or folder (currently disabled, Coming soon)\",\n \"surface\": \"row and grid hover buttons\",\n \"source\": \"matrx-frontend/features/files/components/surfaces/desktop/FileTableRow.tsx:486\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"rare\",\n \"area\": \"files\",\n \"closest\": \"Organize > Pin\"\n },\n {\n \"id\": \"audit:93\",\n \"label\": \"Virtual-source\",\n \"feature\": \"Virtual-source (Drive/library) items: reduced menu where Copy, Duplicate, Share, Visibility are hidden but Cut and Move remain\",\n \"surface\": \"all file and folder menus for virtual sources\",\n \"source\": \"matrx-frontend/features/files/components/core/FileContextMenu/FileContextMenu.tsx:549\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:94\",\n \"label\": \"Camera capture\",\n \"feature\": \"Camera capture / hold-to-record shutter for adding photos or video\",\n \"surface\": \"capture package HoldShutter\",\n \"source\": \"aidream/apps/shared/capture/src/components/HoldShutter.tsx\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"files\"\n },\n {\n \"id\": \"audit:95\",\n \"label\": \"Format Document\",\n \"feature\": \"Format Document (and Format Selection when text is selected) in the code editor\",\n \"surface\": \"code editor right-click (Editor section)\",\n \"source\": \"matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:75-90\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:96\",\n \"label\": \"Go to Line…\",\n \"feature\": \"Go to Line…\",\n \"surface\": \"code editor right-click (Editor section)\",\n \"source\": \"matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:102\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:97\",\n \"label\": \"Toggle Word Wrap\",\n \"feature\": \"Toggle Word Wrap (a toggle in the menu)\",\n \"surface\": \"code editor right-click; also a toggle in the diff viewer toolbar\",\n \"source\": \"matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:110; aidream/apps/shared/diff/src/react/TextDiff.tsx:420\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:98\",\n \"label\": \"Command Palette…\",\n \"feature\": \"Command Palette… (F1)\",\n \"surface\": \"code editor right-click\",\n \"source\": \"matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:120\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:99\",\n \"label\": \"Attach file to chat\",\n \"feature\": \"Attach file to chat / Attach selection to chat (selection one only enabled when text is selected), plus the Cmd+Shift+L send-selection shortcut\",\n \"surface\": \"code editor right-click (Chat context section)\",\n \"source\": \"matrx-frontend/features/code/agent-context/codeEditorExtraSections.ts:46-62; features/code/editor/MonacoEditor.tsx:217\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Intelligence > Chat about this / Send to agent (no way to attach just the selection or the whole file as chat context)\"\n },\n {\n \"id\": \"audit:100\",\n \"label\": \"Save and open in the code editor\",\n \"feature\": \"Save and open in the code editor: Save to Code, and from a chat code block 'Open in code editor'\",\n \"surface\": \"rich-document actions (Save submenu; code block actions)\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/save.ts:228; handlers/answer-tools.ts:160\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"documents\",\n \"closest\": \"Send & Convert (Notes, Task, Project, Custom data) has no code destination\"\n },\n {\n \"id\": \"audit:101\",\n \"label\": \"Code block\",\n \"feature\": \"Code block: Apply to the open file (with an Undo toast), Run the code, Chart this data\",\n \"surface\": \"code block menu inside rendered content\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:204,249,283\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:102\",\n \"label\": \"Save code to Scratch\",\n \"feature\": \"Save code to Scratch (only when the content is code)\",\n \"surface\": \"rich-document Save submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/save.ts:173\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:103\",\n \"label\": \"Replace\",\n \"feature\": \"Replace (selection) and Insert below: write an AI answer back into the text it came from; Apply to source\",\n \"surface\": \"rich-document write-back actions (chat answer / agent window)\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/write-back.ts:50,62; handlers/ai.ts:121\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:104\",\n \"label\": \"Save an agent run as a shortcut\",\n \"feature\": \"Save an agent run as a shortcut; Bind a run to this page\",\n \"surface\": \"rich-document AI group\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/ai.ts:167,192\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:105\",\n \"label\": \"Clean up\",\n \"feature\": \"Clean up / Help with this… / Custom agent… (text-field AI powers, shown only when the host supports text agents)\",\n \"surface\": \"rich-document AI group; text field menus\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/ai.ts:39-83\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"documents\",\n \"closest\": \"Content > Cleanup; Help me with this; Send to agent… (no free-form Custom agent run with review and apply)\"\n },\n {\n \"id\": \"audit:106\",\n \"label\": \"Open in full-screen editor\",\n \"feature\": \"Open in full-screen editor\",\n \"surface\": \"rich-document Edit submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/fullscreen-editor.ts:18\",\n \"coverage\": \"missing\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:107\",\n \"label\": \"Edit this content in place\",\n \"feature\": \"Edit this content in place (edit) and Edit history\",\n \"surface\": \"rich-document Edit submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/edit.ts:37,182\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"documents\",\n \"closest\": \"Content > View history (history only, no edit entry, no per-message edit history)\"\n },\n {\n \"id\": \"audit:108\",\n \"label\": \"Compare with base\",\n \"feature\": \"Compare with base (the third compare verb: run the diff against the saved base)\",\n \"surface\": \"rich-document Compare submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/compare.ts:113\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"documents\",\n \"closest\": \"Compare: Set as compare base, Compare with clipboard, Open Compare Window\"\n },\n {\n \"id\": \"audit:109\",\n \"label\": \"Alchemy palette\",\n \"feature\": \"Alchemy palette (formatted, JSON, every format, send-to) opened from the overflow menu as 'Alchemy…'\",\n \"surface\": \"rich-document overflow menu where a bar is mounted\",\n \"source\": \"aidream/apps/shared/rich-content/src/rich-document/actions/export-palette-action.ts:19\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:110\",\n \"label\": \"Publish HTML\",\n \"feature\": \"Publish HTML (html-preview) and Copy HTML page / Copy HTML source / Download as HTML page\",\n \"surface\": \"rich-document Export and Copy as submenus\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/export.ts:20,103; handlers/transfer.ts:82,201\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"documents\",\n \"closest\": \"Copy > As HTML page; Export > HTML; Publish as web page (no copy of raw HTML source, no HTML preview)\"\n },\n {\n \"id\": \"audit:111\",\n \"label\": \"Send to Google Doc\",\n \"feature\": \"Send to Google Doc; Email to me\",\n \"surface\": \"rich-document Export submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/share.ts:81; handlers/export.ts:136\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"documents\",\n \"closest\": \"Send & Convert > Email, Google Connections\"\n },\n {\n \"id\": \"audit:112\",\n \"label\": \"Full print\",\n \"feature\": \"Full print (print with options) in addition to plain Print / Save PDF\",\n \"surface\": \"rich-document Export submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/print.ts:15,42\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"rare\",\n \"area\": \"documents\",\n \"closest\": \"Export & Download > Print\"\n },\n {\n \"id\": \"audit:113\",\n \"label\": \"Save as PDF document into Files\",\n \"feature\": \"Save as PDF document into Files; Save to Files; Save to Document; Save to Scratch\",\n \"surface\": \"rich-document Save submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/capture.ts:174,221; handlers/save.ts:99,289\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Send & Convert > Notes, Task, Project, Custom data (no Files, Document or Scratch destinations)\"\n },\n {\n \"id\": \"audit:114\",\n \"label\": \"Add to Rulebook\",\n \"feature\": \"Add to Rulebook; Set Context Value; Save as Message Template; Save to my Shapes (when the content holds a kind block); Save as contact (when it looks like a contact)\",\n \"surface\": \"rich-document Save/capture rows\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/capture.ts:75,113,142,282; handlers/contact.ts:28\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Organize > Set as context; Intelligence > AI Resources (Content blocks, Kind Shapes)\"\n },\n {\n \"id\": \"audit:115\",\n \"label\": \"Convert to flashcards\",\n \"feature\": \"Convert to flashcards / quiz; Save as flashcard\",\n \"surface\": \"rich-document Save submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/capture.ts:378,408\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Send & Convert > Convert to…\"\n },\n {\n \"id\": \"audit:116\",\n \"label\": \"Summarize & listen\",\n \"feature\": \"Summarize & listen; Summarize without playing\",\n \"surface\": \"rich-document promoted rows\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/listen.ts:74,87\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"documents\",\n \"closest\": \"Listen & Speak > Condense & Read\"\n },\n {\n \"id\": \"audit:117\",\n \"label\": \"Helpful\",\n \"feature\": \"Helpful / Not helpful thumbs (with undo of the verdict), shown on chat messages, notes, artifacts, working documents\",\n \"surface\": \"rich-document primary actions\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/feedback.ts:80,95\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:118\",\n \"label\": \"Attach artifact to chat\",\n \"feature\": \"Attach artifact to chat\",\n \"surface\": \"rich-document, artifact sources only\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/attach-to-chat.ts:16\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Organize > Attach to…\"\n },\n {\n \"id\": \"audit:119\",\n \"label\": \"Copy table as CSV or TSV for a spreadsheet\",\n \"feature\": \"Copy table as CSV or TSV for a spreadsheet; Save table to a table / workbook / Google Sheet (Save to menu on a rendered table)\",\n \"surface\": \"rich-document Copy as submenu; rendered-table 'Save this table to…' menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/transfer.ts:101,119,167; aidream/apps/shared/rich-content/src/display/tables/TableSaveToMenu.tsx:98-115\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\",\n \"closest\": \"Copy > Data: Copy as JSON; Send & Convert > Custom data\"\n },\n {\n \"id\": \"audit:120\",\n \"label\": \"Rendered table Export menu\",\n \"feature\": \"Rendered table Export menu: Copy as Text, Copy as Markdown, Copy as JSON, Download CSV, Download Markdown\",\n \"surface\": \"table 'Export' dropdown (MarkdownTable, TableWithSeparatedControls, StreamingTableRenderer)\",\n \"source\": \"aidream/apps/shared/rich-content/src/display/tables/MarkdownTable.tsx:160-200\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\",\n \"closest\": \"Copy > Copy as JSON; Export & Download (no CSV)\"\n },\n {\n \"id\": \"audit:121\",\n \"label\": \"Table row and column editing\",\n \"feature\": \"Table row and column editing: insert above/below/left/right, duplicate row/column, clear row/column, delete row/column\",\n \"surface\": \"row and column action menus on editable rendered tables\",\n \"source\": \"aidream/apps/shared/rich-content/src/display/tables/editing/RowActionsMenu.tsx:60-83; ColumnActionsMenu.tsx:60-83\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:122\",\n \"label\": \"Table\",\n \"feature\": \"Table: choose visible columns (hide/show), 'show all' on hidden columns\",\n \"surface\": \"streaming table toolbar\",\n \"source\": \"aidream/apps/shared/rich-content/src/display/blocks/table/StreamingTableRenderer.tsx:986-1023\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:123\",\n \"label\": \"Rich editor table menu\",\n \"feature\": \"Rich editor table menu: add row above/below, add column left/right, toggle header row, delete row, delete column, delete table; align column left/center/right\",\n \"surface\": \"rich editor table handle and bubble\",\n \"source\": \"aidream/apps/shared/rich-editor/src/visual/table-menu.ts:23-30; visual/format-actions.ts:145-147\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:124\",\n \"label\": \"Rich editor block handle\",\n \"feature\": \"Rich editor block handle: Move up, Move down, Turn into text/heading 1/heading 2/bulleted list/numbered list/checklist/quote, Delete block (drag to reorder)\",\n \"surface\": \"rich editor block grip menu (desktop)\",\n \"source\": \"aidream/apps/shared/rich-editor/src/visual/BlockHandle.tsx:139-179\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:125\",\n \"label\": \"Rich editor formatting\",\n \"feature\": \"Rich editor formatting: Bold, Italic, Strikethrough, Inline code, lists, Checklist, Quote, Link, Code block, Table, Horizontal rule, Image, Text style (Normal/H1/H2/H3)\",\n \"surface\": \"formatting toolbar and its More menu\",\n \"source\": \"aidream/apps/shared/rich-editor/src/format/FormatButtons.tsx:84-106\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:126\",\n \"label\": \"Prompt Insert menu\",\n \"feature\": \"Prompt Insert menu: insert a {{variable}}, a section tag, an example, a kind block, a context-item reference; add variable / add context item\",\n \"surface\": \"prompt editor Insert menu\",\n \"source\": \"aidream/apps/shared/rich-editor/src/format/PromptInsertMenu.tsx:105-210\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\",\n \"closest\": \"Intelligence > AI Resources (Content blocks, Kind Shapes)\"\n },\n {\n \"id\": \"audit:127\",\n \"label\": \"Rich editor tools\",\n \"feature\": \"Rich editor tools: switch view (Visual, Split, Source, Preview), Focus mode, show protected blocks as source, Keyboard shortcuts, word count\",\n \"surface\": \"rich editor toolbar and its More tools menu\",\n \"source\": \"aidream/apps/shared/rich-editor/src/editor/RichEditorImpl.tsx:717-723,865-912\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\",\n \"closest\": \"Content > Outline; Listen & Speak > Dictate (view switching, focus mode, shortcuts help not present)\"\n },\n {\n \"id\": \"audit:128\",\n \"label\": \"Mermaid diagram\",\n \"feature\": \"Mermaid diagram: choose theme, style (Classic/Hand-drawn), layout; Save as my default style\",\n \"surface\": \"diagram style dropdown\",\n \"source\": \"aidream/apps/shared/rich-content/src/display/blocks/mermaid/MermaidBlock.tsx:346-400\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:129\",\n \"label\": \"Mermaid diagram\",\n \"feature\": \"Mermaid diagram: Download SVG, Download PNG, Download source (.mmd), Save to my files, Copy source, Show/Hide source, View fullscreen, Open in canvas\",\n \"surface\": \"diagram toolbar\",\n \"source\": \"aidream/apps/shared/rich-content/src/display/blocks/mermaid/MermaidBlock.tsx:407-470\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"documents\",\n \"closest\": \"Export & Download (Markdown/Word/HTML/PDF only); Custom Export\"\n },\n {\n \"id\": \"audit:130\",\n \"label\": \"Interactive diagram editor\",\n \"feature\": \"Interactive diagram editor: Add box, Add section, line style (solid/dashed/dotted), edit nodes\",\n \"surface\": \"interactive diagram block toolbar\",\n \"source\": \"aidream/apps/shared/rich-content/src/display/blocks/diagram/InteractiveDiagramBlock.tsx:1982-2034\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:131\",\n \"label\": \"Diff review\",\n \"feature\": \"Diff review: Previous change, Next change, Accept all, Reject all, Reset, per-change Accept / Reject / Undo, expand hidden unchanged lines, Apply, Cancel\",\n \"surface\": \"diff review toolbar and hunk buttons\",\n \"source\": \"aidream/apps/shared/diff/src/react/DiffReview.tsx:382-431,514,561-623\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:132\",\n \"label\": \"Diff viewer\",\n \"feature\": \"Diff viewer: view mode (Highlight/Split/Inline), Swap sides, toggle line numbers, toggle collapsing of unchanged lines\",\n \"surface\": \"text diff toolbar\",\n \"source\": \"aidream/apps/shared/diff/src/react/TextDiff.tsx:333-446\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:133\",\n \"label\": \"Code workspace diff\",\n \"feature\": \"Code workspace diff: Accept / Reject this edit, previous/next file with pending changes, Monaco per-hunk mode\",\n \"surface\": \"editor tab diff banner\",\n \"source\": \"matrx-frontend/features/code/editor/TabDiffView.tsx:465-545,658\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:134\",\n \"label\": \"Code tab conflict and safety prompts\",\n \"feature\": \"Code tab conflict and safety prompts: Reload / Overwrite on external change, copy to connected sandbox, discard unsaved changes, open live preview\",\n \"surface\": \"code editor tabs\",\n \"source\": \"matrx-frontend/features/code/editor/EditorArea.tsx:346-364,558; EditorTab.tsx:80\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:135\",\n \"label\": \"Code file tree menu\",\n \"feature\": \"Code file tree menu: Open, Properties…, New file, New folder, Download, Rename (F2), Delete, Copy path, Refresh; and Copy tab id / Refresh source for library entries\",\n \"surface\": \"code explorer and Code Library right-click\",\n \"source\": \"matrx-frontend/features/code/views/explorer/FileTreeNode.tsx:436-499; features/code-files/file-menu.tsx:80-136; features/code/views/library/SourceEntryNode.tsx:160-190\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"files\",\n \"closest\": \"Content > Rename, Delete, Duplicate, Refresh; Copy\"\n },\n {\n \"id\": \"audit:136\",\n \"label\": \"Sandbox row menu\",\n \"feature\": \"Sandbox row menu: Open sandbox details, Extend 1 hour, Stop, Rebuild container, Delete sandbox\",\n \"surface\": \"code workspace Sandboxes panel '…' menu\",\n \"source\": \"matrx-frontend/features/code/views/sandboxes/SandboxesPanel.tsx:1132-1155\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:137\",\n \"label\": \"Conversation section on a chat answer\",\n \"feature\": \"Conversation section on a chat answer: Find in conversation, Pinned only, Share conversation, Copy conversation link, Rename, Duplicate\",\n \"surface\": \"rich-document Conversation submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/conversation-section.ts:70-183\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Share & Publish; Content > Rename, Duplicate (these act on the clicked content, not the whole conversation)\"\n },\n {\n \"id\": \"audit:138\",\n \"label\": \"Chat answer actions\",\n \"feature\": \"Chat answer actions: Continue in chat mode, Regenerate answer, Pin message, Ask a follow-up about this, Quote into chat, Edit and resubmit, Fork at this message, Fork and regenerate, Delete message, Copy with thinking\",\n \"surface\": \"rich-document chat message rows\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/chat.ts:33; answer-tools.ts:47,119; ask.ts:69,88; edit.ts:209,284,308,381; copy.ts:34\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Intelligence > Chat about this; Organize > Pin; Content > Delete\"\n },\n {\n \"id\": \"audit:139\",\n \"label\": \"Creator and admin tools\",\n \"feature\": \"Creator and admin tools: Analyze response, Debug stream, and the server-API admin family (fork at/before, hide from model, move to Trash this or this-and-after, dry run, replace with summary, restore compaction)\",\n \"surface\": \"rich-document Creator tools submenu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/creator.ts:12,43; handlers/server-api.ts:45-366\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\",\n \"closest\": \"ADMIN ACTIONS: Creator Options / Org Admin / Super Admin (no named rows)\"\n },\n {\n \"id\": \"audit:140\",\n \"label\": \"Host extras\",\n \"feature\": \"Host extras: Clear (empty a transcript pad) and host-supplied copy variants joining more than one piece of content\",\n \"surface\": \"actions.extra host actions on a bar\",\n \"source\": \"aidream/apps/shared/rich-content/src/rich-document/actions/hostActions.ts:14-45\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"documents\",\n \"closest\": \"Content > Delete; Copy\"\n },\n {\n \"id\": \"audit:141\",\n \"label\": \"Insert row above\",\n \"feature\": \"Insert row above / Insert row below (place a new record next to this one)\",\n \"surface\": \"table row and cell right-click menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:363\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:142\",\n \"label\": \"New record\",\n \"feature\": \"New record (add a row to the table)\",\n \"surface\": \"table right-click menu, toolbar Add button, board/gallery column add\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:413\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:143\",\n \"label\": \"Open record\",\n \"feature\": \"Open record (side panel / full record)\",\n \"surface\": \"table row menu and record card menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:320\",\n \"coverage\": \"missing\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:144\",\n \"label\": \"Open in new tab and Copy link\",\n \"feature\": \"Open in new tab and Copy link (to a table or record)\",\n \"surface\": \"table menu, record card menu, data home rows\",\n \"source\": \"aidream/apps/shared/records-ui/src/objectActions.ts:377\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:145\",\n \"label\": \"Add to favorites\",\n \"feature\": \"Add to favorites / Remove from favorites (star a table)\",\n \"surface\": \"table menu and data home row menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/objectActions.ts:393\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:146\",\n \"label\": \"Merge with another record\",\n \"feature\": \"Merge with another record\",\n \"surface\": \"table row menu, record card menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:350\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:147\",\n \"label\": \"Link a record\",\n \"feature\": \"Link a record (connect this row to a record in another table)\",\n \"surface\": \"table row menu, record card menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:357\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:148\",\n \"label\": \"Save row as template\",\n \"feature\": \"Save row as template\",\n \"surface\": \"table row menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:346\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:149\",\n \"label\": \"Run a row action\",\n \"feature\": \"Run a row action (Run: action name / Ask: agent action) on this row\",\n \"surface\": \"table row menu, built from the table's Row actions\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridActions.tsx:431\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:150\",\n \"label\": \"Copy record reference\",\n \"feature\": \"Copy record reference (reference chip for AI / other tools) and Copy reference to a cell or table\",\n \"surface\": \"table row and cell menu, Get reference… in table menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridAssist.tsx:240\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:151\",\n \"label\": \"Who changed this?\",\n \"feature\": \"Who changed this? (cell history, shortcut Alt+Shift+H) and Row history\",\n \"surface\": \"table cell and row menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:300\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:152\",\n \"label\": \"Cut cell, Copy cell, Paste into cell, Clear…\",\n \"feature\": \"Cut cell, Copy cell, Paste into cell, Clear cell (and Cut / Copy / Paste over / Clear for a multi-cell selection)\",\n \"surface\": \"table cell and selection menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:285\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:153\",\n \"label\": \"Fill down\",\n \"feature\": \"Fill down (Cmd+D) across a selected range, and drag-to-fill handle\",\n \"surface\": \"table selection menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:505\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:154\",\n \"label\": \"Show rows with this value\",\n \"feature\": \"Show rows with this value / Show rows where this is empty (filter by the cell)\",\n \"surface\": \"table cell menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:304\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:155\",\n \"label\": \"Edit whole text…\",\n \"feature\": \"Edit whole text… (Shift+Enter) for a long text cell, and Clean HTML\",\n \"surface\": \"table cell menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridAssist.tsx:200\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:156\",\n \"label\": \"Highlight cell\",\n \"feature\": \"Highlight cell / row / selected cells, No colour (colour picker with scope: this view or the table for everyone)\",\n \"surface\": \"table cell, row, selection menus\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridColors.tsx:408\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:157\",\n \"label\": \"Colour rows by this column, Colour only this…\",\n \"feature\": \"Colour rows by this column, Colour only this column, Colour by…, Colour rules…, Stop colouring by\",\n \"surface\": \"table column header menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridColors.tsx:357\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:158\",\n \"label\": \"Sort ascending/descending\",\n \"feature\": \"Sort ascending/descending (words adapt to type) and Clear sort\",\n \"surface\": \"column header menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:402\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:159\",\n \"label\": \"Column filters\",\n \"feature\": \"Column filters: text contains, value list with counts and exclude, number compare/between, date range presets (last hour to this year, older than), blank checks, Clear this filter, Clear all filters\",\n \"surface\": \"column header menu and toolbar eraser\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/ColumnHeaderCell.tsx:1152\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:160\",\n \"label\": \"Rename column, Column settings…, Change type…\",\n \"feature\": \"Rename column, Column settings…, Change type…, Clean column… (across every row), Duplicate property, Insert column left / right, Use as row label, Hide column, Delete column\",\n \"surface\": \"column header menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridMenus.ts:223\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:161\",\n \"label\": \"Wrap column\",\n \"feature\": \"Wrap column / Unwrap column; Summary (Count, Sum, Average, etc.) in the column footer\",\n \"surface\": \"column header menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridControls.tsx:470\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:162\",\n \"label\": \"Add column…\",\n \"feature\": \"Add column… (table-level) and What names each record…\",\n \"surface\": \"table right-click menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridControls.tsx:519\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:163\",\n \"label\": \"Row actions…\",\n \"feature\": \"Row actions… (set up the table's row buttons)\",\n \"surface\": \"table right-click menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/gridControls.tsx:529\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:164\",\n \"label\": \"Choose and reorder columns\",\n \"feature\": \"Choose and reorder columns (Columns dialog: show/hide, move earlier/later, reset to default)\",\n \"surface\": \"table toolbar\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/ColumnManager.tsx:118\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:165\",\n \"label\": \"Row height\",\n \"feature\": \"Row height (Compact/Normal/Tall), Wrap long text, Fit to width, Freeze first column\",\n \"surface\": \"table layout menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/GridLayoutMenu.tsx:92\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:166\",\n \"label\": \"Group rows by a column\",\n \"feature\": \"Group rows by a column / No groups (with group header rows)\",\n \"surface\": \"table toolbar\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/MatrxDataTable.tsx:5777\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:167\",\n \"label\": \"Drill-down analytics\",\n \"feature\": \"Drill-down analytics: Group by, Then by, Across the top, measures, Compare with, time window, drill trail, break-out, open-in-tab and Preview of a drilled item\",\n \"surface\": \"table toolbar (drill tables)\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/DrillControls.tsx:186\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:168\",\n \"label\": \"Saved views\",\n \"feature\": \"Saved views: Save current view, Update, Delete, Reload, switch view; view tabs (new, rename); Unlock a locked view; Make this the default layout\",\n \"surface\": \"table toolbar, view bar, table menu\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/SavedViewsControl.tsx:164\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:169\",\n \"label\": \"Layout switcher\",\n \"feature\": \"Layout switcher (Grid, Kanban board, Calendar, Gallery, Timeline, Sheet, Chart) plus board options (lanes, card size, card preview, hide empty groups, calculate) and calendar subscribe\",\n \"surface\": \"view bar and layout menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/BoardOptions.tsx:72\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:170\",\n \"label\": \"Filter builder\",\n \"feature\": \"Filter builder (layered filters, Filter · N) and Match any of… search, search match mode (contains / whole words), intelligent search scopes\",\n \"surface\": \"table toolbar\",\n \"source\": \"aidream/apps/shared/records-ui/src/ViewFilter.tsx:91\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:171\",\n \"label\": \"Select all N matching, Clear selection, bulk…\",\n \"feature\": \"Select all N matching, Clear selection, bulk bar with Copy / export of only the selected rows\",\n \"surface\": \"table selection bar\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/MatrxDataTable.tsx:7143\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:172\",\n \"label\": \"Copy table or rows in more formats\",\n \"feature\": \"Copy table or rows in more formats: CSV, Google Sheets paste (TSV), Compact JSON, Copy formatted, Excel workbook, EPUB book, Copy including thinking, Filter and sort before copying (rows subset window)\",\n \"surface\": \"Alchemy copy and export menu\",\n \"source\": \"aidream/apps/shared/alchemy/src/operate/formats.ts:107\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:173\",\n \"label\": \"Send rows to a Google Sheet\",\n \"feature\": \"Send rows to a Google Sheet\",\n \"surface\": \"Alchemy export menu\",\n \"source\": \"aidream/apps/shared/alchemy/src/react/workspace/matrx-copy.tsx:531\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:174\",\n \"label\": \"Copy for AI controls\",\n \"feature\": \"Copy for AI controls: Full AI context, With Prompt, detail level (Everything, Balanced, Minimal, Custom), per-section Keep / Stub / limit lengths, Customize source, Customize sections, Edit and prepare workspace\",\n \"surface\": \"Alchemy copy menu and preparation workspace\",\n \"source\": \"aidream/apps/shared/alchemy/src/react/workspace/workspace-tree.tsx:56\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:175\",\n \"label\": \"Save this content to Notes, as a Document, a…\",\n \"feature\": \"Save this content to Notes, as a Document, as a Workbook, to Code, or open a Task from it; Attach to context; Open in chat or an agent window; Email draft with review\",\n \"surface\": \"Alchemy send-to destinations\",\n \"source\": \"matrx-frontend/components/agent-copy/alchemy-destinations.ts:44\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:176\",\n \"label\": \"Import…\",\n \"feature\": \"Import… (CSV / XLSX) and Import from Notion…\",\n \"surface\": \"table menu (Share group)\",\n \"source\": \"aidream/apps/shared/records-ui/src/objectActions.ts:405\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:177\",\n \"label\": \"Table Settings, Rename table, Move table to……\",\n \"feature\": \"Table Settings, Rename table, Move table to…, Duplicate table (Copy this table), Table details, Access level\",\n \"surface\": \"table menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/objectActions.ts:388\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:178\",\n \"label\": \"Built on this table\",\n \"feature\": \"Built on this table: Forms, Dashboards, Bookings, Checklists, Notifications, Portals, Inbox, Archived records, Workflows, Automations, When a row changes run an agent\",\n \"surface\": \"table menu Built on it submenu\",\n \"source\": \"aidream/apps/shared/records-ui/src/objectActions.ts:266\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:179\",\n \"label\": \"Questions\",\n \"feature\": \"Questions (ask about the table), Turn on / off sub-items, Get reference…\",\n \"surface\": \"table menu\",\n \"source\": \"aidream/apps/shared/records-ui/src/TablePage.tsx:1667\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:180\",\n \"label\": \"Archive table\",\n \"feature\": \"Archive table; Archive record; Restore from its table (archived items); Archived records view\",\n \"surface\": \"table menu, row menu, data home\",\n \"source\": \"aidream/apps/shared/records-ui/src/objectActions.ts:425\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:181\",\n \"label\": \"Open public link\",\n \"feature\": \"Open public link (for a published table or form)\",\n \"surface\": \"data home row menu\",\n \"source\": \"matrx-frontend/features/unified-data/home/useDataHomeRowMenus.tsx:318\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:182\",\n \"label\": \"Copy table ID\",\n \"feature\": \"Copy table ID (admin) and the table's keyboard chords (Alt+Shift+L/R/D/M/F/S/E/I/H/Backspace, comma for settings)\",\n \"surface\": \"table menu shortcuts, admin item\",\n \"source\": \"matrx-frontend/features/data-tables/dataset-table-actions.tsx:79\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"rare\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:183\",\n \"label\": \"Undo the last cell edit or column delete\",\n \"feature\": \"Undo the last cell edit or column delete (cell undo, deleted column is one undo step), Undo after Archive\",\n \"surface\": \"table, record card toast\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/cell-undo.ts\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:184\",\n \"label\": \"Open a row in a window or side panel\",\n \"feature\": \"Open a row in a window or side panel (View / Edit tabs), JSON value viewer for JSON cells\",\n \"surface\": \"table row and cell\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/DataRowWindow.tsx:111\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:185\",\n \"label\": \"Table toolbar overflow\",\n \"feature\": \"Table toolbar overflow (the ... button and phone Tools sheet), Refresh, Clear search and filters, Scroll left/right\",\n \"surface\": \"table toolbar\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/ToolbarOverflow.tsx:44\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:186\",\n \"label\": \"Web page-style table cards\",\n \"feature\": \"Web page-style table cards: Show more / Rows per load and Source info (source coverage)\",\n \"surface\": \"table footer\",\n \"source\": \"aidream/apps/shared/design-system/src/data-table/MatrxDataTable.tsx:6953\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:187\",\n \"label\": \"Thumbs up\",\n \"feature\": \"Thumbs up / thumbs down (Helpful, Not helpful) on an answer, saved with the message\",\n \"surface\": \"chat assistant message bar and options menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/feedback.ts:80\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:188\",\n \"label\": \"Regenerate answer\",\n \"feature\": \"Regenerate answer (with confirm)\",\n \"surface\": \"chat assistant message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:119\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:189\",\n \"label\": \"Edit and resubmit a user message\",\n \"feature\": \"Edit and resubmit a user message (overwrites the turn and discards everything after it)\",\n \"surface\": \"chat user message bar and menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/edit.ts:308\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:190\",\n \"label\": \"Fork the conversation at this message\",\n \"feature\": \"Fork the conversation at this message (stay here or go to the new branch)\",\n \"surface\": \"chat message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/edit.ts:209\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:191\",\n \"label\": \"Fork and regenerate from here\",\n \"feature\": \"Fork and regenerate from here (user messages)\",\n \"surface\": \"chat user message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/edit.ts:381\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:192\",\n \"label\": \"Continue in chat mode\",\n \"feature\": \"Continue in chat mode (opens the full /chat page for this conversation in a new tab)\",\n \"surface\": \"chat assistant message bar\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/chat.ts:34\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:193\",\n \"label\": \"Edit history of a message\",\n \"feature\": \"Edit history of a message: see earlier versions, compare each with current, restore a version\",\n \"surface\": \"chat message menu and Edit history dialog\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/edit.ts:182\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Content > View history (does not say it is per message, nor include compare and restore of archived versions)\"\n },\n {\n \"id\": \"audit:194\",\n \"label\": \"Pin or unpin a single message\",\n \"feature\": \"Pin or unpin a single message\",\n \"surface\": \"chat message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:47\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Organize > Pin (could mean pin the item, but a message pin is a separate saved flag used by Pinned-only filter)\"\n },\n {\n \"id\": \"audit:195\",\n \"label\": \"Show only pinned messages in this conversation\",\n \"feature\": \"Show only pinned messages in this conversation (filter toggle with count)\",\n \"surface\": \"conversation header menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/conversation-section.ts:87\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:196\",\n \"label\": \"Find in conversation\",\n \"feature\": \"Find in conversation (search bar over the whole transcript, next/previous)\",\n \"surface\": \"conversation header menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/chat/ConversationPageMenu.tsx:129\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Find & Replace (searches the focused text, not the whole conversation)\"\n },\n {\n \"id\": \"audit:197\",\n \"label\": \"Rename conversation\",\n \"feature\": \"Rename conversation (inline in sidebar row and from header/panel title)\",\n \"surface\": \"sidebar row menu, header menu, chat panel title menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:185\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Content > Rename\"\n },\n {\n \"id\": \"audit:198\",\n \"label\": \"Open conversation in a new tab\",\n \"feature\": \"Open conversation in a new tab / open its agent\",\n \"surface\": \"sidebar conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:219\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:199\",\n \"label\": \"Make an agent from this chat\",\n \"feature\": \"Make an agent from this chat (Agent Studio window, single agent or Masterwork)\",\n \"surface\": \"sidebar conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:287\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:200\",\n \"label\": \"Exclude or include this conversation in the…\",\n \"feature\": \"Exclude or include this conversation in the knowledge graph\",\n \"surface\": \"sidebar conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:342\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:201\",\n \"label\": \"Remove from this list\",\n \"feature\": \"Remove from this list (context-specific, e.g. a project's chat list)\",\n \"surface\": \"sidebar conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:260\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Organize > Move to folder / Attach to\"\n },\n {\n \"id\": \"audit:202\",\n \"label\": \"Show only\",\n \"feature\": \"Show only / hide conversations from one source feature (source filter)\",\n \"surface\": \"sidebar conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:150\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:203\",\n \"label\": \"Add conversation to a project\",\n \"feature\": \"Add conversation to a project\",\n \"surface\": \"sidebar conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:253\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Send & Convert > Project\"\n },\n {\n \"id\": \"audit:204\",\n \"label\": \"Download whole conversation as JSON or EPUB\",\n \"feature\": \"Download whole conversation as JSON or EPUB (also text, markdown, web page, PDF, Word)\",\n \"surface\": \"conversation header menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/conversation-export/conversation-transfer-rows.ts:57\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Export & Download (has Markdown, Word, HTML, PDF but no plain text, JSON or EPUB)\"\n },\n {\n \"id\": \"audit:205\",\n \"label\": \"Copy whole conversation as plain text, Markd…\",\n \"feature\": \"Copy whole conversation as plain text, Markdown, formatted, or prepared for AI\",\n \"surface\": \"conversation header menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/conversation-export/conversation-transfer-rows.ts:53\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Copy submenu (same formats, but nothing says it applies to the whole conversation)\"\n },\n {\n \"id\": \"audit:206\",\n \"label\": \"Open conversation in a new chat\",\n \"feature\": \"Open conversation in a new chat\",\n \"surface\": \"conversation header menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/conversation-export/conversation-transfer-rows.ts:67\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:207\",\n \"label\": \"Send email to each person in the conversation\",\n \"feature\": \"Send email to each person in the conversation (Gmail compose)\",\n \"surface\": \"conversation header menu (only when the chat has people)\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/chat/ConversationPageMenu.tsx:197\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"chat\",\n \"closest\": \"Send & Convert > Email\"\n },\n {\n \"id\": \"audit:208\",\n \"label\": \"Open chat in full chat page\",\n \"feature\": \"Open chat in full chat page; New chat (from the docked/floating chat panel title menu)\",\n \"surface\": \"chat panel title menu\",\n \"source\": \"aidream/apps/shared/chat/src/canvas/workspace/ChatPanelTitleMenu.tsx:88\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:209\",\n \"label\": \"Open in full-screen editor\",\n \"feature\": \"Open in full-screen editor (assistant or user message)\",\n \"surface\": \"chat message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/fullscreen-editor.ts:19\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:210\",\n \"label\": \"Copy with thinking\",\n \"feature\": \"Copy with thinking / reasoning included\",\n \"surface\": \"chat assistant message menu and public chat menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/copy.ts:35\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:211\",\n \"label\": \"Copy HTML source\",\n \"feature\": \"Copy HTML source; copy table as CSV; copy table for a spreadsheet (TSV)\",\n \"surface\": \"chat message menu (tables in answers)\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/transfer.ts:83\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Copy > Data: Copy as JSON (no CSV or TSV)\"\n },\n {\n \"id\": \"audit:212\",\n \"label\": \"Save table to a data table\",\n \"feature\": \"Save table to a data table\",\n \"surface\": \"chat message menu and text-selection toolbar\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/transfer.ts:168\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Send & Convert > Custom data\"\n },\n {\n \"id\": \"audit:213\",\n \"label\": \"Chart this data\",\n \"feature\": \"Chart this data (only shown when the answer contains chartable data)\",\n \"surface\": \"chat message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:283\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Intelligence > AI Actions > Make a chart\"\n },\n {\n \"id\": \"audit:214\",\n \"label\": \"Ask a follow-up about the selected passage\",\n \"feature\": \"Ask a follow-up about the selected passage; Quote passage into chat\",\n \"surface\": \"chat message menu and selection\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/ask.ts:69\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Intelligence > Chat about this\"\n },\n {\n \"id\": \"audit:215\",\n \"label\": \"Code block\",\n \"feature\": \"Code block: Open in code editor; Save to Code files; Save and open in editor; Save code to Scratch\",\n \"surface\": \"code block kebab menu and message menu\",\n \"source\": \"aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:469\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:216\",\n \"label\": \"Code block\",\n \"feature\": \"Code block: Apply to the open file (with Undo) and Run in sandbox\",\n \"surface\": \"code block in chat answers\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/answer-tools.ts:204\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:217\",\n \"label\": \"Code block\",\n \"feature\": \"Code block: Copy with line numbers; Download as code file\",\n \"surface\": \"code block kebab menu\",\n \"source\": \"aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:435\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\",\n \"closest\": \"Copy submenu and Export & Download (no line numbers, no per-code-file download)\"\n },\n {\n \"id\": \"audit:218\",\n \"label\": \"Code block\",\n \"feature\": \"Code block: View options (word wrap, minimap, fullscreen, collapse/expand code)\",\n \"surface\": \"code block header and kebab\",\n \"source\": \"aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:360\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:219\",\n \"label\": \"Code block\",\n \"feature\": \"Code block: inline edit, Format code, Reset to original, and the code-editor AI jobs\",\n \"surface\": \"code block kebab menu\",\n \"source\": \"aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:410\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\",\n \"closest\": \"Content > Cleanup / Intelligence > AI Actions\"\n },\n {\n \"id\": \"audit:220\",\n \"label\": \"Code block\",\n \"feature\": \"Code block: Open HTML preview for a complete HTML page\",\n \"surface\": \"code block kebab menu (only complete HTML)\",\n \"source\": \"aidream/apps/shared/rich-content/src/code-block/CodeBlockHeader.tsx:452\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:221\",\n \"label\": \"Write back to source\",\n \"feature\": \"Write back to source: Replace and Insert below, Apply to source\",\n \"surface\": \"chat message menu (when message came from selected text)\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/write-back.ts:51\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:222\",\n \"label\": \"Save as shortcut\",\n \"feature\": \"Save as shortcut; Bind this run to the page it came from\",\n \"surface\": \"agent run result menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/ai.ts:167\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\"\n },\n {\n \"id\": \"audit:223\",\n \"label\": \"Save as contact\",\n \"feature\": \"Save as contact (when the text looks like a contact)\",\n \"surface\": \"chat message menu, conditional\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/contact.ts:28\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:224\",\n \"label\": \"Add to Rulebook\",\n \"feature\": \"Add to Rulebook; Set Context Value; Save as Message Template; Save to my Shapes\",\n \"surface\": \"chat message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/capture.ts:76\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Send & Convert > Add to Active Context / Custom data\"\n },\n {\n \"id\": \"audit:225\",\n \"label\": \"Save to Files\",\n \"feature\": \"Save to Files; Save as PDF document (into cloud files)\",\n \"surface\": \"chat message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/capture.ts:175\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Export & Download > PDF (downloads, does not save into the files area)\"\n },\n {\n \"id\": \"audit:226\",\n \"label\": \"Save as flashcard\",\n \"feature\": \"Save as flashcard; Convert to flashcards or quiz\",\n \"surface\": \"chat message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/capture.ts:379\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"files\",\n \"closest\": \"Send & Convert > Convert to…\"\n },\n {\n \"id\": \"audit:227\",\n \"label\": \"Summarize and listen\",\n \"feature\": \"Summarize and listen / Summarize without playing; Pause or resume reading; selection-aware read aloud\",\n \"surface\": \"chat message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/listen.ts:74\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Listen & Speak > Condense & Read (no summarize-without-playing; no pause/resume state)\"\n },\n {\n \"id\": \"audit:228\",\n \"label\": \"Full Print of all blocks including tool and…\",\n \"feature\": \"Full Print of all blocks including tool and media blocks (and Print / Save PDF)\",\n \"surface\": \"chat assistant message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/print.ts:42\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"rare\",\n \"area\": \"chat\",\n \"closest\": \"Export & Download > Print / PDF\"\n },\n {\n \"id\": \"audit:229\",\n \"label\": \"Send to Google Doc\",\n \"feature\": \"Send to Google Doc (with Connect prompt)\",\n \"surface\": \"chat message menu\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/share.ts:82\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Send & Convert > Google Connections\"\n },\n {\n \"id\": \"audit:230\",\n \"label\": \"Analyze response\",\n \"feature\": \"Analyze response; Debug stream (agent owner only)\",\n \"surface\": \"chat assistant message menu, Creator section\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/creator.ts:13\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"ADMIN ACTIONS > Creator Options (section named, items not listed)\"\n },\n {\n \"id\": \"audit:231\",\n \"label\": \"Server API test tools\",\n \"feature\": \"Server API test tools: fork before this message, hide from model, move this and everything after to Trash, dry-run delete, replace with a summary, restore compaction (super admin)\",\n \"surface\": \"chat assistant message menu, Server API section\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/server-api.ts:46\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"rare\",\n \"area\": \"chat\",\n \"closest\": \"ADMIN ACTIONS > Super Admin (section named, items not listed)\"\n },\n {\n \"id\": \"audit:232\",\n \"label\": \"Retry a failed turn\",\n \"feature\": \"Retry a failed turn; Retry now / Cancel on a provider-busy card\",\n \"surface\": \"chat error and provider retry cards\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/messages-display/assistant/ASSISTANT_MESSAGE_ACTIONS_REVIEW.md (Related table)\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:233\",\n \"label\": \"Revert code edits listed on a message\",\n \"feature\": \"Revert code edits listed on a message (message file strip)\",\n \"surface\": \"chat message file strip\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/messages-display/assistant/ASSISTANT_MESSAGE_ACTIONS_REVIEW.md (Related table)\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:234\",\n \"label\": \"Announcements and Preferences shortcuts in t…\",\n \"feature\": \"Announcements and Preferences shortcuts in the message menu\",\n \"surface\": \"chat message menu, App section\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/app.ts:11\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"rare\",\n \"area\": \"chat\",\n \"closest\": \"Help > I found a bug / Request a feature (no announcements or preferences)\"\n },\n {\n \"id\": \"audit:235\",\n \"label\": \"Copy conversation\",\n \"feature\": \"Copy conversation / message link\",\n \"surface\": \"sidebar row and conversation menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:240\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Share & Publish > Copy share link (a share link vs a plain open-in-app link are different things)\"\n },\n {\n \"id\": \"audit:236\",\n \"label\": \"Artifact bar Open menu\",\n \"feature\": \"Artifact bar Open menu: open in Canvas, Edit, Window Panel, Tool Admin\",\n \"surface\": \"artifact result bar in chat\",\n \"source\": \"aidream/apps/shared/chat/src/tool-call-visualization/components/ArtifactResultBar.tsx:187\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Intelligence > AI Resources > Artifacts (finding artifacts, not opening this one in Canvas or a window)\"\n },\n {\n \"id\": \"audit:237\",\n \"label\": \"Attach an artifact to the chat\",\n \"feature\": \"Attach an artifact to the chat\",\n \"surface\": \"artifact action\",\n \"source\": \"matrx-frontend/features/rich-document/actions/handlers/attach-to-chat.ts:16\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Organize > Attach to…\"\n },\n {\n \"id\": \"audit:238\",\n \"label\": \"Composer + menu\",\n \"feature\": \"Composer + menu: Add files or photos; Add a link; From your workspace (attach from AI Matrx); Search your knowledge\",\n \"surface\": \"composer + attach menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:264\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Organize > Attach to… ; Intelligence > AI Resources\"\n },\n {\n \"id\": \"audit:239\",\n \"label\": \"Composer + menu\",\n \"feature\": \"Composer + menu: Tools, Skills, Connections (including Google Workspace files)\",\n \"surface\": \"composer + attach menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:310\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Send & Convert > Google Connections / My connections\"\n },\n {\n \"id\": \"audit:240\",\n \"label\": \"Composer + menu\",\n \"feature\": \"Composer + menu: Environment (run on Cloud, your computers, sandboxes, persistent browser, add a sandbox or computer)\",\n \"surface\": \"composer + attach menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:613\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:241\",\n \"label\": \"Composer + menu\",\n \"feature\": \"Composer + menu: Model and overrides (model and per-run settings); All options (Chat Options window)\",\n \"surface\": \"composer + attach menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:372\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:242\",\n \"label\": \"Composer toggles\",\n \"feature\": \"Composer toggles: Preview context, Memory, Enter sends, Working doc, Scratchpad, Auto-clear, Live audio\",\n \"surface\": \"composer + attach menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:386\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:243\",\n \"label\": \"Composer + menu\",\n \"feature\": \"Composer + menu: Message templates (insert template into draft)\",\n \"surface\": \"composer + attach menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:395\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Intelligence > AI Resources > Content blocks\"\n },\n {\n \"id\": \"audit:244\",\n \"label\": \"Composer\",\n \"feature\": \"Composer: Creator panel toggle (agent creator or admin only)\",\n \"surface\": \"composer + menu, conditional\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerPlusMenu.tsx:460\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"ADMIN ACTIONS > Creator Options\"\n },\n {\n \"id\": \"audit:245\",\n \"label\": \"Composer agent pill menu\",\n \"feature\": \"Composer agent pill menu: starred chat agents, Custom, All agents, model for this chat; mode switch Chat / Work / Advanced; effort pill\",\n \"surface\": \"composer toolbar\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/inputs/smart-input/composer/ComposerAgentPill.tsx\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Intelligence > Agents / My Intelligence\"\n },\n {\n \"id\": \"audit:246\",\n \"label\": \"Context rail chips\",\n \"feature\": \"Context rail chips: open Working document, Scratchpad, Tasks and todos, Cloud browser, artifacts; overflow list\",\n \"surface\": \"chat context rail above composer\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/inputs/smart-input/ConversationContextRail.tsx:400\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:247\",\n \"label\": \"Working document view modes\",\n \"feature\": \"Working document view modes (Edit, Split, Write, Source, Preview) and Version history; scratchpad switcher with delete\",\n \"surface\": \"working document header\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/working-document/WorkingDocumentViewControls.tsx:33\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Content > View history\"\n },\n {\n \"id\": \"audit:248\",\n \"label\": \"Agent memory list\",\n \"feature\": \"Agent memory list: sort mode, per-memory options, delete memory\",\n \"surface\": \"chat agent memory sidebar and window\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/memory/components/AgentMemorySidebar.tsx:101\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:249\",\n \"label\": \"Agent menu\",\n \"feature\": \"Agent menu: Copy agent ID, Copy agent name, Open in builder, Refresh agent data\",\n \"surface\": \"agent section of the context menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/menu/agent-actions.tsx:79\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Intelligence > Agents, Insert / Copy reference\"\n },\n {\n \"id\": \"audit:250\",\n \"label\": \"Agent options menu\",\n \"feature\": \"Agent options menu: Edit Agent Info, View Run History, Advanced Settings, View All Versions, Open Run Modal, Optimizer, Find Usages, Drift Report, Refresh Server Cache, Create Shortcut, Duplicate, Linked Agent Sync, Convert to Template, Create App, Add Data Storage Support, Save as Template, Import Agent\",\n \"surface\": \"agent builder and agent cards\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:100\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"agents\",\n \"closest\": \"Content > Duplicate; Content > View history\"\n },\n {\n \"id\": \"audit:251\",\n \"label\": \"Agent card actions\",\n \"feature\": \"Agent card actions: Open in Chat, View Agent, Build Agent, Run Agent, View Versions, Find Usages (Admin)\",\n \"surface\": \"agent card and list row menus\",\n \"source\": \"matrx-frontend/features/agents/components/agent-listings/AgentCard.tsx\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:252\",\n \"label\": \"Agent mode tabs\",\n \"feature\": \"Agent mode tabs: View, Build, Run, Shortcuts, Apps, Surfaces, Review, Runs, Versions, Widgets, New\",\n \"surface\": \"agent page header controller\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/shared/AgentModeController.tsx:55\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:253\",\n \"label\": \"Public chat\",\n \"feature\": \"Public chat: View in Canvas, Add to Tasks, Share as HTML\",\n \"surface\": \"public chat message menu\",\n \"source\": \"aidream/apps/shared/chat/src/public-chat/components/PublicMessageOptionsMenu.tsx:463\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Send & Convert > Task; Share & Publish > Publish as web page\"\n },\n {\n \"id\": \"audit:254\",\n \"label\": \"Messenger menu\",\n \"feature\": \"Messenger menu: switch account or workspace entries with a checkmark; thread header and contact list actions\",\n \"surface\": \"messenger\",\n \"source\": \"aidream/apps/shared/chat/src/messenger/MessengerMenu.tsx:52\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:255\",\n \"label\": \"Follow-up suggestion chips under an answer\",\n \"feature\": \"Follow-up suggestion chips under an answer\",\n \"surface\": \"chat transcript\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/messages-display/conversation-tools/FollowUpSuggestions.tsx:67\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:256\",\n \"label\": \"Window-panel history actions\",\n \"feature\": \"Window-panel history actions: chat history window, run history, live run, run controls, message analysis, markdown debug\",\n \"surface\": \"chat window panels\",\n \"source\": \"aidream/apps/shared/chat/src/window-panels/windows/agents/ChatHistoryWindow.tsx\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:257\",\n \"label\": \"Quick Chat window\",\n \"feature\": \"Quick Chat window (small floating chat, separate from 'Chat about this')\",\n \"surface\": \"engine Quick Actions submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:935\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Intelligence > Chat about this\"\n },\n {\n \"id\": \"audit:258\",\n \"label\": \"Quick Data window\",\n \"feature\": \"Quick Data window (open data quick-sheet)\",\n \"surface\": \"engine Quick Actions submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:936\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:259\",\n \"label\": \"Quick Files window\",\n \"feature\": \"Quick Files window (open files quick-sheet)\",\n \"surface\": \"engine Quick Actions submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:937\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:260\",\n \"label\": \"Voice Input pad\",\n \"feature\": \"Voice Input pad (voice pad)\",\n \"surface\": \"engine Quick Actions submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:938\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Listen & Speak > Dictate\"\n },\n {\n \"id\": \"audit:261\",\n \"label\": \"Quick Notes and Quick Tasks capture windows\",\n \"feature\": \"Quick Notes and Quick Tasks capture windows (open the quick window, not 'send this to a note')\",\n \"surface\": \"engine Quick Actions submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:933\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Send & Convert > Notes / Task\"\n },\n {\n \"id\": \"audit:262\",\n \"label\": \"Link a record…\",\n \"feature\": \"Link a record… (link this item to another record)\",\n \"surface\": \"engine share group\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:885\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"agents\",\n \"closest\": \"Organize > Attach to…\"\n },\n {\n \"id\": \"audit:263\",\n \"label\": \"Compare with base\",\n \"feature\": \"Compare with base (second half of the compare pair, appears once a base is set)\",\n \"surface\": \"engine compare submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:836\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Content > Compare (Set as compare base / Compare with clipboard / Open Compare Window)\"\n },\n {\n \"id\": \"audit:264\",\n \"label\": \"Summarize without playing\",\n \"feature\": \"Summarize without playing / Summarize & listen (spoken summary of selection or content)\",\n \"surface\": \"engine Listen submenu (read-only content)\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:669\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Listen & Speak > Condense & Read\"\n },\n {\n \"id\": \"audit:265\",\n \"label\": \"JSON tools on JSON text\",\n \"feature\": \"JSON tools on JSON text: prettify/format, minify, copy minified, 'Invalid JSON' honest row with parse error\",\n \"surface\": \"engine JSON submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/utils/json-menu-actions.ts:110-181\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Copy > Data > Copy as JSON\"\n },\n {\n \"id\": \"audit:266\",\n \"label\": \"Bind an agent to this page…\",\n \"feature\": \"Bind an agent to this page… (attach an agent to the current screen)\",\n \"surface\": \"engine surface submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1076\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"agents\",\n \"closest\": \"My Intelligence > Customize\"\n },\n {\n \"id\": \"audit:267\",\n \"label\": \"Agents on this page\",\n \"feature\": \"Agents on this page (list of agents bound to this surface, grouped by scope/organization)\",\n \"surface\": \"engine surface submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1149\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"agents\",\n \"closest\": \"Intelligence > Agents\"\n },\n {\n \"id\": \"audit:268\",\n \"label\": \"Surface Context\",\n \"feature\": \"Surface Context (view the live page values the menu and agents can see)\",\n \"surface\": \"engine surface submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1114\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:269\",\n \"label\": \"Surface Context Admin\",\n \"feature\": \"Surface Context Admin (contract, provenance and settings editor)\",\n \"surface\": \"engine surface submenu, admin power only\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1132\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Admin Actions > Super Admin\"\n },\n {\n \"id\": \"audit:270\",\n \"label\": \"Related surfaces\",\n \"feature\": \"Related surfaces (parent and child pages of this surface, open their context)\",\n \"surface\": \"engine surface submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1158\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"rare\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:271\",\n \"label\": \"Copy surface location key\",\n \"feature\": \"Copy surface location key (click to copy the screen's internal name) and menu revision (v3.N / V#)\",\n \"surface\": \"engine surface submenu, admin debugger only\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/hooks/useContextMenuActions.ts:1103,1170\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"rare\",\n \"area\": \"agents\",\n \"closest\": \"Admin Actions > Super Admin\"\n },\n {\n \"id\": \"audit:272\",\n \"label\": \"Enable/Disable Debug Mode toggle\",\n \"feature\": \"Enable/Disable Debug Mode toggle\",\n \"surface\": \"engine Admin Tools\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:978\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Admin Actions > Super Admin\"\n },\n {\n \"id\": \"audit:273\",\n \"label\": \"Context Values inspector\",\n \"feature\": \"Context Values inspector (what values this page/menu resolves)\",\n \"surface\": \"engine Admin Tools\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:986\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Admin Actions > Super Admin\"\n },\n {\n \"id\": \"audit:274\",\n \"label\": \"Redux State viewer\",\n \"feature\": \"Redux State viewer (only while debug mode is on)\",\n \"surface\": \"engine Admin Tools\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:996\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"rare\",\n \"area\": \"agents\",\n \"closest\": \"Admin Actions > Super Admin\"\n },\n {\n \"id\": \"audit:275\",\n \"label\": \"Show/Hide Admin Indicator toggle\",\n \"feature\": \"Show/Hide Admin Indicator toggle\",\n \"surface\": \"engine Admin Tools\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:1007\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"rare\",\n \"area\": \"agents\",\n \"closest\": \"Admin Actions > Super Admin\"\n },\n {\n \"id\": \"audit:276\",\n \"label\": \"Insert\",\n \"feature\": \"Insert / Copy reference… for a record or text (insert a link/reference into an editor)\",\n \"surface\": \"engine Edit group (cm:insert-reference)\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:764\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Share & Publish > Insert / Copy reference…\"\n },\n {\n \"id\": \"audit:277\",\n \"label\": \"Copy variants shown only when relevant\",\n \"feature\": \"Copy variants shown only when relevant: 'Copy as' registry entries per document type (e.g. rich document copy variants)\",\n \"surface\": \"engine Copy as submenu\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/model/menu-model.ts:696\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Copy submenu (Text / For AI / Data)\"\n },\n {\n \"id\": \"audit:278\",\n \"label\": \"Page-own rows that merge into groups\",\n \"feature\": \"Page-own rows that merge into groups (custom per-pane rows, 'primary' clicked-target section first)\",\n \"surface\": \"engine extraSections / regroup\",\n \"source\": \"aidream/apps/shared/context-menu/src/engine/regroup/proposed-grouping.ts\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"agents\",\n \"closest\": \"THIS FEATURE NAME placeholder\"\n },\n {\n \"id\": \"audit:279\",\n \"label\": \"Source filter on a conversation row\",\n \"feature\": \"Source filter on a conversation row: Show only <source> / Hide <source>\",\n \"surface\": \"conversation row menu (history/sidebars)\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:150-170\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:280\",\n \"label\": \"Open agent for this conversation\",\n \"feature\": \"Open agent for this conversation / Open in new tab\",\n \"surface\": \"conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:219-240\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:281\",\n \"label\": \"Add to project…\",\n \"feature\": \"Add to project…\",\n \"surface\": \"conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:253\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Send & Convert > Project / Organize > Attach to…\"\n },\n {\n \"id\": \"audit:282\",\n \"label\": \"Remove from this list\",\n \"feature\": \"Remove from this list (host-labelled, e.g. remove from project)\",\n \"surface\": \"conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:261\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:283\",\n \"label\": \"Make an agent from this conversation…\",\n \"feature\": \"Make an agent from this conversation…\",\n \"surface\": \"conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:287\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:284\",\n \"label\": \"Exclude from\",\n \"feature\": \"Exclude from / include in knowledge graph toggle\",\n \"surface\": \"conversation row menu\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:342\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:285\",\n \"label\": \"Archive/Unarchive with Undo toast\",\n \"feature\": \"Archive/Unarchive with Undo toast (archive is a toggle with a way back)\",\n \"surface\": \"conversation and agent rows\",\n \"source\": \"aidream/apps/shared/chat/src/agents/components/conversation-actions/conversationActionRegistry.tsx:294-340\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"icon strip > Archive\"\n },\n {\n \"id\": \"audit:286\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Run\",\n \"surface\": \"agent row/card menu\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:120\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\",\n \"closest\": \"Intelligence > Send to agent…\"\n },\n {\n \"id\": \"audit:287\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Edit / Build, View, Quick look (sneak peek), Open in new tab\",\n \"surface\": \"agent row/card menu\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:123-134\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:288\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Edit details (name/description/category quick edit)\",\n \"surface\": \"agent row/card menu\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:156\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\",\n \"closest\": \"Content > Rename\"\n },\n {\n \"id\": \"audit:289\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Add/Remove favorite\",\n \"surface\": \"agent row/card menu\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:164\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"tables\",\n \"closest\": \"Organize > Pin\"\n },\n {\n \"id\": \"audit:290\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Version history, View all versions, Declare input/output/both break and Clear declaration (version contract breaks)\",\n \"surface\": \"agent row menu + version timeline\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:182 ; features/agents/components/diff/VersionHistoryTimeline.tsx:351\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"documents\",\n \"closest\": \"Content > View history\"\n },\n {\n \"id\": \"audit:291\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Duplicate a specific past version as a new agent\",\n \"surface\": \"version history timeline\",\n \"source\": \"matrx-frontend/features/agents/components/diff/VersionHistoryTimeline.tsx:427,522\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"documents\",\n \"closest\": \"Content > Duplicate\"\n },\n {\n \"id\": \"audit:292\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Add to set / Add to Orchestra (existing orchestra, New Orchestra with this agent, Browse all Orchestras)\",\n \"surface\": \"agent row menu + AddToOrchestraMenu\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:201 ; features/agents/orchestras/components/AddToOrchestraMenu.tsx:78-118\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:293\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Open source agent (for a copy/fork)\",\n \"surface\": \"agent row menu, conditional on source_agent_id\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:212\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:294\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Shortcuts and Surfaces pages for this agent\",\n \"surface\": \"agent row menu\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:221-228\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:295\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Create app from agent\",\n \"surface\": \"agent card, list item, builder menu\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:123\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:296\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Save as template / Convert to Template / Share as organization template (with the tables its variables read)\",\n \"surface\": \"agent card and builder menus\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:122,128\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:297\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Linked Agent Sync (create/open personal copy, pull system updates, push to system, convert to system agent)\",\n \"surface\": \"agent builder menu\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:121\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"core\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:298\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Create Shortcut from this agent\",\n \"surface\": \"agent builder menu\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:115\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:299\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Add Data Storage Support\",\n \"surface\": \"agent builder menu\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:124\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:300\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Import Agent (from file/JSON)\",\n \"surface\": \"agent builder menu (global item)\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:133\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:301\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Export agent (listed as coming soon)\",\n \"surface\": \"agent row menu\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:244\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"tables\",\n \"closest\": \"Export & Download\"\n },\n {\n \"id\": \"audit:302\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Edit Agent Info, View Run History, Advanced Settings View, Open Run Modal, Full Screen Editor (coming soon)\",\n \"surface\": \"agent builder menu\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:100-106\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:303\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Matrx Agent Optimizer\",\n \"surface\": \"agent builder menu\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:107\",\n \"coverage\": \"partial\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Intelligence > AI Actions (Improve writing)\"\n },\n {\n \"id\": \"audit:304\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Find Usages (and Find Usages Admin), Drift Report\",\n \"surface\": \"agent builder menu\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:108-109,172\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:305\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Refresh Server Cache / Refresh agent data\",\n \"surface\": \"agent builder menu + agent section\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:110 ; chat/src/agents/menu/agent-actions.tsx:107\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Content > Refresh\"\n },\n {\n \"id\": \"audit:306\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Open in Chat / View Agent / Build Agent / Run Agent / View Versions in new tab\",\n \"surface\": \"agent builder menu (new-tab links)\",\n \"source\": \"matrx-frontend/features/agents/components/shared/AgentOptionsMenu.tsx:139-168\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:307\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: Copy agent ID, Copy agent name, Copy link, Copy for AI (agent definition)\",\n \"surface\": \"agent section and registry\",\n \"source\": \"chat/src/agents/menu/agent-actions.tsx:79-96 ; agentActionRegistry.tsx:240-243\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\",\n \"closest\": \"Copy submenu\"\n },\n {\n \"id\": \"audit:308\",\n \"label\": \"Agent Sneak Peek copy variants\",\n \"feature\": \"Agent Sneak Peek copy variants: Complete agent definition, id/name/variables/slots, Full JSON with messages truncated\",\n \"surface\": \"agent sneak peek modal copy menu\",\n \"source\": \"matrx-frontend/features/agents/components/agent-listings/AgentSneakPeekModal.tsx:788-806\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Copy > For AI / Copy as JSON\"\n },\n {\n \"id\": \"audit:309\",\n \"label\": \"Agent tool list copy formats\",\n \"feature\": \"Agent tool list copy formats: full, compact, minimal, XML\",\n \"surface\": \"agent tools manager and modal\",\n \"source\": \"matrx-frontend/features/agents/components/tools-management/AgentToolsManager.tsx:1039-1088\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"agents\",\n \"closest\": \"Copy > For AI\"\n },\n {\n \"id\": \"audit:310\",\n \"label\": \"Agent admin\",\n \"feature\": \"Agent admin: Make global built-in, Move to organization (super admin; coming soon)\",\n \"surface\": \"agent row menu admin submenu\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:258-280\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"tables\",\n \"closest\": \"Admin Actions > Super Admin\"\n },\n {\n \"id\": \"audit:311\",\n \"label\": \"Agent\",\n \"feature\": \"Agent: delete disabled with read-only reason for non-owners\",\n \"surface\": \"agent row menu\",\n \"source\": \"matrx-frontend/features/agents/browse/agentActionRegistry.tsx:287\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"useful\",\n \"area\": \"tables\",\n \"closest\": \"Content > Delete / Creator Options\"\n },\n {\n \"id\": \"audit:312\",\n \"label\": \"Agent builder message\",\n \"feature\": \"Agent builder message: View mode picker (Plain / Write / Split / Read)\",\n \"surface\": \"agent builder message toolbar\",\n \"source\": \"matrx-frontend/features/agents/components/builder/message-builders/MessageViewModeMenu.tsx:55-70\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"chat\"\n },\n {\n \"id\": \"audit:313\",\n \"label\": \"Agent builder\",\n \"feature\": \"Agent builder: Add block menu (Text, Image, Audio, Video, YouTube, Questions, Speech script, Document) with edit-block\",\n \"surface\": \"agent builder message AddBlockButton\",\n \"source\": \"matrx-frontend/features/agents/components/builder/message-builders/AddBlockButton.tsx:118-203\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"chat\",\n \"closest\": \"Intelligence > AI Resources > Content blocks\"\n },\n {\n \"id\": \"audit:314\",\n \"label\": \"Agent widget tester\",\n \"feature\": \"Agent widget tester: Pick a Display Mode (open widget with each display type, test-mode badge)\",\n \"surface\": \"agent widgets page\",\n \"source\": \"matrx-frontend/features/agents/components/widgets/AgentWidgetsPage.tsx:536-560\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:315\",\n \"label\": \"Agent org chart card menu\",\n \"feature\": \"Agent org chart card menu: Open / Open Orchestra, Branch view, Copy link, Position actions (Open its job / Build its agent, Define, Rename, Fill with a person, Clear), multi-select: Make an Orchestra, Delete, drag-drop 'Place under / Add to Orchestra / hands off to' choices, health views\",\n \"surface\": \"agent org chart\",\n \"source\": \"matrx-frontend/features/agents/org-chart/components/AgentOrgChartView.tsx:671-780,556-626,879\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:316\",\n \"label\": \"Shortcut directory row\",\n \"feature\": \"Shortcut directory row: Open shortcut, Open in a new tab, Copy ID, Open its agent\",\n \"surface\": \"shortcut directory row menu\",\n \"source\": \"matrx-frontend/features/agent-shortcuts/components/ShortcutDirectory.tsx:330-356\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:317\",\n \"label\": \"Shortcut\",\n \"feature\": \"Shortcut: Duplicate, Promote to global, Link agent to shortcut, Import shortcuts, Move shortcut to Trash\",\n \"surface\": \"shortcut form/list modals\",\n \"source\": \"matrx-frontend/features/agent-shortcuts/components/DuplicateShortcutModal.tsx ; PromoteToGlobalModal.tsx ; LinkAgentToShortcutModal.tsx ; ImportShortcutsBrowserModal.tsx ; ShortcutForm.tsx:1066\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\",\n \"closest\": \"Content > Duplicate / Delete; Admin Actions\"\n },\n {\n \"id\": \"audit:318\",\n \"label\": \"Shortcut category row\",\n \"feature\": \"Shortcut category row: Add subcategory, Edit, Duplicate, Activate/Deactivate, Delete\",\n \"surface\": \"shortcut category tree row buttons\",\n \"source\": \"matrx-frontend/features/agent-shortcuts/components/CategoryTree.tsx:232-286\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:319\",\n \"label\": \"Shortcut batch editor\",\n \"feature\": \"Shortcut batch editor: Customize fields, Grid vs surfaces view, Surfaces & shortcuts selector\",\n \"surface\": \"batch shortcuts editor toolbar\",\n \"source\": \"matrx-frontend/features/agent-shortcuts/components/batch/BatchShortcutsEditor.tsx:650-720\",\n \"coverage\": \"missing\",\n \"home\": \"window\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:320\",\n \"label\": \"Workflow run\",\n \"feature\": \"Workflow run: Open run, Open workflow\",\n \"surface\": \"workflow run row/readout menu\",\n \"source\": \"matrx-frontend/features/workflow-runtime/run-actions.tsx:93,104\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"tables\"\n },\n {\n \"id\": \"audit:321\",\n \"label\": \"Workflow sneak peek copy\",\n \"feature\": \"Workflow sneak peek copy: Graph JSON (nodes+edges), Execution core (what a caller feeds it), Workflow id\",\n \"surface\": \"workflow sneak peek copy menu\",\n \"source\": \"matrx-frontend/features/workflow-runtime/listings/core/WorkflowSneakPeek.tsx:259-297\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\",\n \"closest\": \"Copy > Data > Copy as JSON\"\n },\n {\n \"id\": \"audit:322\",\n \"label\": \"Canvas pane\",\n \"feature\": \"Canvas pane: New tab\",\n \"surface\": \"canvas pane menu\",\n \"source\": \"aidream/apps/shared/canvas/src/react/CanvasPane.tsx:306\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:323\",\n \"label\": \"Canvas pane\",\n \"feature\": \"Canvas pane: Expand / Restore (fullscreen)\",\n \"surface\": \"canvas pane menu\",\n \"source\": \"aidream/apps/shared/canvas/src/react/CanvasPane.tsx:307\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:324\",\n \"label\": \"Canvas pane\",\n \"feature\": \"Canvas pane: Split right / Split down\",\n \"surface\": \"canvas pane menu\",\n \"source\": \"aidream/apps/shared/canvas/src/react/CanvasPane.tsx:866-869\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:325\",\n \"label\": \"Canvas pane\",\n \"feature\": \"Canvas pane: Pop out / Dock back\",\n \"surface\": \"canvas pane menu\",\n \"source\": \"aidream/apps/shared/canvas/src/react/CanvasPane.tsx:871-874\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:326\",\n \"label\": \"Canvas pane\",\n \"feature\": \"Canvas pane: Close tab, Close other tabs, Close pane\",\n \"surface\": \"canvas pane menu\",\n \"source\": \"aidream/apps/shared/canvas/src/react/CanvasPane.tsx:879-880,308\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"useful\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:327\",\n \"label\": \"Canvas\",\n \"feature\": \"Canvas: All tabs list (overflow tab picker) and Move tab to another pane\",\n \"surface\": \"canvas tab strip overflow\",\n \"source\": \"aidream/apps/shared/canvas/src/react/CanvasPane.tsx:682-716,837\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:328\",\n \"label\": \"Canvas output\",\n \"feature\": \"Canvas output: Print, Save as PDF, Copy image (each shown disabled with the reason when unavailable)\",\n \"surface\": \"canvas pane menu (output items)\",\n \"source\": \"aidream/apps/shared/canvas/src/react/output.ts:190-201\",\n \"coverage\": \"partial\",\n \"home\": \"main menu\",\n \"importance\": \"core\",\n \"area\": \"agents\",\n \"closest\": \"Export & Download > PDF / Print\"\n },\n {\n \"id\": \"audit:329\",\n \"label\": \"Canvas\",\n \"feature\": \"Canvas: per-kind menu items and body-contributed items (useCanvasMenuItems) and host item actions merged into the pane menu\",\n \"surface\": \"canvas pane menu\",\n \"source\": \"aidream/apps/shared/canvas/src/react/menuItems.ts ; CanvasPane.tsx:843-846\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"core\",\n \"area\": \"agents\",\n \"closest\": \"THIS FEATURE NAME placeholder\"\n },\n {\n \"id\": \"audit:330\",\n \"label\": \"Canvas keyboard shortcuts shown in menus\",\n \"feature\": \"Canvas keyboard shortcuts shown in menus: toggle canvas, expand, split, back/forward, next/previous tab, close tab\",\n \"surface\": \"canvas commands\",\n \"source\": \"aidream/apps/shared/canvas/src/core/commands.ts:44-54\",\n \"coverage\": \"missing\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"agents\"\n },\n {\n \"id\": \"audit:331\",\n \"label\": \"Terminal\",\n \"feature\": \"Terminal: Copy selection button and Paste key (long-press word select), keyboard accessory keys\",\n \"surface\": \"terminal touch UI\",\n \"source\": \"aidream/apps/shared/terminal/src/react/Terminal.tsx:591 ; core/keys.ts:58\",\n \"coverage\": \"partial\",\n \"home\": \"feature section\",\n \"importance\": \"rare\",\n \"area\": \"agents\",\n \"closest\": \"icon strip Copy / Paste\"\n }\n];\n","// src/builder/icons.tsx — the builder's icon set: every lucide icon, by name. Builder-only (it pulls\n// the whole set; the live menu takes its icons from the host instead).\nimport * as Lucide from \"lucide-react\";\nimport type { ComponentType, ReactNode } from \"react\";\n\ntype IconComponent = ComponentType<{ className?: string | undefined; strokeWidth?: number }>;\n\nconst table = Lucide as unknown as Record<string, unknown>;\n\nexport const ICON_NAMES: readonly string[] = Object.keys(table)\n .filter((k) => /^[A-Z]/.test(k) && !k.endsWith(\"Icon\") && !k.startsWith(\"Lucide\") && k !== \"Icon\" && k !== \"createLucideIcon\")\n .sort();\n\nexport function renderLucide(name: string, className?: string): ReactNode {\n const Found = table[name] as IconComponent | undefined;\n const Icon = (typeof Found === \"function\" || (typeof Found === \"object\" && Found !== null) ? Found : table.CircleHelp) as IconComponent;\n return <Icon className={className} strokeWidth={1.75} />;\n}\n"],"mappings":"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","names":["useEffect","useMemo","useRef","useState","design","design","o","o","strip","sub","Tile","jsx","Fragment","jsx","jsxs","useState","useRef","design","useEffect","useMemo","shown","Tile","o"]}
|