@ai-matrx/context-menu 0.0.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +14 -1
  3. package/dist/builder.cjs +1810 -0
  4. package/dist/builder.cjs.map +1 -0
  5. package/dist/builder.d.cts +22 -0
  6. package/dist/builder.d.ts +22 -0
  7. package/dist/builder.js +1795 -0
  8. package/dist/builder.js.map +1 -0
  9. package/dist/design-store.cjs +195 -0
  10. package/dist/design-store.cjs.map +1 -0
  11. package/dist/design-store.d.cts +42 -0
  12. package/dist/design-store.d.ts +42 -0
  13. package/dist/design-store.js +175 -0
  14. package/dist/design-store.js.map +1 -0
  15. package/dist/engine.cjs +3069 -0
  16. package/dist/engine.cjs.map +1 -0
  17. package/dist/engine.d.cts +731 -0
  18. package/dist/engine.d.ts +731 -0
  19. package/dist/engine.js +3250 -0
  20. package/dist/engine.js.map +1 -0
  21. package/dist/grouping-CB3zlD1T.d.ts +623 -0
  22. package/dist/grouping-CGcWsltu.d.cts +623 -0
  23. package/dist/host-types-AOiEYwR8.d.cts +9 -0
  24. package/dist/host-types-AOiEYwR8.d.ts +9 -0
  25. package/dist/index.cjs +583 -0
  26. package/dist/index.cjs.map +1 -0
  27. package/dist/index.d.cts +60 -0
  28. package/dist/index.d.ts +60 -0
  29. package/dist/index.js +561 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/menu-content.cjs +3146 -0
  32. package/dist/menu-content.cjs.map +1 -0
  33. package/dist/menu-content.d.cts +30 -0
  34. package/dist/menu-content.d.ts +30 -0
  35. package/dist/menu-content.js +3197 -0
  36. package/dist/menu-content.js.map +1 -0
  37. package/dist/model-CkLCR6WY.d.cts +123 -0
  38. package/dist/model-CkLCR6WY.d.ts +123 -0
  39. package/dist/react.cjs +3322 -0
  40. package/dist/react.cjs.map +1 -0
  41. package/dist/react.d.cts +133 -0
  42. package/dist/react.d.ts +133 -0
  43. package/dist/react.js +3345 -0
  44. package/dist/react.js.map +1 -0
  45. package/package.json +170 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/builder/index.ts","../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":["// @ai-matrx/context-menu/builder — the drag-and-drop menu designer (dev tool; pulls every lucide icon).\nexport { MenuBuilder, type MenuBuilderProps } from \"./MenuBuilder\";\nexport { renderLucide, ICON_NAMES } from \"./icons\";\n","// 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":"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","names":["import_react","design","design","o","o","strip","sub","import_jsx_runtime","import_jsx_runtime","design","o"]}
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { M as MenuDesign } from './model-CkLCR6WY.cjs';
4
+ import { DesignStore } from './design-store.cjs';
5
+ import '@ai-matrx/records/typed-table';
6
+ import '@ai-matrx/records/core';
7
+
8
+ interface MenuBuilderProps {
9
+ store: DesignStore;
10
+ /** A short line naming where saves go ("Live data · admin@admin.com"). */
11
+ storeLabel: string;
12
+ /** Opens with this design instead of the browser's working copy. */
13
+ initialDesign?: MenuDesign;
14
+ /** The host's account control (who saves), shown beside Save. */
15
+ accountSlot?: ReactNode;
16
+ }
17
+ declare function MenuBuilder({ store, storeLabel, initialDesign, accountSlot }: MenuBuilderProps): React.JSX.Element;
18
+
19
+ declare const ICON_NAMES: readonly string[];
20
+ declare function renderLucide(name: string, className?: string): ReactNode;
21
+
22
+ export { ICON_NAMES, MenuBuilder, type MenuBuilderProps, renderLucide };
@@ -0,0 +1,22 @@
1
+ import * as React from 'react';
2
+ import { ReactNode } from 'react';
3
+ import { M as MenuDesign } from './model-CkLCR6WY.js';
4
+ import { DesignStore } from './design-store.js';
5
+ import '@ai-matrx/records/typed-table';
6
+ import '@ai-matrx/records/core';
7
+
8
+ interface MenuBuilderProps {
9
+ store: DesignStore;
10
+ /** A short line naming where saves go ("Live data · admin@admin.com"). */
11
+ storeLabel: string;
12
+ /** Opens with this design instead of the browser's working copy. */
13
+ initialDesign?: MenuDesign;
14
+ /** The host's account control (who saves), shown beside Save. */
15
+ accountSlot?: ReactNode;
16
+ }
17
+ declare function MenuBuilder({ store, storeLabel, initialDesign, accountSlot }: MenuBuilderProps): React.JSX.Element;
18
+
19
+ declare const ICON_NAMES: readonly string[];
20
+ declare function renderLucide(name: string, className?: string): ReactNode;
21
+
22
+ export { ICON_NAMES, MenuBuilder, type MenuBuilderProps, renderLucide };