@trafica/editor 1.0.48 → 1.0.50
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +15 -4
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +15 -4
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/editor/core/DocumentModel.ts","../src/editor/core/Transaction.ts","../src/editor/core/EditorEngine.ts","../src/hooks/useEditorState.ts","../src/editor/rendering/DOMRenderer.ts","../src/editor/selection/SelectionEngine.ts","../src/editor/serialization/HTMLSerializer.ts","../src/editor/plugins/PastePlugin.ts","../src/editor/commands/index.ts","../src/components/toolbar/ToolbarButton.tsx","../src/components/toolbar/AlignmentDropdown.tsx","../src/components/toolbar/FontSizeDropdown.tsx","../src/components/toolbar/FontFamilyDropdown.tsx","../src/components/toolbar/BackgroundColorDropdown.tsx","../src/components/toolbar/TextColorDropdown.tsx","../src/components/toolbar/HorizontalRuleButton.tsx","../src/components/toolbar/ChecklistButton.tsx","../src/editor/table/TableModel.ts","../src/editor/table/TableCommands.ts","../src/components/toolbar/TableButton.tsx","../src/components/toolbar/ImageUploadButton.tsx","../src/data/specialCharacters.ts","../src/components/toolbar/SpecialCharactersButton.tsx","../src/components/toolbar/CodeBlockButton.tsx","../src/components/toolbar/SourceEditingButton.tsx","../src/editor/history/HistoryManager.ts","../src/components/toolbar/toolbarConfig.ts","../src/components/toolbar/Toolbar.tsx","../src/editor/search/SearchEngine.ts","../src/editor/search/SearchCommands.ts","../src/components/FindReplaceModal.tsx","../src/components/TableContextMenu.tsx","../src/components/toolbar/TableToolbar.tsx","../src/components/toolbar/ImageToolbar.tsx","../src/editor/serialization/JSONSerializer.ts","../src/components/EditorCore.tsx","../src/editor/table/TablePlugin.ts","../src/hooks/useEditorEngine.ts","../src/editor/serialization/MarkdownSerializer.ts","../src/editor/commands/CommandRegistry.ts","../src/components/Editor.tsx"],"names":["newTextNode","result","useSyncExternalStore","node","items","_a","_b","state","sel","tr","e","mergedChildren","escapeAttr","escapeHTML","html","setBlockType","listNode","blockNode","jsx","useState","useRef","useEffect","jsxs","ChevronDownIcon","CheckIcon","useCallback","Fragment","PRESET_COLORS","normalizeHex","RemoveColorIcon","Swatch","hexInputToPreview","isLight","_","useMemo","createPortal","label","Divider","useLayoutEffect","handleDelete","Btn","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","Sep","fig","pos","forwardRef","Editor","useImperativeHandle"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * DocumentModel\n *\n * Provides utilities for navigating, reading, and immutably modifying the\n * document tree. None of these functions mutate their inputs — they always\n * return new objects. This is the single source of truth for document shape.\n *\n * Architecture note:\n * The document is a tree: doc → [block] → [block | text]*\n * All positions are expressed as (path, offset) pairs, not DOM positions.\n * This makes every operation deterministic and testable outside the browser.\n */\n\nimport type {\n Document,\n EditorNode,\n BlockNode,\n TextNode,\n Mark,\n MarkType,\n NodePosition,\n BlockNodeType,\n NodeAttrs,\n} from '../../types';\n\n// ─── Predicates ──────────────────────────────────────────────────────────────\n\nexport function isTextNode(node: EditorNode): node is TextNode {\n return node.type === 'text';\n}\n\nexport function isBlockNode(node: EditorNode): node is BlockNode {\n return node.type !== 'text';\n}\n\n/**\n * Container blocks hold other blocks (not inline content directly).\n * Used to skip past list wrappers when finding the \"content block\" a cursor is in.\n */\nexport function isContainerBlock(type: string): boolean {\n return (\n type === 'bullet_list' || type === 'ordered_list' || type === 'check_list' ||\n type === 'table' || type === 'table_row' || type === 'table_cell' || type === 'table_header' ||\n type === 'doc'\n );\n}\n\n// ─── Path & Position Comparison ───────────────────────────────────────────────\n\n/**\n * Compare two paths in document order.\n * [0] < [0,0] < [0,1] < [1]\n * Returns -1 if a < b, 0 if equal, 1 if a > b.\n */\nexport function comparePaths(a: number[], b: number[]): -1 | 0 | 1 {\n const min = Math.min(a.length, b.length);\n for (let i = 0; i < min; i++) {\n if (a[i] < b[i]) return -1;\n if (a[i] > b[i]) return 1;\n }\n if (a.length < b.length) return -1;\n if (a.length > b.length) return 1;\n return 0;\n}\n\nexport function comparePositions(a: NodePosition, b: NodePosition): -1 | 0 | 1 {\n const c = comparePaths(a.path, b.path);\n if (c !== 0) return c;\n if (a.offset < b.offset) return -1;\n if (a.offset > b.offset) return 1;\n return 0;\n}\n\n/**\n * Return from/to in document order (from ≤ to).\n */\nexport function normalizeRange(\n from: NodePosition,\n to: NodePosition,\n): { from: NodePosition; to: NodePosition } {\n return comparePositions(from, to) <= 0 ? { from, to } : { from: to, to: from };\n}\n\n/**\n * Walk up the path to find the deepest *content* block containing it.\n * Skips container blocks (bullet_list, ordered_list, doc).\n * Used by commands to find the block to set type on, split, etc.\n */\nexport function findContentBlockPath(doc: Document, path: number[]): number[] | null {\n for (let depth = path.length; depth >= 1; depth--) {\n const candidate = path.slice(0, depth);\n const node = getNodeAtPath(doc, candidate);\n if (!node) continue;\n if (isTextNode(node as EditorNode)) continue;\n if (isContainerBlock((node as EditorNode).type)) continue;\n return candidate;\n }\n return null;\n}\n\n// ─── Navigation ──────────────────────────────────────────────────────────────\n\n/**\n * Walk a path through the document to retrieve a node.\n * path=[] returns the doc root itself.\n * path=[0] returns doc.children[0].\n * path=[0,2] returns doc.children[0].children[2].\n */\nexport function getNodeAtPath(doc: Document, path: number[]): EditorNode | Document | null {\n if (path.length === 0) return doc;\n let current: EditorNode | Document = doc;\n for (const idx of path) {\n if (isTextNode(current as EditorNode)) return null;\n const block = current as BlockNode | Document;\n const children = (block as BlockNode).children ?? (block as Document).children;\n if (!children || idx >= children.length) return null;\n current = children[idx];\n }\n return current;\n}\n\n/**\n * Immutably replace the node at path with a new node.\n * Uses structural sharing: only nodes on the path are copied.\n */\nexport function setNodeAtPath(\n doc: Document,\n path: number[],\n newNode: EditorNode,\n): Document {\n if (path.length === 0) {\n // Replacing the root — caller should use replaceDoc step instead\n return doc;\n }\n return setChildAtPath(doc, path, newNode) as Document;\n}\n\nfunction setChildAtPath(\n node: Document | EditorNode,\n path: number[],\n newNode: EditorNode,\n): Document | EditorNode {\n if (path.length === 0) return newNode;\n\n const [idx, ...rest] = path;\n const parent = node as BlockNode | Document;\n const children = [...(parent.children as EditorNode[])];\n children[idx] = setChildAtPath(children[idx], rest, newNode) as EditorNode;\n\n if ((node as Document).type === 'doc') {\n return { ...(node as Document), children: children as BlockNode[] };\n }\n return { ...(node as BlockNode), children };\n}\n\n/**\n * Insert a node into a parent's children array at a given index.\n */\nexport function insertNodeAtPath(\n doc: Document,\n parentPath: number[],\n index: number,\n newNode: EditorNode,\n): Document {\n const parent = getNodeAtPath(doc, parentPath);\n if (!parent || isTextNode(parent as EditorNode)) return doc;\n\n const block = parent as BlockNode | Document;\n const children = [...(block.children as EditorNode[])];\n children.splice(index, 0, newNode);\n\n if (parentPath.length === 0) {\n return { ...(doc as Document), children: children as BlockNode[] };\n }\n\n const updatedParent: EditorNode = { ...(block as BlockNode), children };\n return setNodeAtPath(doc, parentPath, updatedParent);\n}\n\n/**\n * Remove the node at path from the tree.\n */\nexport function removeNodeAtPath(doc: Document, path: number[]): Document {\n if (path.length === 0) return doc;\n const parentPath = path.slice(0, -1);\n const idx = path[path.length - 1];\n\n const parent = getNodeAtPath(doc, parentPath);\n if (!parent || isTextNode(parent as EditorNode)) return doc;\n\n const block = parent as BlockNode | Document;\n const children = [...(block.children as EditorNode[])];\n children.splice(idx, 1);\n\n if (parentPath.length === 0) {\n return { ...doc, children: children as BlockNode[] };\n }\n\n const updatedParent: EditorNode = { ...(block as BlockNode), children };\n return setNodeAtPath(doc, parentPath, updatedParent);\n}\n\n// ─── Text Manipulation ────────────────────────────────────────────────────────\n\n/**\n * Insert text at offset inside a TextNode at path, applying marks.\n * If the path points to a block node (e.g. empty paragraph), a new text node\n * is created and inserted as the first child, then text is placed inside it.\n * Returns the modified document AND the resolved path to the text node\n * (callers use this to correctly advance the cursor).\n */\nexport function insertTextAtPath(\n doc: Document,\n path: number[],\n offset: number,\n text: string,\n marks: Mark[],\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node) return doc;\n\n // ── Path points to a block node (empty paragraph, etc.) ──────────────────\n if (!isTextNode(node as EditorNode)) {\n const block = node as BlockNode;\n // Find or create the first text child\n if (block.children.length === 0) {\n // Truly empty block: create a new text node\n const newTextNode: TextNode = { type: 'text', text, marks };\n return setNodeAtPath(doc, path, { ...block, children: [newTextNode] });\n }\n // Has children: delegate to the first text child\n const firstTextIdx = block.children.findIndex((c) => isTextNode(c));\n if (firstTextIdx !== -1) {\n return insertTextAtPath(doc, [...path, firstTextIdx], offset, text, marks);\n }\n // No text children but has block children: prepend a new text node\n const newTextNode: TextNode = { type: 'text', text, marks };\n const updated: BlockNode = { ...block, children: [newTextNode, ...block.children] };\n return setNodeAtPath(doc, path, updated);\n }\n\n const textNode = node as TextNode;\n\n if (marksEqual(textNode.marks, marks)) {\n // Same marks: just splice the string in\n const newText = textNode.text.slice(0, offset) + text + textNode.text.slice(offset);\n return setNodeAtPath(doc, path, { ...textNode, text: newText });\n }\n\n // Different marks: split the text node into up to 3 parts\n const parentPath = path.slice(0, -1);\n const nodeIndex = path[path.length - 1];\n const before = textNode.text.slice(0, offset);\n const after = textNode.text.slice(offset);\n\n const newNodes: EditorNode[] = [];\n if (before) newNodes.push({ type: 'text', text: before, marks: textNode.marks });\n newNodes.push({ type: 'text', text, marks });\n if (after) newNodes.push({ type: 'text', text: after, marks: textNode.marks });\n\n // Remove the original node and insert the new parts\n let result = removeNodeAtPath(doc, path);\n for (let i = newNodes.length - 1; i >= 0; i--) {\n result = insertNodeAtPath(result, parentPath, nodeIndex, newNodes[i]);\n }\n return result;\n}\n\n/**\n * Delete characters in range [from, to) within a TextNode at path.\n */\nexport function deleteTextAtPath(\n doc: Document,\n path: number[],\n from: number,\n to: number,\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || !isTextNode(node as EditorNode)) return doc;\n const textNode = node as TextNode;\n const newText = textNode.text.slice(0, from) + textNode.text.slice(to);\n\n if (newText === '') {\n // Remove the empty text node entirely\n return removeNodeAtPath(doc, path);\n }\n return setNodeAtPath(doc, path, { ...textNode, text: newText });\n}\n\n// ─── Mark Application ─────────────────────────────────────────────────────────\n\n/**\n * Add a mark to an entire TextNode at path. Used internally; commands should\n * prefer applyMarkToRange for partial selections.\n */\nexport function addMarkToNode(doc: Document, path: number[], mark: Mark): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || !isTextNode(node as EditorNode)) return doc;\n const textNode = node as TextNode;\n\n if (textNode.marks.some((m) => m.type === mark.type)) return doc;\n return setNodeAtPath(doc, path, {\n ...textNode,\n marks: [...textNode.marks, mark],\n });\n}\n\n/**\n * Remove a mark from an entire TextNode at path. Internal — use removeMarkFromRange.\n */\nexport function removeMarkFromNode(\n doc: Document,\n path: number[],\n markType: MarkType,\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || !isTextNode(node as EditorNode)) return doc;\n const textNode = node as TextNode;\n return setNodeAtPath(doc, path, {\n ...textNode,\n marks: textNode.marks.filter((m) => m.type !== markType),\n });\n}\n\n/**\n * Split a TextNode at a character offset, producing two adjacent text nodes\n * that share the original's marks. Returns the path to each half.\n * If offset is at a boundary, no split is performed.\n */\nexport function splitTextNodeAt(\n doc: Document,\n path: number[],\n offset: number,\n): { doc: Document; firstPath: number[]; secondPath: number[] } {\n const node = getNodeAtPath(doc, path);\n if (!node || !isTextNode(node as EditorNode)) {\n return { doc, firstPath: path, secondPath: path };\n }\n const textNode = node as TextNode;\n\n const parentPath = path.slice(0, -1);\n const idx = path[path.length - 1];\n\n if (offset <= 0) {\n return { doc, firstPath: path, secondPath: path };\n }\n if (offset >= textNode.text.length) {\n return { doc, firstPath: path, secondPath: [...parentPath, idx + 1] };\n }\n\n const firstNode: TextNode = {\n type: 'text',\n text: textNode.text.slice(0, offset),\n marks: textNode.marks,\n };\n const secondNode: TextNode = {\n type: 'text',\n text: textNode.text.slice(offset),\n marks: textNode.marks,\n };\n\n let result = setNodeAtPath(doc, path, firstNode);\n result = insertNodeAtPath(result, parentPath, idx + 1, secondNode);\n\n return { doc: result, firstPath: path, secondPath: [...parentPath, idx + 1] };\n}\n\n/**\n * Apply (or remove) a mark across an arbitrary text range.\n * Splits text nodes at the range boundaries when offsets fall mid-node,\n * then mutates the marks of every text node strictly inside the range.\n */\nexport function applyMarkToRange(\n doc: Document,\n from: NodePosition,\n to: NodePosition,\n mark: Mark,\n): Document {\n return mutateMarksInRange(doc, from, to, (marks) =>\n marks.some((m) => m.type === mark.type) ? marks : [...marks, mark],\n );\n}\n\nexport function removeMarkFromRange(\n doc: Document,\n from: NodePosition,\n to: NodePosition,\n markType: MarkType,\n): Document {\n return mutateMarksInRange(doc, from, to, (marks) =>\n marks.filter((m) => m.type !== markType),\n );\n}\n\n/**\n * Atomically replace a mark type across a range in one pass.\n * If mark is null, the mark type is removed from every node in the range.\n * This avoids the path-shift bug that occurs when remove_mark + add_mark\n * steps are used separately in sequence.\n */\nexport function setMarkOnRange(\n doc: Document,\n from: NodePosition,\n to: NodePosition,\n markType: MarkType,\n mark: Mark | null,\n): Document {\n return mutateMarksInRange(doc, from, to, (marks) => {\n const filtered = marks.filter((m) => m.type !== markType);\n return mark ? [...filtered, mark] : filtered;\n });\n}\n\nfunction mutateMarksInRange(\n doc: Document,\n rawFrom: NodePosition,\n rawTo: NodePosition,\n mutate: (marks: Mark[]) => Mark[],\n): Document {\n const { from, to } = normalizeRange(rawFrom, rawTo);\n\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return doc;\n\n let result = doc;\n\n // Iterate in reverse so splitting earlier nodes doesn't shift later paths.\n for (let i = nodes.length - 1; i >= 0; i--) {\n const { path, node } = nodes[i];\n const isFirst = i === 0;\n const isLast = i === nodes.length - 1;\n\n let markPath = path;\n\n if (isLast && comparePaths(path, to.path) === 0 && to.offset < node.text.length) {\n const split = splitTextNodeAt(result, path, to.offset);\n result = split.doc;\n markPath = split.firstPath;\n }\n\n if (isFirst && comparePaths(path, from.path) === 0 && from.offset > 0) {\n const split = splitTextNodeAt(result, markPath, from.offset);\n result = split.doc;\n markPath = split.secondPath;\n }\n\n const target = getNodeAtPath(result, markPath);\n if (target && isTextNode(target as EditorNode)) {\n const t = target as TextNode;\n const newMarks = mutate(t.marks);\n result = setNodeAtPath(result, markPath, { ...t, marks: newMarks });\n }\n }\n\n return mergeAdjacentTextNodesInDoc(result);\n}\n\n/**\n * Walk the doc and merge consecutive text-node siblings that share identical marks.\n * Called after mark/delete operations to keep the model tidy.\n */\nexport function mergeAdjacentTextNodesInDoc(doc: Document): Document {\n function mergeChildren(children: EditorNode[]): EditorNode[] {\n const merged: EditorNode[] = [];\n for (const child of children) {\n if (isTextNode(child)) {\n const last = merged[merged.length - 1];\n if (last && isTextNode(last) && marksEqual(last.marks, child.marks)) {\n merged[merged.length - 1] = { ...last, text: last.text + child.text };\n continue;\n }\n merged.push(child);\n } else {\n const block = child as BlockNode;\n merged.push({ ...block, children: mergeChildren(block.children) });\n }\n }\n return merged;\n }\n\n return { ...doc, children: mergeChildren(doc.children) as BlockNode[] };\n}\n\n/**\n * Delete the text in [from, to). Handles three cases:\n * 1. Both positions in the same text node → splice the string.\n * 2. Both positions in the same content block but different text nodes →\n * trim the from-node tail, remove middle nodes, trim the to-node head.\n * 3. Positions in different content blocks → trim each end, remove blocks in\n * between, then join the surviving blocks.\n * Returns the new document and the resulting collapsed cursor position.\n */\nexport function deleteRange(\n doc: Document,\n rawFrom: NodePosition,\n rawTo: NodePosition,\n): { doc: Document; cursor: NodePosition } {\n const { from, to } = normalizeRange(rawFrom, rawTo);\n if (comparePositions(from, to) === 0) return { doc, cursor: from };\n\n // Case 1: same text node\n if (comparePaths(from.path, to.path) === 0) {\n const node = getNodeAtPath(doc, from.path);\n if (node && isTextNode(node as EditorNode)) {\n const t = node as TextNode;\n const newText = t.text.slice(0, from.offset) + t.text.slice(to.offset);\n const result =\n newText === ''\n ? removeNodeAtPath(doc, from.path)\n : setNodeAtPath(doc, from.path, { ...t, text: newText });\n return {\n doc: mergeAdjacentTextNodesInDoc(result),\n cursor: { path: from.path, offset: from.offset },\n };\n }\n return { doc, cursor: from };\n }\n\n const fromBlockPath = findContentBlockPath(doc, from.path);\n const toBlockPath = findContentBlockPath(doc, to.path);\n if (!fromBlockPath || !toBlockPath) return { doc, cursor: from };\n\n // Case 2: same content block, different text nodes\n if (comparePaths(fromBlockPath, toBlockPath) === 0) {\n const result = deleteWithinBlock(doc, from, to);\n return {\n doc: mergeAdjacentTextNodesInDoc(result),\n cursor: { path: from.path, offset: from.offset },\n };\n }\n\n // Case 3: cross-block delete + join\n let result = doc;\n result = trimBlockAfter(result, fromBlockPath, from);\n const toBlockPathAfter = toBlockPath;\n result = trimBlockBefore(result, toBlockPathAfter, to);\n result = removeBlocksBetween(result, fromBlockPath, toBlockPathAfter);\n\n // For same-depth same-parent blocks, join at that level.\n // For cross-depth (e.g. list_item[0,0] → paragraph[N]), join at the top level\n // so the to-block's content merges into the from-block's top-level ancestor.\n const sameLevelSameParent =\n fromBlockPath.length === toBlockPath.length &&\n JSON.stringify(fromBlockPath.slice(0, -1)) === JSON.stringify(toBlockPath.slice(0, -1));\n const joinPath = sameLevelSameParent\n ? [...fromBlockPath.slice(0, -1), fromBlockPath[fromBlockPath.length - 1] + 1]\n : [fromBlockPath[0] + 1];\n result = joinBlocks(result, joinPath);\n\n return {\n doc: mergeAdjacentTextNodesInDoc(result),\n cursor: { path: from.path, offset: from.offset },\n };\n}\n\nfunction deleteWithinBlock(doc: Document, from: NodePosition, to: NodePosition): Document {\n let result = doc;\n\n // Step 1: trim to-node head (remove [0, to.offset))\n const toNode = getNodeAtPath(result, to.path);\n if (toNode && isTextNode(toNode as EditorNode)) {\n const t = toNode as TextNode;\n if (to.offset >= t.text.length) {\n result = removeNodeAtPath(result, to.path);\n } else if (to.offset > 0) {\n result = setNodeAtPath(result, to.path, { ...t, text: t.text.slice(to.offset) });\n }\n }\n\n // Step 2: remove all text nodes strictly between from.path and to.path (exclusive)\n // We re-fetch each pass since paths shift after each removal. Walk in reverse.\n const between = collectPathsStrictlyBetween(result, from.path, to.path);\n for (let i = between.length - 1; i >= 0; i--) {\n result = removeNodeAtPath(result, between[i]);\n }\n\n // Step 3: trim from-node tail (remove [from.offset, end))\n const fromNode = getNodeAtPath(result, from.path);\n if (fromNode && isTextNode(fromNode as EditorNode)) {\n const t = fromNode as TextNode;\n if (from.offset <= 0) {\n result = removeNodeAtPath(result, from.path);\n } else if (from.offset < t.text.length) {\n result = setNodeAtPath(result, from.path, { ...t, text: t.text.slice(0, from.offset) });\n }\n }\n\n return result;\n}\n\nfunction collectPathsStrictlyBetween(\n doc: Document,\n from: number[],\n to: number[],\n): number[][] {\n const results: number[][] = [];\n walkDocument(doc, (node, path) => {\n if (!isTextNode(node as EditorNode)) return;\n if (comparePaths(path, from) > 0 && comparePaths(path, to) < 0) {\n results.push([...path]);\n }\n });\n return results;\n}\n\nfunction trimBlockAfter(doc: Document, blockPath: number[], from: NodePosition): Document {\n let result = doc;\n // Trim from-node tail\n const fromNode = getNodeAtPath(result, from.path);\n if (fromNode && isTextNode(fromNode as EditorNode)) {\n const t = fromNode as TextNode;\n if (from.offset <= 0) {\n result = removeNodeAtPath(result, from.path);\n } else if (from.offset < t.text.length) {\n result = setNodeAtPath(result, from.path, { ...t, text: t.text.slice(0, from.offset) });\n }\n }\n // Remove later children of the block (after from.path within blockPath)\n const block = getNodeAtPath(result, blockPath);\n if (block && !isTextNode(block as EditorNode)) {\n const b = block as BlockNode;\n const fromChildIdx = from.path[blockPath.length];\n const keep = b.children.slice(0, fromChildIdx + 1);\n result = setNodeAtPath(result, blockPath, { ...b, children: keep });\n }\n return result;\n}\n\nfunction trimBlockBefore(doc: Document, blockPath: number[], to: NodePosition): Document {\n let result = doc;\n // Trim to-node head\n const toNode = getNodeAtPath(result, to.path);\n if (toNode && isTextNode(toNode as EditorNode)) {\n const t = toNode as TextNode;\n if (to.offset >= t.text.length) {\n result = removeNodeAtPath(result, to.path);\n } else if (to.offset > 0) {\n result = setNodeAtPath(result, to.path, { ...t, text: t.text.slice(to.offset) });\n }\n }\n // Remove earlier children of the block (before to.path within blockPath)\n const block = getNodeAtPath(result, blockPath);\n if (block && !isTextNode(block as EditorNode)) {\n const b = block as BlockNode;\n const toChildIdx = to.path[blockPath.length];\n const keep = b.children.slice(toChildIdx);\n result = setNodeAtPath(result, blockPath, { ...b, children: keep });\n }\n return result;\n}\n\nfunction removeBlocksBetween(doc: Document, fromBlockPath: number[], toBlockPath: number[]): Document {\n const fromTop = fromBlockPath[0];\n const toTop = toBlockPath[0];\n\n // Cross-depth or different top-level ancestors: remove top-level blocks strictly\n // between fromTop and toTop so the join step can merge the survivors.\n if (fromBlockPath.length !== toBlockPath.length || fromTop !== toTop) {\n let result = doc;\n for (let i = toTop - 1; i > fromTop; i--) {\n result = removeNodeAtPath(result, [i]);\n }\n return result;\n }\n\n // Same depth, same top-level ancestor: remove siblings strictly between the two paths.\n const parent = fromBlockPath.slice(0, -1);\n for (let i = 0; i < parent.length; i++) {\n if (parent[i] !== toBlockPath[i]) return doc;\n }\n const fromIdx = fromBlockPath[fromBlockPath.length - 1];\n const toIdx = toBlockPath[toBlockPath.length - 1];\n let result = doc;\n for (let i = toIdx - 1; i > fromIdx; i--) {\n result = removeNodeAtPath(result, [...parent, i]);\n }\n return result;\n}\n\n// ─── Block Manipulation ───────────────────────────────────────────────────────\n\n/**\n * Split a block at a character offset (measured in flat text of the block).\n * Preserves marks: each side keeps the formatting it had.\n * The second block's type is decided by SPLIT_TYPE_RULES (e.g. heading → paragraph,\n * list_item → list_item).\n */\nexport function splitBlock(doc: Document, path: number[], offset: number): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || isTextNode(node as EditorNode)) return doc;\n const block = node as BlockNode;\n\n const { left, right } = splitChildrenAtOffset(block.children, offset);\n\n const secondType: BlockNodeType = SPLIT_TYPE_RULES[block.type] ?? 'paragraph';\n const firstBlock: BlockNode = { ...block, children: left };\n const secondBlock: BlockNode = {\n type: secondType,\n attrs: secondType === block.type ? { ...block.attrs } : {},\n children: right,\n };\n\n const parentPath = path.slice(0, -1);\n const blockIndex = path[path.length - 1];\n\n let result = removeNodeAtPath(doc, path);\n result = insertNodeAtPath(result, parentPath, blockIndex, secondBlock);\n result = insertNodeAtPath(result, parentPath, blockIndex, firstBlock);\n return result;\n}\n\n/**\n * When you press Enter inside a block of `type`, the *new* block created below\n * should be of this type. Most content blocks split into a paragraph; lists\n * and code blocks continue as the same type.\n */\nconst SPLIT_TYPE_RULES: Partial<Record<BlockNodeType, BlockNodeType>> = {\n paragraph: 'paragraph',\n heading: 'paragraph',\n blockquote: 'paragraph',\n list_item: 'list_item',\n check_list_item: 'check_list_item',\n code_block: 'code_block',\n};\n\n/**\n * Split a children array into two halves at a flat text offset, preserving marks.\n * Text nodes that span the split point are sliced; both halves keep the original marks.\n */\nfunction splitChildrenAtOffset(\n children: EditorNode[],\n offset: number,\n): { left: EditorNode[]; right: EditorNode[] } {\n const left: EditorNode[] = [];\n const right: EditorNode[] = [];\n let consumed = 0;\n let done = false;\n\n for (const child of children) {\n if (done) {\n right.push(child);\n continue;\n }\n if (isTextNode(child)) {\n const len = child.text.length;\n if (consumed + len <= offset) {\n left.push(child);\n consumed += len;\n continue;\n }\n const cut = offset - consumed;\n if (cut > 0) {\n left.push({ ...child, text: child.text.slice(0, cut) });\n }\n if (cut < len) {\n right.push({ ...child, text: child.text.slice(cut) });\n }\n done = true;\n } else {\n // Non-text child: keep on left until offset is reached, then on right.\n // For mixed content blocks we don't try to split inside an inline block.\n const len = collectText(child as BlockNode).length;\n if (consumed + len <= offset) {\n left.push(child);\n consumed += len;\n } else {\n right.push(child);\n done = true;\n }\n }\n }\n\n return { left, right };\n}\n\n/**\n * Join the block at path with the previous sibling block.\n */\nexport function joinBlocks(doc: Document, path: number[]): Document {\n const idx = path[path.length - 1];\n if (idx === 0) return doc;\n\n const parentPath = path.slice(0, -1);\n const prevPath = [...parentPath, idx - 1];\n\n const prevNode = getNodeAtPath(doc, prevPath);\n const curNode = getNodeAtPath(doc, path);\n\n if (\n !prevNode ||\n !curNode ||\n isTextNode(prevNode as EditorNode) ||\n isTextNode(curNode as EditorNode)\n )\n return doc;\n\n const prevBlock = prevNode as BlockNode;\n const curBlock = curNode as BlockNode;\n\n const mergedChildren = [...prevBlock.children, ...curBlock.children];\n const mergedBlock: BlockNode = { ...prevBlock, children: mergedChildren };\n\n let result = removeNodeAtPath(doc, path);\n result = setNodeAtPath(result, prevPath, mergedBlock);\n return mergeAdjacentTextNodesInDoc(result);\n}\n\n/**\n * Merge attrs into a block node without changing its type.\n * Values in `attrs` override existing attrs; keys set to undefined are removed.\n */\nexport function setNodeAttrs(\n doc: Document,\n path: number[],\n attrs: NodeAttrs,\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || isTextNode(node as EditorNode)) return doc;\n const block = node as BlockNode;\n // Merge: explicit undefined values remove the key\n const merged: NodeAttrs = { ...block.attrs };\n for (const [k, v] of Object.entries(attrs)) {\n if (v === undefined) {\n delete merged[k];\n } else {\n merged[k] = v;\n }\n }\n return setNodeAtPath(doc, path, { ...block, attrs: merged });\n}\n\n/**\n * Change the type of a block node.\n */\nexport function setBlockType(\n doc: Document,\n path: number[],\n nodeType: BlockNodeType,\n attrs: NodeAttrs = {},\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || isTextNode(node as EditorNode)) return doc;\n const block = node as BlockNode;\n return setNodeAtPath(doc, path, { ...block, type: nodeType, attrs: { ...block.attrs, ...attrs } });\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Flatten all text content of a block node into a single string.\n */\nexport function collectText(node: BlockNode | Document): string {\n return (node.children as EditorNode[])\n .map((child) => {\n if (isTextNode(child)) return child.text;\n if (isBlockNode(child)) return collectText(child as BlockNode);\n return '';\n })\n .join('');\n}\n\n/**\n * Check if two mark arrays are equivalent (type AND attrs must match).\n * Attrs comparison prevents adjacent text nodes with different font-size/link\n * marks from being incorrectly merged into one.\n */\nexport function marksEqual(a: Mark[], b: Mark[]): boolean {\n if (a.length !== b.length) return false;\n const sortedA = [...a].sort((x, y) => x.type.localeCompare(y.type));\n const sortedB = [...b].sort((x, y) => x.type.localeCompare(y.type));\n return sortedA.every((m, i) => {\n if (m.type !== sortedB[i].type) return false;\n const aAttrs = m.attrs ?? {};\n const bAttrs = sortedB[i].attrs ?? {};\n const aKeys = Object.keys(aAttrs);\n const bKeys = Object.keys(bAttrs);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((k) => aAttrs[k] === bAttrs[k]);\n });\n}\n\n/**\n * Create an empty paragraph block.\n */\nexport function createParagraph(text = ''): BlockNode {\n return {\n type: 'paragraph',\n attrs: {},\n children: text ? [{ type: 'text', text, marks: [] }] : [],\n };\n}\n\n/**\n * Create an empty document.\n */\nexport function createEmptyDocument(): Document {\n return {\n type: 'doc',\n children: [createParagraph()],\n };\n}\n\n/**\n * Walk every node in the document (depth-first), calling visitor.\n * Visitor receives (node, path). Return false to stop traversal.\n */\nexport function walkDocument(\n doc: Document,\n visitor: (node: EditorNode | Document, path: number[]) => boolean | void,\n): void {\n function walk(node: EditorNode | Document, path: number[]): boolean {\n const result = visitor(node, path);\n if (result === false) return false;\n\n if (!isTextNode(node as EditorNode)) {\n const parent = node as BlockNode | Document;\n const children = parent.children as EditorNode[];\n for (let i = 0; i < children.length; i++) {\n if (!walk(children[i], [...path, i])) return false;\n }\n }\n return true;\n }\n walk(doc, []);\n}\n\n/**\n * Walk the document and collect all unique values of a specific mark attribute.\n * Used to populate \"Document colors\" sections in color pickers.\n * Returns values in first-seen order, deduplicated.\n */\nexport function getDocumentMarkAttrValues(\n doc: Document,\n markType: MarkType,\n attrKey: string,\n): string[] {\n const seen = new Set<string>();\n walkDocument(doc, (node) => {\n if (!isTextNode(node as EditorNode)) return;\n const m = (node as TextNode).marks.find((mk) => mk.type === markType);\n const v = m?.attrs?.[attrKey];\n if (typeof v === 'string' && v) seen.add(v);\n });\n return [...seen];\n}\n\n/**\n * Compute the total text length of the document (sum of all text nodes).\n */\nexport function getDocumentLength(doc: Document): number {\n let len = 0;\n walkDocument(doc, (node) => {\n if (isTextNode(node as EditorNode)) {\n len += (node as TextNode).text.length;\n }\n });\n return len;\n}\n\n/**\n * Return the absolute character offset of `nodePos` within its immediate parent block.\n * Used to map positions through text-node splits caused by mark operations.\n */\nexport function getCharOffsetInBlock(\n doc: Document,\n blockPath: number[],\n nodePos: NodePosition,\n): number {\n const block = getNodeAtPath(doc, blockPath);\n if (!block || !('children' in block)) return nodePos.offset;\n const children = (block as BlockNode).children;\n const targetIdx = nodePos.path[blockPath.length] ?? 0;\n let offset = 0;\n for (let i = 0; i < targetIdx && i < children.length; i++) {\n const child = children[i];\n if (isTextNode(child as EditorNode)) offset += (child as TextNode).text.length;\n }\n return offset + nodePos.offset;\n}\n\n/**\n * Inverse of getCharOffsetInBlock — find the (path, offset) in `newDoc` that\n * corresponds to a given character offset within a block. Handles the case\n * where text nodes were split/merged since the char offset was captured.\n */\nexport function getPosFromCharOffset(\n newDoc: Document,\n blockPath: number[],\n charOffset: number,\n): NodePosition {\n const block = getNodeAtPath(newDoc, blockPath);\n if (!block || !('children' in block)) return { path: [...blockPath, 0], offset: charOffset };\n const children = (block as BlockNode).children;\n let remaining = charOffset;\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (!isTextNode(child as EditorNode)) continue;\n const len = (child as TextNode).text.length;\n if (remaining <= len) return { path: [...blockPath, i], offset: remaining };\n remaining -= len;\n }\n // Clamp to end of last text node\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n if (isTextNode(child as EditorNode)) {\n return { path: [...blockPath, i], offset: (child as TextNode).text.length };\n }\n }\n return { path: [...blockPath, 0], offset: 0 };\n}\n\n/**\n * Find all text nodes that fall within a selection range (inclusive of both ends).\n * Caller must pass `from` and `to` in document order; use normalizeRange first.\n */\nexport function getTextNodesBetween(\n doc: Document,\n from: NodePosition,\n to: NodePosition,\n): Array<{ path: number[]; node: TextNode }> {\n const results: Array<{ path: number[]; node: TextNode }> = [];\n\n walkDocument(doc, (node, path) => {\n if (!isTextNode(node as EditorNode)) return;\n if (comparePaths(path, from.path) >= 0 && comparePaths(path, to.path) <= 0) {\n results.push({ path: [...path], node: node as TextNode });\n }\n });\n\n return results;\n}\n","/**\n * Transaction Engine\n *\n * A Transaction is a list of Steps applied atomically to produce a new\n * EditorState. This is the ONLY way state changes — never mutate state directly.\n *\n * Architecture (ProseMirror-inspired):\n * dispatch(transaction) → apply steps → new EditorState → notify listeners\n *\n * Why transactions?\n * 1. Undo/redo: store the inverse transaction, replay to undo.\n * 2. Plugins: intercept and modify transactions before apply.\n * 3. Collaboration: merge remote transactions via OT/CRDT.\n * 4. Debugging: log every change as a serializable step list.\n */\n\nimport type {\n EditorState,\n Transaction,\n Step,\n Document,\n EditorSelection,\n Mark,\n} from '../../types';\n\nimport {\n insertTextAtPath,\n deleteTextAtPath,\n insertNodeAtPath,\n removeNodeAtPath,\n splitBlock,\n joinBlocks,\n setBlockType,\n setNodeAttrs,\n applyMarkToRange,\n removeMarkFromRange,\n setMarkOnRange,\n deleteRange,\n getNodeAtPath,\n normalizeRange,\n getCharOffsetInBlock,\n getPosFromCharOffset,\n collectText,\n} from './DocumentModel';\n\nimport type { TextNode, NodePosition } from '../../types';\n\n// ─── Transaction Builder ──────────────────────────────────────────────────────\n\nlet txCounter = 0;\n\n/**\n * Create a new empty transaction.\n */\nexport function createTransaction(meta: Record<string, unknown> = {}): Transaction {\n return {\n id: `tx-${++txCounter}-${Date.now()}`,\n steps: [],\n meta,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Add a step to an existing transaction (returns a new transaction object).\n */\nexport function addStep(tr: Transaction, step: Step): Transaction {\n return { ...tr, steps: [...tr.steps, step] };\n}\n\n// ─── Apply Transaction ────────────────────────────────────────────────────────\n\n/**\n * Apply a transaction to the current state, producing a new state.\n * This is a pure function: same inputs → same output.\n */\nexport function applyTransaction(state: EditorState, tr: Transaction): EditorState {\n let doc = state.doc;\n let selection = state.selection;\n let marks = state.marks;\n\n for (const step of tr.steps) {\n switch (step.type) {\n case 'insert_text':\n doc = insertTextAtPath(doc, step.path, step.offset, step.text, step.marks);\n break;\n\n case 'delete_text':\n doc = deleteTextAtPath(doc, step.path, step.from, step.to);\n break;\n\n case 'delete_range': {\n const result = deleteRange(doc, step.from, step.to);\n doc = result.doc;\n selection = {\n anchor: result.cursor,\n focus: result.cursor,\n isCollapsed: true,\n };\n break;\n }\n\n case 'insert_node':\n doc = insertNodeAtPath(doc, step.parentPath, step.index, step.node);\n break;\n\n case 'delete_node':\n doc = removeNodeAtPath(doc, step.path);\n break;\n\n case 'split_block':\n doc = splitBlock(doc, step.path, step.offset);\n break;\n\n case 'join_blocks': {\n const joinIdx = step.path[step.path.length - 1];\n const prevPath = [...step.path.slice(0, -1), joinIdx - 1];\n const prevNode = getNodeAtPath(doc, prevPath);\n const prevTextLen = prevNode && 'children' in prevNode\n ? collectText(prevNode as import('../../types').BlockNode).length\n : 0;\n doc = joinBlocks(doc, step.path);\n const joinPos = getPosFromCharOffset(doc, prevPath, prevTextLen);\n selection = { anchor: joinPos, focus: joinPos, isCollapsed: true };\n break;\n }\n\n case 'set_node_type':\n doc = setBlockType(doc, step.path, step.nodeType, step.attrs);\n break;\n\n case 'set_node_attrs':\n doc = setNodeAttrs(doc, step.path, step.attrs);\n break;\n\n case 'add_mark':\n case 'remove_mark':\n case 'set_mark': {\n // Capture char-based positions before text-node splits so we can\n // restore the selection accurately after mergeAdjacentTextNodesInDoc.\n const { from: nFrom, to: nTo } = normalizeRange(step.from, step.to);\n const fromBlock = nFrom.path.slice(0, -1);\n const toBlock = nTo.path.slice(0, -1);\n const sameBlock = JSON.stringify(fromBlock) === JSON.stringify(toBlock);\n const fromChar = getCharOffsetInBlock(doc, fromBlock, nFrom);\n const toChar = sameBlock\n ? getCharOffsetInBlock(doc, toBlock, nTo)\n : getCharOffsetInBlock(doc, toBlock, nTo);\n\n if (step.type === 'add_mark') {\n doc = applyMarkToRange(doc, step.from, step.to, step.mark);\n } else if (step.type === 'remove_mark') {\n doc = removeMarkFromRange(doc, step.from, step.to, step.markType);\n } else {\n doc = setMarkOnRange(doc, step.from, step.to, step.markType, step.mark);\n }\n\n // Fix up selection so it spans the (possibly re-pathed) marked region.\n if (selection && !selection.isCollapsed) {\n const newFrom = getPosFromCharOffset(doc, fromBlock, fromChar);\n const newTo = getPosFromCharOffset(doc, toBlock, toChar);\n // Preserve anchor/focus direction from the original selection.\n const { from: origFrom } = normalizeRange(selection.anchor, selection.focus);\n const anchorWasFirst =\n JSON.stringify(origFrom) === JSON.stringify(selection.anchor);\n selection = {\n anchor: anchorWasFirst ? newFrom : newTo,\n focus: anchorWasFirst ? newTo : newFrom,\n isCollapsed: false,\n };\n }\n break;\n }\n\n case 'set_selection':\n selection = step.selection;\n // When cursor moves to a collapsed position, inherit marks from the\n // text node at the cursor so toolbar state reflects the context.\n if (selection && selection.isCollapsed) {\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && node.type === 'text') {\n marks = (node as TextNode).marks;\n }\n }\n break;\n\n case 'replace_doc':\n doc = step.doc;\n selection = null;\n break;\n\n default:\n console.warn('[EditorEngine] Unknown step type:', (step as Step).type);\n }\n }\n\n // Merge pending marks from the transaction if provided\n if (tr.meta.pendingMarks !== undefined) {\n marks = tr.meta.pendingMarks as Mark[];\n }\n\n return {\n doc,\n selection,\n marks,\n version: state.version + 1,\n };\n}\n\n// ─── Convenience Transaction Builders ─────────────────────────────────────────\n// These are helpers used by commands so commands don't need to know step shapes.\n\nexport function tr_insertText(\n path: number[],\n offset: number,\n text: string,\n marks: Mark[],\n): Step {\n return { type: 'insert_text', path, offset, text, marks };\n}\n\nexport function tr_deleteText(path: number[], from: number, to: number): Step {\n return { type: 'delete_text', path, from, to };\n}\n\nexport function tr_deleteRange(from: NodePosition, to: NodePosition): Step {\n return { type: 'delete_range', from, to };\n}\n\nexport function tr_splitBlock(path: number[], offset: number): Step {\n return { type: 'split_block', path, offset };\n}\n\nexport function tr_joinBlocks(path: number[]): Step {\n return { type: 'join_blocks', path };\n}\n\nexport function tr_setNodeType(\n path: number[],\n nodeType: import('../../types').BlockNodeType,\n attrs?: import('../../types').NodeAttrs,\n): Step {\n return { type: 'set_node_type', path, nodeType, attrs };\n}\n\nexport function tr_addMark(\n from: import('../../types').NodePosition,\n to: import('../../types').NodePosition,\n mark: Mark,\n): Step {\n return { type: 'add_mark', from, to, mark };\n}\n\nexport function tr_removeMark(\n from: import('../../types').NodePosition,\n to: import('../../types').NodePosition,\n markType: import('../../types').MarkType,\n): Step {\n return { type: 'remove_mark', from, to, markType };\n}\n\nexport function tr_setSelection(\n selection: EditorSelection | null,\n): Step {\n return { type: 'set_selection', selection };\n}\n\nexport function tr_replaceDoc(doc: Document): Step {\n return { type: 'replace_doc', doc };\n}\n\nexport function tr_setNodeAttrs(path: number[], attrs: import('../../types').NodeAttrs): Step {\n return { type: 'set_node_attrs', path, attrs };\n}\n\nexport function tr_setMark(\n from: import('../../types').NodePosition,\n to: import('../../types').NodePosition,\n markType: import('../../types').MarkType,\n mark: Mark | null,\n): Step {\n return { type: 'set_mark', from, to, markType, mark };\n}\n","/**\n * EditorEngine\n *\n * The central controller of the editor. It owns:\n * - the current EditorState (immutable)\n * - the plugin registry\n * - the subscriber list (React re-renders listen here)\n *\n * The engine is framework-agnostic. React hooks wrap it for component use.\n * This means the same engine could power a terminal editor, a native app, etc.\n *\n * Data flow:\n * User action → Command → Transaction → dispatch() → applyTransaction()\n * → new EditorState → notify subscribers → React re-render → DOM update\n *\n * The DOM is NEVER the source of truth. It is always derived from EditorState.\n */\n\nimport type {\n EditorState,\n Transaction,\n EditorPlugin,\n EditorEngineInterface,\n StateListener,\n} from '../../types';\n\nimport { applyTransaction, createTransaction } from './Transaction';\nimport { createEmptyDocument } from './DocumentModel';\n\nexport class EditorEngine implements EditorEngineInterface {\n private state: EditorState;\n private plugins: EditorPlugin[] = [];\n private listeners: Set<StateListener> = new Set();\n\n constructor(initialState?: Partial<EditorState>) {\n this.state = {\n doc: initialState?.doc ?? createEmptyDocument(),\n selection: initialState?.selection ?? null,\n marks: initialState?.marks ?? [],\n version: 0,\n };\n }\n\n // ─── State Access ───────────────────────────────────────────────────────────\n\n getState(): EditorState {\n return this.state;\n }\n\n // ─── Dispatch ───────────────────────────────────────────────────────────────\n\n /**\n * The single entry point for all state changes.\n *\n * 1. Let plugins intercept and transform the transaction.\n * 2. Apply the (possibly modified) transaction to produce a new state.\n * 3. Notify all subscribers.\n *\n * Transactions are synchronous. Never dispatch inside a plugin's onTransaction\n * handler (it would cause re-entrancy). Use setTimeout if you need deferred\n * dispatch (rare).\n */\n dispatch(tr: Transaction): void {\n // Plugin interception phase\n let intercepted = tr;\n for (const plugin of this.plugins) {\n if (plugin.onTransaction) {\n intercepted = plugin.onTransaction(intercepted, this.state);\n }\n }\n\n const prevState = this.state;\n this.state = applyTransaction(this.state, intercepted);\n\n // Notify plugins of state change\n for (const plugin of this.plugins) {\n if (plugin.onStateChange) {\n plugin.onStateChange(this.state, prevState);\n }\n }\n\n // Notify React subscribers\n for (const listener of this.listeners) {\n listener(this.state, prevState);\n }\n }\n\n // ─── Plugin Registry ────────────────────────────────────────────────────────\n\n registerPlugin(plugin: EditorPlugin): void {\n if (this.plugins.some((p) => p.name === plugin.name)) {\n console.warn(`[EditorEngine] Plugin \"${plugin.name}\" is already registered.`);\n return;\n }\n this.plugins.push(plugin);\n if (plugin.init) {\n plugin.init(this);\n }\n }\n\n getPlugin<T extends EditorPlugin>(name: string): T | undefined {\n return this.plugins.find((p) => p.name === name) as T | undefined;\n }\n\n getPlugins(): EditorPlugin[] {\n return [...this.plugins];\n }\n\n // ─── Subscriptions ──────────────────────────────────────────────────────────\n\n /**\n * Subscribe to state changes. Returns an unsubscribe function.\n * This is what React hooks use to trigger re-renders.\n */\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n // ─── Keyboard Dispatch ──────────────────────────────────────────────────────\n\n /**\n * Handle a keyboard event. Plugins register key bindings; the engine\n * tries them in registration order and stops at the first that returns true.\n */\n handleKeyDown(event: KeyboardEvent): boolean {\n const key = buildKeyString(event);\n\n for (const plugin of this.plugins) {\n if (plugin.keyBindings && plugin.keyBindings[key]) {\n const handled = plugin.keyBindings[key](this);\n if (handled) {\n event.preventDefault();\n return true;\n }\n }\n }\n return false;\n }\n\n // ─── Convenience ────────────────────────────────────────────────────────────\n\n /**\n * Create a new transaction. Commands call this before adding steps.\n */\n createTransaction(meta?: Record<string, unknown>): Transaction {\n return createTransaction(meta);\n }\n}\n\n/**\n * Build a canonical key string from a KeyboardEvent.\n * Examples: 'Ctrl+b', 'Shift+Alt+ArrowDown', 'Enter'\n */\nfunction buildKeyString(event: KeyboardEvent): string {\n const parts: string[] = [];\n if (event.ctrlKey || event.metaKey) parts.push('Ctrl');\n if (event.altKey) parts.push('Alt');\n if (event.shiftKey) parts.push('Shift');\n parts.push(event.key);\n return parts.join('+');\n}\n\n// ─── Singleton factory ────────────────────────────────────────────────────────\n\n/**\n * Create a new EditorEngine instance.\n * Each editor instance on the page gets its own engine.\n */\nexport function createEditorEngine(initialState?: Partial<EditorState>): EditorEngine {\n return new EditorEngine(initialState);\n}\n","/**\n * useEditorState\n *\n * Subscribes a React component to an EditorEngine and re-renders\n * whenever the state changes. This is the React integration layer.\n *\n * This hook uses React's useSyncExternalStore — the correct primitive\n * for subscribing to external mutable stores in React 18+.\n * It avoids the tearing issues of useEffect+setState patterns.\n */\n\n'use client';\n\nimport { useSyncExternalStore } from 'react';\nimport type { EditorEngine } from '../editor/core/EditorEngine';\nimport type { EditorState } from '../types';\n\nexport function useEditorState(engine: EditorEngine): EditorState {\n return useSyncExternalStore(\n (onStoreChange) => engine.subscribe(() => onStoreChange()),\n () => engine.getState(),\n () => engine.getState(), // server snapshot (SSR)\n );\n}\n","/**\n * DOMRenderer\n *\n * Converts our document model into DOM elements and keeps them in sync.\n *\n * Architecture:\n * renderDocument(doc, container) → wipes container, rebuilds DOM from scratch.\n *\n * Why rebuild instead of diff?\n * For this engine we use \"controlled full render\" — similar to how React\n * worked before the virtual DOM. For a production editor with very large\n * documents you would layer a diffing reconciler on top. For our purposes\n * the controlled render + cursor restoration pattern is correct and fast\n * enough for documents up to ~50,000 characters.\n *\n * The KEY contract of this renderer:\n * Every rendered element that corresponds to a TextNode gets:\n * data-path=\"[0,1,2]\" ← the path to that node in the document tree\n * This is what SelectionEngine uses to map between DOM and model positions.\n *\n * Marks map to HTML elements:\n * bold → <strong>\n * italic → <em>\n * underline → <u>\n * strikethrough → <s>\n * code → <code>\n * link → <a href=\"...\">\n * highlight → <mark>\n *\n * Block nodes map to:\n * paragraph → <p>\n * heading → <h1>...<h6>\n * blockquote → <blockquote>\n * bullet_list → <ul>\n * ordered_list→ <ol>\n * list_item → <li>\n * code_block → <pre><code>\n * image → <img>\n * hard_break → <br>\n */\n\nimport type {\n Document,\n EditorNode,\n BlockNode,\n TextNode,\n Mark,\n} from '../../types';\n\nimport { isTextNode, isBlockNode } from '../core/DocumentModel';\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Render the entire document into the container element.\n * Clears existing content and rebuilds from the model.\n */\nexport function renderDocument(doc: Document, container: HTMLElement): void {\n container.innerHTML = '';\n for (let i = 0; i < doc.children.length; i++) {\n const blockEl = renderBlock(doc.children[i], [i]);\n container.appendChild(blockEl);\n }\n}\n\n// ─── Block Rendering ──────────────────────────────────────────────────────────\n\nfunction renderBlock(node: BlockNode, path: number[]): HTMLElement {\n switch (node.type) {\n case 'paragraph':\n return renderParagraph(node, path);\n case 'heading':\n return renderHeading(node, path);\n case 'blockquote':\n return renderBlockquote(node, path);\n case 'bullet_list':\n return renderList(node, path, 'ul');\n case 'ordered_list':\n return renderList(node, path, 'ol');\n case 'list_item':\n return renderListItem(node, path);\n case 'code_block':\n return renderCodeBlock(node, path);\n case 'image':\n return renderImage(node, path);\n case 'hard_break':\n return renderHardBreak();\n case 'check_list':\n return renderCheckList(node, path);\n case 'check_list_item':\n return renderCheckListItem(node, path);\n case 'horizontal_rule':\n return renderHorizontalRule();\n case 'table':\n return renderTable(node, path);\n case 'table_row':\n return renderTableRow(node, path);\n case 'table_cell':\n return renderTableCell(node, path);\n case 'table_header':\n return renderTableHeader(node, path);\n default:\n return renderParagraph(node, path);\n }\n}\n\n// ─── Alignment ────────────────────────────────────────────────────────────────\n\nfunction alignClass(node: BlockNode): string {\n const align = node.attrs?.align as string | undefined;\n return align && align !== 'left' ? ` editor-align-${align}` : '';\n}\n\nfunction renderParagraph(node: BlockNode, path: number[]): HTMLElement {\n const el = document.createElement('p');\n el.dataset.blockPath = JSON.stringify(path);\n el.className = `editor-paragraph${alignClass(node)}`;\n renderChildren(node, path, el);\n if (el.innerHTML === '') {\n // Ensure empty paragraphs are clickable / show a cursor\n el.appendChild(document.createElement('br'));\n }\n return el;\n}\n\nfunction renderHeading(node: BlockNode, path: number[]): HTMLElement {\n const level = (node.attrs?.level as number) ?? 1;\n const el = document.createElement(`h${level}`) as HTMLElement;\n el.dataset.blockPath = JSON.stringify(path);\n el.className = `editor-heading editor-heading-${level}${alignClass(node)}`;\n renderChildren(node, path, el);\n if (el.innerHTML === '') el.appendChild(document.createElement('br'));\n return el;\n}\n\nfunction renderBlockquote(node: BlockNode, path: number[]): HTMLElement {\n const el = document.createElement('blockquote');\n el.dataset.blockPath = JSON.stringify(path);\n el.className = `editor-blockquote${alignClass(node)}`;\n renderChildren(node, path, el);\n return el;\n}\n\nfunction renderList(node: BlockNode, path: number[], tag: 'ul' | 'ol'): HTMLElement {\n const el = document.createElement(tag);\n el.dataset.blockPath = JSON.stringify(path);\n el.className = tag === 'ul' ? 'editor-bullet-list' : 'editor-ordered-list';\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childPath = [...path, i];\n if (isBlockNode(child)) {\n const li = renderBlock(child as BlockNode, childPath);\n el.appendChild(li);\n }\n }\n\n if (el.children.length === 0) {\n // Empty list: add a placeholder li\n const li = document.createElement('li');\n li.appendChild(document.createElement('br'));\n el.appendChild(li);\n }\n\n return el;\n}\n\nfunction renderListItem(node: BlockNode, path: number[]): HTMLElement {\n const el = document.createElement('li');\n el.dataset.blockPath = JSON.stringify(path);\n el.className = `editor-list-item${alignClass(node)}`;\n renderChildren(node, path, el);\n if (el.innerHTML === '') el.appendChild(document.createElement('br'));\n return el;\n}\n\nconst CODE_BLOCK_LANGUAGE_LABELS: Record<string, string> = {\n plaintext: 'Plain text', c: 'C', cs: 'C#', cpp: 'C++', css: 'CSS',\n diff: 'Diff', go: 'Go', html: 'HTML', java: 'Java', javascript: 'JavaScript',\n json: 'JSON', php: 'PHP', python: 'Python', sql: 'SQL',\n typescript: 'TypeScript', xml: 'XML',\n};\n\nfunction renderCodeBlock(node: BlockNode, path: number[]): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.dataset.blockPath = JSON.stringify(path);\n wrapper.className = 'editor-code-block-wrapper';\n\n const lang = (node.attrs?.language as string | undefined) ?? '';\n\n // Language label header (CKEditor-style)\n const header = document.createElement('div');\n header.className = 'editor-code-block-header';\n header.contentEditable = 'false';\n header.textContent = CODE_BLOCK_LANGUAGE_LABELS[lang] ?? (lang || 'Plain text');\n wrapper.appendChild(header);\n\n const pre = document.createElement('pre');\n pre.className = 'editor-code-block';\n if (lang) pre.dataset.language = lang;\n\n const code = document.createElement('code');\n if (lang) code.className = `language-${lang}`;\n\n renderChildren(node, path, code);\n if (code.innerHTML === '') {\n code.appendChild(document.createElement('br'));\n } else if ((code.textContent ?? '').endsWith('\\n')) {\n // Browser collapses a trailing \\n in <pre>, making cursor invisible on the new line.\n // Append a phantom \\n (DOM-only) so the browser renders the cursor correctly.\n code.appendChild(document.createTextNode('\\n'));\n }\n\n pre.appendChild(code);\n wrapper.appendChild(pre);\n return wrapper;\n}\n\nfunction renderImage(node: BlockNode, path: number[]): HTMLElement {\n const wrapper = document.createElement('figure');\n wrapper.dataset.blockPath = JSON.stringify(path);\n wrapper.dataset.imagePath = JSON.stringify(path);\n wrapper.contentEditable = 'false';\n\n const align = node.attrs?.align as string | undefined;\n const fx = node.attrs?.x as number | undefined;\n const fy = node.attrs?.y as number | undefined;\n wrapper.className = [\n 'editor-image-wrapper',\n fx !== undefined ? 'editor-image-floating' : '',\n !fx && align === 'center' ? 'editor-image-center' : '',\n !fx && align === 'right' ? 'editor-image-right' : '',\n !fx && align === 'left' ? 'editor-image-left' : '',\n ].filter(Boolean).join(' ');\n if (fx !== undefined) {\n wrapper.style.left = `${fx}px`;\n wrapper.style.top = `${fy ?? 0}px`;\n }\n\n const img = document.createElement('img');\n img.src = (node.attrs?.src as string) ?? '';\n img.alt = (node.attrs?.alt as string) ?? '';\n img.className = 'editor-image';\n img.draggable = false;\n if (node.attrs?.width) (img as HTMLImageElement).style.width = `${node.attrs.width as number}px`;\n\n wrapper.appendChild(img);\n\n // Caption\n const caption = node.attrs?.caption as string | undefined;\n if (caption !== undefined) {\n const figcaption = document.createElement('figcaption');\n figcaption.className = 'editor-image-caption';\n figcaption.textContent = caption;\n wrapper.appendChild(figcaption);\n }\n\n // Resize handles (corners) — shown only when wrapper[data-selected]\n for (const pos of ['nw', 'ne', 'sw', 'se'] as const) {\n const handle = document.createElement('div');\n handle.className = `editor-image-resize-handle editor-image-resize-${pos}`;\n handle.contentEditable = 'false';\n handle.dataset.resizeImagePath = JSON.stringify(path);\n handle.dataset.resizeImagePos = pos;\n wrapper.appendChild(handle);\n }\n\n return wrapper;\n}\n\nfunction renderHardBreak(): HTMLElement {\n const span = document.createElement('span');\n span.appendChild(document.createElement('br'));\n return span;\n}\n\nfunction renderCheckList(node: BlockNode, path: number[]): HTMLElement {\n const ul = document.createElement('ul');\n ul.dataset.blockPath = JSON.stringify(path);\n ul.className = 'editor-check-list';\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childPath = [...path, i];\n if (isBlockNode(child)) {\n ul.appendChild(renderBlock(child as BlockNode, childPath));\n }\n }\n\n if (ul.children.length === 0) {\n const li = document.createElement('li');\n li.appendChild(document.createElement('br'));\n ul.appendChild(li);\n }\n\n return ul;\n}\n\nfunction renderCheckListItem(node: BlockNode, path: number[]): HTMLElement {\n const li = document.createElement('li');\n li.dataset.blockPath = JSON.stringify(path);\n const isChecked = !!node.attrs?.checked;\n li.className = `editor-check-list-item${isChecked ? ' editor-check-list-item--checked' : ''}`;\n\n // CKEditor-style custom checkbox wrapper — contentEditable=false keeps it\n // outside the editable flow so clicks don't move the cursor.\n const checkboxWrapper = document.createElement('span');\n checkboxWrapper.contentEditable = 'false';\n checkboxWrapper.className = `editor-checkbox-wrapper${isChecked ? ' editor-checkbox-wrapper--checked' : ''}`;\n checkboxWrapper.dataset.checkPath = JSON.stringify(path);\n checkboxWrapper.setAttribute('role', 'checkbox');\n checkboxWrapper.setAttribute('aria-checked', String(isChecked));\n checkboxWrapper.setAttribute('tabindex', '-1');\n\n // Inner checkmark SVG shown when checked\n const checkmark = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n checkmark.setAttribute('viewBox', '0 0 10 10');\n checkmark.setAttribute('class', 'editor-checkbox-checkmark');\n const polyline = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');\n polyline.setAttribute('points', '1.5 5 4 7.5 8.5 2.5');\n polyline.setAttribute('fill', 'none');\n polyline.setAttribute('stroke', 'white');\n polyline.setAttribute('stroke-width', '1.5');\n polyline.setAttribute('stroke-linecap', 'round');\n polyline.setAttribute('stroke-linejoin', 'round');\n checkmark.appendChild(polyline);\n checkboxWrapper.appendChild(checkmark);\n\n li.appendChild(checkboxWrapper);\n\n // Text content area\n const content = document.createElement('span');\n content.className = 'editor-check-list-content';\n renderChildren(node, path, content);\n if (content.innerHTML === '') content.appendChild(document.createElement('br'));\n li.appendChild(content);\n\n return li;\n}\n\nfunction renderHorizontalRule(): HTMLElement {\n const el = document.createElement('hr');\n el.className = 'editor-hr';\n el.contentEditable = 'false';\n return el;\n}\n\n// ─── Table Rendering ──────────────────────────────────────────────────────────\n\nfunction renderTable(node: BlockNode, path: number[]): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.dataset.blockPath = JSON.stringify(path);\n wrapper.className = 'editor-table-wrapper';\n\n const colWidths = (node.attrs?.colWidths as number[]) ?? [];\n\n const table = document.createElement('table');\n table.className = 'editor-table';\n\n // <colgroup> drives column widths with table-layout:fixed\n // Use percentages so table always fits within its 100% container\n if (colWidths.length > 0) {\n const total = colWidths.reduce((s, w) => s + w, 0) || colWidths.length * 120;\n const colgroup = document.createElement('colgroup');\n for (let i = 0; i < colWidths.length; i++) {\n const col = document.createElement('col');\n col.style.width = `${((colWidths[i] / total) * 100).toFixed(4)}%`;\n col.dataset.colIndex = String(i);\n colgroup.appendChild(col);\n }\n table.appendChild(colgroup);\n }\n\n const tbody = document.createElement('tbody');\n for (let r = 0; r < node.children.length; r++) {\n const row = node.children[r] as BlockNode;\n tbody.appendChild(renderTableRow(row, [...path, r], colWidths));\n }\n table.appendChild(tbody);\n wrapper.appendChild(table);\n return wrapper;\n}\n\nfunction renderTableRow(\n node: BlockNode,\n path: number[],\n _colWidths?: number[],\n): HTMLElement {\n const tr = document.createElement('tr');\n tr.dataset.blockPath = JSON.stringify(path);\n tr.className = 'editor-table-row';\n\n for (let c = 0; c < node.children.length; c++) {\n const cell = node.children[c] as BlockNode;\n const covered = cell.attrs?.covered as boolean | undefined;\n if (covered) continue; // spanning ancestor covers this slot — omit from DOM\n const cellEl = cell.type === 'table_header'\n ? renderTableHeader(cell, [...path, c])\n : renderTableCell(cell, [...path, c]);\n tr.appendChild(cellEl);\n }\n return tr;\n}\n\nfunction renderTableCellBase(\n tag: 'td' | 'th',\n node: BlockNode,\n path: number[],\n): HTMLElement {\n const el = document.createElement(tag);\n el.dataset.blockPath = JSON.stringify(path);\n el.className = tag === 'th' ? 'editor-table-header-cell' : 'editor-table-cell';\n\n const colspan = (node.attrs?.colspan as number) ?? 1;\n const rowspan = (node.attrs?.rowspan as number) ?? 1;\n if (colspan > 1) el.colSpan = colspan;\n if (rowspan > 1) el.rowSpan = rowspan;\n\n // data attrs for cell-selection and resize tracking\n const row = path[path.length - 2];\n const col = path[path.length - 1];\n const tablePath = path.slice(0, -2);\n el.dataset.cellRow = String(row);\n el.dataset.cellCol = String(col);\n el.dataset.cellTablePath = JSON.stringify(tablePath);\n\n renderChildren(node, path, el);\n if (el.innerHTML === '') el.appendChild(document.createElement('br'));\n\n // Resize handle — contentEditable=false so it doesn't capture caret\n const handle = document.createElement('div');\n handle.className = 'editor-col-resize-handle';\n handle.contentEditable = 'false';\n handle.dataset.resizeTable = JSON.stringify(tablePath);\n handle.dataset.resizeCol = String(col);\n el.appendChild(handle);\n\n return el;\n}\n\nfunction renderTableCell(node: BlockNode, path: number[]): HTMLElement {\n return renderTableCellBase('td', node, path);\n}\n\nfunction renderTableHeader(node: BlockNode, path: number[]): HTMLElement {\n return renderTableCellBase('th', node, path);\n}\n\n// ─── Children / Inline Rendering ──────────────────────────────────────────────\n\nfunction renderChildren(node: BlockNode, path: number[], container: HTMLElement): void {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childPath = [...path, i];\n\n if (isTextNode(child)) {\n const textEl = renderTextNode(child as TextNode, childPath);\n container.appendChild(textEl);\n } else if (isBlockNode(child)) {\n const blockEl = renderBlock(child as BlockNode, childPath);\n container.appendChild(blockEl);\n }\n }\n}\n\n/**\n * Render a TextNode into a <span> with nested mark elements.\n * The span gets data-path so the SelectionEngine can find it.\n *\n * Mark nesting: bold+italic → <strong><em>text</em></strong>\n */\nfunction renderTextNode(node: TextNode, path: number[]): HTMLElement {\n const span = document.createElement('span');\n span.dataset.path = JSON.stringify(path);\n span.className = 'editor-text';\n\n // Build the mark-wrapped text node\n const textNode = document.createTextNode(node.text);\n const wrapped = wrapWithMarks(textNode, node.marks);\n span.appendChild(wrapped);\n\n return span;\n}\n\n/**\n * Wrap a DOM node with the given marks (innermost first).\n */\nfunction wrapWithMarks(inner: Node, marks: Mark[]): Node {\n let current: Node = inner;\n for (const mark of [...marks].reverse()) {\n const wrapper = createMarkElement(mark);\n wrapper.appendChild(current);\n current = wrapper;\n }\n return current;\n}\n\nfunction createMarkElement(mark: Mark): HTMLElement {\n switch (mark.type) {\n case 'bold':\n return document.createElement('strong');\n case 'italic':\n return document.createElement('em');\n case 'underline': {\n const u = document.createElement('u');\n return u;\n }\n case 'strikethrough':\n return document.createElement('s');\n case 'code': {\n const code = document.createElement('code');\n code.className = 'editor-inline-code';\n return code;\n }\n case 'link': {\n const a = document.createElement('a');\n a.href = (mark.attrs?.href as string) ?? '#';\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n a.className = 'editor-link';\n return a;\n }\n case 'highlight': {\n const mark_ = document.createElement('mark');\n if (mark.attrs?.color) {\n (mark_ as HTMLElement).style.backgroundColor = mark.attrs.color as string;\n }\n return mark_;\n }\n case 'font_size': {\n const span = document.createElement('span');\n if (mark.attrs?.size) span.style.fontSize = mark.attrs.size as string;\n return span;\n }\n case 'font_family': {\n const span = document.createElement('span');\n if (mark.attrs?.family) span.style.fontFamily = mark.attrs.family as string;\n return span;\n }\n case 'text_color': {\n const span = document.createElement('span');\n if (mark.attrs?.color) span.style.color = mark.attrs.color as string;\n return span;\n }\n default:\n return document.createElement('span');\n }\n}\n","/**\n * SelectionEngine\n *\n * Bridges the browser's Selection/Range API to our internal EditorSelection\n * model. This is one of the hardest parts of building a custom editor.\n *\n * THE CORE PROBLEM:\n * The browser's Selection gives you DOM nodes + character offsets.\n * Our model uses (path, offset) pairs pointing into the document tree.\n * We need to map reliably between the two — even after DOM re-renders.\n *\n * HOW CURSOR RESTORATION WORKS:\n * 1. Before re-render: call captureSelection() → save EditorSelection.\n * 2. Re-render DOM from new state.\n * 3. After re-render: call restoreSelection(editorSelection) → walk the\n * new DOM using data-path attributes we baked in during rendering,\n * find the corresponding text nodes, and use Range API to put the\n * cursor back exactly where it was.\n *\n * WHY data-path?\n * Each rendered DOM text node gets a data-path=\"[0,1,2]\" attribute on its\n * parent span/element. The SelectionEngine uses querySelectorAll to find\n * the text node matching a given path without doing a full tree walk.\n */\n\nimport type { EditorSelection, NodePosition, Document, EditorNode, TextNode, MarkType, Mark } from '../../types';\nimport {\n isTextNode,\n getNodeAtPath,\n comparePaths,\n normalizeRange,\n getTextNodesBetween,\n} from '../core/DocumentModel';\n\n// ─── DOM → Model ──────────────────────────────────────────────────────────────\n\n/**\n * Read the browser's current Selection and convert it to an EditorSelection.\n * Returns null if there's no valid selection inside the editor container.\n */\nexport function captureSelection(container: HTMLElement): EditorSelection | null {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n\n const range = sel.getRangeAt(0);\n\n // Bail if the selection is completely outside our editor\n if (!container.contains(range.commonAncestorContainer)) return null;\n\n const anchor = domPointToNodePosition(range.startContainer, range.startOffset, container);\n const focus = domPointToNodePosition(range.endContainer, range.endOffset, container);\n\n if (!anchor || !focus) return null;\n\n return {\n anchor,\n focus,\n isCollapsed: range.collapsed,\n };\n}\n\n/**\n * Convert a (domNode, offset) pair to a (path, offset) NodePosition.\n * Walks up the DOM looking for data-path (text node span) first,\n * then falls back to data-block-path (the block element itself).\n * This handles the case of clicking inside an empty paragraph that has no\n * text children yet — the path will point to the block, and insertTextAtPath\n * knows how to create a text node there.\n */\nfunction domPointToNodePosition(\n node: Node,\n offset: number,\n container: HTMLElement,\n): NodePosition | null {\n let el: Node | null = node.nodeType === Node.TEXT_NODE ? node.parentElement : node;\n\n let blockPathFallback: NodePosition | null = null;\n\n while (el && el !== container) {\n const elem = el as HTMLElement;\n\n if (elem.dataset?.path) {\n try {\n const path = JSON.parse(elem.dataset.path) as number[];\n return { path, offset };\n } catch {\n // malformed\n }\n }\n\n // Remember the nearest block path as a fallback\n if (!blockPathFallback && elem.dataset?.blockPath) {\n try {\n const path = JSON.parse(elem.dataset.blockPath) as number[];\n blockPathFallback = { path, offset: 0 };\n } catch {\n // malformed\n }\n }\n\n el = elem.parentElement;\n }\n\n return blockPathFallback ?? { path: [0], offset: 0 };\n}\n\n// ─── Model → DOM ──────────────────────────────────────────────────────────────\n\n/**\n * Restore the browser's selection from an EditorSelection.\n * Must be called after the DOM has been re-rendered.\n *\n * Strategy:\n * Find the DOM element with data-path matching anchor.path,\n * then set the Range on its text node with the correct offset.\n */\nexport function restoreSelection(\n container: HTMLElement,\n selection: EditorSelection,\n): void {\n if (!selection) return;\n\n // Try text-node path first; fall back to block-path for block-level selections\n // (e.g. an empty paragraph whose path is [0] — it has data-block-path but no data-path).\n // If neither exists (e.g. selection pointed at [1,0] but the new block at [1] is empty),\n // walk the path up until we find a block element to anchor on.\n const anchorEl = resolveSelectionElement(container, selection.anchor.path);\n const focusEl = resolveSelectionElement(container, selection.focus.path);\n\n if (!anchorEl || !focusEl) return;\n\n const anchorText = getTextNodeOf(anchorEl);\n const focusText = getTextNodeOf(focusEl);\n\n try {\n const range = document.createRange();\n\n if (anchorText) {\n range.setStart(anchorText, Math.min(selection.anchor.offset, anchorText.length));\n } else {\n // Empty block (only a <br> inside) — place cursor at start of the element\n range.setStart(anchorEl, 0);\n }\n\n if (focusText) {\n range.setEnd(focusText, Math.min(selection.focus.offset, focusText.length));\n } else {\n range.setEnd(focusEl, 0);\n }\n\n const sel = window.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n } catch {\n // DOM may have changed between capture and restore; silently fail\n }\n}\n\n/**\n * Resolve a model path to a DOM element for selection restoration.\n *\n * Tries the exact text-node path first (data-path), then the exact block path\n * (data-block-path), and finally walks the path upward stripping the last\n * index — this handles the case where the model points at a child that doesn't\n * exist yet in the DOM (e.g. Enter at the end of a paragraph creates an empty\n * block; selection points at [1,0] but only data-block-path='[1]' exists).\n */\nfunction resolveSelectionElement(container: HTMLElement, path: number[]): HTMLElement | null {\n for (let depth = path.length; depth >= 0; depth--) {\n const candidate = path.slice(0, depth);\n const pathStr = JSON.stringify(candidate);\n const el =\n container.querySelector<HTMLElement>(`[data-path='${pathStr}']`) ??\n container.querySelector<HTMLElement>(`[data-block-path='${pathStr}']`);\n if (el) return el;\n }\n return null;\n}\n\n/**\n * Find the first descendant Text node inside an element. Recurses through mark\n * wrappers (<strong>, <em>, <u>, <s>, <code>, <a>, <mark>) since text nodes are\n * nested inside them. Returns null only for truly empty elements.\n */\nfunction getTextNodeOf(el: HTMLElement): Text | null {\n let cur: Node | null = el;\n while (cur) {\n const first: Node | null = cur.firstChild;\n if (!first) return null;\n if (first.nodeType === Node.TEXT_NODE) return first as Text;\n cur = first;\n }\n return null;\n}\n\n// ─── Mark detection ───────────────────────────────────────────────────────────\n\n/**\n * Given an EditorSelection, determine which marks are active.\n * Used by the toolbar to highlight active format buttons.\n *\n * Collapsed cursor → marks of the text node at the cursor.\n * Range → marks present on EVERY text node fully inside the range\n * (industry standard: button is \"on\" iff all selected chars\n * carry the mark).\n */\nexport function getActiveMarks(\n doc: Document,\n selection: EditorSelection | null,\n): Set<MarkType> {\n if (!selection) return new Set();\n\n if (selection.isCollapsed) {\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (!node || !isTextNode(node as EditorNode)) return new Set();\n return new Set((node as TextNode).marks.map((m) => m.type));\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return new Set();\n\n // Skip nodes that don't actually overlap the range (boundary nodes whose\n // selected slice is empty).\n const overlapping = nodes.filter(({ path, node }) => {\n if (comparePaths(path, from.path) === 0 && from.offset >= node.text.length) return false;\n if (comparePaths(path, to.path) === 0 && to.offset <= 0) return false;\n return true;\n });\n if (overlapping.length === 0) return new Set();\n\n // Intersect the marks across every overlapping text node.\n const initial = new Set(overlapping[0].node.marks.map((m) => m.type));\n for (let i = 1; i < overlapping.length; i++) {\n const here = new Set(overlapping[i].node.marks.map((m) => m.type));\n for (const m of initial) {\n if (!here.has(m)) initial.delete(m);\n }\n if (initial.size === 0) break;\n }\n return initial;\n}\n\n/**\n * Get the block node type at the current selection anchor.\n * Used by toolbar to highlight the active block type button.\n */\nexport function getActiveBlockType(\n doc: Document,\n selection: EditorSelection | null,\n): string {\n if (!selection) return 'paragraph';\n\n // Walk up from the anchor path to find the first block node\n const path = selection.anchor.path;\n for (let depth = path.length; depth >= 0; depth--) {\n const node = getNodeAtPath(doc, path.slice(0, depth));\n if (node && !isTextNode(node as EditorNode) && (node as EditorNode).type !== 'doc') {\n const type = (node as EditorNode).type;\n if (type === 'heading') {\n const level = ((node as import('../../types').BlockNode).attrs?.level as number) ?? 1;\n return `heading-${level}`;\n }\n // list_item: return the parent container type (bullet_list / ordered_list)\n // so toolbar buttons keyed on the container type activate correctly.\n if (type === 'list_item' && depth > 0) {\n const parent = getNodeAtPath(doc, path.slice(0, depth - 1));\n if (parent && !isTextNode(parent as EditorNode)) {\n const pt = (parent as EditorNode).type;\n if (pt === 'bullet_list' || pt === 'ordered_list') return pt;\n }\n }\n // check_list_item: return 'check_list' so ChecklistButton activates.\n if (type === 'check_list_item') return 'check_list';\n return type;\n }\n }\n return 'paragraph';\n}\n\n/**\n * Return the text alignment of the content block at the cursor, or 'left'.\n */\nexport function getActiveAlignment(\n doc: Document,\n selection: EditorSelection | null,\n): import('../../types').AlignmentType {\n if (!selection) return 'left';\n const path = selection.anchor.path;\n for (let depth = path.length; depth >= 1; depth--) {\n const node = getNodeAtPath(doc, path.slice(0, depth));\n if (node && !isTextNode(node as EditorNode) && (node as EditorNode).type !== 'doc') {\n return ((node as import('../../types').BlockNode).attrs?.align as import('../../types').AlignmentType) ?? 'left';\n }\n }\n return 'left';\n}\n\n/**\n * Return the href of the link mark at the current cursor/selection, or null.\n * For a collapsed cursor: checks the text node at the cursor position.\n * For a range: checks the anchor text node.\n * Also checks pendingMarks so the toolbar reflects a just-toggled link.\n */\nexport function getActiveLinkHref(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n const findHref = (marks: Mark[]): string | null => {\n const lm = marks.find((m) => m.type === 'link');\n return lm ? (lm.attrs?.href as string) ?? null : null;\n };\n\n if (selection.isCollapsed) {\n const fromPending = findHref(pendingMarks);\n if (fromPending) return fromPending;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) return findHref((node as TextNode).marks);\n return null;\n }\n\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) return findHref((node as TextNode).marks);\n return null;\n}\n\n/**\n * Return the text_color mark value at the current cursor/selection, or null.\n * Collapsed cursor: checks pending marks then the text node at the cursor.\n * Range: returns the color only if every selected text node shares the same one.\n */\nexport function getActiveTextColor(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n if (selection.isCollapsed) {\n const fromPending = pendingMarks.find((m) => m.type === 'text_color');\n if (fromPending) return (fromPending.attrs?.color as string) ?? null;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n const cm = (node as TextNode).marks.find((m) => m.type === 'text_color');\n return cm ? (cm.attrs?.color as string) ?? null : null;\n }\n return null;\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return null;\n\n let color: string | null | undefined = undefined;\n for (const { node } of nodes) {\n const cm = node.marks.find((m) => m.type === 'text_color');\n const nodeColor = cm ? (cm.attrs?.color as string) ?? null : null;\n if (color === undefined) {\n color = nodeColor;\n } else if (color !== nodeColor) {\n return null; // mixed colors — show nothing active\n }\n }\n return color ?? null;\n}\n\n/**\n * Return the highlight color at the current cursor/selection, or null.\n * Collapsed cursor: checks pending marks then the text node at the cursor.\n * Range: returns the color only if every selected text node shares the same one.\n */\nexport function getActiveHighlightColor(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n if (selection.isCollapsed) {\n const fromPending = pendingMarks.find((m) => m.type === 'highlight');\n if (fromPending) return (fromPending.attrs?.color as string) ?? null;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n const hm = (node as TextNode).marks.find((m) => m.type === 'highlight');\n return hm ? (hm.attrs?.color as string) ?? null : null;\n }\n return null;\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return null;\n\n let color: string | null | undefined = undefined;\n for (const { node } of nodes) {\n const hm = node.marks.find((m) => m.type === 'highlight');\n const nodeColor = hm ? (hm.attrs?.color as string) ?? null : null;\n if (color === undefined) {\n color = nodeColor;\n } else if (color !== nodeColor) {\n return null; // mixed colors — show nothing active\n }\n }\n return color ?? null;\n}\n\n/**\n * Return the font_family mark value at the current cursor/selection, or null.\n * Collapsed cursor: checks pending marks then the text node at the cursor.\n * Range: returns the family only if every selected text node shares the same one.\n */\n/**\n * Return the full model range that a link mark occupies starting from the cursor.\n *\n * Walks the block's text-node siblings in both directions from the anchor node,\n * collecting all consecutive nodes that carry the same link href. Returns\n * {from, to, href} so commands can operate on the whole link span — not just\n * the node the cursor happens to sit in.\n *\n * Returns null when the cursor is not on any link mark.\n */\nexport function getActiveLinkRange(\n doc: Document,\n selection: EditorSelection | null,\n): { from: NodePosition; to: NodePosition; href: string } | null {\n if (!selection) return null;\n\n const anchorPath = selection.anchor.path;\n const node = getNodeAtPath(doc, anchorPath);\n if (!node || !isTextNode(node as EditorNode)) return null;\n\n const anchorNode = node as TextNode;\n const linkMark = anchorNode.marks.find((m) => m.type === 'link');\n if (!linkMark) return null;\n\n const href = (linkMark.attrs?.href as string) ?? '';\n\n // Walk sibling text nodes in the same parent block\n const parentPath = anchorPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath);\n if (!parent || isTextNode(parent as EditorNode)) return null;\n\n const siblings = (parent as import('../../types').BlockNode).children;\n const anchorIdx = anchorPath[anchorPath.length - 1];\n\n // Expand left: include preceding siblings with the same link href\n let startIdx = anchorIdx;\n while (startIdx > 0) {\n const prev = siblings[startIdx - 1];\n if (!prev || !isTextNode(prev as EditorNode)) break;\n const prevLink = (prev as TextNode).marks.find((m) => m.type === 'link');\n if (!prevLink || (prevLink.attrs?.href as string) !== href) break;\n startIdx--;\n }\n\n // Expand right: include following siblings with the same link href\n let endIdx = anchorIdx;\n while (endIdx < siblings.length - 1) {\n const next = siblings[endIdx + 1];\n if (!next || !isTextNode(next as EditorNode)) break;\n const nextLink = (next as TextNode).marks.find((m) => m.type === 'link');\n if (!nextLink || (nextLink.attrs?.href as string) !== href) break;\n endIdx++;\n }\n\n const startNode = siblings[startIdx] as TextNode;\n const endNode = siblings[endIdx] as TextNode;\n\n return {\n from: makePosition([...parentPath, startIdx], 0),\n to: makePosition([...parentPath, endIdx], endNode.text.length),\n href,\n };\n}\n\nexport function getActiveFontFamily(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n if (selection.isCollapsed) {\n const fromPending = pendingMarks.find((m) => m.type === 'font_family');\n if (fromPending) return (fromPending.attrs?.family as string) ?? null;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n const fm = (node as TextNode).marks.find((m) => m.type === 'font_family');\n return fm ? (fm.attrs?.family as string) ?? null : null;\n }\n return null;\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return null;\n\n let family: string | null | undefined = undefined;\n for (const { node } of nodes) {\n const fm = node.marks.find((m) => m.type === 'font_family');\n const nodeFamily = fm ? (fm.attrs?.family as string) ?? null : null;\n if (family === undefined) {\n family = nodeFamily;\n } else if (family !== nodeFamily) {\n return null; // mixed families — show nothing\n }\n }\n return family ?? null;\n}\n\n/**\n * Return the font_size mark value at the current cursor/selection, or null.\n * Collapsed cursor: checks pending marks then the text node at the cursor.\n * Range: returns the size only if every selected text node shares the same size.\n */\nexport function getActiveFontSize(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n if (selection.isCollapsed) {\n const fromPending = pendingMarks.find((m) => m.type === 'font_size');\n if (fromPending) return (fromPending.attrs?.size as string) ?? null;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n const fm = (node as TextNode).marks.find((m) => m.type === 'font_size');\n return fm ? (fm.attrs?.size as string) ?? null : null;\n }\n return null;\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return null;\n\n let size: string | null | undefined = undefined;\n for (const { node } of nodes) {\n const fm = node.marks.find((m) => m.type === 'font_size');\n const nodeSize = fm ? (fm.attrs?.size as string) ?? null : null;\n if (size === undefined) {\n size = nodeSize;\n } else if (size !== nodeSize) {\n return null; // mixed sizes — show nothing\n }\n }\n return size ?? null;\n}\n\n/**\n * Collapse the current browser selection to the end of the range.\n */\nexport function collapseSelectionToEnd(_container: HTMLElement): void {\n const sel = window.getSelection();\n if (sel && sel.rangeCount > 0) {\n sel.collapseToEnd();\n }\n}\n\n/**\n * Returns true if the current browser selection is inside the given container.\n */\nexport function isSelectionInContainer(container: HTMLElement): boolean {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return false;\n const range = sel.getRangeAt(0);\n return container.contains(range.commonAncestorContainer);\n}\n\n/**\n * Build a NodePosition from a path and offset.\n */\nexport function makePosition(path: number[], offset: number): NodePosition {\n return { path, offset };\n}\n\n/**\n * Build a collapsed EditorSelection at a given position.\n */\nexport function makeCollapsedSelection(position: NodePosition): EditorSelection {\n return {\n anchor: position,\n focus: position,\n isCollapsed: true,\n };\n}\n","/**\n * HTMLSerializer\n *\n * Converts the document model to/from HTML strings.\n * serialize() → HTML string for storage or copy-paste.\n * deserialize() → Document model from a pasted HTML string.\n *\n * Paste sanitization: we whitelist only the HTML elements we understand.\n * Any unknown element is converted to its text content, stripping the tag.\n */\n\nimport type { Document, BlockNode, TextNode, EditorNode, Mark, Serializer, AlignmentType } from '../../types';\nimport { isTextNode, createParagraph, createEmptyDocument } from '../core/DocumentModel';\n\n// ─── Serialize: Model → HTML ──────────────────────────────────────────────────\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .trim()\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-');\n}\n\nexport const htmlSerializer: Serializer<string> = {\n serialize(doc: Document): string {\n const idCounts = new Map<string, number>();\n return doc.children.map((node) => serializeBlock(node, idCounts)).join('');\n },\n\n deserialize(html: string): Document {\n const parser = new DOMParser();\n const parsed = parser.parseFromString(html, 'text/html');\n return parseHTMLBody(parsed.body);\n },\n};\n\nfunction serializeBlock(node: BlockNode, idCounts: Map<string, number> = new Map(), inCell = false): string {\n switch (node.type) {\n case 'paragraph': {\n const alignVal = node.attrs?.align as string | undefined;\n const alignAttrs = alignVal ? ` data-align=\"${alignVal}\" style=\"text-align:${alignVal};\"` : '';\n const cellStyle = inCell ? ` style=\"margin:0;min-height:1.2em;${alignVal ? `text-align:${alignVal};` : ''}\"` : '';\n const attrs = inCell ? (alignVal ? ` data-align=\"${alignVal}\"${cellStyle}` : cellStyle) : alignAttrs;\n return `<p${attrs}>${serializeChildren(node.children)}</p>`;\n }\n case 'heading': {\n const l = node.attrs?.level ?? 1;\n const alignVal = node.attrs?.align as string | undefined;\n const alignAttrs = alignVal ? ` data-align=\"${alignVal}\" style=\"text-align:${alignVal};\"` : '';\n const rawText = node.children\n .filter((c): c is TextNode => 'text' in c)\n .map((c) => c.text)\n .join('');\n const base = slugify(rawText) || `heading-${l}`;\n const count = idCounts.get(base) ?? 0;\n idCounts.set(base, count + 1);\n const id = count === 0 ? base : `${base}-${count}`;\n return `<h${l} id=\"${id}\"${alignAttrs}>${serializeChildren(node.children)}</h${l}>`;\n }\n case 'blockquote': {\n const alignVal = node.attrs?.align as string | undefined;\n const alignAttrs = alignVal ? ` data-align=\"${alignVal}\" style=\"text-align:${alignVal};\"` : '';\n return `<blockquote${alignAttrs}>${serializeChildren(node.children)}</blockquote>`;\n }\n case 'bullet_list':\n return `<ul>${serializeChildren(node.children)}</ul>`;\n case 'ordered_list':\n return `<ol>${serializeChildren(node.children)}</ol>`;\n case 'list_item':\n return `<li>${serializeChildren(node.children)}</li>`;\n case 'check_list':\n return `<ul class=\"todo-list\" data-type=\"checklist\">${serializeChildren(node.children)}</ul>`;\n case 'check_list_item': {\n const checked = !!node.attrs?.checked;\n const dataChecked = checked ? ' data-checked=\"true\"' : '';\n const itemClass = `todo-list__item${checked ? ' todo-list__item_checked' : ''}`;\n const checkedAttr = checked ? ' checked=\"checked\"' : '';\n const innerContent = serializeChildren(node.children);\n return `<li class=\"${itemClass}\"${dataChecked}><label class=\"todo-list__label\"><input type=\"checkbox\" disabled=\"disabled\"${checkedAttr}><span class=\"todo-list__label__description\">${innerContent}</span></label></li>`;\n }\n case 'code_block': {\n const lang = node.attrs?.language ? ` class=\"language-${node.attrs.language}\"` : '';\n const raw = node.children.map((c) => isTextNode(c) ? escapeHTML((c as TextNode).text) : '').join('');\n return `<pre><code${lang}>${raw}</code></pre>`;\n }\n case 'image': {\n const src = escapeAttr(node.attrs?.src as string ?? '');\n const alt = escapeAttr(node.attrs?.alt as string ?? '');\n const width = node.attrs?.width ? ` width=\"${node.attrs.width}\"` : '';\n const align = node.attrs?.align ? ` data-align=\"${node.attrs.align}\"` : '';\n const caption = node.attrs?.caption ? escapeHTML(node.attrs.caption as string) : '';\n const x = node.attrs?.x as number | undefined;\n const y = node.attrs?.y as number | undefined;\n const posAttrs = x !== undefined\n ? ` data-x=\"${Math.round(x)}\" data-y=\"${Math.round(y ?? 0)}\" style=\"position:absolute;left:${Math.round(x)}px;top:${Math.round(y ?? 0)}px;\"`\n : '';\n if (caption) {\n return `<figure${align}${posAttrs}><img src=\"${src}\" alt=\"${alt}\"${width} /><figcaption>${caption}</figcaption></figure>`;\n }\n return `<figure${align}${posAttrs}><img src=\"${src}\" alt=\"${alt}\"${width} /></figure>`;\n }\n case 'horizontal_rule':\n return '<hr />';\n case 'table': {\n const rows = node.children.map((c) => serializeBlock(c as BlockNode)).join('');\n const colWidths = (node.attrs?.colWidths as number[]) ?? [];\n let colgroup = '';\n if (colWidths.length > 0) {\n const total = colWidths.reduce((s, w) => s + w, 0) || colWidths.length * 120;\n colgroup = `<colgroup>${colWidths.map((w) => `<col style=\"width:${((w / total) * 100).toFixed(4)}%\">`).join('')}</colgroup>`;\n }\n return `<div style=\"overflow-x:auto;margin:0.75em 0;\"><table style=\"border-collapse:collapse;table-layout:fixed;width:100%;font-size:inherit;font-family:inherit;\">${colgroup}<tbody>${rows}</tbody></table></div>`;\n }\n case 'table_row': {\n const cells = node.children.map((c) => serializeBlock(c as BlockNode)).join('');\n return `<tr>${cells}</tr>`;\n }\n case 'table_cell': {\n if (node.attrs?.covered) return '';\n const cs = (node.attrs?.colspan as number) > 1 ? ` colspan=\"${node.attrs?.colspan}\"` : '';\n const rs = (node.attrs?.rowspan as number) > 1 ? ` rowspan=\"${node.attrs?.rowspan}\"` : '';\n return `<td${cs}${rs} style=\"border:1px solid #d1d5db;padding:0.5em 0.75em;vertical-align:top;min-width:40px;word-break:break-word;\">${node.children.map((c) => serializeBlock(c as BlockNode, new Map(), true)).join('')}</td>`;\n }\n case 'table_header': {\n if (node.attrs?.covered) return '';\n const cs = (node.attrs?.colspan as number) > 1 ? ` colspan=\"${node.attrs?.colspan}\"` : '';\n const rs = (node.attrs?.rowspan as number) > 1 ? ` rowspan=\"${node.attrs?.rowspan}\"` : '';\n return `<th${cs}${rs} style=\"border:1px solid #d1d5db;padding:0.5em 0.75em;vertical-align:top;min-width:40px;word-break:break-word;background:#f9fafb;font-weight:600;text-align:left;\">${node.children.map((c) => serializeBlock(c as BlockNode, new Map(), true)).join('')}</th>`;\n }\n default:\n return `<p>${serializeChildren(node.children)}</p>`;\n }\n}\n\nfunction serializeChildren(children: EditorNode[]): string {\n return children.map((child) => {\n if (isTextNode(child)) return serializeTextNode(child as TextNode);\n return serializeBlock(child as BlockNode);\n }).join('');\n}\n\nfunction serializeTextNode(node: TextNode): string {\n const parts = node.text.split('\\n');\n const serializedParts = parts.map((part) => {\n let text = escapeHTML(part);\n for (const mark of node.marks) {\n text = wrapWithMarkHTML(text, mark);\n }\n return text;\n });\n return serializedParts.join('<br>');\n}\n\nfunction wrapWithMarkHTML(text: string, mark: Mark): string {\n switch (mark.type) {\n case 'bold': return `<strong>${text}</strong>`;\n case 'italic': return `<em>${text}</em>`;\n case 'underline': return `<u>${text}</u>`;\n case 'strikethrough': return `<s>${text}</s>`;\n case 'code': return `<code>${text}</code>`;\n case 'link': return `<a href=\"${escapeAttr(mark.attrs?.href as string ?? '#')}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n case 'highlight': return mark.attrs?.color\n ? `<mark style=\"background-color:${escapeAttr(mark.attrs.color as string)}\">${text}</mark>`\n : `<mark>${text}</mark>`;\n case 'font_size': return `<span style=\"font-size:${escapeAttr(mark.attrs?.size as string ?? '')}\">${text}</span>`;\n case 'font_family': return `<span style=\"font-family:${escapeAttr(mark.attrs?.family as string ?? '')}\">${text}</span>`;\n case 'text_color': return `<span style=\"color:${escapeAttr(mark.attrs?.color as string ?? '')}\">${text}</span>`;\n default: return text;\n }\n}\n\nfunction escapeHTML(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction escapeAttr(str: string): string {\n return str.replace(/\"/g, '"').replace(/'/g, ''');\n}\n\n// ─── Deserialize: HTML → Model ────────────────────────────────────────────────\n\nconst VALID_ALIGNS = new Set(['left', 'center', 'right', 'justify']);\n\nfunction getAlign(el: HTMLElement): AlignmentType | null {\n const da = el.getAttribute('data-align');\n if (da && VALID_ALIGNS.has(da)) return da as AlignmentType;\n const ta = el.style.textAlign;\n if (ta && VALID_ALIGNS.has(ta)) return ta as AlignmentType;\n return null;\n}\n\nfunction parseHTMLBody(body: HTMLElement): Document {\n const children: BlockNode[] = [];\n\n for (const child of Array.from(body.childNodes)) {\n const block = parseHTMLNode(child);\n if (block) children.push(block);\n }\n\n return { type: 'doc', children: children.length > 0 ? children : [createParagraph()] };\n}\n\nfunction parseHTMLNode(node: Node): BlockNode | null {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = (node.textContent ?? '').trim();\n if (!text) return null;\n return createParagraph(text);\n }\n\n const el = node as HTMLElement;\n const tag = el.tagName?.toLowerCase();\n\n switch (tag) {\n case 'p':\n case 'div': {\n const align = getAlign(el);\n return { type: 'paragraph', attrs: align ? { align } : {}, children: parseInlineChildren(el) };\n }\n case 'h1': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 1, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h2': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 2, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h3': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 3, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h4': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 4, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h5': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 5, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h6': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 6, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'blockquote': {\n const align = getAlign(el);\n return { type: 'blockquote', attrs: align ? { align } : {}, children: parseInlineChildren(el) };\n }\n case 'ul': {\n if (el.getAttribute('data-type') === 'checklist') {\n const items: BlockNode[] = Array.from(el.children).filter(c => c.tagName.toLowerCase() === 'li').map((li) => ({\n type: 'check_list_item' as const,\n attrs: { checked: li.getAttribute('data-checked') === 'true' },\n children: parseInlineChildren(li as HTMLElement),\n }));\n return { type: 'check_list', attrs: {}, children: items };\n }\n const items: BlockNode[] = Array.from(el.children).filter(c => c.tagName.toLowerCase() === 'li').map((li) => ({\n type: 'list_item' as const,\n attrs: {},\n children: parseListItemChildren(li as HTMLElement, 'bullet_list'),\n }));\n return { type: 'bullet_list', attrs: {}, children: items };\n }\n case 'ol': {\n const items: BlockNode[] = Array.from(el.children).filter(c => c.tagName.toLowerCase() === 'li').map((li) => ({\n type: 'list_item' as const,\n attrs: {},\n children: parseListItemChildren(li as HTMLElement, 'ordered_list'),\n }));\n return { type: 'ordered_list', attrs: {}, children: items };\n }\n case 'pre': {\n const codeEl = el.querySelector('code');\n const lang = codeEl?.className.match(/language-(\\S+)/)?.[1] ?? '';\n const text = codeEl?.textContent ?? el.textContent ?? '';\n return {\n type: 'code_block',\n attrs: lang ? { language: lang } : {},\n children: [{ type: 'text', text, marks: [] }],\n };\n }\n case 'figure': {\n const img = el.querySelector('img');\n const caption = el.querySelector('figcaption')?.textContent ?? '';\n const align = el.getAttribute('data-align') ?? '';\n const dxRaw = el.getAttribute('data-x');\n const dyRaw = el.getAttribute('data-y');\n const fx = dxRaw !== null ? parseFloat(dxRaw) : undefined;\n const fy = dyRaw !== null ? parseFloat(dyRaw) : undefined;\n if (img) {\n return {\n type: 'image',\n attrs: {\n src: img.getAttribute('src') ?? '',\n alt: img.getAttribute('alt') ?? '',\n ...(img.getAttribute('width') ? { width: parseFloat(img.getAttribute('width')!) } : {}),\n ...(align ? { align: align as AlignmentType } : {}),\n ...(caption ? { caption } : {}),\n ...(fx !== undefined && !isNaN(fx) ? { x: fx, y: fy ?? 0 } : {}),\n },\n children: [],\n };\n }\n return null;\n }\n case 'img':\n return {\n type: 'image',\n attrs: { src: el.getAttribute('src') ?? '', alt: el.getAttribute('alt') ?? '' },\n children: [],\n };\n case 'hr':\n return { type: 'horizontal_rule', attrs: {}, children: [] };\n case 'br':\n return null;\n case 'table': {\n const tbody = el.querySelector('tbody') ?? el;\n const rows: BlockNode[] = Array.from(tbody.children)\n .filter(c => c.tagName.toLowerCase() === 'tr')\n .map((tr) => {\n const cells: BlockNode[] = Array.from(tr.children)\n .filter(c => c.tagName.toLowerCase() === 'td' || c.tagName.toLowerCase() === 'th')\n .map((cell) => ({\n type: (cell.tagName.toLowerCase() === 'th' ? 'table_header' : 'table_cell') as 'table_header' | 'table_cell',\n attrs: {\n colspan: parseInt(cell.getAttribute('colspan') ?? '1'),\n rowspan: parseInt(cell.getAttribute('rowspan') ?? '1'),\n covered: false,\n },\n // table_cell children must be block nodes (paragraphs)\n children: [{ type: 'paragraph' as const, attrs: {}, children: parseInlineChildren(cell as HTMLElement) }],\n }));\n return { type: 'table_row' as const, attrs: {}, children: cells };\n });\n return { type: 'table', attrs: { colWidths: rows[0]?.children.map(() => 120) ?? [] }, children: rows };\n }\n default: {\n // Unknown element: extract its text and make a paragraph\n const text = el.textContent ?? '';\n if (!text.trim()) return null;\n return createParagraph(text.trim());\n }\n }\n}\n\nfunction parseListItemChildren(li: HTMLElement, _listType: 'bullet_list' | 'ordered_list'): EditorNode[] {\n const children: EditorNode[] = [];\n for (const child of Array.from(li.childNodes)) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n const tag = (child as HTMLElement).tagName.toLowerCase();\n if (tag === 'ul' || tag === 'ol') {\n const nestedListType = tag === 'ul' ? 'bullet_list' : 'ordered_list';\n const items: BlockNode[] = Array.from((child as HTMLElement).children)\n .filter(c => c.tagName.toLowerCase() === 'li')\n .map((nestedLi) => ({\n type: 'list_item' as const,\n attrs: {},\n children: parseListItemChildren(nestedLi as HTMLElement, nestedListType),\n }));\n children.push({ type: nestedListType, attrs: {}, children: items });\n continue;\n }\n }\n }\n\n const inlineNodes = parseInlineChildren(li);\n if (inlineNodes.length > 0 || children.length === 0) {\n return [...inlineNodes, ...children];\n }\n return children;\n}\n\nfunction parseInlineChildren(el: HTMLElement): TextNode[] {\n const results: TextNode[] = [];\n\n function walk(node: Node, marks: Mark[]) {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? '';\n if (text) results.push({ type: 'text', text, marks: [...marks] });\n return;\n }\n\n const elem = node as HTMLElement;\n const tag = elem.tagName?.toLowerCase();\n\n if (tag === 'br') {\n results.push({ type: 'text', text: '\\n', marks: [...marks] });\n return;\n }\n\n // Skip checkbox inputs inside todo-list items — they carry no text content\n if (tag === 'input') return;\n\n const newMarks = [...marks, ...getMarksForTag(tag, elem)];\n\n for (const child of Array.from(elem.childNodes)) {\n walk(child, newMarks);\n }\n }\n\n walk(el, []);\n return results;\n}\n\nfunction getMarksForTag(tag: string, el: HTMLElement): Mark[] {\n switch (tag) {\n case 'strong':\n case 'b':\n return [{ type: 'bold' }];\n case 'em':\n case 'i':\n return [{ type: 'italic' }];\n case 'u':\n return [{ type: 'underline' }];\n case 's':\n case 'del':\n case 'strike':\n return [{ type: 'strikethrough' }];\n case 'code':\n return [{ type: 'code' }];\n case 'a':\n return [{ type: 'link', attrs: { href: el.getAttribute('href') ?? '#' } }];\n case 'mark': {\n const bg = el.style.backgroundColor;\n return [{ type: 'highlight', ...(bg ? { attrs: { color: bg } } : {}) }];\n }\n case 'span': {\n const marks: Mark[] = [];\n const style = el.getAttribute('style') ?? '';\n const fontSize = style.match(/font-size:\\s*([^;]+)/)?.[1]?.trim();\n const fontFamily = style.match(/font-family:\\s*([^;]+)/)?.[1]?.trim();\n const color = style.match(/(?:^|;)\\s*color:\\s*([^;]+)/)?.[1]?.trim();\n if (fontSize) marks.push({ type: 'font_size', attrs: { size: fontSize } });\n if (fontFamily) marks.push({ type: 'font_family', attrs: { family: fontFamily } });\n if (color) marks.push({ type: 'text_color', attrs: { color } });\n return marks;\n }\n default:\n return [];\n }\n}\n","/**\n * PastePlugin / ClipboardPlugin\n *\n * CKEditor-style clipboard pipeline:\n *\n * Copy/Cut — intercept event, serialize selection from model to clean HTML,\n * write text/html + text/plain to clipboard. Cut also deletes selection.\n *\n * Paste — normalize HTML from external sources (Word, Google Docs, web),\n * deserialize to model, merge at cursor with block-split/merge logic.\n *\n * Pipeline stages:\n * 1. normalizeHTML — strip MSO/GDocs junk, preserve useful inline styles\n * 2. deserialize — HTML → model (BlockNode[])\n * 3. mergeAtCursor — split current block, insert pasted blocks, merge edges\n * 4. set cursor — place after last pasted character\n *\n * Never uses document.execCommand. Uses Clipboard API, Selection API, DOM APIs only.\n */\n\nimport type {\n EditorPlugin,\n EditorEngineInterface,\n EditorState,\n Document,\n BlockNode,\n TextNode,\n EditorNode,\n EditorSelection,\n NodePosition,\n} from '../../types';\n\nimport { htmlSerializer } from '../serialization/HTMLSerializer';\nimport {\n createTransaction,\n tr_replaceDoc,\n tr_setSelection,\n tr_deleteRange,\n} from '../core/Transaction';\nimport {\n isTextNode,\n normalizeRange,\n createParagraph,\n} from '../core/DocumentModel';\n\n// ─── Plugin factory ───────────────────────────────────────────────────────────\n\nexport function createPastePlugin(): EditorPlugin {\n return { name: 'clipboard' };\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Attach copy, cut, and paste handlers to the editor container.\n * Returns a cleanup function that removes all listeners.\n */\nexport function attachClipboardHandlers(\n container: HTMLElement,\n engine: EditorEngineInterface,\n): () => void {\n const removeCopy = attachCopyOrCutHandler(container, engine, false);\n const removeCut = attachCopyOrCutHandler(container, engine, true);\n const removePaste = attachPasteHandler(container, engine);\n return () => { removeCopy(); removeCut(); removePaste(); };\n}\n\n/**\n * Attach only the paste handler (kept for backward compat).\n */\nexport function attachPasteHandler(\n container: HTMLElement,\n engine: EditorEngineInterface,\n): () => void {\n const handler = (e: ClipboardEvent) => {\n e.preventDefault();\n const clipboardData = e.clipboardData;\n if (!clipboardData) return;\n\n // ── Image blob (screenshot / copied image) ────────────────────────────\n const imageItem = Array.from(clipboardData.items).find(\n (item) => item.type.startsWith('image/'),\n );\n if (imageItem) {\n const file = imageItem.getAsFile();\n if (file) {\n const blobUrl = URL.createObjectURL(file);\n const state = engine.getState();\n const sel = state.selection;\n const insertIdx = sel ? sel.anchor.path[0] + 1 : state.doc.children.length;\n const tr = createTransaction();\n tr.steps.push({\n type: 'insert_node',\n parentPath: [],\n index: insertIdx,\n node: { type: 'image', attrs: { src: blobUrl, alt: file.name }, children: [] },\n });\n engine.dispatch(tr);\n return;\n }\n }\n\n const html = clipboardData.getData('text/html');\n const plainText = clipboardData.getData('text/plain');\n\n let pastedDoc: Document;\n\n if (html) {\n const normalized = normalizeHTML(html);\n pastedDoc = htmlSerializer.deserialize(normalized);\n } else if (plainText) {\n pastedDoc = parsePlainText(plainText);\n } else {\n return;\n }\n\n // Filter out empty placeholder paragraphs the deserializer produces\n const pastedBlocks = pastedDoc.children.filter(\n (b) => !(b.type === 'paragraph' && b.children.length === 0),\n );\n if (pastedBlocks.length === 0) return;\n\n const state = engine.getState();\n let sel = state.selection;\n\n // ── Delete selection range first if non-collapsed ─────────────────────\n if (sel && !sel.isCollapsed) {\n const { from, to } = normalizeRange(sel.anchor, sel.focus);\n const delTr = createTransaction();\n delTr.steps.push(tr_deleteRange(from, to));\n engine.dispatch(delTr);\n // Refresh state — deleteRange sets selection to collapsed cursor\n sel = engine.getState().selection;\n }\n\n // ── Merge pasted content at cursor ────────────────────────────────────\n const currentState = engine.getState();\n const { mergedDoc, cursorPos } = mergeAtCursor(\n currentState,\n { type: 'doc', children: pastedBlocks as BlockNode[] },\n sel,\n );\n\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(mergedDoc));\n if (cursorPos) {\n tr.steps.push(tr_setSelection({ anchor: cursorPos, focus: cursorPos, isCollapsed: true }));\n }\n engine.dispatch(tr);\n };\n\n container.addEventListener('paste', handler as EventListener);\n return () => container.removeEventListener('paste', handler as EventListener);\n}\n\n// ─── Copy / Cut ───────────────────────────────────────────────────────────────\n\nfunction attachCopyOrCutHandler(\n container: HTMLElement,\n engine: EditorEngineInterface,\n isCut: boolean,\n): () => void {\n const handler = (e: ClipboardEvent) => {\n const state = engine.getState();\n const sel = state.selection;\n\n // No selection or collapsed — let browser default handle it\n if (!sel || sel.isCollapsed) return;\n\n e.preventDefault();\n\n // Extract selected content from model → clean HTML\n const selectedDoc = extractSelection(state);\n const selectedHTML = htmlSerializer.serialize(selectedDoc);\n const selectedText = docToPlainText(selectedDoc);\n\n try {\n e.clipboardData!.setData('text/html', selectedHTML);\n e.clipboardData!.setData('text/plain', selectedText);\n } catch {\n // Some browsers block setData outside of user-gesture — silently ignore\n }\n\n if (isCut) {\n const { from, to } = normalizeRange(sel.anchor, sel.focus);\n const tr = createTransaction();\n tr.steps.push(tr_deleteRange(from, to));\n engine.dispatch(tr);\n }\n };\n\n const event = isCut ? 'cut' : 'copy';\n container.addEventListener(event, handler as EventListener);\n return () => container.removeEventListener(event, handler as EventListener);\n}\n\n// ─── Selection extraction (for copy/cut) ─────────────────────────────────────\n\nfunction extractSelection(state: EditorState): Document {\n const sel = state.selection;\n if (!sel || sel.isCollapsed) return { type: 'doc', children: [createParagraph()] };\n\n const { from, to } = normalizeRange(sel.anchor, sel.focus);\n const blocks = state.doc.children;\n const fromBlockIdx = from.path[0] ?? 0;\n const toBlockIdx = to.path[0] ?? 0;\n\n if (fromBlockIdx === toBlockIdx) {\n const sliced = sliceBlock(blocks[fromBlockIdx], from.path.slice(1), from.offset, to.path.slice(1), to.offset);\n return { type: 'doc', children: sliced.length > 0 ? sliced : [createParagraph()] };\n }\n\n const firstBlock = sliceBlockFrom(blocks[fromBlockIdx], from.path.slice(1), from.offset);\n const middleBlocks = blocks.slice(fromBlockIdx + 1, toBlockIdx);\n const lastBlock = sliceBlockTo(blocks[toBlockIdx], to.path.slice(1), to.offset);\n\n return { type: 'doc', children: [firstBlock, ...middleBlocks, lastBlock] };\n}\n\n/** Extract text nodes from `startIdx:startOffset` to `endIdx:endOffset` within a flat block. */\nfunction sliceBlock(\n block: BlockNode,\n fromRelPath: number[],\n fromOffset: number,\n toRelPath: number[],\n toOffset: number,\n): BlockNode[] {\n const fromIdx = fromRelPath[0] ?? 0;\n const toIdx = toRelPath[0] ?? Math.max(0, block.children.length - 1);\n\n if (!block.children.every((c) => isTextNode(c as EditorNode))) {\n return [block]; // container/complex block — return whole\n }\n\n const children: TextNode[] = [];\n for (let i = fromIdx; i <= toIdx && i < block.children.length; i++) {\n const t = block.children[i] as TextNode;\n const s = i === fromIdx ? fromOffset : 0;\n const end = i === toIdx ? toOffset : t.text.length;\n const slice = t.text.slice(s, end);\n if (slice) children.push({ type: 'text', text: slice, marks: t.marks });\n }\n\n return children.length > 0 ? [{ ...block, children }] : [];\n}\n\n/** Slice a block from cursor to end. */\nfunction sliceBlockFrom(block: BlockNode, relPath: number[], offset: number): BlockNode {\n const fromIdx = relPath[0] ?? 0;\n if (!block.children.every((c) => isTextNode(c as EditorNode))) return block;\n\n const children: TextNode[] = [];\n for (let i = fromIdx; i < block.children.length; i++) {\n const t = block.children[i] as TextNode;\n const s = i === fromIdx ? offset : 0;\n const slice = t.text.slice(s);\n if (slice) children.push({ type: 'text', text: slice, marks: t.marks });\n }\n return { ...block, children };\n}\n\n/** Slice a block from start to cursor. */\nfunction sliceBlockTo(block: BlockNode, relPath: number[], offset: number): BlockNode {\n const toIdx = relPath[0] ?? Math.max(0, block.children.length - 1);\n if (!block.children.every((c) => isTextNode(c as EditorNode))) return block;\n\n const children: TextNode[] = [];\n for (let i = 0; i <= toIdx && i < block.children.length; i++) {\n const t = block.children[i] as TextNode;\n const end = i === toIdx ? offset : t.text.length;\n const slice = t.text.slice(0, end);\n if (slice) children.push({ type: 'text', text: slice, marks: t.marks });\n }\n return { ...block, children };\n}\n\n// ─── Paste merge at cursor ────────────────────────────────────────────────────\n\n/**\n * Merge pastedDoc into existingDoc at the cursor position.\n *\n * Strategy (mirrors CKEditor):\n * 1. Split the cursor block into beforeChildren / afterChildren at cursor offset.\n * 2. If pasting a single block: merge inline — beforeChildren + pasted.children + afterChildren,\n * preserving the cursor block's type.\n * 3. If pasting multiple blocks: build firstMerged (before + pastedFirst) and\n * lastMerged (pastedLast + after), insert middle blocks between them.\n *\n * Returns the merged document and the cursor NodePosition after the paste.\n */\nfunction mergeAtCursor(\n state: EditorState,\n pastedDoc: Document,\n sel: EditorSelection | null,\n): { mergedDoc: Document; cursorPos: NodePosition | null } {\n const pasted = pastedDoc.children;\n if (pasted.length === 0) return { mergedDoc: state.doc, cursorPos: sel?.anchor ?? null };\n\n const existingBlocks = state.doc.children;\n\n // If no selection, append at end\n if (!sel) {\n const mergedDoc: Document = { ...state.doc, children: [...existingBlocks, ...pasted] };\n const lastIdx = mergedDoc.children.length - 1;\n const cursorPos = endOfBlock(mergedDoc.children[lastIdx], lastIdx);\n return { mergedDoc, cursorPos };\n }\n\n const blockIdx = sel.anchor.path[0] ?? 0;\n const relPath = sel.anchor.path.slice(1);\n const charOffset = sel.anchor.offset;\n\n const currentBlock = existingBlocks[blockIdx];\n if (!currentBlock) {\n const mergedDoc: Document = { ...state.doc, children: [...existingBlocks, ...pasted] };\n const lastIdx = mergedDoc.children.length - 1;\n return { mergedDoc, cursorPos: endOfBlock(mergedDoc.children[lastIdx], lastIdx) };\n }\n\n // ── List/checklist container: cursor is inside a list_item ───────────────\n // mergeAtCursor must operate at the list_item level, not the list level.\n // Operating at the list level corrupts list structure (text nodes inside <ul>).\n const LIST_CONTAINERS = new Set(['bullet_list', 'ordered_list', 'check_list']);\n if (LIST_CONTAINERS.has(currentBlock.type) && relPath.length > 0) {\n return mergeIntoListContainer(state, pasted, existingBlocks, blockIdx, currentBlock, relPath, charOffset);\n }\n\n // Split the cursor block at cursor position\n const [beforeChildren, afterChildren] = splitBlockChildren(currentBlock, relPath, charOffset);\n\n let newBlocks: BlockNode[];\n let cursorBlockOffset: number; // offset from blockIdx to cursor's block in newBlocks\n let cursorInBlock: NodePosition; // cursor within that block\n\n if (pasted.length === 1) {\n // ── Single-block paste: inline merge ──────────────────────────────────\n const pastedChildren = pasted[0].children as EditorNode[];\n const mergedChildren = [...beforeChildren, ...pastedChildren, ...afterChildren];\n const cleanChildren = mergedChildren.length > 0\n ? mergedChildren\n : [{ type: 'text' as const, text: '', marks: [] }];\n\n newBlocks = [{ ...currentBlock, children: cleanChildren }];\n cursorBlockOffset = 0;\n\n // Cursor right after the pasted content (before afterChildren)\n const cursorChildIdx = beforeChildren.length + pastedChildren.length;\n const nodeBeforeCursor = cleanChildren[cursorChildIdx - 1];\n if (nodeBeforeCursor && isTextNode(nodeBeforeCursor)) {\n cursorInBlock = {\n path: [blockIdx, cursorChildIdx - 1],\n offset: (nodeBeforeCursor as TextNode).text.length,\n };\n } else {\n cursorInBlock = { path: [blockIdx], offset: 0 };\n }\n\n } else {\n // ── Multi-block paste: split and insert ───────────────────────────────\n const firstPasted = pasted[0];\n const lastPasted = pasted[pasted.length - 1];\n const middleBlocks = pasted.slice(1, -1);\n\n // First merged: cursor block type + before + first pasted content\n const firstMerged: BlockNode = {\n ...currentBlock,\n children: [...beforeChildren, ...(firstPasted.children as EditorNode[])],\n };\n\n // Last merged: last pasted block type + last pasted content + after\n const lastMerged: BlockNode = {\n type: lastPasted.type,\n attrs: lastPasted.attrs,\n children: [...(lastPasted.children as EditorNode[]), ...afterChildren],\n };\n\n newBlocks = [firstMerged, ...(middleBlocks as BlockNode[]), lastMerged];\n cursorBlockOffset = newBlocks.length - 1;\n\n // Cursor at end of last pasted block content (before afterChildren)\n const lpChildren = lastPasted.children as EditorNode[];\n const absoluteLastBlockIdx = blockIdx + cursorBlockOffset;\n if (lpChildren.length > 0) {\n const lastNode = lpChildren[lpChildren.length - 1];\n cursorInBlock = {\n path: [absoluteLastBlockIdx, lpChildren.length - 1],\n offset: isTextNode(lastNode) ? (lastNode as TextNode).text.length : 0,\n };\n } else {\n cursorInBlock = { path: [absoluteLastBlockIdx], offset: 0 };\n }\n }\n\n const mergedChildren: BlockNode[] = [\n ...existingBlocks.slice(0, blockIdx),\n ...newBlocks,\n ...existingBlocks.slice(blockIdx + 1),\n ];\n\n return {\n mergedDoc: { ...state.doc, children: mergedChildren },\n cursorPos: cursorInBlock,\n };\n}\n\n/**\n * Merge pasted content into a list container at the list_item level.\n * Prevents corrupt structure (text nodes directly inside <ul>/<ol>).\n */\nfunction mergeIntoListContainer(\n state: EditorState,\n pasted: BlockNode[],\n existingBlocks: BlockNode[],\n blockIdx: number,\n listBlock: BlockNode,\n relPath: number[],\n charOffset: number,\n): { mergedDoc: Document; cursorPos: NodePosition | null } {\n const itemIdx = relPath[0];\n const itemRelPath = relPath.slice(1);\n const listItems = listBlock.children as BlockNode[];\n const currentItem = listItems[itemIdx];\n const isCheckList = listBlock.type === 'check_list';\n const itemType = isCheckList ? 'check_list_item' : 'list_item';\n\n if (!currentItem) {\n // Cursor out of bounds — append pasted blocks after the list\n const newBlocks = [...existingBlocks, ...pasted];\n const lastIdx = newBlocks.length - 1;\n return {\n mergedDoc: { ...state.doc, children: newBlocks },\n cursorPos: endOfBlock(newBlocks[lastIdx], lastIdx),\n };\n }\n\n const [beforeChildren, afterChildren] = splitBlockChildren(currentItem, itemRelPath, charOffset);\n\n const makeItem = (children: EditorNode[]): BlockNode => ({\n type: itemType as BlockNode['type'],\n attrs: isCheckList ? { checked: false } : {},\n children: children.length > 0 ? children : [{ type: 'text', text: '', marks: [] }],\n });\n\n let newItems: BlockNode[];\n let cursorItemIdx: number;\n\n if (pasted.length === 1) {\n // Single block: inline-merge pasted children into the current item\n const pastedChildren = (pasted[0].children ?? []) as EditorNode[];\n const merged = [...beforeChildren, ...pastedChildren, ...afterChildren];\n newItems = [\n ...listItems.slice(0, itemIdx),\n { ...currentItem, children: merged.length > 0 ? merged : [{ type: 'text' as const, text: '', marks: [] }] },\n ...listItems.slice(itemIdx + 1),\n ];\n cursorItemIdx = itemIdx;\n } else {\n // Multi-block: first+last merge with split halves, middle become new items\n const firstPasted = pasted[0];\n const lastPasted = pasted[pasted.length - 1];\n const middlePasted = pasted.slice(1, -1);\n\n const firstItem = { ...currentItem, children: [...beforeChildren, ...(firstPasted.children ?? [] as EditorNode[])] };\n const lastItem = makeItem([...(lastPasted.children ?? [] as EditorNode[]), ...afterChildren]);\n const midItems = middlePasted.map((p) => makeItem((p.children ?? []) as EditorNode[]));\n\n newItems = [\n ...listItems.slice(0, itemIdx),\n firstItem,\n ...midItems,\n lastItem,\n ...listItems.slice(itemIdx + 1),\n ];\n cursorItemIdx = itemIdx + 1 + midItems.length;\n }\n\n const newList: BlockNode = { ...listBlock, children: newItems };\n const mergedBlocks: BlockNode[] = [\n ...existingBlocks.slice(0, blockIdx),\n newList,\n ...existingBlocks.slice(blockIdx + 1),\n ];\n\n // Compute cursor: end of last pasted content in target item\n const targetItem = newItems[cursorItemIdx];\n let cursorPos: NodePosition;\n if (pasted.length === 1) {\n const pastedChildren = (pasted[0].children ?? []) as EditorNode[];\n const cursorChildIdx = beforeChildren.length + pastedChildren.length;\n const nodeBefore = targetItem?.children[cursorChildIdx - 1];\n cursorPos = nodeBefore && isTextNode(nodeBefore)\n ? { path: [blockIdx, cursorItemIdx, cursorChildIdx - 1], offset: (nodeBefore as TextNode).text.length }\n : { path: [blockIdx, cursorItemIdx], offset: 0 };\n } else {\n const lpChildren = (pasted[pasted.length - 1].children ?? []) as EditorNode[];\n if (lpChildren.length > 0) {\n const lastNode = lpChildren[lpChildren.length - 1];\n cursorPos = {\n path: [blockIdx, cursorItemIdx, lpChildren.length - 1],\n offset: isTextNode(lastNode) ? (lastNode as TextNode).text.length : 0,\n };\n } else {\n cursorPos = { path: [blockIdx, cursorItemIdx], offset: 0 };\n }\n }\n\n return { mergedDoc: { ...state.doc, children: mergedBlocks }, cursorPos };\n}\n\n/**\n * Split a block's children array at the cursor position.\n * Returns [beforeChildren, afterChildren].\n *\n * relPath: path within block to the text node, e.g. [2] for children[2].\n * offset: char offset within that text node.\n */\nfunction splitBlockChildren(\n block: BlockNode,\n relPath: number[],\n offset: number,\n): [EditorNode[], EditorNode[]] {\n const children = block.children;\n\n if (children.length === 0) return [[], []];\n\n // If cursor is at block level (empty block or cursor on block itself)\n if (relPath.length === 0) return [[], [...children]];\n\n const textIdx = relPath[0];\n if (textIdx >= children.length) return [[...children], []];\n\n const node = children[textIdx];\n\n if (!isTextNode(node)) {\n // Split at block boundary\n return [[...children.slice(0, textIdx)], [...children.slice(textIdx)]];\n }\n\n const textNode = node as TextNode;\n const before: EditorNode[] = [\n ...children.slice(0, textIdx),\n ...(offset > 0\n ? [{ type: 'text' as const, text: textNode.text.slice(0, offset), marks: textNode.marks }]\n : []),\n ];\n const after: EditorNode[] = [\n ...(offset < textNode.text.length\n ? [{ type: 'text' as const, text: textNode.text.slice(offset), marks: textNode.marks }]\n : []),\n ...children.slice(textIdx + 1),\n ];\n\n return [before, after];\n}\n\n/** Return a NodePosition pointing to the end of the last text node in a block. */\nfunction endOfBlock(block: BlockNode, blockIdx: number): NodePosition {\n const children = block.children;\n for (let i = children.length - 1; i >= 0; i--) {\n const n = children[i];\n if (isTextNode(n)) {\n return { path: [blockIdx, i], offset: (n as TextNode).text.length };\n }\n }\n return { path: [blockIdx], offset: 0 };\n}\n\n// ─── Plain text parsing ───────────────────────────────────────────────────────\n\nfunction parsePlainText(text: string): Document {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').trim();\n\n // Check if it's a URL\n if (isURL(normalized)) {\n const href = /^https?:\\/\\//i.test(normalized) ? normalized : `https://${normalized}`;\n return htmlSerializer.deserialize(\n `<p><a href=\"${escapeAttr(href)}\">${escapeHTML(normalized)}</a></p>`,\n );\n }\n\n // Double newline = new paragraph; single newline = <br> within paragraph\n const paragraphs = normalized.split(/\\n{2,}/);\n\n if (paragraphs.length === 1) {\n const lines = normalized.split('\\n');\n if (lines.length === 1) {\n return htmlSerializer.deserialize(`<p>${escapeHTML(normalized)}</p>`);\n }\n const html = lines.map((l) => escapeHTML(l)).join('<br>');\n return htmlSerializer.deserialize(`<p>${html}</p>`);\n }\n\n const html = paragraphs\n .map((p) => `<p>${p.split('\\n').map((l) => escapeHTML(l)).join('<br>')}</p>`)\n .join('');\n return htmlSerializer.deserialize(html);\n}\n\n// ─── HTML normalization ───────────────────────────────────────────────────────\n\n/**\n * Normalize pasted HTML for safe insertion.\n *\n * Handles:\n * - CF_HTML clipboard markers (<!--StartFragment-->, etc.)\n * - Microsoft Word / Office MSO conditional comments and namespace tags\n * - Google Docs wrapper elements (<b style=\"font-weight:normal\">)\n * - Inline style preservation: font-size, font-family, color, background-color\n * - Strips: scripts, iframes, event handlers, class, id, MSO-specific styles\n */\nfunction normalizeHTML(html: string): string {\n // 1. Strip HTML/XML comments (CF_HTML markers, MSO conditionals)\n let out = html.replace(/<!--[\\s\\S]*?-->/g, '');\n\n // 2. Strip MSO conditional blocks that survived comment removal\n out = out.replace(/<!\\[if[^\\]]*\\]>[\\s\\S]*?<!\\[endif\\]>/gi, '');\n\n // 3. Strip MSO / Office namespace tags (o:p, w:sdtPr, v:shape, etc.)\n out = out.replace(/<\\/?(?:o|w|m|v|st\\d?|x):[^>]*>/gi, '');\n\n // 4. Parse cleaned HTML\n const parser = new DOMParser();\n const doc = parser.parseFromString(out, 'text/html');\n\n // 5. Remove dangerous elements\n doc\n .querySelectorAll(\n 'script, style, iframe, object, embed, form, button, select, textarea, meta, link',\n )\n .forEach((el) => el.remove());\n\n // Remove all inputs except checkbox inputs inside todo-list items\n doc.querySelectorAll('input').forEach((el) => {\n const isCheckbox = el.getAttribute('type')?.toLowerCase() === 'checkbox';\n const inTodoList = !!el.closest('ul[data-type=\"checklist\"], ul.todo-list, li.todo-list__item, li[data-checked]');\n if (!isCheckbox || !inTodoList) el.remove();\n });\n\n // 6. Unwrap Google Docs' <b style=\"font-weight:normal|400|inherit\"> wrappers\n doc.querySelectorAll('b').forEach((el) => {\n const fw = (el as HTMLElement).style.fontWeight;\n if (fw === 'normal' || fw === '400' || fw === 'inherit' || fw === '') {\n // Keep children, remove the tag\n const parent = el.parentNode;\n if (!parent) return;\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\n el.remove();\n }\n });\n\n // 7. For every remaining element: strip unsafe attributes, preserve useful styles\n doc.querySelectorAll('*').forEach((node) => {\n const el = node as HTMLElement;\n const tag = el.tagName.toLowerCase();\n\n // ── Preserve safe CSS properties, strip the rest ──────────────────────\n const fontSize = el.style?.fontSize ?? '';\n const fontFamily = el.style?.fontFamily ?? '';\n const color = el.style?.color ?? '';\n const bgColor = el.style?.backgroundColor ?? '';\n\n el.removeAttribute('style');\n\n const safeStyle: string[] = [];\n if (fontSize) safeStyle.push(`font-size:${fontSize}`);\n if (fontFamily) safeStyle.push(`font-family:${fontFamily}`);\n if (color) safeStyle.push(`color:${color}`);\n // Only keep background-color if it's non-trivial (not white or transparent)\n if (\n bgColor &&\n !['transparent', 'rgba(0, 0, 0, 0)', 'white', 'rgb(255, 255, 255)', '#ffffff', '#fff'].includes(\n bgColor.toLowerCase().replace(/\\s/g, ''),\n )\n ) {\n safeStyle.push(`background-color:${bgColor}`);\n }\n if (safeStyle.length > 0) el.setAttribute('style', safeStyle.join(';'));\n\n // ── Remove class, id, and all event handlers ──────────────────────────\n el.removeAttribute('class');\n el.removeAttribute('id');\n Array.from(el.attributes).forEach((attr) => {\n if (attr.name.startsWith('on')) el.removeAttribute(attr.name);\n });\n\n // ── Strip non-semantic / dangerous data-* except our own ──────────────\n Array.from(el.attributes).forEach((attr) => {\n if (attr.name.startsWith('data-') && !['data-align', 'data-type', 'data-checked'].includes(attr.name)) {\n el.removeAttribute(attr.name);\n }\n });\n\n // ── For <a>: keep href, target, rel only ─────────────────────────────\n if (tag === 'a') {\n const href = el.getAttribute('href') ?? '';\n const isUnsafe = /^(javascript:|vbscript:|data:)/i.test(href.trim());\n Array.from(el.attributes).forEach((attr) => {\n if (!['href', 'target', 'rel', 'style'].includes(attr.name)) el.removeAttribute(attr.name);\n });\n if (isUnsafe) el.removeAttribute('href');\n }\n\n // ── For <img>: keep src, alt, width ───────────────────────────────────\n if (tag === 'img') {\n Array.from(el.attributes).forEach((attr) => {\n if (!['src', 'alt', 'width', 'height', 'style'].includes(attr.name)) el.removeAttribute(attr.name);\n });\n }\n\n // ── For table cells: keep colspan/rowspan ─────────────────────────────\n if (tag === 'td' || tag === 'th') {\n Array.from(el.attributes).forEach((attr) => {\n if (!['colspan', 'rowspan', 'style'].includes(attr.name)) el.removeAttribute(attr.name);\n });\n }\n\n // ── For <code>: keep class (language-*) ──────────────────────────────\n if (tag === 'code') {\n Array.from(el.attributes).forEach((attr) => {\n if (!['class', 'style'].includes(attr.name)) el.removeAttribute(attr.name);\n });\n }\n });\n\n // 8. Detect and promote MSO heading classes (Word pastes headings as <p class=\"MsoHeading1\">)\n // These were stripped above, but we can detect them from the raw string before parsing\n // (already handled by heading tag detection — Word also outputs <h1>/<h2> sometimes)\n\n return doc.body.innerHTML;\n}\n\n// ─── Utilities ────────────────────────────────────────────────────────────────\n\nfunction docToPlainText(doc: Document): string {\n return doc.children.map(blockToPlainText).join('\\n\\n');\n}\n\nfunction blockToPlainText(block: BlockNode): string {\n if (block.children.length === 0) return '';\n return block.children\n .map((c) => {\n if (isTextNode(c)) return (c as TextNode).text;\n return blockToPlainText(c as BlockNode);\n })\n .join('');\n}\n\nfunction escapeHTML(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nfunction escapeAttr(str: string): string {\n return str.replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''');\n}\n\nconst URL_RE = /^(https?:\\/\\/|www\\.)[^\\s]{2,}$/i;\n\nfunction isURL(text: string): boolean {\n if (!URL_RE.test(text)) return false;\n try {\n new URL(text.startsWith('http') ? text : `https://${text}`);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Editor Commands\n *\n * A Command is a pure function: (engine) → boolean.\n * It creates a Transaction, adds steps, and dispatches it.\n * Returns true if it handled the action (for key binding chains).\n *\n * Commands are the ONLY place that should call engine.dispatch().\n * Components and plugins should call commands, not dispatch directly.\n *\n * Architecture note:\n * Commands don't know about React or the DOM.\n * They only know about EditorState and Transactions.\n * This makes them trivially testable.\n */\n\nimport type {\n Command,\n Mark,\n MarkType,\n BlockNodeType,\n EditorNode,\n TextNode,\n BlockNode,\n NodeAttrs,\n EditorEngineInterface,\n} from '../../types';\n\nimport {\n createTransaction,\n tr_addMark,\n tr_removeMark,\n tr_setMark,\n tr_setNodeType,\n tr_setNodeAttrs,\n tr_splitBlock,\n tr_joinBlocks,\n tr_insertText,\n tr_setSelection,\n tr_deleteRange,\n} from '../core/Transaction';\n\nimport {\n isTextNode,\n findContentBlockPath,\n normalizeRange,\n getNodeAtPath,\n createParagraph,\n marksEqual,\n} from '../core/DocumentModel';\n\nimport {\n getActiveMarks,\n getActiveLinkRange,\n makePosition,\n makeCollapsedSelection,\n} from '../selection/SelectionEngine';\n\n// ─── Mark Commands ────────────────────────────────────────────────────────────\n\n/**\n * Toggle a mark on the current selection.\n * If the selection has the mark → remove it.\n * If not → add it.\n */\nexport function toggleMark(markType: MarkType, attrs?: Record<string, unknown>): Command {\n return (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n\n const mark: Mark = { type: markType, attrs: attrs as Mark['attrs'] };\n\n const tr = createTransaction();\n if (!state.selection) tr.steps.push(tr_setSelection(selection));\n\n if (selection.isCollapsed) {\n // Collapsed cursor: toggle against pending marks (state.marks), NOT the\n // text node at cursor. getActiveMarks reads the text node which never\n // reflects pending marks set before typing — using it here caused the\n // mark to keep accumulating instead of toggling off.\n const isPendingActive = state.marks.some((m) => m.type === markType);\n tr.meta.pendingMarks = isPendingActive\n ? state.marks.filter((m) => m.type !== markType)\n : [...state.marks, mark];\n engine.dispatch(tr);\n return true;\n }\n\n const activeMarks = getActiveMarks(doc, selection);\n const isActive = activeMarks.has(markType);\n\n const from = selection.anchor;\n const to = selection.focus;\n\n if (isActive) {\n tr.steps.push(tr_removeMark(from, to, markType));\n } else {\n tr.steps.push(tr_addMark(from, to, mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport const toggleBold: Command = toggleMark('bold');\nexport const toggleItalic: Command = toggleMark('italic');\nexport const toggleUnderline: Command = toggleMark('underline');\nexport const toggleStrikethrough: Command = toggleMark('strikethrough');\nexport const toggleCode: Command = toggleMark('code');\n\n// ─── Block Type Commands ──────────────────────────────────────────────────────\n\n/**\n * Set the block type of the paragraph containing the cursor.\n * If the block is already the target type, revert to paragraph.\n */\nexport function setBlockType(nodeType: BlockNodeType, attrs: NodeAttrs = {}): Command {\n return (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const currentBlock = getNodeAtPath(doc, blockPath) as import('../../types').BlockNode | null;\n const currentType = currentBlock?.type ?? 'paragraph';\n\n // For headings compare both type and level so H1→H2 changes level rather than toggling off\n const isSame = currentType === nodeType &&\n (nodeType !== 'heading' || (currentBlock?.attrs?.level ?? 1) === (attrs.level ?? 1));\n\n const targetType = isSame ? 'paragraph' : nodeType;\n const targetAttrs = isSame ? {} : attrs;\n\n const tr = createTransaction();\n tr.steps.push(tr_setNodeType(blockPath, targetType, targetAttrs));\n if (!state.selection) tr.steps.push(tr_setSelection(selection));\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport const setHeading = (level: 1 | 2 | 3 | 4 | 5 | 6): Command =>\n setBlockType('heading', { level });\n\nexport const setParagraph: Command = setBlockType('paragraph');\nexport const setBlockquote: Command = setBlockType('blockquote');\nexport const setCodeBlock: Command = setBlockType('code_block');\n\n/**\n * Toggle bullet list. Wraps the current block in a bullet_list > list_item,\n * or unwraps it back to a paragraph if already inside a list.\n */\nconst toggleListOfType = (listType: 'bullet_list' | 'ordered_list'): Command => (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block) return false;\n\n const parentPath = blockPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath) as BlockNode | import('../../types').Document | null;\n const parentType = (parent && 'type' in parent) ? parent.type : 'doc';\n\n const blockIdx = blockPath[blockPath.length - 1];\n const tr = createTransaction();\n\n // Already inside a list of the target kind → unwrap back to a paragraph.\n if (block.type === 'list_item' && parentType === listType) {\n const listPath = parentPath;\n const grandParentPath = listPath.slice(0, -1);\n const listIdx = listPath[listPath.length - 1];\n\n const paragraph: BlockNode = {\n type: 'paragraph',\n attrs: {},\n children: block.children,\n };\n\n // Split remaining items into before/after so the list is properly divided\n // around the extracted paragraph (CKEditor behavior).\n const listNode = parent as BlockNode;\n const beforeItems = (listNode.children as BlockNode[]).slice(0, blockIdx);\n const afterItems = (listNode.children as BlockNode[]).slice(blockIdx + 1);\n\n tr.steps.push({ type: 'delete_node', path: listPath });\n let insertIdx = listIdx;\n if (beforeItems.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: insertIdx, node: { ...listNode, children: beforeItems } });\n insertIdx++;\n }\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: insertIdx, node: paragraph });\n insertIdx++;\n if (afterItems.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: insertIdx, node: { ...listNode, children: afterItems } });\n }\n engine.dispatch(tr);\n return true;\n }\n\n // Inside a DIFFERENT regular list type (bullet ↔ ordered) → convert parent list type.\n // Do NOT wrap again — that would nest a new list inside the existing one.\n if (block.type === 'list_item' && (parentType === 'bullet_list' || parentType === 'ordered_list')) {\n tr.steps.push(tr_setNodeType(parentPath, listType, {}));\n engine.dispatch(tr);\n return true;\n }\n\n // Inside a check_list → convert entire check_list to the requested list type,\n // mapping each check_list_item → list_item.\n if (block.type === 'check_list_item' && parentType === 'check_list') {\n const checkList = parent as BlockNode;\n const grandParentPath = parentPath.slice(0, -1);\n const listIdx = parentPath[parentPath.length - 1];\n const convertedList: BlockNode = {\n type: listType,\n attrs: {},\n children: (checkList.children as BlockNode[]).map((item) => ({\n type: 'list_item' as const,\n attrs: {},\n children: item.children,\n })),\n };\n tr.steps.push({ type: 'delete_node', path: parentPath });\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: listIdx, node: convertedList });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...grandParentPath, listIdx, blockIdx, 0], 0))));\n engine.dispatch(tr);\n return true;\n }\n\n // Wrap the current block in a list. Preserve its inline children as a list_item.\n const listItem: BlockNode = {\n type: 'list_item',\n attrs: {},\n children: block.children,\n };\n const listNode: BlockNode = {\n type: listType,\n attrs: {},\n children: [listItem],\n };\n\n tr.steps.push({ type: 'delete_node', path: blockPath });\n tr.steps.push({\n type: 'insert_node',\n parentPath,\n index: blockIdx,\n node: listNode,\n });\n // Move the cursor into the new list_item's first text node.\n tr.steps.push(\n tr_setSelection(\n makeCollapsedSelection(makePosition([...blockPath, 0, 0], 0)),\n ),\n );\n engine.dispatch(tr);\n return true;\n};\n\nexport const toggleBulletList: Command = toggleListOfType('bullet_list');\nexport const toggleOrderedList: Command = toggleListOfType('ordered_list');\n\n// ─── Code Block Helpers ───────────────────────────────────────────────────────\n\n/**\n * Exit code block: strip the trailing '\\n', insert a paragraph after the block,\n * move cursor there. Mirrors CKEditor double-Enter exit behavior.\n */\nfunction exitCodeBlock(\n engine: EditorEngineInterface,\n doc: import('../../types').Document,\n blockPath: number[],\n): boolean {\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block || block.type !== 'code_block') return false;\n\n // Remove the trailing '\\n' from the last text node.\n const children = block.children as EditorNode[];\n const lastTextIdx = [...children].reverse().findIndex((c) => c.type === 'text');\n if (lastTextIdx === -1) return false;\n const realIdx = children.length - 1 - lastTextIdx;\n const lastText = children[realIdx] as TextNode;\n if (!lastText.text.endsWith('\\n')) return false;\n\n const trimmedText = lastText.text.slice(0, -1);\n const tr = createTransaction();\n\n // Replace last text node content.\n if (trimmedText.length === 0) {\n // Remove empty text node entirely only if there are siblings; else keep with empty text.\n if (children.length > 1) {\n tr.steps.push({ type: 'delete_text', path: [...blockPath, realIdx], from: 0, to: lastText.text.length });\n } else {\n tr.steps.push({ type: 'delete_text', path: [...blockPath, realIdx], from: lastText.text.length - 1, to: lastText.text.length });\n }\n } else {\n tr.steps.push({ type: 'delete_text', path: [...blockPath, realIdx], from: trimmedText.length, to: lastText.text.length });\n }\n\n // Insert paragraph after code block.\n const parentPath = blockPath.slice(0, -1);\n const blockIdx = blockPath[blockPath.length - 1];\n const para = createParagraph();\n tr.steps.push({ type: 'insert_node', parentPath, index: blockIdx + 1, node: para });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...parentPath, blockIdx + 1, 0], 0))));\n\n engine.dispatch(tr);\n return true;\n}\n\n/**\n * Set or clear the language on the code_block under the cursor.\n */\nexport function setCodeBlockLanguage(language: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block || block.type !== 'code_block') return false;\n const tr = createTransaction();\n tr.steps.push(tr_setNodeAttrs(blockPath, { ...(block.attrs ?? {}), language: language ?? '' }));\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Check List ───────────────────────────────────────────────────────────────\n\n/**\n * Exit a list_item from a bullet_list or ordered_list: extract it as a paragraph,\n * splitting the surrounding list into before/after parts as needed.\n * Mirrors CKEditor behavior for Backspace at start of first item / Enter on empty item.\n */\nfunction exitListItem(\n engine: EditorEngineInterface,\n doc: import('../../types').Document,\n blockPath: number[],\n): boolean {\n const parentPath = blockPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath) as BlockNode | null;\n if (!parent || (parent.type !== 'bullet_list' && parent.type !== 'ordered_list')) return false;\n\n const blockIdx = blockPath[blockPath.length - 1];\n const listIdx = parentPath[parentPath.length - 1];\n const grandPath = parentPath.slice(0, -1);\n\n const listItem = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!listItem) return false;\n\n const before = (parent.children as BlockNode[]).slice(0, blockIdx);\n const after = (parent.children as BlockNode[]).slice(blockIdx + 1);\n\n const tr = createTransaction();\n\n tr.steps.push({ type: 'delete_node', path: parentPath });\n\n let insertAt = listIdx;\n if (before.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: { ...parent, children: before } as BlockNode });\n insertAt++;\n }\n\n const para: BlockNode = { type: 'paragraph', attrs: {}, children: listItem.children };\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: para });\n const paraPath = [...grandPath, insertAt];\n insertAt++;\n\n if (after.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: { ...parent, children: after } as BlockNode });\n }\n\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...paraPath, 0], 0))));\n engine.dispatch(tr);\n return true;\n}\n\n/**\n * Exit an empty check_list_item: extract it as a paragraph, splitting the\n * surrounding check_list into before/after parts as needed.\n */\nfunction exitCheckListItem(\n engine: EditorEngineInterface,\n doc: import('../../types').Document,\n blockPath: number[],\n): boolean {\n const parentPath = blockPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath) as BlockNode | null;\n if (!parent || parent.type !== 'check_list') return false;\n\n const blockIdx = blockPath[blockPath.length - 1];\n const listIdx = parentPath[parentPath.length - 1];\n const grandPath = parentPath.slice(0, -1);\n\n const before = (parent.children as BlockNode[]).slice(0, blockIdx);\n const after = (parent.children as BlockNode[]).slice(blockIdx + 1);\n\n const tr = createTransaction();\n\n // Remove the whole list then re-assemble around an empty paragraph.\n tr.steps.push({ type: 'delete_node', path: parentPath });\n\n let insertAt = listIdx;\n if (before.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: { ...parent, children: before } as BlockNode });\n insertAt++;\n }\n\n const para = createParagraph();\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: para });\n const paraPath = [...grandPath, insertAt];\n insertAt++;\n\n if (after.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: { ...parent, children: after } as BlockNode });\n }\n\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(paraPath, 0))));\n engine.dispatch(tr);\n return true;\n}\n\n/**\n * Toggle checklist. Wraps the current block in check_list > check_list_item,\n * or unwraps it back to a paragraph if already inside a checklist.\n */\nexport const toggleCheckList: Command = (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block) return false;\n\n const parentPath = blockPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath) as BlockNode | import('../../types').Document | null;\n const parentType = (parent && 'type' in parent) ? parent.type : 'doc';\n const blockIdx = blockPath[blockPath.length - 1];\n const tr = createTransaction();\n\n // Already in a check_list_item → unwrap to paragraph.\n if (block.type === 'check_list_item' && parentType === 'check_list') {\n const listPath = parentPath;\n const grandParentPath = listPath.slice(0, -1);\n const listIdx = listPath[listPath.length - 1];\n\n const paragraph: BlockNode = { type: 'paragraph', attrs: {}, children: block.children };\n const listNode = parent as BlockNode;\n const remainingItems = listNode.children.filter((_, i) => i !== blockIdx);\n\n tr.steps.push({ type: 'delete_node', path: listPath });\n let insertIdx = listIdx;\n if (remainingItems.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: listIdx, node: { ...listNode, children: remainingItems } });\n insertIdx = listIdx + 1;\n }\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: insertIdx, node: paragraph });\n engine.dispatch(tr);\n return true;\n }\n\n // Inside a regular list (bullet/ordered) → convert entire list to check_list,\n // mapping each list_item → check_list_item.\n // Do NOT nest a check_list inside the existing list.\n if (block.type === 'list_item' && (parentType === 'bullet_list' || parentType === 'ordered_list')) {\n const listNode = parent as BlockNode;\n const grandParentPath = parentPath.slice(0, -1);\n const listIdx = parentPath[parentPath.length - 1];\n const convertedList: BlockNode = {\n type: 'check_list',\n attrs: {},\n children: (listNode.children as BlockNode[]).map((item) => ({\n type: 'check_list_item' as const,\n attrs: { checked: false },\n children: item.children,\n })),\n };\n tr.steps.push({ type: 'delete_node', path: parentPath });\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: listIdx, node: convertedList });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...grandParentPath, listIdx, blockIdx, 0], 0))));\n engine.dispatch(tr);\n return true;\n }\n\n // Wrap current block in check_list > check_list_item.\n const checkListItem: BlockNode = { type: 'check_list_item', attrs: { checked: false }, children: block.children };\n const checkListNode: BlockNode = { type: 'check_list', attrs: {}, children: [checkListItem] };\n\n tr.steps.push({ type: 'delete_node', path: blockPath });\n tr.steps.push({ type: 'insert_node', parentPath, index: blockIdx, node: checkListNode });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...blockPath, 0, 0], 0))));\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Toggle the checked state of the check_list_item at path.\n * Called by the Editor's mousedown handler when the user clicks a checkbox.\n */\nexport function toggleCheckItemAt(path: number[]): Command {\n return (engine) => {\n const state = engine.getState();\n const node = getNodeAtPath(state.doc, path) as BlockNode | null;\n if (!node || node.type !== 'check_list_item') return false;\n\n const tr = createTransaction();\n tr.steps.push(tr_setNodeAttrs(path, { checked: !node.attrs?.checked }));\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Text Insertion ───────────────────────────────────────────────────────────\n\n/**\n * Insert text at the current cursor position with the current pending marks.\n * If a range is selected, deletes it first (industry-standard \"type-to-replace\").\n */\nexport function insertText(text: string): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection, marks, doc } = state;\n if (!selection) return false;\n\n const tr = createTransaction();\n let insertAt = selection.anchor;\n\n if (!selection.isCollapsed) {\n const { from } = normalizeRange(selection.anchor, selection.focus);\n tr.steps.push(tr_deleteRange(selection.anchor, selection.focus));\n insertAt = from;\n }\n\n // Resolve the cursor's text-node path. If the selection points at a block\n // (empty paragraph), the cursor lands at [...blockPath, 0] after insertion.\n const node = getNodeAtPath(doc, insertAt.path);\n const isAtBlock = !node || !isTextNode(node as EditorNode);\n let cursorPath: number[];\n let cursorOffset: number;\n\n if (isAtBlock) {\n cursorPath = [...insertAt.path, 0];\n cursorOffset = text.length;\n } else {\n const textNode = node as TextNode;\n if (marksEqual(textNode.marks, marks)) {\n // Same marks: text spliced in-place, cursor stays on same node.\n cursorPath = insertAt.path;\n cursorOffset = insertAt.offset + text.length;\n } else {\n // Different marks: insertTextAtPath splits the node. The new text node\n // lands at parentPath[nodeIndex + (hasBefore ? 1 : 0)]. Using the\n // pre-split path here caused set_selection to read the wrong node's\n // marks, resetting state.marks and breaking continued formatting.\n const parentPath = insertAt.path.slice(0, -1);\n const nodeIndex = insertAt.path[insertAt.path.length - 1];\n const hasBefore = insertAt.offset > 0;\n cursorPath = [...parentPath, nodeIndex + (hasBefore ? 1 : 0)];\n cursorOffset = text.length;\n }\n }\n\n tr.steps.push(tr_insertText(insertAt.path, insertAt.offset, text, marks));\n tr.steps.push(\n tr_setSelection(\n makeCollapsedSelection(makePosition(cursorPath, cursorOffset)),\n ),\n );\n\n engine.dispatch(tr);\n return true;\n };\n}\n\n/**\n * Replace the current selection with the given text. Used by handleBeforeInput\n * to implement \"typing replaces selected text\".\n */\nexport const replaceSelectionWithText = (text: string): Command => insertText(text);\n\n// ─── Enter / Backspace ───────────────────────────────────────────────────────\n\n/**\n * Handle Enter key: split the current block at the cursor. If a range is selected,\n * delete the range first.\n */\nexport const handleEnter: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n const tr = createTransaction();\n\n let cursor = selection.anchor;\n if (!selection.isCollapsed) {\n const { from } = normalizeRange(selection.anchor, selection.focus);\n tr.steps.push(tr_deleteRange(selection.anchor, selection.focus));\n cursor = from;\n }\n\n const blockPath = findContentBlockPath(doc, cursor.path);\n if (!blockPath) return false;\n\n // Enter on an empty check_list_item exits the list instead of splitting.\n if (selection.isCollapsed) {\n const blockNode = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (blockNode?.type === 'check_list_item') {\n const isEmpty = blockNode.children.length === 0 ||\n (blockNode.children as EditorNode[]).every(\n (c) => c.type !== 'text' || (c as TextNode).text.length === 0,\n );\n if (isEmpty) return exitCheckListItem(engine, doc, blockPath);\n }\n\n // Enter on an empty list_item exits the list (CKEditor behavior)\n if (blockNode?.type === 'list_item') {\n const isEmpty = blockNode.children.length === 0 ||\n (blockNode.children as EditorNode[]).every(\n (c) => c.type !== 'text' || (c as TextNode).text.length === 0,\n );\n if (isEmpty) return exitListItem(engine, doc, blockPath);\n }\n\n // Enter inside code_block: insert '\\n' instead of splitting into a new block.\n // Double-Enter on an empty last line exits the code block (CKEditor behavior).\n if (blockNode?.type === 'code_block') {\n const fullText = (blockNode.children as EditorNode[])\n .filter((c): c is TextNode => c.type === 'text')\n .map((c) => c.text)\n .join('');\n // If block ends with '\\n' and cursor is at the very end → exit to paragraph.\n if (fullText.endsWith('\\n') && cursor.offset === fullText.length) {\n return exitCodeBlock(engine, doc, blockPath);\n }\n return insertText('\\n')(engine);\n }\n }\n\n // Compute the text offset within the block where the cursor sits.\n // For a text-node path this is the same as the offset within that text node\n // PLUS the sum of preceding sibling text lengths in the block.\n const blockOffset = computeBlockOffset(doc, blockPath, cursor);\n tr.steps.push(tr_splitBlock(blockPath, blockOffset));\n\n // Cursor lands at the start of the new (second) block.\n const newBlockPath = [...blockPath.slice(0, -1), blockPath[blockPath.length - 1] + 1];\n\n // New check_list_item must always start unchecked regardless of parent.\n const blockNode = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (blockNode?.type === 'check_list_item') {\n tr.steps.push(tr_setNodeAttrs(newBlockPath, { checked: false }));\n }\n\n tr.steps.push(\n tr_setSelection(makeCollapsedSelection(makePosition([...newBlockPath, 0], 0))),\n );\n\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Handle Backspace: delete a character, or if a range is selected delete the range,\n * or if at the start of a block join with the previous block.\n */\nexport const handleBackspace: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n // Range selected → delete it.\n if (!selection.isCollapsed) {\n const tr = createTransaction();\n tr.steps.push(tr_deleteRange(selection.anchor, selection.focus));\n engine.dispatch(tr);\n return true;\n }\n\n const { path, offset } = selection.anchor;\n\n if (offset > 0) {\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_text', path, from: offset - 1, to: offset });\n tr.steps.push(\n tr_setSelection(makeCollapsedSelection(makePosition(path, offset - 1))),\n );\n engine.dispatch(tr);\n return true;\n }\n\n // At the start of a text node: if there's a previous sibling in the block,\n // move cursor there. Otherwise join with previous block.\n const blockPath = findContentBlockPath(doc, path);\n if (!blockPath) return false;\n\n // Backspace on an empty check_list_item exits the list.\n const blockNode = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (blockNode?.type === 'check_list_item') {\n const isEmpty = blockNode.children.length === 0 ||\n (blockNode.children as EditorNode[]).every(\n (c) => c.type !== 'text' || (c as TextNode).text.length === 0,\n );\n if (isEmpty) return exitCheckListItem(engine, doc, blockPath);\n }\n\n const blockIdx = blockPath[blockPath.length - 1];\n if (blockIdx === 0 && path.length === blockPath.length + 1 && path[blockPath.length] === 0) {\n // At start of first text in first content block.\n // If it's a list_item, exit the list (CKEditor behavior: Backspace → paragraph above list).\n const blockAtPath = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (blockAtPath?.type === 'list_item') {\n return exitListItem(engine, doc, blockPath);\n }\n return true; // first text in first top-level block; nothing to delete\n }\n\n const tr = createTransaction();\n tr.steps.push(tr_joinBlocks(blockPath));\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Compute the flat text offset of a position within a block.\n * For Enter/split: we need the character offset within the block's flat text.\n */\nfunction computeBlockOffset(\n doc: import('../../types').Document,\n blockPath: number[],\n pos: import('../../types').NodePosition,\n): number {\n // Walk the block's children up to pos.path, summing text lengths;\n // add pos.offset for the text node containing the cursor.\n const block = (function get(d: typeof doc, p: number[]): unknown {\n let cur: unknown = d;\n for (const i of p) {\n cur = (cur as { children: unknown[] }).children[i];\n }\n return cur;\n })(doc, blockPath) as import('../../types').BlockNode | null;\n if (!block) return 0;\n\n let offset = 0;\n const targetIdx = pos.path[blockPath.length];\n if (targetIdx === undefined) return 0;\n\n for (let i = 0; i < targetIdx; i++) {\n const child = block.children[i];\n if (child && child.type === 'text') {\n offset += (child as TextNode).text.length;\n }\n }\n offset += pos.offset;\n return offset;\n}\n\n// ─── Link ─────────────────────────────────────────────────────────────────────\n\n/**\n * Insert or update a link — mirrors CKEditor 5 link behaviour:\n *\n * 1. Cursor collapsed, text provided → insert a new text node with the link\n * mark at the cursor position, then place cursor after it.\n * 2. Cursor collapsed inside existing link → update the href on the whole link\n * span (all adjacent same-href nodes) using tr_setMark to avoid duplicates.\n * 3. Range selected → atomically replace any existing link on that range with\n * the new href via tr_setMark (also prevents duplicate <a> tags).\n */\nexport function insertLink(href: string, displayText?: string): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection, doc, marks } = state;\n if (!selection) return false;\n\n const linkMark: Mark = { type: 'link', attrs: { href } };\n const tr = createTransaction();\n\n // ── Case 1: collapsed cursor ──────────────────────────────────────────────\n if (selection.isCollapsed) {\n const linkRange = getActiveLinkRange(doc, selection);\n\n if (linkRange) {\n // Update existing link span href atomically\n tr.steps.push(tr_setMark(linkRange.from, linkRange.to, 'link', linkMark));\n engine.dispatch(tr);\n return true;\n }\n\n if (displayText && displayText.trim()) {\n // Insert brand-new linked text at cursor\n const text = displayText.trim();\n const insertAt = selection.anchor;\n const node = getNodeAtPath(doc, insertAt.path);\n const isAtBlock = !node || !isTextNode(node as EditorNode);\n\n // Build marks for the new node: current pending marks + link\n const baseMarks = marks.filter((m) => m.type !== 'link');\n const newMarks: Mark[] = [...baseMarks, linkMark];\n\n // Calculate cursor position after insertion (same split-aware logic as insertText)\n let cursorPath: number[];\n let cursorOffset: number;\n if (isAtBlock) {\n cursorPath = [...insertAt.path, 0];\n cursorOffset = text.length;\n } else {\n const textNode = node as TextNode;\n if (marksEqual(textNode.marks, newMarks)) {\n cursorPath = insertAt.path;\n cursorOffset = insertAt.offset + text.length;\n } else {\n const parentPath = insertAt.path.slice(0, -1);\n const nodeIndex = insertAt.path[insertAt.path.length - 1];\n const hasBefore = insertAt.offset > 0;\n cursorPath = [...parentPath, nodeIndex + (hasBefore ? 1 : 0)];\n cursorOffset = text.length;\n }\n }\n\n tr.steps.push(tr_insertText(insertAt.path, insertAt.offset, text, newMarks));\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(cursorPath, cursorOffset))));\n engine.dispatch(tr);\n return true;\n }\n\n // Collapsed with no text and no existing link — nothing to do\n return false;\n }\n\n // ── Case 2: range selected ────────────────────────────────────────────────\n // tr_setMark atomically removes any existing link mark then adds the new\n // one in a single pass — prevents nested/duplicate <a> tags.\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n tr.steps.push(tr_setMark(from, to, 'link', linkMark));\n\n // Restore the selection so the user sees the highlighted text after apply\n tr.steps.push(tr_setSelection(selection));\n engine.dispatch(tr);\n return true;\n };\n}\n\n/**\n * Remove the link mark from the whole link span the cursor is inside,\n * or from the explicit range when text is selected. Uses getActiveLinkRange\n * to walk sibling nodes with the same href so removing a collapsed-cursor\n * link clears the entire hyperlink, not just the one text node.\n */\nexport const removeLink: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n let from = selection.anchor;\n let to = selection.focus;\n\n if (selection.isCollapsed) {\n // Expand to full link span (all adjacent nodes sharing the same href)\n const linkRange = getActiveLinkRange(doc, selection);\n if (linkRange) {\n from = linkRange.from;\n to = linkRange.to;\n } else {\n // Fallback: at least cover the current text node\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n from = makePosition(selection.anchor.path, 0);\n to = makePosition(selection.anchor.path, (node as TextNode).text.length);\n }\n }\n }\n\n const tr = createTransaction();\n tr.steps.push(tr_removeMark(from, to, 'link'));\n engine.dispatch(tr);\n return true;\n};\n\n// ─── Font Size ────────────────────────────────────────────────────────────────\n\n/**\n * Set font size on the current selection, or null to remove it.\n * Collapsed cursor: updates pending marks so the next typed char gets the size.\n * Range selection: atomically replaces any existing font_size mark across the range.\n */\n/**\n * Set highlight (background) color on the current selection, or null to remove it.\n * Uses setMarkOnRange for atomic replace so mixed-color ranges are handled cleanly.\n * Collapsed cursor: stores in pending marks for the next typed character.\n */\n/**\n * Set text (foreground) color on the current selection, or null to remove it.\n * Collapsed cursor: stores in pending marks for the next typed character.\n * Range: atomically replaces any existing text_color mark across the range.\n */\nexport function setTextColor(color: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const mark: Mark | null = color ? { type: 'text_color', attrs: { color } } : null;\n const tr = createTransaction();\n\n if (selection.isCollapsed) {\n const filtered = state.marks.filter((m) => m.type !== 'text_color');\n tr.meta.pendingMarks = mark ? [...filtered, mark] : filtered;\n } else {\n tr.steps.push(tr_setMark(selection.anchor, selection.focus, 'text_color', mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function setHighlightColor(color: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const mark: Mark | null = color ? { type: 'highlight', attrs: { color } } : null;\n const tr = createTransaction();\n\n if (selection.isCollapsed) {\n const filtered = state.marks.filter((m) => m.type !== 'highlight');\n tr.meta.pendingMarks = mark ? [...filtered, mark] : filtered;\n } else {\n tr.steps.push(tr_setMark(selection.anchor, selection.focus, 'highlight', mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function setFontFamily(family: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const mark: Mark | null = family ? { type: 'font_family', attrs: { family } } : null;\n const tr = createTransaction();\n\n if (selection.isCollapsed) {\n const filtered = state.marks.filter((m) => m.type !== 'font_family');\n tr.meta.pendingMarks = mark ? [...filtered, mark] : filtered;\n } else {\n tr.steps.push(tr_setMark(selection.anchor, selection.focus, 'font_family', mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function setFontSize(size: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const mark: Mark | null = size ? { type: 'font_size', attrs: { size } } : null;\n const tr = createTransaction();\n\n if (selection.isCollapsed) {\n const filtered = state.marks.filter((m) => m.type !== 'font_size');\n tr.meta.pendingMarks = mark ? [...filtered, mark] : filtered;\n } else {\n tr.steps.push(tr_setMark(selection.anchor, selection.focus, 'font_size', mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Alignment ───────────────────────────────────────────────────────────────\n\n/**\n * Set text alignment on the content block at the cursor.\n * Clicking the active alignment again removes it (reverts to default left).\n * Applies to: paragraph, heading, blockquote, list_item.\n */\nexport function setAlignment(align: import('../../types').AlignmentType): Command {\n return (engine) => {\n const state = engine.getState();\n const { doc, selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as import('../../types').BlockNode | null;\n if (!block) return false;\n\n // Toggle off if same alignment is clicked again\n const current = block.attrs?.align as string | undefined;\n const next = current === align ? undefined : align;\n\n const tr = createTransaction();\n tr.steps.push(tr_setNodeAttrs(blockPath, { align: next }));\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport const alignLeft = setAlignment('left');\nexport const alignCenter = setAlignment('center');\nexport const alignRight = setAlignment('right');\nexport const alignJustify = setAlignment('justify');\n\n// ─── Image ────────────────────────────────────────────────────────────────────\n\nexport function insertImage(src: string, alt = '', extraAttrs?: Record<string, unknown>): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(state.doc, selection.anchor.path) ?? [0];\n const parentPath = blockPath.slice(0, -1);\n const insertIdx = blockPath[blockPath.length - 1] + 1;\n\n const imageNode: BlockNode = {\n type: 'image',\n attrs: { src, alt, ...extraAttrs },\n children: [],\n };\n\n const tr = createTransaction();\n tr.steps.push({ type: 'insert_node', parentPath, index: insertIdx, node: imageNode });\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function setImageAttr(imagePath: number[], attrs: Record<string, unknown>): Command {\n return (engine) => {\n const state = engine.getState();\n const node = getNodeAtPath(state.doc, imagePath);\n if (!node || (node as BlockNode).type !== 'image') return false;\n const updated: BlockNode = {\n ...(node as BlockNode),\n attrs: { ...(node as BlockNode).attrs, ...attrs },\n };\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: imagePath });\n tr.steps.push({\n type: 'insert_node',\n parentPath: imagePath.length > 1 ? imagePath.slice(0, -1) : [],\n index: imagePath[imagePath.length - 1],\n node: updated,\n });\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function deleteImageAtPath(imagePath: number[]): Command {\n return (engine) => {\n const state = engine.getState();\n const node = getNodeAtPath(state.doc, imagePath);\n if (!node || (node as BlockNode).type !== 'image') return false;\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: imagePath });\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Horizontal Rule ─────────────────────────────────────────────────────────\n\n/**\n * Insert a horizontal rule after the current block.\n * Always appends an empty paragraph after the HR so the cursor has\n * somewhere to land and the user can continue typing.\n */\nexport const insertHorizontalRule: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path) ?? [0];\n const parentPath = blockPath.slice(0, -1);\n const afterIdx = blockPath[blockPath.length - 1] + 1;\n\n const hrNode: BlockNode = { type: 'horizontal_rule', attrs: {}, children: [] };\n const paraNode = createParagraph();\n\n const tr = createTransaction();\n tr.steps.push({ type: 'insert_node', parentPath, index: afterIdx, node: hrNode });\n tr.steps.push({ type: 'insert_node', parentPath, index: afterIdx + 1, node: paraNode });\n // Land cursor at the new empty paragraph (block-level path, offset 0).\n tr.steps.push(tr_setSelection(\n makeCollapsedSelection(makePosition([...parentPath, afterIdx + 1], 0)),\n ));\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Skip the cursor over an adjacent horizontal_rule node.\n * Returns true (consumed) only when it actually jumps over an HR.\n * Only handles top-level blocks — HRs inside lists are not expected.\n */\nfunction jumpOverHR(engine: EditorEngineInterface, dir: 'down' | 'up'): boolean {\n const state = engine.getState();\n const { doc, selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath || blockPath.length !== 1) return false;\n\n const idx = blockPath[0];\n const neighborIdx = dir === 'down' ? idx + 1 : idx - 1;\n const neighbor = doc.children[neighborIdx];\n if (!neighbor || neighbor.type !== 'horizontal_rule') return false;\n\n const destIdx = dir === 'down' ? neighborIdx + 1 : neighborIdx - 1;\n const dest = doc.children[destIdx];\n if (!dest) return false;\n\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(\n makeCollapsedSelection(makePosition([destIdx], 0)),\n ));\n engine.dispatch(tr);\n return true;\n}\n\n// ─── Forward Delete ───────────────────────────────────────────────────────────\n\n/**\n * Handle the Delete key: delete one character forward, or if a range is selected\n * delete the range, or if at the end of a block join the next block into this one.\n */\nexport const handleDelete: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n // Non-collapsed → same delete-range logic as Backspace\n if (!selection.isCollapsed) {\n const tr = createTransaction();\n tr.steps.push(tr_deleteRange(selection.anchor, selection.focus));\n engine.dispatch(tr);\n return true;\n }\n\n const { path, offset } = selection.anchor;\n const node = getNodeAtPath(doc, path);\n\n // Delete forward within text node\n if (node && isTextNode(node as EditorNode)) {\n const textNode = node as TextNode;\n if (offset < textNode.text.length) {\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_text', path, from: offset, to: offset + 1 });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(path, offset))));\n engine.dispatch(tr);\n return true;\n }\n }\n\n // At end of text node / block → join next sibling block into current\n const blockPath = findContentBlockPath(doc, path);\n if (!blockPath) return true;\n\n const parentPath = blockPath.slice(0, -1);\n const blockIdx = blockPath[blockPath.length - 1];\n const nextPath = [...parentPath, blockIdx + 1];\n\n if (!getNodeAtPath(doc, nextPath)) {\n // No next sibling at this level — try one level up (e.g. end of last list item)\n if (parentPath.length > 0) {\n const outerBlockPath = parentPath.slice(0, -1);\n const outerIdx = parentPath[parentPath.length - 1];\n const outerNext = [...outerBlockPath, outerIdx + 1];\n if (getNodeAtPath(doc, outerNext)) {\n const tr = createTransaction();\n tr.steps.push(tr_joinBlocks(outerNext));\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(path, offset))));\n engine.dispatch(tr);\n return true;\n }\n }\n return true; // nothing to delete\n }\n\n const tr = createTransaction();\n tr.steps.push(tr_joinBlocks(nextPath));\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(path, offset))));\n engine.dispatch(tr);\n return true;\n};\n\n// ─── List Indent / Outdent ────────────────────────────────────────────────────\n\n/**\n * Tab inside a list_item: nest the item one level deeper under the previous item.\n * Mirrors CKEditor Tab behaviour in lists.\n */\nexport const indentListItem: Command = (engine) => {\n const state = engine.getState();\n const { doc, selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block || block.type !== 'list_item') return false;\n\n const listPath = blockPath.slice(0, -1);\n const list = getNodeAtPath(doc, listPath) as BlockNode | null;\n if (!list || (list.type !== 'bullet_list' && list.type !== 'ordered_list')) return false;\n\n const itemIdx = blockPath[blockPath.length - 1];\n if (itemIdx === 0) return false; // cannot indent first item\n\n const prevItemPath = [...listPath, itemIdx - 1];\n const prevItem = getNodeAtPath(doc, prevItemPath) as BlockNode | null;\n if (!prevItem) return false;\n\n // Check if prevItem already ends with a nested list of the same type\n const prevChildren = prevItem.children as EditorNode[];\n const lastChild = prevChildren[prevChildren.length - 1] as BlockNode | undefined;\n const hasNested = lastChild && !isTextNode(lastChild as EditorNode) && lastChild.type === list.type;\n\n const newPrevChildren: EditorNode[] = hasNested\n ? [\n ...prevChildren.slice(0, -1),\n { ...lastChild!, children: [...(lastChild!.children as BlockNode[]), block] },\n ]\n : [...prevChildren, { type: list.type, attrs: {}, children: [block] } as BlockNode];\n\n // Nested item's path after transaction:\n // prevItemPath + [newPrevChildren.length - 1 (nested list)] + [hasNested ? lastChild.children.length : 0]\n const nestedListIdxInPrev = newPrevChildren.length - 1;\n const nestedItemIdx = hasNested ? (lastChild!.children as BlockNode[]).length : 0;\n const nestedItemPath = [...prevItemPath, nestedListIdxInPrev, nestedItemIdx];\n\n const updatedPrev: BlockNode = { ...prevItem, children: newPrevChildren };\n\n const tr = createTransaction();\n // Delete current item first (higher index), then prev item, then re-insert prev\n tr.steps.push({ type: 'delete_node', path: blockPath });\n tr.steps.push({ type: 'delete_node', path: prevItemPath });\n tr.steps.push({ type: 'insert_node', parentPath: listPath, index: itemIdx - 1, node: updatedPrev });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...nestedItemPath, 0], 0))));\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Shift+Tab inside a nested list_item: promote it one level up.\n * Mirrors CKEditor Shift+Tab behaviour in lists.\n */\nexport const outdentListItem: Command = (engine) => {\n const state = engine.getState();\n const { doc, selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block || block.type !== 'list_item') return false;\n\n const nestedListPath = blockPath.slice(0, -1);\n const nestedList = getNodeAtPath(doc, nestedListPath) as BlockNode | null;\n if (!nestedList || (nestedList.type !== 'bullet_list' && nestedList.type !== 'ordered_list')) return false;\n\n // Must be inside another list_item (truly nested)\n const parentItemPath = nestedListPath.slice(0, -1);\n const parentItem = getNodeAtPath(doc, parentItemPath) as BlockNode | null;\n if (!parentItem || parentItem.type !== 'list_item') return false;\n\n const parentListPath = parentItemPath.slice(0, -1);\n const parentList = getNodeAtPath(doc, parentListPath) as BlockNode | null;\n if (!parentList) return false;\n\n const itemIdx = blockPath[blockPath.length - 1];\n const nestedListIdx = nestedListPath[nestedListPath.length - 1];\n const parentItemIdx = parentItemPath[parentItemPath.length - 1];\n\n // Split the nested list around the extracted item\n const beforeNested = (nestedList.children as BlockNode[]).slice(0, itemIdx);\n const afterNested = (nestedList.children as BlockNode[]).slice(itemIdx + 1);\n\n const parentItemChildren = parentItem.children as EditorNode[];\n let newParentChildren: EditorNode[];\n\n if (beforeNested.length === 0 && afterNested.length === 0) {\n // Remove nested list entirely\n newParentChildren = [\n ...parentItemChildren.slice(0, nestedListIdx),\n ...parentItemChildren.slice(nestedListIdx + 1),\n ];\n } else if (beforeNested.length === 0) {\n newParentChildren = [\n ...parentItemChildren.slice(0, nestedListIdx),\n { ...nestedList, children: afterNested },\n ...parentItemChildren.slice(nestedListIdx + 1),\n ];\n } else if (afterNested.length === 0) {\n newParentChildren = [\n ...parentItemChildren.slice(0, nestedListIdx),\n { ...nestedList, children: beforeNested },\n ...parentItemChildren.slice(nestedListIdx + 1),\n ];\n } else {\n // Split into two nested lists\n newParentChildren = [\n ...parentItemChildren.slice(0, nestedListIdx),\n { ...nestedList, children: beforeNested },\n { ...nestedList, children: afterNested },\n ...parentItemChildren.slice(nestedListIdx + 1),\n ];\n }\n\n const updatedParent: BlockNode = { ...parentItem, children: newParentChildren };\n const insertIdx = parentItemIdx + 1; // extracted item goes right after parent item\n const newBlockPath = [...parentListPath, insertIdx];\n\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: parentItemPath });\n tr.steps.push({ type: 'insert_node', parentPath: parentListPath, index: parentItemIdx, node: updatedParent });\n tr.steps.push({ type: 'insert_node', parentPath: parentListPath, index: insertIdx, node: block });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...newBlockPath, 0], 0))));\n engine.dispatch(tr);\n return true;\n};\n\n// ─── Select All ───────────────────────────────────────────────────────────────\n\nexport const selectAll: Command = (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const lastBlock = doc.children[doc.children.length - 1];\n if (!lastBlock) return false;\n\n const lastIdx = doc.children.length - 1;\n const lastChildren = lastBlock.children;\n const focusChildIdx = Math.max(lastChildren.length - 1, 0);\n const lastChild = lastChildren[focusChildIdx];\n const lastTextOffset =\n lastChild && isTextNode(lastChild) ? (lastChild as TextNode).text.length : 0;\n\n const tr = createTransaction();\n tr.steps.push(tr_setSelection({\n anchor: makePosition([0, 0], 0),\n focus: makePosition([lastIdx, focusChildIdx], lastTextOffset),\n isCollapsed: false,\n }));\n engine.dispatch(tr);\n return true;\n};\n\n// ─── Keyboard Shortcut Bindings ───────────────────────────────────────────────\n\n/**\n * Default keyboard shortcuts. Register this as a plugin.\n */\nexport const defaultKeyboardPlugin = {\n name: 'default-keyboard',\n keyBindings: {\n 'ArrowDown': (engine: EditorEngineInterface) => jumpOverHR(engine, 'down'),\n 'ArrowUp': (engine: EditorEngineInterface) => jumpOverHR(engine, 'up'),\n 'Ctrl+b': toggleBold,\n 'Ctrl+B': toggleBold,\n 'Ctrl+i': toggleItalic,\n 'Ctrl+I': toggleItalic,\n 'Ctrl+u': toggleUnderline,\n 'Ctrl+U': toggleUnderline,\n 'Ctrl+Shift+x': toggleStrikethrough,\n 'Ctrl+Shift+X': toggleStrikethrough,\n 'Ctrl+e': toggleCode,\n 'Ctrl+E': toggleCode,\n 'Ctrl+a': selectAll,\n 'Ctrl+A': selectAll,\n 'Ctrl+Shift+7': toggleOrderedList,\n 'Ctrl+Shift+8': toggleBulletList,\n 'Ctrl+Shift+9': toggleCheckList,\n 'Ctrl+Shift+.': setBlockquote,\n 'Ctrl+Shift+c': setCodeBlock,\n 'Ctrl+Shift+C': setCodeBlock,\n // Alignment shortcuts (Shift produces uppercase key)\n 'Ctrl+Shift+L': alignLeft,\n 'Ctrl+Shift+E': alignCenter,\n 'Ctrl+Shift+R': alignRight,\n 'Ctrl+Shift+J': alignJustify,\n },\n};\n","'use client';\n\nimport React from 'react';\n\ninterface ToolbarButtonProps {\n label: string;\n title: string;\n onClick: () => void;\n isActive?: boolean;\n isDisabled?: boolean;\n icon?: React.ReactNode;\n}\n\nexport function ToolbarButton({\n label,\n title,\n onClick,\n isActive = false,\n isDisabled = false,\n icon,\n}: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n title={title}\n aria-label={title}\n aria-pressed={isActive}\n disabled={isDisabled}\n onMouseDown={(e) => {\n // Prevent the editor from losing focus on toolbar click\n e.preventDefault();\n if (!isDisabled) onClick();\n }}\n className={[\n 'flex items-center justify-center w-7 h-7 rounded text-sm transition-colors',\n 'focus:outline-none focus-visible:ring-1 focus-visible:ring-blue-500',\n isActive\n ? 'bg-blue-100 text-blue-700 '\n : 'text-gray-600 hover:bg-gray-100 ',\n isDisabled ? 'opacity-40 cursor-not-allowed' : 'cursor-pointer',\n ].join(' ')}\n >\n {icon ?? label}\n </button>\n );\n}\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport type { AlignmentType } from '../../types';\r\nimport { setAlignment } from '../../editor/commands';\r\n\r\n// ─── Config ───────────────────────────────────────────────────────────────────\r\n\r\ninterface AlignmentOption {\r\n value: AlignmentType;\r\n label: string;\r\n shortcut: string;\r\n icon: React.ReactNode;\r\n}\r\n\r\nconst OPTIONS: AlignmentOption[] = [\r\n {\r\n value: 'left',\r\n label: 'Align Left',\r\n shortcut: 'Ctrl+Shift+L',\r\n icon: <AlignLeftIcon />,\r\n },\r\n {\r\n value: 'center',\r\n label: 'Align Center',\r\n shortcut: 'Ctrl+Shift+E',\r\n icon: <AlignCenterIcon />,\r\n },\r\n {\r\n value: 'right',\r\n label: 'Align Right',\r\n shortcut: 'Ctrl+Shift+R',\r\n icon: <AlignRightIcon />,\r\n },\r\n {\r\n value: 'justify',\r\n label: 'Justify',\r\n shortcut: 'Ctrl+Shift+J',\r\n icon: <AlignJustifyIcon />,\r\n },\r\n];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface AlignmentDropdownProps {\r\n engine: EditorEngine;\r\n activeAlignment: AlignmentType;\r\n}\r\n\r\nexport function AlignmentDropdown({ engine, activeAlignment }: AlignmentDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n // Close on Escape\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n const activeOption = OPTIONS.find((o) => o.value === activeAlignment) ?? OPTIONS[0];\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n {/* Trigger: current-alignment icon + chevron */}\r\n <button\r\n type=\"button\"\r\n title={`Text alignment (${activeOption.label})`}\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault(); // keep editor focus\r\n setOpen((prev) => !prev);\r\n }}\r\n className={[\r\n 'flex items-center gap-0.5 px-1.5 h-8 rounded text-sm font-medium transition-colors',\r\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\r\n open\r\n ? 'bg-gray-100 text-gray-900 '\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n {activeOption.icon}\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {/* Dropdown panel */}\r\n {open && (\r\n <div\r\n role=\"listbox\"\r\n aria-label=\"Text alignment\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-lg py-1 min-w-[168px]\"\r\n >\r\n {OPTIONS.map((option) => {\r\n const isActive = activeAlignment === option.value;\r\n return (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n title={`${option.label} (${option.shortcut})`}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setAlignment(option.value)(engine);\r\n setOpen(false);\r\n }}\r\n className={[\r\n 'w-full flex items-center gap-3 px-3 py-1.5 text-sm transition-colors',\r\n isActive\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span className=\"flex-shrink-0\">{option.icon}</span>\r\n <span className=\"flex-1 text-left\">{option.label}</span>\r\n {isActive && <CheckIcon />}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\r\n\r\nfunction AlignLeftIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"3\" y1=\"10\" x2=\"15\" y2=\"10\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"15\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction AlignCenterIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"6\" y1=\"10\" x2=\"18\" y2=\"10\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" />\r\n <line x1=\"6\" y1=\"18\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction AlignRightIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"9\" y1=\"10\" x2=\"21\" y2=\"10\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" />\r\n <line x1=\"9\" y1=\"18\" x2=\"21\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction AlignJustifyIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg className=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CheckIcon() {\r\n return (\r\n <svg className=\"w-3.5 h-3.5 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport { setFontSize } from '../../editor/commands';\r\n\r\n// ─── Config ───────────────────────────────────────────────────────────────────\r\n\r\nconst SIZES = ['8', '10', '12', '14', '16', '18', '24', '32', '48'];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface FontSizeDropdownProps {\r\n engine: EditorEngine;\r\n activeFontSize: string | null; // stored as e.g. '12px', null = default\r\n}\r\n\r\nexport function FontSizeDropdown({ engine, activeFontSize }: FontSizeDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n // Show the numeric part only (e.g. '12' from '12px')\r\n const activeNum = activeFontSize ? activeFontSize.replace('px', '') : null;\r\n const label = activeNum ?? 'Size';\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n <button\r\n type=\"button\"\r\n title=\"Font size\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setOpen((prev) => !prev);\r\n }}\r\n className={[\r\n 'flex items-center gap-0.5 px-1.5 h-8 rounded text-sm font-medium transition-colors min-w-[52px]',\r\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\r\n open\r\n ? 'bg-gray-100 text-gray-900 '\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span className=\"flex-1 text-left\">{label}</span>\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {open && (\r\n <div\r\n role=\"listbox\"\r\n aria-label=\"Font size\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-lg py-1 min-w-[88px] max-h-64 overflow-y-auto\"\r\n >\r\n {/* Default / reset */}\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={activeFontSize === null}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setFontSize(null)(engine);\r\n setOpen(false);\r\n }}\r\n className={[\r\n 'w-full flex items-center justify-between px-3 py-1.5 text-sm transition-colors',\r\n activeFontSize === null\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span>Default</span>\r\n {activeFontSize === null && <CheckIcon />}\r\n </button>\r\n\r\n {SIZES.map((size) => {\r\n const isActive = activeNum === size;\r\n return (\r\n <button\r\n key={size}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setFontSize(`${size}px`)(engine);\r\n setOpen(false);\r\n }}\r\n className={[\r\n 'w-full flex items-center justify-between px-3 py-1.5 transition-colors',\r\n isActive\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span style={{ fontSize: `${size}px`, lineHeight: 1.3 }}>{size}</span>\r\n {isActive && <CheckIcon />}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg className=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CheckIcon() {\r\n return (\r\n <svg className=\"w-3.5 h-3.5 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport { setFontFamily } from '../../editor/commands';\r\n\r\n// ─── Config ───────────────────────────────────────────────────────────────────\r\n\r\ninterface FontOption {\r\n label: string;\r\n value: string; // stored in mark attrs and applied as CSS font-family\r\n}\r\n\r\nconst FONTS: FontOption[] = [\r\n { label: 'Inter', value: 'Inter, sans-serif' },\r\n { label: 'Arial', value: 'Arial, sans-serif' },\r\n { label: 'Courier New', value: '\"Courier New\", Courier, monospace' },\r\n { label: 'Georgia', value: 'Georgia, serif' },\r\n { label: 'Lucida Sans Unicode', value: '\"Lucida Sans Unicode\", \"Lucida Grande\", sans-serif' },\r\n { label: 'Tahoma', value: 'Tahoma, Geneva, sans-serif' },\r\n { label: 'Times New Roman', value: '\"Times New Roman\", Times, serif' },\r\n { label: 'Trebuchet MS', value: '\"Trebuchet MS\", Helvetica, sans-serif' },\r\n { label: 'Verdana', value: 'Verdana, Geneva, sans-serif' },\r\n];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface FontFamilyDropdownProps {\r\n engine: EditorEngine;\r\n activeFontFamily: string | null;\r\n}\r\n\r\nexport function FontFamilyDropdown({ engine, activeFontFamily }: FontFamilyDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const [showCustomInput, setShowCustomInput] = useState(false);\r\n const [customValue, setCustomValue] = useState('');\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const customInputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n closeDropdown();\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n // Close on Escape\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') closeDropdown(); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n // Focus custom input when it appears\r\n useEffect(() => {\r\n if (showCustomInput) customInputRef.current?.focus();\r\n }, [showCustomInput]);\r\n\r\n function closeDropdown() {\r\n setOpen(false);\r\n setShowCustomInput(false);\r\n setCustomValue('');\r\n }\r\n\r\n function applyFont(value: string | null) {\r\n setFontFamily(value)(engine);\r\n closeDropdown();\r\n }\r\n\r\n function applyCustom() {\r\n const trimmed = customValue.trim();\r\n if (!trimmed) return;\r\n applyFont(trimmed);\r\n }\r\n\r\n // Find the predefined option matching the active family (if any)\r\n const activeOption = activeFontFamily\r\n ? FONTS.find((f) => f.value === activeFontFamily) ?? null\r\n : null;\r\n\r\n // Trigger label: predefined name, or first ~10 chars of custom value, or placeholder\r\n const triggerLabel = activeOption\r\n ? activeOption.label\r\n : activeFontFamily\r\n ? activeFontFamily.split(',')[0].replace(/['\"]/g, '').trim().slice(0, 10)\r\n : 'Font';\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n {/* Trigger button */}\r\n <button\r\n type=\"button\"\r\n title=\"Font family\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n if (open) { closeDropdown(); return; }\r\n setShowCustomInput(false);\r\n setCustomValue('');\r\n setOpen(true);\r\n }}\r\n className={[\r\n 'flex items-center gap-0.5 px-1.5 h-8 rounded text-sm font-medium transition-colors min-w-[60px] max-w-[120px]',\r\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\r\n open\r\n ? 'bg-gray-100 text-gray-900 '\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <FontIcon />\r\n <span className=\"flex-1 text-left truncate\">{triggerLabel}</span>\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {/* Dropdown panel */}\r\n {open && (\r\n <div\r\n role=\"listbox\"\r\n aria-label=\"Font family\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-lg py-1 min-w-[200px]\"\r\n >\r\n {/* Default / reset */}\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={activeFontFamily === null}\r\n onMouseDown={(e) => { e.preventDefault(); applyFont(null); }}\r\n className={[\r\n 'w-full flex items-center justify-between px-3 py-1.5 text-sm transition-colors',\r\n activeFontFamily === null\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span>Default</span>\r\n {activeFontFamily === null && <CheckIcon />}\r\n </button>\r\n\r\n <div className=\"my-1 border-t border-gray-100 \" />\r\n\r\n {/* Predefined fonts */}\r\n {FONTS.map((font) => {\r\n const isActive = activeFontFamily === font.value;\r\n return (\r\n <button\r\n key={font.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n onMouseDown={(e) => { e.preventDefault(); applyFont(font.value); }}\r\n className={[\r\n 'w-full flex items-center justify-between px-3 py-1.5 text-sm transition-colors',\r\n isActive\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span style={{ fontFamily: font.value }}>{font.label}</span>\r\n {isActive && <CheckIcon />}\r\n </button>\r\n );\r\n })}\r\n\r\n {/* <div className=\"my-1 border-t border-gray-100 \" /> */}\r\n\r\n {/* Custom font */}\r\n \r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\r\n\r\nfunction FontIcon() {\r\n return (\r\n <svg className=\"w-4 h-4 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"4 7 4 4 20 4 20 7\" />\r\n <line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\" />\r\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg className=\"w-3 h-3 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CheckIcon() {\r\n return (\r\n <svg className=\"w-3.5 h-3.5 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction PlusIcon() {\r\n return (\r\n <svg className=\"w-3.5 h-3.5 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\r\n </svg>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useRef, useEffect, useCallback } from \"react\";\r\nimport type { EditorEngine } from \"../../editor/core/EditorEngine\";\r\nimport { setHighlightColor } from \"../../editor/commands\";\r\n\r\n// ─── CKEditor 5-matching colour palette ───────────────────────────────────────\r\n// Same hue/saturation grid CKEditor ships by default:\r\n// row 1 — neutral grey ramp\r\n// row 2 — warm spectrum (hsl h=0..120, s=75%, l=60%)\r\n// row 3 — cool spectrum (hsl h=150..270, s=75%, l=60%)\r\n\r\ninterface ColorOption {\r\n label: string;\r\n value: string; // lowercase hex\r\n hasBorder?: boolean;\r\n}\r\n\r\nconst PRESET_COLORS: ColorOption[] = [\r\n // Row 1 — neutrals\r\n { label: \"Black\", value: \"#000000\" },\r\n { label: \"Dim grey\", value: \"#4d4d4d\" },\r\n { label: \"Grey\", value: \"#999999\" },\r\n { label: \"Light grey\", value: \"#e6e6e6\" },\r\n { label: \"White\", value: \"#ffffff\", hasBorder: true },\r\n // Row 2 — warm\r\n { label: \"Red\", value: \"#e64d4d\" },\r\n { label: \"Orange\", value: \"#f99a4d\" },\r\n { label: \"Yellow\", value: \"#f9e04d\" },\r\n { label: \"Light green\", value: \"#91e44d\" },\r\n { label: \"Green\", value: \"#54d454\" },\r\n // Row 3 — cool\r\n { label: \"Aquamarine\", value: \"#54d4a6\" },\r\n { label: \"Turquoise\", value: \"#54d4d4\" },\r\n { label: \"Light blue\", value: \"#4d91e4\" },\r\n { label: \"Blue\", value: \"#4d4de4\" },\r\n { label: \"Purple\", value: \"#9d4de4\" },\r\n];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface BackgroundColorDropdownProps {\r\n engine: EditorEngine;\r\n activeColor: string | null;\r\n documentColors: string[];\r\n}\r\n\r\nexport function BackgroundColorDropdown({\r\n engine,\r\n activeColor,\r\n documentColors,\r\n}: BackgroundColorDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const [lastColor, setLastColor] = useState(PRESET_COLORS[6].value); // Yellow default\r\n const [hexInput, setHexInput] = useState(\"\");\r\n const [hexError, setHexError] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Outside-click → close\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n )\r\n setOpen(false);\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n }, [open]);\r\n\r\n // Escape → close\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") setOpen(false);\r\n };\r\n document.addEventListener(\"keydown\", handler);\r\n return () => document.removeEventListener(\"keydown\", handler);\r\n }, [open]);\r\n\r\n const applyColor = useCallback(\r\n (color: string | null) => {\r\n if (color) setLastColor(normalizeHex(color));\r\n setHighlightColor(color)(engine);\r\n setOpen(false);\r\n },\r\n [engine],\r\n );\r\n\r\n const handleQuickApply = () => {\r\n const norm = normalizeHex(lastColor);\r\n if (activeColor && normalizeHex(activeColor) === norm) {\r\n setHighlightColor(null)(engine);\r\n } else {\r\n setHighlightColor(norm)(engine);\r\n }\r\n };\r\n\r\n const commitHexInput = () => {\r\n const raw = hexInput.trim().replace(/^#/, \"\");\r\n if (/^[0-9a-f]{6}$/i.test(raw) || /^[0-9a-f]{3}$/i.test(raw)) {\r\n applyColor(`#${raw.toLowerCase()}`);\r\n setHexError(false);\r\n } else {\r\n setHexError(true);\r\n }\r\n };\r\n\r\n // Non-preset document colors\r\n const extraDocColors = documentColors.filter(\r\n (c) =>\r\n !PRESET_COLORS.some((p) => normalizeHex(p.value) === normalizeHex(c)),\r\n );\r\n\r\n const normActive = activeColor ? normalizeHex(activeColor) : null;\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative flex items-center\">\r\n {/* ── Quick-apply split button ──────────────────────────────────────── */}\r\n <button\r\n type=\"button\"\r\n title={`Background color: ${lastColor}`}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleQuickApply();\r\n }}\r\n className=\"flex flex-col items-center justify-center gap-0.5 w-8 h-8 rounded-l\r\n text-gray-700 \r\n hover:bg-gray-100 \r\n focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500\r\n transition-colors\"\r\n >\r\n <BgColorIcon />\r\n <ColorBar color={normActive ?? lastColor} />\r\n </button>\r\n\r\n {/* ── Chevron button ───────────────────────────────────────────────── */}\r\n <button\r\n type=\"button\"\r\n title=\"More background colors\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setOpen((p) => {\r\n if (!p) {\r\n setHexInput(\"\");\r\n setHexError(false);\r\n }\r\n return !p;\r\n });\r\n }}\r\n className={[\r\n \"flex items-center justify-center w-4 h-8 rounded-r border-l border-gray-200 \",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500\",\r\n \"transition-colors\",\r\n open\r\n ? \"bg-gray-100 text-gray-700 \"\r\n : \"text-gray-400 hover:bg-gray-100 \",\r\n ].join(\" \")}\r\n >\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {/* ── Dropdown panel ───────────────────────────────────────────────── */}\r\n {open && (\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Background color\"\r\n className=\"absolute top-full left-0 mt-1 z-50\r\n bg-white \r\n border border-gray-200 \r\n rounded-lg shadow-xl\r\n p-3 w-[208px]\"\r\n >\r\n {/* Remove background */}\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n applyColor(null);\r\n }}\r\n className=\"flex items-center gap-2 w-full px-2 py-1.5 mb-2.5 text-xs font-medium\r\n text-gray-600 \r\n rounded hover:bg-gray-100 \r\n transition-colors\"\r\n >\r\n <RemoveColorIcon />\r\n Remove background\r\n </button>\r\n\r\n {/* Separator */}\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n\r\n {/* Document colors — non-preset colors already in doc */}\r\n {extraDocColors.length > 0 && (\r\n <>\r\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5 px-0.5\">\r\n Document colors\r\n </p>\r\n <div className=\"grid grid-cols-5 gap-1 mb-2.5\">\r\n {extraDocColors.slice(0, 10).map((c) => (\r\n <Swatch\r\n key={c}\r\n color={{ label: c, value: c }}\r\n isActive={normActive === normalizeHex(c)}\r\n onSelect={applyColor}\r\n />\r\n ))}\r\n </div>\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n </>\r\n )}\r\n\r\n {/* Preset grid 5×3 */}\r\n <div className=\"grid grid-cols-5 gap-1 mb-3\">\r\n {PRESET_COLORS.map((c) => (\r\n <Swatch\r\n key={c.value}\r\n color={c}\r\n isActive={normActive === normalizeHex(c.value)}\r\n onSelect={applyColor}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Custom hex input — CKEditor-style inline, no native dialog */}\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5 px-0.5\">\r\n Custom color\r\n </p>\r\n <div className=\"flex items-center gap-1.5\">\r\n {/* Live color preview */}\r\n <div\r\n className=\"shrink-0 w-7 h-7 rounded border border-gray-300 \"\r\n style={{ backgroundColor: hexInputToPreview(hexInput) }}\r\n />\r\n <div\r\n className=\"flex flex-1 items-center border rounded overflow-hidden\r\n border-gray-300 \r\n focus-within:ring-2 focus-within:ring-blue-500\"\r\n >\r\n <span className=\"pl-2 text-xs text-gray-400 select-none\">#</span>\r\n <input\r\n type=\"text\"\r\n maxLength={6}\r\n value={hexInput}\r\n onChange={(e) => {\r\n setHexInput(e.target.value.replace(/[^0-9a-fA-F]/g, \"\"));\r\n setHexError(false);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n commitHexInput();\r\n }\r\n if (e.key === \"Escape\") setOpen(false);\r\n }}\r\n placeholder=\"e.g. ffff00\"\r\n className={[\r\n \"flex-1 px-1 py-1.5 text-xs bg-transparent outline-none font-mono\",\r\n \"text-gray-900 \",\r\n hexError ? \"text-red-500\" : \"\",\r\n ].join(\" \")}\r\n aria-label=\"Hex colour value\"\r\n />\r\n </div>\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n commitHexInput();\r\n }}\r\n className=\"shrink-0 px-2 py-1.5 text-xs bg-blue-600 text-white rounded\r\n hover:bg-blue-700 transition-colors\"\r\n >\r\n ✓\r\n </button>\r\n </div>\r\n {hexError && (\r\n <p className=\"text-[10px] text-red-500 mt-1 px-0.5\">\r\n Invalid hex colour\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Swatch ───────────────────────────────────────────────────────────────────\r\n\r\nfunction Swatch({\r\n color,\r\n isActive,\r\n onSelect,\r\n}: {\r\n color: ColorOption;\r\n isActive: boolean;\r\n onSelect: (v: string) => void;\r\n}) {\r\n return (\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n title={color.label}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n onSelect(color.value);\r\n }}\r\n className={[\r\n \"relative w-[30px] h-[30px] rounded transition-transform\",\r\n \"hover:scale-110 focus:outline-none\",\r\n \"focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-blue-500\",\r\n isActive ? \"ring-2 ring-offset-1 ring-blue-500 scale-105\" : \"\",\r\n color.hasBorder ? \"border border-gray-300 \" : \"\",\r\n ].join(\" \")}\r\n style={{ backgroundColor: color.value }}\r\n >\r\n {isActive && <CheckIcon light={isLight(color.value)} />}\r\n </button>\r\n );\r\n}\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\nfunction normalizeHex(hex: string): string {\r\n return hex.trim().toLowerCase();\r\n}\r\n\r\nfunction hexInputToPreview(input: string): string {\r\n const raw = input.replace(/^#/, \"\");\r\n if (/^[0-9a-f]{6}$/i.test(raw)) return `#${raw}`;\r\n if (/^[0-9a-f]{3}$/i.test(raw)) return `#${raw}`;\r\n return \"transparent\";\r\n}\r\n\r\nfunction isLight(hex: string): boolean {\r\n const h = hex.replace(\"#\", \"\");\r\n if (h.length < 6) return true;\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n return (r * 299 + g * 587 + b * 114) / 1000 > 128;\r\n}\r\n\r\n// ─── Sub-components ───────────────────────────────────────────────────────────\r\n\r\nfunction ColorBar({ color }: { color: string }) {\r\n return (\r\n <span\r\n className=\"block w-4 h-[3px] rounded-sm\"\r\n style={{ backgroundColor: color }}\r\n />\r\n );\r\n}\r\n\r\nfunction CheckIcon({ light }: { light: boolean }) {\r\n return (\r\n <svg\r\n className=\"absolute inset-0 m-auto w-3.5 h-3.5 drop-shadow\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke={light ? \"rgba(0,0,0,0.65)\" : \"rgba(255,255,255,0.9)\"}\r\n strokeWidth={3.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ─── Icons ────────────────────────────────────────────────────────────────────\r\n\r\nfunction BgColorIcon() {\r\n return (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 1024 1024\"\r\n fill=\"currentColor\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path d=\"M766.4 744.3c43.7 0 79.4-36.2 79.4-80.5 0-53.5-79.4-140.8-79.4-140.8S687 610.3 687 663.8c0 44.3 35.7 80.5 79.4 80.5zm-377.1-44.1c7.1 7.1 18.6 7.1 25.6 0l256.1-256c7.1-7.1 7.1-18.6 0-25.6l-256-256c-.6-.6-1.3-1.2-2-1.7l-78.2-78.2a9.11 9.11 0 0 0-12.8 0l-48 48a9.11 9.11 0 0 0 0 12.8l67.2 67.2-207.8 207.9c-7.1 7.1-7.1 18.6 0 25.6l255.9 256zm12.9-448.6l178.9 178.9H223.4l178.8-178.9zM904 816H120c-4.4 0-8 3.6-8 8v80c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-80c0-4.4-3.6-8-8-8z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg\r\n className=\"w-2.5 h-2.5\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction RemoveColorIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4 shrink-0\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M7 21h14\" />\r\n <path d=\"m5 11 9-9 7 7-9 9H5l-2-2 2-5Z\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { useState, useRef, useEffect, useCallback } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport { setTextColor } from '../../editor/commands';\r\n\r\n// ─── CKEditor 5-matching colour palette ───────────────────────────────────────\r\n// Row 1 — neutral grey ramp\r\n// Row 2 — warm spectrum (hsl h=0..120, s=75%, l=60%)\r\n// Row 3 — cool spectrum (hsl h=150..270, s=75%, l=60%)\r\n\r\ninterface ColorOption {\r\n label: string;\r\n value: string;\r\n hasBorder?: boolean;\r\n}\r\n\r\nconst PRESET_COLORS: ColorOption[] = [\r\n // Row 1 — neutrals\r\n { label: 'Black', value: '#000000' },\r\n { label: 'Dim grey', value: '#4d4d4d' },\r\n { label: 'Grey', value: '#999999' },\r\n { label: 'Light grey', value: '#e6e6e6' },\r\n { label: 'White', value: '#ffffff', hasBorder: true },\r\n // Row 2 — warm\r\n { label: 'Red', value: '#e64d4d' },\r\n { label: 'Orange', value: '#f99a4d' },\r\n { label: 'Yellow', value: '#f9e04d' },\r\n { label: 'Light green', value: '#91e44d' },\r\n { label: 'Green', value: '#54d454' },\r\n // Row 3 — cool\r\n { label: 'Aquamarine', value: '#54d4a6' },\r\n { label: 'Turquoise', value: '#54d4d4' },\r\n { label: 'Light blue', value: '#4d91e4' },\r\n { label: 'Blue', value: '#4d4de4' },\r\n { label: 'Purple', value: '#9d4de4' },\r\n];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface TextColorDropdownProps {\r\n engine: EditorEngine;\r\n activeColor: string | null;\r\n documentColors: string[];\r\n}\r\n\r\nexport function TextColorDropdown({\r\n engine,\r\n activeColor,\r\n documentColors,\r\n}: TextColorDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const [lastColor, setLastColor] = useState(PRESET_COLORS[0].value); // Black default\r\n const [hexInput, setHexInput] = useState('');\r\n const [hexError, setHexError] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node))\r\n setOpen(false);\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n const applyColor = useCallback((color: string | null) => {\r\n if (color) setLastColor(normalizeHex(color));\r\n setTextColor(color)(engine);\r\n setOpen(false);\r\n }, [engine]);\r\n\r\n const handleQuickApply = () => {\r\n const norm = normalizeHex(lastColor);\r\n if (activeColor && normalizeHex(activeColor) === norm) {\r\n setTextColor(null)(engine);\r\n } else {\r\n setTextColor(norm)(engine);\r\n }\r\n };\r\n\r\n const commitHexInput = () => {\r\n const raw = hexInput.trim().replace(/^#/, '');\r\n if (/^[0-9a-f]{6}$/i.test(raw) || /^[0-9a-f]{3}$/i.test(raw)) {\r\n applyColor(`#${raw.toLowerCase()}`);\r\n setHexError(false);\r\n } else {\r\n setHexError(true);\r\n }\r\n };\r\n\r\n const extraDocColors = documentColors.filter(\r\n (c) => !PRESET_COLORS.some((p) => normalizeHex(p.value) === normalizeHex(c)),\r\n );\r\n\r\n const normActive = activeColor ? normalizeHex(activeColor) : null;\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative flex items-center\">\r\n\r\n {/* ── Quick-apply split button ── */}\r\n <button\r\n type=\"button\"\r\n title={`Text color: ${lastColor}`}\r\n onMouseDown={(e) => { e.preventDefault(); handleQuickApply(); }}\r\n className=\"flex flex-col items-center justify-center gap-0.5 w-8 h-8 rounded-l\r\n text-gray-700 \r\n hover:bg-gray-100 \r\n focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500\r\n transition-colors\"\r\n >\r\n <TextColorIcon />\r\n <span\r\n className=\"block w-4 h-[3px] rounded-sm\"\r\n style={{ backgroundColor: normActive ?? lastColor }}\r\n />\r\n </button>\r\n\r\n {/* ── Chevron button ── */}\r\n <button\r\n type=\"button\"\r\n title=\"More text colors\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => { e.preventDefault(); setOpen((p) => { if (!p) { setHexInput(''); setHexError(false); } return !p; }); }}\r\n className={[\r\n 'flex items-center justify-center w-4 h-8 rounded-r border-l border-gray-200 ',\r\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500',\r\n 'transition-colors',\r\n open\r\n ? 'bg-gray-100 text-gray-700 '\r\n : 'text-gray-400 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {/* ── Dropdown panel ── */}\r\n {open && (\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Text color\"\r\n className=\"absolute top-full left-0 mt-1 z-50\r\n bg-white \r\n border border-gray-200 \r\n rounded-lg shadow-xl\r\n p-3 w-[208px]\"\r\n >\r\n {/* Remove color */}\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => { e.preventDefault(); applyColor(null); }}\r\n className=\"flex items-center gap-2 w-full px-2 py-1.5 mb-2.5 text-xs font-medium\r\n text-gray-600 \r\n rounded hover:bg-gray-100 \r\n transition-colors\"\r\n >\r\n <RemoveColorIcon />\r\n Remove color\r\n </button>\r\n\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n\r\n {/* Document colors */}\r\n {extraDocColors.length > 0 && (\r\n <>\r\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5 px-0.5\">\r\n Document colors\r\n </p>\r\n <div className=\"grid grid-cols-5 gap-1 mb-2.5\">\r\n {extraDocColors.slice(0, 10).map((c) => (\r\n <Swatch\r\n key={c}\r\n color={{ label: c, value: c }}\r\n isActive={normActive === normalizeHex(c)}\r\n onSelect={applyColor}\r\n />\r\n ))}\r\n </div>\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n </>\r\n )}\r\n\r\n {/* Preset grid 5×3 */}\r\n <div className=\"grid grid-cols-5 gap-1 mb-3\">\r\n {PRESET_COLORS.map((c) => (\r\n <Swatch\r\n key={c.value}\r\n color={c}\r\n isActive={normActive === normalizeHex(c.value)}\r\n onSelect={applyColor}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Custom hex input */}\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5 px-0.5\">\r\n Custom color\r\n </p>\r\n <div className=\"flex items-center gap-1.5\">\r\n <div\r\n className=\"shrink-0 w-7 h-7 rounded border border-gray-300 \"\r\n style={{ backgroundColor: hexInputToPreview(hexInput) }}\r\n />\r\n <div className=\"flex flex-1 items-center border rounded overflow-hidden\r\n border-gray-300 \r\n focus-within:ring-2 focus-within:ring-blue-500\">\r\n <span className=\"pl-2 text-xs text-gray-400 select-none\">#</span>\r\n <input\r\n type=\"text\"\r\n maxLength={6}\r\n value={hexInput}\r\n onChange={(e) => {\r\n setHexInput(e.target.value.replace(/[^0-9a-fA-F]/g, ''));\r\n setHexError(false);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') { e.preventDefault(); commitHexInput(); }\r\n if (e.key === 'Escape') setOpen(false);\r\n }}\r\n placeholder=\"e.g. 000000\"\r\n className={[\r\n 'flex-1 px-1 py-1.5 text-xs bg-transparent outline-none font-mono',\r\n 'text-gray-900 ',\r\n hexError ? 'text-red-500' : '',\r\n ].join(' ')}\r\n aria-label=\"Hex colour value\"\r\n />\r\n </div>\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => { e.preventDefault(); commitHexInput(); }}\r\n className=\"shrink-0 px-2 py-1.5 text-xs bg-blue-600 text-white rounded\r\n hover:bg-blue-700 transition-colors\"\r\n >\r\n ✓\r\n </button>\r\n </div>\r\n {hexError && (\r\n <p className=\"text-[10px] text-red-500 mt-1 px-0.5\">Invalid hex colour</p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Swatch ───────────────────────────────────────────────────────────────────\r\n\r\nfunction Swatch({\r\n color,\r\n isActive,\r\n onSelect,\r\n}: {\r\n color: ColorOption;\r\n isActive: boolean;\r\n onSelect: (v: string) => void;\r\n}) {\r\n return (\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n title={color.label}\r\n onMouseDown={(e) => { e.preventDefault(); onSelect(color.value); }}\r\n className={[\r\n 'relative w-[30px] h-[30px] rounded transition-transform',\r\n 'hover:scale-110 focus:outline-none',\r\n 'focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-blue-500',\r\n isActive ? 'ring-2 ring-offset-1 ring-blue-500 scale-105' : '',\r\n color.hasBorder ? 'border border-gray-300 ' : '',\r\n ].join(' ')}\r\n style={{ backgroundColor: color.value }}\r\n >\r\n {isActive && <CheckIcon light={isLight(color.value)} />}\r\n </button>\r\n );\r\n}\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\nfunction normalizeHex(hex: string): string {\r\n return hex.trim().toLowerCase();\r\n}\r\n\r\nfunction hexInputToPreview(input: string): string {\r\n const raw = input.replace(/^#/, '');\r\n if (/^[0-9a-f]{6}$/i.test(raw) || /^[0-9a-f]{3}$/i.test(raw)) return `#${raw}`;\r\n return 'transparent';\r\n}\r\n\r\nfunction isLight(hex: string): boolean {\r\n const h = hex.replace('#', '');\r\n if (h.length < 6) return true;\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n return (r * 299 + g * 587 + b * 114) / 1000 > 128;\r\n}\r\n\r\n// ─── Sub-components ───────────────────────────────────────────────────────────\r\n\r\nfunction CheckIcon({ light }: { light: boolean }) {\r\n return (\r\n <svg\r\n className=\"absolute inset-0 m-auto w-3.5 h-3.5 drop-shadow\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke={light ? 'rgba(0,0,0,0.65)' : 'rgba(255,255,255,0.9)'}\r\n strokeWidth={3.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ─── Icons ────────────────────────────────────────────────────────────────────\r\n\r\nfunction TextColorIcon() {\r\n return (\r\n <svg width=\"14\" height=\"12\" viewBox=\"0 0 24 22\" fill=\"none\" stroke=\"currentColor\"\r\n strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M4 20 L12 4 L20 20\" />\r\n <path d=\"M7.5 13 L16.5 13\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg className=\"w-2.5 h-2.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction RemoveColorIcon() {\r\n return (\r\n <svg className=\"w-4 h-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M7 21h14\" />\r\n <path d=\"m5 11 9-9 7 7-9 9H5l-2-2 2-5Z\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\n\nimport React from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { insertHorizontalRule } from '../../editor/commands';\nimport { ToolbarButton } from './ToolbarButton';\n\ninterface HorizontalRuleButtonProps {\n engine: EditorEngine;\n}\n\nexport function HorizontalRuleButton({ engine }: HorizontalRuleButtonProps) {\n return (\n <ToolbarButton\n label=\"HR\"\n title=\"Insert Horizontal Rule\"\n onClick={() => insertHorizontalRule(engine)}\n icon={<HRIcon />}\n />\n );\n}\n\nfunction HRIcon() {\n return (\n <svg\n className=\"w-4 h-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n >\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"7\" x2=\"9\" y2=\"7\" strokeWidth={1.5} strokeOpacity={0.5} />\n <line x1=\"3\" y1=\"17\" x2=\"9\" y2=\"17\" strokeWidth={1.5} strokeOpacity={0.5} />\n </svg>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { ToolbarButton } from './ToolbarButton';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { useEditorState } from '../../hooks/useEditorState';\nimport { getActiveBlockType } from '../../editor/selection/SelectionEngine';\nimport { toggleCheckList } from '../../editor/commands';\n\ninterface ChecklistButtonProps {\n engine: EditorEngine;\n}\n\nexport function ChecklistButton({ engine }: ChecklistButtonProps) {\n const state = useEditorState(engine);\n const activeBlock = getActiveBlockType(state.doc, state.selection);\n\n return (\n <ToolbarButton\n label=\"☑\"\n title=\"Checklist (Ctrl+Shift+9)\"\n onClick={() => toggleCheckList(engine)}\n isActive={activeBlock === 'check_list'}\n icon={<ChecklistIcon />}\n />\n );\n}\n\nfunction ChecklistIcon() {\n return (\n <svg\n className=\"w-4 h-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" />\n <polyline points=\"4 8 6 10 9 6\" />\n <line x1=\"13\" y1=\"8\" x2=\"21\" y2=\"8\" />\n <rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" />\n <line x1=\"13\" y1=\"17\" x2=\"21\" y2=\"17\" />\n </svg>\n );\n}\n","/**\n * TableModel\n *\n * Pure, immutable operations on table nodes. No DOM, no React, no side effects.\n * Mirrors the pattern of DocumentModel.ts for the table sub-tree.\n *\n * Table structure in the document:\n * table { attrs: { colWidths: number[] }, children: [table_row, ...] }\n * table_row { children: [table_cell | table_header, ...] }\n * table_cell { attrs: { colspan, rowspan, covered }, children: [paragraph, ...] }\n *\n * Covered cells: when a cell spans multiple cols/rows, the \"shadowed\" grid\n * positions still have a table_cell node with attrs.covered=true and empty\n * children. The renderer skips them; the model keeps the grid rectangular.\n */\n\nimport type { BlockNode, Document, EditorNode, NodePosition } from '../../types';\nimport { getNodeAtPath, isTextNode, createParagraph } from '../core/DocumentModel';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface TableDimensions {\n rows: number;\n cols: number;\n}\n\nexport interface CellPosition {\n tablePath: number[];\n row: number;\n col: number;\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createTableNode(rows: number, cols: number, defaultColWidth = 120): BlockNode {\n const colWidths = Array.from({ length: cols }, () => defaultColWidth);\n return {\n type: 'table',\n attrs: { colWidths },\n children: Array.from({ length: rows }, () => createTableRow(cols)),\n };\n}\n\nfunction createTableRow(cols: number): BlockNode {\n return {\n type: 'table_row',\n attrs: {},\n children: Array.from({ length: cols }, () => createTableCell()),\n };\n}\n\nexport function createTableCell(content = ''): BlockNode {\n return {\n type: 'table_cell',\n attrs: { colspan: 1, rowspan: 1, covered: false },\n children: [createParagraph(content)],\n };\n}\n\n// ─── Queries ──────────────────────────────────────────────────────────────────\n\nexport function getTableDimensions(table: BlockNode): TableDimensions {\n const rows = table.children.length;\n const cols = rows > 0 ? (table.children[0] as BlockNode).children.length : 0;\n return { rows, cols };\n}\n\nexport function getTableCell(table: BlockNode, row: number, col: number): BlockNode | null {\n const rowNode = table.children[row] as BlockNode | undefined;\n if (!rowNode) return null;\n return (rowNode.children[col] as BlockNode) ?? null;\n}\n\n/**\n * Walk from a node path upward to find the ancestor table path.\n * Returns null if not inside a table.\n */\nexport function findTablePath(doc: Document, path: number[]): number[] | null {\n for (let depth = path.length - 1; depth >= 1; depth--) {\n const candidate = path.slice(0, depth);\n const node = getNodeAtPath(doc, candidate);\n if (node && !isTextNode(node as EditorNode) && (node as BlockNode).type === 'table') {\n return candidate;\n }\n }\n return null;\n}\n\n/**\n * Derive { tablePath, row, col } from a selection path inside a table.\n * path=[2,0,1,...] → tablePath=[2], row=0, col=1\n */\nexport function findCellPosition(doc: Document, path: number[]): CellPosition | null {\n const tablePath = findTablePath(doc, path);\n if (!tablePath) return null;\n\n const rowIdx = path[tablePath.length];\n const colIdx = path[tablePath.length + 1];\n if (rowIdx === undefined || colIdx === undefined) return null;\n\n return { tablePath, row: rowIdx, col: colIdx };\n}\n\n/**\n * Get the NodePosition for the first editable position in a cell.\n * Navigates: cell → first paragraph → first text node (or block).\n */\nexport function getCellFirstPosition(\n doc: Document,\n tablePath: number[],\n row: number,\n col: number,\n): NodePosition | null {\n const cellPath = [...tablePath, row, col];\n const cell = getNodeAtPath(doc, cellPath);\n if (!cell || isTextNode(cell as EditorNode)) return null;\n\n const cellBlock = cell as BlockNode;\n if (cellBlock.attrs.covered) return null;\n\n if (cellBlock.children.length === 0) return { path: cellPath, offset: 0 };\n\n const firstChildPath = [...cellPath, 0];\n const firstChild = cellBlock.children[0];\n\n if (isTextNode(firstChild)) return { path: firstChildPath, offset: 0 };\n\n // First child is a block (paragraph) — go one level deeper\n const firstParagraph = firstChild as BlockNode;\n if (firstParagraph.children.length > 0) {\n return { path: [...firstChildPath, 0], offset: 0 };\n }\n return { path: firstChildPath, offset: 0 };\n}\n\n/**\n * Get the NodePosition for the last editable position in a cell (for Shift+Tab).\n */\nexport function getCellLastPosition(\n doc: Document,\n tablePath: number[],\n row: number,\n col: number,\n): NodePosition | null {\n const cellPath = [...tablePath, row, col];\n const cell = getNodeAtPath(doc, cellPath);\n if (!cell || isTextNode(cell as EditorNode)) return null;\n\n const cellBlock = cell as BlockNode;\n if (cellBlock.attrs.covered) return null;\n\n if (cellBlock.children.length === 0) return { path: cellPath, offset: 0 };\n\n const lastParaIdx = cellBlock.children.length - 1;\n const lastParaPath = [...cellPath, lastParaIdx];\n const lastPara = cellBlock.children[lastParaIdx] as BlockNode;\n\n if (lastPara.children.length > 0) {\n const lastTextIdx = lastPara.children.length - 1;\n const lastText = lastPara.children[lastTextIdx];\n if (isTextNode(lastText)) {\n return { path: [...lastParaPath, lastTextIdx], offset: lastText.text.length };\n }\n }\n return { path: lastParaPath, offset: 0 };\n}\n\n// ─── Row Operations ───────────────────────────────────────────────────────────\n\n/** Insert a new empty row after rowIndex. */\nexport function insertTableRowAfter(table: BlockNode, rowIndex: number): BlockNode {\n const { cols } = getTableDimensions(table);\n const newRow = createTableRow(cols);\n const rows = [...(table.children as BlockNode[])];\n rows.splice(rowIndex + 1, 0, newRow);\n return { ...table, children: rows };\n}\n\n/** Insert a new empty row before rowIndex. */\nexport function insertTableRowBefore(table: BlockNode, rowIndex: number): BlockNode {\n if (rowIndex <= 0) return insertTableRowAfter(table, -1);\n return insertTableRowAfter(table, rowIndex - 1);\n}\n\n/** Delete row at rowIndex. No-op if it's the only row. */\nexport function deleteTableRow(table: BlockNode, rowIndex: number): BlockNode {\n const rows = table.children as BlockNode[];\n if (rows.length <= 1) return table;\n return { ...table, children: rows.filter((_, i) => i !== rowIndex) };\n}\n\n// ─── Column Operations ────────────────────────────────────────────────────────\n\n/** Insert a new empty column after colIndex. */\nexport function insertTableColumnAfter(table: BlockNode, colIndex: number): BlockNode {\n const newRows = (table.children as BlockNode[]).map((row) => {\n const cells = [...(row.children as BlockNode[])];\n cells.splice(colIndex + 1, 0, createTableCell());\n return { ...row, children: cells };\n });\n\n const colWidths = [...((table.attrs.colWidths as number[]) ?? [])];\n const insertWidth = colWidths[colIndex] ?? 120;\n colWidths.splice(colIndex + 1, 0, insertWidth);\n\n return { ...table, attrs: { ...table.attrs, colWidths }, children: newRows };\n}\n\n/** Insert a new empty column before colIndex. */\nexport function insertTableColumnBefore(table: BlockNode, colIndex: number): BlockNode {\n if (colIndex <= 0) return insertTableColumnAfter(table, -1);\n return insertTableColumnAfter(table, colIndex - 1);\n}\n\n/** Delete column at colIndex. No-op if it's the only column. */\nexport function deleteTableColumn(table: BlockNode, colIndex: number): BlockNode {\n const { cols } = getTableDimensions(table);\n if (cols <= 1) return table;\n\n const newRows = (table.children as BlockNode[]).map((row) => ({\n ...row,\n children: (row.children as BlockNode[]).filter((_, i) => i !== colIndex),\n }));\n\n const colWidths = [...((table.attrs.colWidths as number[]) ?? [])];\n colWidths.splice(colIndex, 1);\n\n return { ...table, attrs: { ...table.attrs, colWidths }, children: newRows };\n}\n\n// ─── Merge / Split ────────────────────────────────────────────────────────────\n\n/**\n * Merge the rectangular cell range from (r1,c1) to (r2,c2) into one cell.\n * The top-left anchor cell absorbs all content; others become covered.\n */\nexport function mergeTableCells(\n table: BlockNode,\n from: [number, number],\n to: [number, number],\n): BlockNode {\n const minRow = Math.min(from[0], to[0]);\n const maxRow = Math.max(from[0], to[0]);\n const minCol = Math.min(from[1], to[1]);\n const maxCol = Math.max(from[1], to[1]);\n\n const colspan = maxCol - minCol + 1;\n const rowspan = maxRow - minRow + 1;\n\n // Collect all non-covered cell content\n const allChildren: BlockNode[] = [];\n for (let r = minRow; r <= maxRow; r++) {\n for (let c = minCol; c <= maxCol; c++) {\n const cell = getTableCell(table, r, c);\n if (cell && !cell.attrs.covered) {\n allChildren.push(...(cell.children as BlockNode[]));\n }\n }\n }\n\n const mergedContent =\n allChildren.filter((b) => {\n if (b.type !== 'paragraph') return true;\n // Filter out empty paragraphs from non-anchor cells\n return b.children.length > 0;\n });\n\n const anchorContent = mergedContent.length > 0 ? mergedContent : [createParagraph()];\n\n const newRows = (table.children as BlockNode[]).map((rowNode, r) => {\n if (r < minRow || r > maxRow) return rowNode;\n const newCells = (rowNode.children as BlockNode[]).map((cellNode, c) => {\n if (c < minCol || c > maxCol) return cellNode;\n if (r === minRow && c === minCol) {\n return {\n ...cellNode,\n attrs: { ...cellNode.attrs, colspan, rowspan, covered: false },\n children: anchorContent,\n };\n }\n return {\n ...cellNode,\n attrs: { ...cellNode.attrs, colspan: 1, rowspan: 1, covered: true },\n children: [createParagraph()],\n };\n });\n return { ...rowNode, children: newCells };\n });\n\n return { ...table, children: newRows };\n}\n\n/**\n * Split a merged cell back to individual cells, restoring the covered cells.\n */\nexport function splitTableCell(table: BlockNode, row: number, col: number): BlockNode {\n const cell = getTableCell(table, row, col);\n if (!cell) return table;\n\n const colspan = (cell.attrs.colspan as number) ?? 1;\n const rowspan = (cell.attrs.rowspan as number) ?? 1;\n if (colspan <= 1 && rowspan <= 1) return table;\n\n const newRows = (table.children as BlockNode[]).map((rowNode, r) => {\n if (r < row || r >= row + rowspan) return rowNode;\n const newCells = (rowNode.children as BlockNode[]).map((cellNode, c) => {\n if (c < col || c >= col + colspan) return cellNode;\n if (r === row && c === col) {\n return { ...cellNode, attrs: { ...cellNode.attrs, colspan: 1, rowspan: 1, covered: false } };\n }\n return {\n ...cellNode,\n attrs: { ...cellNode.attrs, colspan: 1, rowspan: 1, covered: false },\n children: [createParagraph()],\n };\n });\n return { ...rowNode, children: newCells };\n });\n\n return { ...table, children: newRows };\n}\n\n// ─── Column Resize ────────────────────────────────────────────────────────────\n\nexport function updateColumnWidth(table: BlockNode, colIndex: number, width: number): BlockNode {\n const colWidths = [...((table.attrs.colWidths as number[]) ?? [])];\n colWidths[colIndex] = Math.max(40, width);\n return { ...table, attrs: { ...table.attrs, colWidths } };\n}\n","/**\n * TableCommands\n *\n * All table-related Commands. Each is a pure function (engine) → boolean.\n * Table mutations use delete_node + insert_node to replace the table atomically,\n * which keeps undo/redo working via the existing HistoryManager snapshots.\n */\n\nimport type { Command, BlockNode, Document } from '../../types';\nimport { createTransaction, tr_setSelection } from '../core/Transaction';\nimport { getNodeAtPath } from '../core/DocumentModel';\nimport { makeCollapsedSelection, makePosition } from '../selection/SelectionEngine';\nimport {\n createTableNode,\n getTableDimensions,\n insertTableRowAfter,\n insertTableRowBefore,\n deleteTableRow,\n insertTableColumnAfter,\n insertTableColumnBefore,\n deleteTableColumn,\n mergeTableCells,\n splitTableCell,\n updateColumnWidth,\n findCellPosition,\n getCellFirstPosition,\n} from './TableModel';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Replace the table at tablePath with newTable in a single transaction.\n * Optionally sets cursor to (cursorRow, cursorCol) in the new table.\n */\nfunction replaceTable(\n engine: Parameters<Command>[0],\n tablePath: number[],\n newTable: BlockNode,\n cursorRow?: number,\n cursorCol?: number,\n): boolean {\n const state = engine.getState();\n const tr = createTransaction();\n\n tr.steps.push({ type: 'delete_node', path: tablePath });\n tr.steps.push({\n type: 'insert_node',\n parentPath: tablePath.length > 1 ? tablePath.slice(0, -1) : [],\n index: tablePath[tablePath.length - 1],\n node: newTable,\n });\n\n if (cursorRow !== undefined && cursorCol !== undefined) {\n // Build a temporary doc with the new table to resolve the position\n const newChildren = [...state.doc.children];\n newChildren[tablePath[0]] = newTable;\n const tempDoc: Document = { type: 'doc', children: newChildren };\n const pos = getCellFirstPosition(tempDoc, tablePath, cursorRow, cursorCol);\n if (pos) tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n }\n\n engine.dispatch(tr);\n return true;\n}\n\n// ─── Insert Table ─────────────────────────────────────────────────────────────\n\nexport function insertTable(rows: number, cols: number): Command {\n return (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n const tableNode = createTableNode(rows, cols);\n\n // Insert after the current top-level block (or at 0 if no selection)\n const insertIndex = sel ? sel.anchor.path[0] + 1 : state.doc.children.length;\n\n const tr = createTransaction();\n tr.steps.push({ type: 'insert_node', parentPath: [], index: insertIndex, node: tableNode });\n\n // Set cursor to first cell of new table\n const newChildren = [...state.doc.children];\n newChildren.splice(insertIndex, 0, tableNode);\n const tempDoc: Document = { type: 'doc', children: newChildren };\n const pos = getCellFirstPosition(tempDoc, [insertIndex], 0, 0);\n if (pos) tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Row Commands ─────────────────────────────────────────────────────────────\n\nexport const addRowAbove: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = insertTableRowBefore(table, row);\n // Cursor stays at same logical row (which is now row+1 after insert)\n return replaceTable(engine, tablePath, newTable, row + 1, col);\n};\n\nexport const addRowBelow: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = insertTableRowAfter(table, row);\n return replaceTable(engine, tablePath, newTable, row + 1, col);\n};\n\nexport const deleteRow: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = deleteTableRow(table, row);\n const { rows } = getTableDimensions(newTable);\n return replaceTable(engine, tablePath, newTable, Math.min(row, rows - 1), col);\n};\n\n// ─── Column Commands ──────────────────────────────────────────────────────────\n\nexport const addColumnLeft: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = insertTableColumnBefore(table, col);\n // Cursor shifts right by 1 (same column position in new grid)\n return replaceTable(engine, tablePath, newTable, row, col + 1);\n};\n\nexport const addColumnRight: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = insertTableColumnAfter(table, col);\n return replaceTable(engine, tablePath, newTable, row, col);\n};\n\nexport const deleteColumn: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = deleteTableColumn(table, col);\n const { cols } = getTableDimensions(newTable);\n return replaceTable(engine, tablePath, newTable, row, Math.min(col, cols - 1));\n};\n\n// ─── Merge / Split ────────────────────────────────────────────────────────────\n\nexport function mergeCells(\n tableSelection: { tablePath: number[]; anchorCell: [number, number]; focusCell: [number, number] },\n): Command {\n return (engine) => {\n const state = engine.getState();\n const table = getNodeAtPath(state.doc, tableSelection.tablePath) as BlockNode;\n if (!table) return false;\n\n const newTable = mergeTableCells(table, tableSelection.anchorCell, tableSelection.focusCell);\n const [anchorRow, anchorCol] = [\n Math.min(tableSelection.anchorCell[0], tableSelection.focusCell[0]),\n Math.min(tableSelection.anchorCell[1], tableSelection.focusCell[1]),\n ];\n return replaceTable(engine, tableSelection.tablePath, newTable, anchorRow, anchorCol);\n };\n}\n\nexport const splitCell: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = splitTableCell(table, row, col);\n return replaceTable(engine, tablePath, newTable, row, col);\n};\n\n// ─── Delete Table ─────────────────────────────────────────────────────────────\n\nexport const deleteTable: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath } = cellPos;\n const tableIdx = tablePath[tablePath.length - 1];\n\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: tablePath });\n\n // Land cursor on the nearest surviving block\n const newLen = state.doc.children.length - 1;\n if (newLen > 0) {\n const landIdx = Math.min(tableIdx, newLen - 1);\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([landIdx], 0))));\n }\n\n engine.dispatch(tr);\n return true;\n};\n\n// ─── Header Row Toggle ────────────────────────────────────────────────────────\n\nexport function toggleHeaderRow(tablePath: number[]): Command {\n return (engine) => {\n const state = engine.getState();\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n if (!table) return false;\n\n const rows = table.children as BlockNode[];\n if (rows.length === 0) return false;\n\n const firstRow = rows[0];\n const hasHeader = (firstRow.children as BlockNode[]).some((c) => c.type === 'table_header');\n const newType = hasHeader ? 'table_cell' : 'table_header';\n\n const newFirstRow: BlockNode = {\n ...firstRow,\n children: (firstRow.children as BlockNode[]).map((cell) => ({\n ...cell,\n type: newType,\n })),\n };\n const newTable: BlockNode = {\n ...table,\n children: [newFirstRow, ...rows.slice(1)],\n };\n return replaceTable(engine, tablePath, newTable);\n };\n}\n\n// ─── Column Resize ────────────────────────────────────────────────────────────\n\nexport function setColumnWidth(tablePath: number[], colIndex: number, width: number): Command {\n return (engine) => {\n const state = engine.getState();\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n if (!table) return false;\n const newTable = updateColumnWidth(table, colIndex, width);\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: tablePath });\n tr.steps.push({\n type: 'insert_node',\n parentPath: tablePath.length > 1 ? tablePath.slice(0, -1) : [],\n index: tablePath[tablePath.length - 1],\n node: newTable,\n });\n engine.dispatch(tr);\n return true;\n };\n}\n","'use client';\n\n/**\n * TableButton\n *\n * Toolbar button that opens a CKEditor-style grid-selector popup.\n * Hovering over the grid highlights the selection area and shows a live\n * \"rows × cols\" preview. Clicking inserts the table at the cursor.\n */\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { insertTable } from '../../editor/table/TableCommands';\n\nconst MAX_ROWS = 10;\nconst MAX_COLS = 10;\n\ninterface TableButtonProps {\n engine: EditorEngine;\n}\n\nexport function TableButton({ engine }: TableButtonProps) {\n const [open, setOpen] = useState(false);\n const [hovered, setHovered] = useState<[number, number]>([0, 0]);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n setHovered([0, 0]);\n }, []);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (\n popupRef.current &&\n !popupRef.current.contains(e.target as Node) &&\n !buttonRef.current?.contains(e.target as Node)\n ) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open, close]);\n\n // Close on Escape\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') close(); };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, close]);\n\n const handleSelect = useCallback(\n (rows: number, cols: number) => {\n insertTable(rows, cols)(engine);\n close();\n },\n [engine, close],\n );\n\n const [hovRows, hovCols] = hovered;\n\n return (\n <div className=\"relative\">\n <button\n ref={buttonRef}\n type=\"button\"\n title=\"Insert table\"\n aria-label=\"Insert table\"\n aria-expanded={open}\n aria-haspopup=\"true\"\n onClick={() => setOpen((v) => !v)}\n className={[\n 'flex items-center gap-1 rounded px-1.5 py-1 text-sm',\n 'text-gray-700 ',\n 'hover:bg-gray-100 ',\n open ? 'bg-gray-100 ' : '',\n ].join(' ')}\n >\n <TableIcon />\n <svg\n className=\"h-2.5 w-2.5 opacity-60\"\n viewBox=\"0 0 10 6\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M0 0l5 6 5-6z\" />\n </svg>\n </button>\n\n {open && (\n <div\n ref={popupRef}\n role=\"dialog\"\n aria-label=\"Select table size\"\n className={[\n 'absolute left-0 top-full z-50 mt-1',\n 'rounded-lg border border-gray-200 bg-white p-3 shadow-xl',\n ' ',\n ].join(' ')}\n onMouseLeave={() => setHovered([0, 0])}\n >\n {/* Grid */}\n <div\n className=\"grid gap-0.5\"\n style={{ gridTemplateColumns: `repeat(${MAX_COLS}, 1.25rem)` }}\n >\n {Array.from({ length: MAX_ROWS }, (_, r) =>\n Array.from({ length: MAX_COLS }, (_, c) => {\n const active = r <= hovRows && c <= hovCols;\n return (\n <button\n key={`${r}-${c}`}\n type=\"button\"\n aria-label={`${r + 1} rows × ${c + 1} columns`}\n onMouseEnter={() => setHovered([r, c])}\n onFocus={() => setHovered([r, c])}\n onClick={() => handleSelect(r + 1, c + 1)}\n className={[\n 'h-5 w-5 rounded-sm border transition-colors duration-75',\n active\n ? 'border-blue-400 bg-blue-100 '\n : 'border-gray-300 bg-white ',\n ].join(' ')}\n />\n );\n }),\n )}\n </div>\n\n {/* Size preview label */}\n <p className=\"mt-2 text-center text-xs font-medium text-gray-600 \">\n {hovRows + 1} × {hovCols + 1}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nfunction TableIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" />\n <line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\n <line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" />\n </svg>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { insertImage } from '../../editor/commands';\n\ninterface ImageUploadButtonProps {\n engine: EditorEngine;\n onUploadImage?: (file: File) => Promise<string>;\n}\n\ntype Tab = 'upload' | 'url';\n\nexport function ImageUploadButton({ engine, onUploadImage }: ImageUploadButtonProps) {\n const [open, setOpen] = useState(false);\n const [tab, setTab] = useState<Tab>('upload');\n const [urlInput, setUrlInput] = useState('');\n const [urlError, setUrlError] = useState(false);\n const [altInput, setAltInput] = useState('');\n const [dragging, setDragging] = useState(false);\n const [preview, setPreview] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const [progress, setProgress] = useState(0);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const altInputRef = useRef('');\n\n // Keep ref in sync so async handleFile always reads latest alt text\n useEffect(() => { altInputRef.current = altInput; }, [altInput]);\n\n const close = useCallback(() => {\n setOpen(false);\n setUrlInput('');\n setUrlError(false);\n setAltInput('');\n altInputRef.current = '';\n setPreview((prev) => { if (prev?.startsWith('blob:')) URL.revokeObjectURL(prev); return null; });\n setUploading(false);\n setProgress(0);\n setDragging(false);\n }, []);\n\n // Outside click → close\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node))\n close();\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open, close]);\n\n // Escape → close\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') close(); };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, close]);\n\n const handleFile = useCallback(async (file: File) => {\n if (!file.type.startsWith('image/')) return;\n\n // Immediate blob URL preview\n const blobUrl = URL.createObjectURL(file);\n setPreview(blobUrl);\n setAltInput(file.name.replace(/\\.[^.]+$/, ''));\n\n if (!onUploadImage) {\n // No upload service — use blob URL directly. Clear preview without revoking\n // because the blob is now the live image src in the editor.\n insertImage(blobUrl, file.name.replace(/\\.[^.]+$/, ''))(engine);\n setOpen(false);\n setUrlInput('');\n setUrlError(false);\n setAltInput('');\n altInputRef.current = '';\n setPreview(null);\n setUploading(false);\n setProgress(0);\n setDragging(false);\n return;\n }\n\n // Upload with progress simulation\n setUploading(true);\n setProgress(0);\n const fakeProgress = setInterval(() => {\n setProgress((p) => Math.min(p + 12, 85));\n }, 150);\n\n try {\n const finalUrl = await onUploadImage(file);\n clearInterval(fakeProgress);\n setProgress(100);\n insertImage(finalUrl, altInputRef.current || file.name.replace(/\\.[^.]+$/, ''))(engine);\n setTimeout(close, 300);\n } catch {\n clearInterval(fakeProgress);\n setUploading(false);\n setProgress(0);\n }\n }, [engine, onUploadImage, close]);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setDragging(false);\n const file = e.dataTransfer.files[0];\n if (file) void handleFile(file);\n }, [handleFile]);\n\n const handleFileInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) void handleFile(file);\n e.target.value = '';\n }, [handleFile]);\n\n const commitUrl = () => {\n const url = urlInput.trim();\n if (!url) { setUrlError(true); return; }\n insertImage(url, altInput)(engine);\n close();\n };\n\n return (\n <div ref={containerRef} className=\"relative\">\n <button\n type=\"button\"\n title=\"Insert image\"\n aria-expanded={open}\n onMouseDown={(e) => { e.preventDefault(); setOpen((v) => !v); }}\n className={[\n 'flex items-center justify-center w-8 h-8 rounded text-sm',\n 'text-gray-700 ',\n 'hover:bg-gray-100 ',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\n open ? 'bg-gray-100 ' : '',\n ].join(' ')}\n >\n <ImageIcon />\n </button>\n\n {open && (\n <div\n role=\"dialog\"\n aria-label=\"Insert image\"\n className=\"absolute top-full right-0 mt-1 z-50 w-80\n bg-white \n border border-gray-200 \n rounded-lg shadow-xl overflow-y-auto\n max-h-[min(480px,calc(100vh-var(--toolbar-bottom,80px)))]\"\n >\n {/* Tabs */}\n <div className=\"flex border-b border-gray-200 \">\n {(['upload', 'url'] as Tab[]).map((t) => (\n <button\n key={t}\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); setTab(t); }}\n className={[\n 'flex-1 py-2 text-xs font-medium capitalize transition-colors',\n tab === t\n ? 'border-b-2 border-blue-500 text-blue-600 '\n : 'text-gray-500 hover:text-gray-700 ',\n ].join(' ')}\n >\n {t === 'upload' ? 'Upload file' : 'Insert URL'}\n </button>\n ))}\n </div>\n\n <div className=\"p-3 space-y-3\">\n {tab === 'upload' ? (\n <>\n {/* Drop zone */}\n {!preview && (\n <div\n onDragOver={(e) => { e.preventDefault(); setDragging(true); }}\n onDragLeave={() => setDragging(false)}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n className={[\n 'flex flex-col items-center justify-center gap-2',\n 'h-32 rounded-lg border-2 border-dashed cursor-pointer',\n 'transition-colors text-center px-4',\n dragging\n ? 'border-blue-400 bg-blue-50 '\n : 'border-gray-300 hover:border-blue-400 hover:bg-gray-50 ',\n ].join(' ')}\n >\n <UploadIcon />\n <p className=\"text-xs text-gray-500 \">\n <span className=\"font-medium text-blue-600 \">Click to upload</span>\n {' '}or drag & drop\n </p>\n <p className=\"text-[10px] text-gray-400\">PNG, JPG, GIF, WebP</p>\n </div>\n )}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={handleFileInput}\n />\n\n {/* Preview */}\n {preview && (\n <div className=\"relative\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={preview}\n alt=\"preview\"\n className=\"w-full max-h-40 object-contain rounded-md border border-gray-200 \"\n />\n {uploading && (\n <div className=\"absolute inset-x-0 bottom-0 h-1 bg-gray-200 rounded-b-md overflow-hidden\">\n <div\n className=\"h-full bg-blue-500 transition-all duration-150\"\n style={{ width: `${progress}%` }}\n />\n </div>\n )}\n {!uploading && (\n <button\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); setPreview((prev) => { if (prev?.startsWith('blob:')) URL.revokeObjectURL(prev); return null; }); }}\n className=\"absolute top-1 right-1 w-5 h-5 rounded-full bg-black/50 text-white flex items-center justify-center text-xs hover:bg-black/70\"\n >\n ✕\n </button>\n )}\n </div>\n )}\n\n {uploading && (\n <p className=\"text-[10px] text-center text-gray-400\">\n Uploading… {progress}%\n </p>\n )}\n </>\n ) : (\n <>\n {/* URL tab */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1\">\n Image URL\n </label>\n <input\n type=\"url\"\n placeholder=\"https://example.com/image.jpg\"\n value={urlInput}\n onChange={(e) => { setUrlInput(e.target.value); setUrlError(false); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitUrl(); } }}\n autoFocus\n className={[\n 'w-full px-2.5 py-1.5 text-xs rounded border outline-none',\n 'bg-white text-gray-900 ',\n urlError\n ? 'border-red-400 focus:ring-red-400'\n : 'border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-transparent',\n ].join(' ')}\n />\n {urlError && <p className=\"text-[10px] text-red-500 mt-1\">Enter a valid URL</p>}\n </div>\n\n {/* Live preview for URL tab */}\n {urlInput && (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={urlInput}\n alt=\"preview\"\n onError={(e) => { (e.target as HTMLImageElement).style.display = 'none'; }}\n onLoad={(e) => { (e.target as HTMLImageElement).style.display = 'block'; }}\n style={{ display: 'none' }}\n className=\"w-full max-h-28 object-contain rounded-md border border-gray-200 \"\n />\n )}\n </>\n )}\n\n {/* Alt text */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1\">\n Alt text <span className=\"normal-case font-normal\">(optional)</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"Describe the image\"\n value={altInput}\n onChange={(e) => setAltInput(e.target.value)}\n className=\"w-full px-2.5 py-1.5 text-xs rounded border outline-none\n border-gray-300 \n bg-white text-gray-900 \n focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n </div>\n\n {/* Actions */}\n {tab === 'url' && (\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); close(); }}\n className=\"px-3 py-1.5 text-xs text-gray-600 rounded hover:bg-gray-100 \"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); commitUrl(); }}\n className=\"px-3 py-1.5 text-xs bg-blue-600 text-white rounded hover:bg-blue-700\"\n >\n Insert\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ImageIcon() {\n return (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n );\n}\n\nfunction UploadIcon() {\n return (\n <svg className=\"w-8 h-8 text-gray-300 \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n );\n}\n","export interface SpecialChar {\n char: string;\n name: string;\n category: string;\n}\n\nexport const SPECIAL_CHARACTERS: SpecialChar[] = [\n // ── Currency ──────────────────────────────────────────────────────────────\n { char: '€', name: 'Euro Sign', category: 'Currency' },\n { char: '£', name: 'Pound Sign', category: 'Currency' },\n { char: '¥', name: 'Yen Sign', category: 'Currency' },\n { char: '¢', name: 'Cent Sign', category: 'Currency' },\n { char: '₹', name: 'Indian Rupee Sign', category: 'Currency' },\n { char: '₽', name: 'Ruble Sign', category: 'Currency' },\n { char: '₩', name: 'Won Sign', category: 'Currency' },\n { char: '₺', name: 'Turkish Lira Sign', category: 'Currency' },\n { char: '₫', name: 'Dong Sign', category: 'Currency' },\n { char: '฿', name: 'Baht Sign', category: 'Currency' },\n { char: '₴', name: 'Hryvnia Sign', category: 'Currency' },\n { char: '₦', name: 'Naira Sign', category: 'Currency' },\n { char: '₲', name: 'Guarani Sign', category: 'Currency' },\n { char: '₱', name: 'Philippine Peso Sign', category: 'Currency' },\n { char: '₪', name: 'New Shekel Sign', category: 'Currency' },\n { char: '$', name: 'Fullwidth Dollar Sign', category: 'Currency' },\n { char: '¤', name: 'Currency Sign', category: 'Currency' },\n { char: '₡', name: 'Colon Sign', category: 'Currency' },\n\n // ── Mathematical ──────────────────────────────────────────────────────────\n { char: '±', name: 'Plus-Minus Sign', category: 'Mathematical' },\n { char: '×', name: 'Multiplication Sign', category: 'Mathematical' },\n { char: '÷', name: 'Division Sign', category: 'Mathematical' },\n { char: '≠', name: 'Not Equal To', category: 'Mathematical' },\n { char: '≈', name: 'Almost Equal To', category: 'Mathematical' },\n { char: '≤', name: 'Less-Than or Equal To', category: 'Mathematical' },\n { char: '≥', name: 'Greater-Than or Equal To', category: 'Mathematical' },\n { char: '∞', name: 'Infinity', category: 'Mathematical' },\n { char: '√', name: 'Square Root', category: 'Mathematical' },\n { char: '∑', name: 'N-Ary Summation', category: 'Mathematical' },\n { char: '∏', name: 'N-Ary Product', category: 'Mathematical' },\n { char: '∫', name: 'Integral', category: 'Mathematical' },\n { char: '∂', name: 'Partial Differential', category: 'Mathematical' },\n { char: '∆', name: 'Increment', category: 'Mathematical' },\n { char: '∇', name: 'Nabla', category: 'Mathematical' },\n { char: 'π', name: 'Greek Small Letter Pi', category: 'Mathematical' },\n { char: 'μ', name: 'Micro Sign', category: 'Mathematical' },\n { char: '°', name: 'Degree Sign', category: 'Mathematical' },\n { char: '∅', name: 'Empty Set', category: 'Mathematical' },\n { char: '∈', name: 'Element Of', category: 'Mathematical' },\n { char: '∉', name: 'Not an Element Of', category: 'Mathematical' },\n { char: '⊂', name: 'Subset Of', category: 'Mathematical' },\n { char: '⊃', name: 'Superset Of', category: 'Mathematical' },\n { char: '∩', name: 'Intersection', category: 'Mathematical' },\n { char: '∪', name: 'Union', category: 'Mathematical' },\n { char: '⊕', name: 'Circled Plus', category: 'Mathematical' },\n { char: '⊗', name: 'Circled Times', category: 'Mathematical' },\n { char: '‰', name: 'Per Mille Sign', category: 'Mathematical' },\n { char: '℃', name: 'Degree Celsius', category: 'Mathematical' },\n { char: '℉', name: 'Degree Fahrenheit', category: 'Mathematical' },\n\n // ── Text ──────────────────────────────────────────────────────────────────\n { char: '©', name: 'Copyright Sign', category: 'Text' },\n { char: '®', name: 'Registered Sign', category: 'Text' },\n { char: '™', name: 'Trade Mark Sign', category: 'Text' },\n { char: '§', name: 'Section Sign', category: 'Text' },\n { char: '¶', name: 'Pilcrow Sign', category: 'Text' },\n { char: '†', name: 'Dagger', category: 'Text' },\n { char: '‡', name: 'Double Dagger', category: 'Text' },\n { char: '•', name: 'Bullet', category: 'Text' },\n { char: '…', name: 'Horizontal Ellipsis', category: 'Text' },\n { char: '‣', name: 'Triangular Bullet', category: 'Text' },\n { char: '·', name: 'Middle Dot', category: 'Text' },\n { char: '¡', name: 'Inverted Exclamation Mark', category: 'Text' },\n { char: '¿', name: 'Inverted Question Mark', category: 'Text' },\n { char: 'ª', name: 'Feminine Ordinal Indicator', category: 'Text' },\n { char: 'º', name: 'Masculine Ordinal Indicator', category: 'Text' },\n { char: '№', name: 'Numero Sign', category: 'Text' },\n { char: '℗', name: 'Sound Recording Copyright', category: 'Text' },\n { char: '‼', name: 'Double Exclamation Mark', category: 'Text' },\n { char: '⁉', name: 'Exclamation Question Mark', category: 'Text' },\n\n // ── Arrows ────────────────────────────────────────────────────────────────\n { char: '←', name: 'Leftwards Arrow', category: 'Arrows' },\n { char: '→', name: 'Rightwards Arrow', category: 'Arrows' },\n { char: '↑', name: 'Upwards Arrow', category: 'Arrows' },\n { char: '↓', name: 'Downwards Arrow', category: 'Arrows' },\n { char: '↔', name: 'Left Right Arrow', category: 'Arrows' },\n { char: '↕', name: 'Up Down Arrow', category: 'Arrows' },\n { char: '↖', name: 'North West Arrow', category: 'Arrows' },\n { char: '↗', name: 'North East Arrow', category: 'Arrows' },\n { char: '↘', name: 'South East Arrow', category: 'Arrows' },\n { char: '↙', name: 'South West Arrow', category: 'Arrows' },\n { char: '⇐', name: 'Leftwards Double Arrow', category: 'Arrows' },\n { char: '⇒', name: 'Rightwards Double Arrow', category: 'Arrows' },\n { char: '⇑', name: 'Upwards Double Arrow', category: 'Arrows' },\n { char: '⇓', name: 'Downwards Double Arrow', category: 'Arrows' },\n { char: '⇔', name: 'Left Right Double Arrow', category: 'Arrows' },\n { char: '↺', name: 'Anticlockwise Open Circle Arrow', category: 'Arrows' },\n { char: '↻', name: 'Clockwise Open Circle Arrow', category: 'Arrows' },\n { char: '➔', name: 'Heavy Wide-Headed Rightwards Arrow', category: 'Arrows' },\n { char: '➡', name: 'Black Rightwards Arrow', category: 'Arrows' },\n { char: '⬅', name: 'Black Leftwards Arrow', category: 'Arrows' },\n { char: '⬆', name: 'Black Upwards Arrow', category: 'Arrows' },\n { char: '⬇', name: 'Black Downwards Arrow', category: 'Arrows' },\n { char: '↵', name: 'Downwards Arrow with Corner Leftwards', category: 'Arrows' },\n\n // ── Latin ─────────────────────────────────────────────────────────────────\n { char: 'À', name: 'Latin Capital Letter A with Grave', category: 'Latin' },\n { char: 'Á', name: 'Latin Capital Letter A with Acute', category: 'Latin' },\n { char: 'Â', name: 'Latin Capital Letter A with Circumflex', category: 'Latin' },\n { char: 'Ã', name: 'Latin Capital Letter A with Tilde', category: 'Latin' },\n { char: 'Ä', name: 'Latin Capital Letter A with Diaeresis', category: 'Latin' },\n { char: 'Å', name: 'Latin Capital Letter A with Ring Above', category: 'Latin' },\n { char: 'Æ', name: 'Latin Capital Letter AE', category: 'Latin' },\n { char: 'Ç', name: 'Latin Capital Letter C with Cedilla', category: 'Latin' },\n { char: 'È', name: 'Latin Capital Letter E with Grave', category: 'Latin' },\n { char: 'É', name: 'Latin Capital Letter E with Acute', category: 'Latin' },\n { char: 'Ê', name: 'Latin Capital Letter E with Circumflex', category: 'Latin' },\n { char: 'Ë', name: 'Latin Capital Letter E with Diaeresis', category: 'Latin' },\n { char: 'Ì', name: 'Latin Capital Letter I with Grave', category: 'Latin' },\n { char: 'Í', name: 'Latin Capital Letter I with Acute', category: 'Latin' },\n { char: 'Î', name: 'Latin Capital Letter I with Circumflex', category: 'Latin' },\n { char: 'Ï', name: 'Latin Capital Letter I with Diaeresis', category: 'Latin' },\n { char: 'Ñ', name: 'Latin Capital Letter N with Tilde', category: 'Latin' },\n { char: 'Ò', name: 'Latin Capital Letter O with Grave', category: 'Latin' },\n { char: 'Ó', name: 'Latin Capital Letter O with Acute', category: 'Latin' },\n { char: 'Ô', name: 'Latin Capital Letter O with Circumflex', category: 'Latin' },\n { char: 'Õ', name: 'Latin Capital Letter O with Tilde', category: 'Latin' },\n { char: 'Ö', name: 'Latin Capital Letter O with Diaeresis', category: 'Latin' },\n { char: 'Ø', name: 'Latin Capital Letter O with Stroke', category: 'Latin' },\n { char: 'Ù', name: 'Latin Capital Letter U with Grave', category: 'Latin' },\n { char: 'Ú', name: 'Latin Capital Letter U with Acute', category: 'Latin' },\n { char: 'Û', name: 'Latin Capital Letter U with Circumflex', category: 'Latin' },\n { char: 'Ü', name: 'Latin Capital Letter U with Diaeresis', category: 'Latin' },\n { char: 'Ý', name: 'Latin Capital Letter Y with Acute', category: 'Latin' },\n { char: 'Þ', name: 'Latin Capital Letter Thorn', category: 'Latin' },\n { char: 'ß', name: 'Latin Small Letter Sharp S', category: 'Latin' },\n { char: 'à', name: 'Latin Small Letter A with Grave', category: 'Latin' },\n { char: 'á', name: 'Latin Small Letter A with Acute', category: 'Latin' },\n { char: 'â', name: 'Latin Small Letter A with Circumflex', category: 'Latin' },\n { char: 'ã', name: 'Latin Small Letter A with Tilde', category: 'Latin' },\n { char: 'ä', name: 'Latin Small Letter A with Diaeresis', category: 'Latin' },\n { char: 'å', name: 'Latin Small Letter A with Ring Above', category: 'Latin' },\n { char: 'æ', name: 'Latin Small Letter AE', category: 'Latin' },\n { char: 'ç', name: 'Latin Small Letter C with Cedilla', category: 'Latin' },\n { char: 'è', name: 'Latin Small Letter E with Grave', category: 'Latin' },\n { char: 'é', name: 'Latin Small Letter E with Acute', category: 'Latin' },\n { char: 'ê', name: 'Latin Small Letter E with Circumflex', category: 'Latin' },\n { char: 'ë', name: 'Latin Small Letter E with Diaeresis', category: 'Latin' },\n { char: 'ì', name: 'Latin Small Letter I with Grave', category: 'Latin' },\n { char: 'í', name: 'Latin Small Letter I with Acute', category: 'Latin' },\n { char: 'î', name: 'Latin Small Letter I with Circumflex', category: 'Latin' },\n { char: 'ï', name: 'Latin Small Letter I with Diaeresis', category: 'Latin' },\n { char: 'ñ', name: 'Latin Small Letter N with Tilde', category: 'Latin' },\n { char: 'ò', name: 'Latin Small Letter O with Grave', category: 'Latin' },\n { char: 'ó', name: 'Latin Small Letter O with Acute', category: 'Latin' },\n { char: 'ô', name: 'Latin Small Letter O with Circumflex', category: 'Latin' },\n { char: 'õ', name: 'Latin Small Letter O with Tilde', category: 'Latin' },\n { char: 'ö', name: 'Latin Small Letter O with Diaeresis', category: 'Latin' },\n { char: 'ø', name: 'Latin Small Letter O with Stroke', category: 'Latin' },\n { char: 'ù', name: 'Latin Small Letter U with Grave', category: 'Latin' },\n { char: 'ú', name: 'Latin Small Letter U with Acute', category: 'Latin' },\n { char: 'û', name: 'Latin Small Letter U with Circumflex', category: 'Latin' },\n { char: 'ü', name: 'Latin Small Letter U with Diaeresis', category: 'Latin' },\n { char: 'ý', name: 'Latin Small Letter Y with Acute', category: 'Latin' },\n { char: 'þ', name: 'Latin Small Letter Thorn', category: 'Latin' },\n { char: 'ÿ', name: 'Latin Small Letter Y with Diaeresis', category: 'Latin' },\n { char: 'Œ', name: 'Latin Capital Ligature OE', category: 'Latin' },\n { char: 'œ', name: 'Latin Small Ligature OE', category: 'Latin' },\n\n // ── Quotations ────────────────────────────────────────────────────────────\n { char: '‘', name: 'Left Single Quotation Mark', category: 'Quotations' },\n { char: '’', name: 'Right Single Quotation Mark', category: 'Quotations' },\n { char: '“', name: 'Left Double Quotation Mark', category: 'Quotations' },\n { char: '”', name: 'Right Double Quotation Mark', category: 'Quotations' },\n { char: '‚', name: 'Single Low-9 Quotation Mark', category: 'Quotations' },\n { char: '„', name: 'Double Low-9 Quotation Mark', category: 'Quotations' },\n { char: '‹', name: 'Single Left-Pointing Angle Quotation Mark', category: 'Quotations' },\n { char: '›', name: 'Single Right-Pointing Angle Quotation Mark', category: 'Quotations' },\n { char: '«', name: 'Left-Pointing Double Angle Quotation Mark', category: 'Quotations' },\n { char: '»', name: 'Right-Pointing Double Angle Quotation Mark', category: 'Quotations' },\n { char: '〈', name: 'Left Angle Bracket', category: 'Quotations' },\n { char: '〉', name: 'Right Angle Bracket', category: 'Quotations' },\n\n // ── Symbols ───────────────────────────────────────────────────────────────\n { char: '♠', name: 'Black Spade Suit', category: 'Symbols' },\n { char: '♣', name: 'Black Club Suit', category: 'Symbols' },\n { char: '♥', name: 'Black Heart Suit', category: 'Symbols' },\n { char: '♦', name: 'Black Diamond Suit', category: 'Symbols' },\n { char: '★', name: 'Black Star', category: 'Symbols' },\n { char: '☆', name: 'White Star', category: 'Symbols' },\n { char: '☀', name: 'Black Sun with Rays', category: 'Symbols' },\n { char: '☁', name: 'Cloud', category: 'Symbols' },\n { char: '☂', name: 'Umbrella', category: 'Symbols' },\n { char: '☃', name: 'Snowman', category: 'Symbols' },\n { char: '☎', name: 'Black Telephone', category: 'Symbols' },\n { char: '☑', name: 'Ballot Box with Check', category: 'Symbols' },\n { char: '☒', name: 'Ballot Box with X', category: 'Symbols' },\n { char: '☓', name: 'Saltire', category: 'Symbols' },\n { char: '☕', name: 'Hot Beverage', category: 'Symbols' },\n { char: '♪', name: 'Eighth Note', category: 'Symbols' },\n { char: '♫', name: 'Beamed Eighth Notes', category: 'Symbols' },\n { char: '♯', name: 'Music Sharp Sign', category: 'Symbols' },\n { char: '♭', name: 'Music Flat Sign', category: 'Symbols' },\n { char: '⚡', name: 'High Voltage Sign', category: 'Symbols' },\n { char: '⚠', name: 'Warning Sign', category: 'Symbols' },\n { char: '✓', name: 'Check Mark', category: 'Symbols' },\n { char: '✗', name: 'Ballot X', category: 'Symbols' },\n { char: '✦', name: 'Black Four Pointed Star', category: 'Symbols' },\n { char: '❤', name: 'Heavy Black Heart', category: 'Symbols' },\n { char: '⚙', name: 'Gear', category: 'Symbols' },\n { char: '⚓', name: 'Anchor', category: 'Symbols' },\n { char: '⚔', name: 'Crossed Swords', category: 'Symbols' },\n { char: '⚖', name: 'Scales', category: 'Symbols' },\n { char: '♻', name: 'Black Universal Recycling Symbol', category: 'Symbols' },\n];\n\nexport const CATEGORIES = ['All', 'Currency', 'Mathematical', 'Text', 'Arrows', 'Latin', 'Quotations', 'Symbols'] as const;\nexport type Category = typeof CATEGORIES[number];\n","\"use client\";\n\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { EditorEngine } from \"../../editor/core/EditorEngine\";\nimport { insertText } from \"../../editor/commands\";\nimport {\n SPECIAL_CHARACTERS,\n CATEGORIES,\n type Category,\n} from \"../../data/specialCharacters\";\n\ninterface SpecialCharactersButtonProps {\n engine: EditorEngine;\n}\n\nexport function SpecialCharactersButton({\n engine,\n}: SpecialCharactersButtonProps) {\n const [open, setOpen] = useState(false);\n const [category, setCategory] = useState<Category>(\"All\");\n const [search, setSearch] = useState(\"\");\n const [hovered, setHovered] = useState<{ char: string; name: string } | null>(\n null,\n );\n const [focusedIdx, setFocusedIdx] = useState(-1);\n\n const buttonRef = useRef<HTMLButtonElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n const [popupPos, setPopupPos] = useState<{ top: number; left: number }>({ top: 0, left: 0 });\n\n const filtered = useMemo(() => {\n const q = search.toLowerCase();\n return SPECIAL_CHARACTERS.filter(\n (c) =>\n (category === \"All\" || c.category === category) &&\n (!q || c.name.toLowerCase().includes(q) || c.char.includes(q)),\n );\n }, [category, search]);\n\n const openModal = () => {\n if (buttonRef.current) {\n const rect = buttonRef.current.getBoundingClientRect();\n const popupWidth = 340;\n const left = Math.min(rect.left, window.innerWidth - popupWidth - 8);\n setPopupPos({ top: rect.bottom + 4, left: Math.max(8, left) });\n }\n setOpen(true);\n setSearch(\"\");\n setFocusedIdx(-1);\n };\n\n const closeModal = useCallback(() => {\n setOpen(false);\n setHovered(null);\n setFocusedIdx(-1);\n }, []);\n\n // Close on outside click (check both button and portal popup)\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n const insidePopup = popupRef.current?.contains(target);\n const insideButton = buttonRef.current?.contains(target);\n if (!insidePopup && !insideButton) closeModal();\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, closeModal]);\n\n // Focus search on open\n useEffect(() => {\n if (open) {\n setTimeout(() => searchRef.current?.focus(), 0);\n }\n }, [open]);\n\n const insertChar = useCallback(\n (char: string) => {\n insertText(char)(engine);\n closeModal();\n },\n [engine, closeModal],\n );\n\n // Keyboard nav in grid\n const handleGridKeyDown = (e: React.KeyboardEvent) => {\n const cols = 8;\n const len = filtered.length;\n if (len === 0) return;\n\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n setFocusedIdx((i) => Math.min(i + 1, len - 1));\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n setFocusedIdx((i) => Math.max(i - 1, 0));\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setFocusedIdx((i) => Math.min(i + cols, len - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setFocusedIdx((i) => Math.max(i - cols, 0));\n } else if (e.key === \"Enter\" && focusedIdx >= 0) {\n e.preventDefault();\n insertChar(filtered[focusedIdx].char);\n } else if (e.key === \"Escape\") {\n closeModal();\n }\n };\n\n // Sync focused cell into view\n useEffect(() => {\n if (focusedIdx < 0 || !gridRef.current) return;\n const cell = gridRef.current.children[focusedIdx] as\n | HTMLElement\n | undefined;\n cell?.focus();\n }, [focusedIdx]);\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n title=\"Special Characters\"\n aria-label=\"Insert special character\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onMouseDown={(e) => {\n e.preventDefault();\n if (open) { closeModal(); } else { openModal(); }\n }}\n className={[\n \"flex items-center justify-center w-8 h-8 rounded text-sm font-medium transition-colors\",\n open\n ? \"bg-blue-100 text-blue-700 \"\n : \"text-gray-700 hover:bg-gray-100 \",\n ].join(\" \")}\n >\n <OmegaIcon />\n </button>\n\n {open && createPortal(\n <div\n ref={popupRef}\n role=\"dialog\"\n aria-label=\"Special characters\"\n aria-modal=\"true\"\n className=\"bg-white border border-gray-200 rounded-lg shadow-2xl flex flex-col\"\n style={{ position: \"fixed\", top: popupPos.top, left: popupPos.left, width: 340, maxHeight: 420, zIndex: 9999 }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") closeModal();\n }}\n >\n {/* Header */}\n <div className=\"px-3 pt-3 pb-2 border-b border-gray-100 \">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">\n Special Characters\n </span>\n <button\n type=\"button\"\n onClick={closeModal}\n aria-label=\"Close\"\n className=\"text-gray-400 hover:text-gray-600 p-0.5 rounded\"\n >\n <CloseIcon />\n </button>\n </div>\n\n {/* Search */}\n <input\n ref={searchRef}\n type=\"search\"\n placeholder=\"Search characters…\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setFocusedIdx(-1);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") closeModal();\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setFocusedIdx(0);\n gridRef.current?.children[0]?.dispatchEvent(\n new Event(\"focus\"),\n );\n }\n }}\n className=\"w-full border border-gray-200 rounded px-2.5 py-1.5 text-sm bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n\n {/* Category tabs */}\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {CATEGORIES.map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onMouseDown={(e) => {\n e.preventDefault();\n setCategory(cat);\n setFocusedIdx(-1);\n }}\n className={[\n \"px-2 py-0.5 rounded text-xs font-medium transition-colors\",\n category === cat\n ? \"bg-blue-600 text-white\"\n : \"bg-gray-100 text-gray-600 hover:bg-gray-200 \",\n ].join(\" \")}\n >\n {cat}\n </button>\n ))}\n </div>\n </div>\n\n {/* Character grid */}\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label=\"Character grid\"\n className=\"flex-1 overflow-y-auto p-2\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(8, 1fr)\",\n gap: 2,\n }}\n onKeyDown={handleGridKeyDown}\n >\n {filtered.length === 0 ? (\n <div\n className=\"col-span-8 text-center py-8 text-sm text-gray-400 \"\n role=\"status\"\n >\n No characters found\n </div>\n ) : (\n filtered.map((c, idx) => (\n <button\n key={c.char + c.name}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={focusedIdx === idx ? 0 : -1}\n aria-label={c.name}\n title={c.name}\n onMouseDown={(e) => {\n e.preventDefault();\n insertChar(c.char);\n }}\n onMouseEnter={() =>\n setHovered({ char: c.char, name: c.name })\n }\n onMouseLeave={() => setHovered(null)}\n onFocus={() => setHovered({ char: c.char, name: c.name })}\n onBlur={() => setHovered(null)}\n className={[\n \"flex items-center justify-center rounded text-base h-8 w-full transition-colors cursor-pointer select-none\",\n focusedIdx === idx\n ? \"bg-blue-100 text-blue-700 ring-2 ring-blue-500\"\n : \"text-gray-800 hover:bg-blue-50 hover:text-blue-700 \",\n ].join(\" \")}\n >\n {c.char}\n </button>\n ))\n )}\n </div>\n\n {/* Footer preview */}\n <div className=\"px-3 py-2 border-t border-gray-100 flex items-center gap-3 min-h-[40px]\">\n {hovered ? (\n <>\n <span className=\"text-2xl leading-none text-gray-800 w-8 text-center\">\n {hovered.char}\n </span>\n <span className=\"text-xs text-gray-500 truncate\">\n {hovered.name}\n </span>\n </>\n ) : (\n <span className=\"text-xs text-gray-400 \">\n Hover or use arrow keys to preview\n </span>\n )}\n </div>\n </div>,\n document.body,\n )}\n </>\n );\n}\n\nfunction OmegaIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M16.164 4.561c-6.459 0-11.721 5.618-11.721 12.576 0 2.663 0.766 5.168 2.076 7.204-1.525-0.826-3.023-1.826-4.518-3.052v5.935h10.907c-2.995-2.075-5.087-5.131-5.087-8.621 0-4.653 3.736-8.425 8.343-8.425s8.343 3.772 8.343 8.425c0 3.49-2.092 6.546-5.087 8.621h10.907v-5.935c-1.499 1.24-3.014 2.259-4.558 3.093 1.329-2.045 2.116-4.561 2.116-7.244 0-6.958-5.262-12.576-11.721-12.576h-0z\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport type { BlockNode } from '../../types';\r\nimport { useEditorState } from '../../hooks/useEditorState';\r\nimport { getActiveBlockType } from '../../editor/selection/SelectionEngine';\r\nimport { findContentBlockPath, getNodeAtPath } from '../../editor/core/DocumentModel';\r\nimport { setCodeBlock, setCodeBlockLanguage } from '../../editor/commands';\r\n\r\nconst LANGUAGES: { value: string; label: string }[] = [\r\n { value: 'plaintext', label: 'Plain text' },\r\n { value: 'c', label: 'C' },\r\n { value: 'cs', label: 'C#' },\r\n { value: 'cpp', label: 'C++' },\r\n { value: 'css', label: 'CSS' },\r\n { value: 'diff', label: 'Diff' },\r\n { value: 'go', label: 'Go' },\r\n { value: 'html', label: 'HTML' },\r\n { value: 'java', label: 'Java' },\r\n { value: 'javascript', label: 'JavaScript' },\r\n { value: 'json', label: 'JSON' },\r\n { value: 'php', label: 'PHP' },\r\n { value: 'python', label: 'Python' },\r\n { value: 'sql', label: 'SQL' },\r\n { value: 'typescript', label: 'TypeScript' },\r\n { value: 'xml', label: 'XML' },\r\n];\r\n\r\ninterface CodeBlockButtonProps {\r\n engine: EditorEngine;\r\n}\r\n\r\nexport function CodeBlockButton({ engine }: CodeBlockButtonProps) {\r\n const state = useEditorState(engine);\r\n const activeBlock = getActiveBlockType(state.doc, state.selection);\r\n const isActive = activeBlock === 'code_block';\r\n\r\n const [open, setOpen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const currentLang = (() => {\r\n if (!isActive || !state.selection) return 'plaintext';\r\n const bp = findContentBlockPath(state.doc, state.selection.anchor.path);\r\n if (!bp) return 'plaintext';\r\n const block = getNodeAtPath(state.doc, bp) as BlockNode | null;\r\n return (block?.attrs?.language as string) || 'plaintext';\r\n })();\r\n\r\n const closeDropdown = useCallback(() => setOpen(false), []);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n closeDropdown();\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open, closeDropdown]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') closeDropdown(); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open, closeDropdown]);\r\n\r\n const handleToggle = () => {\r\n setCodeBlock(engine);\r\n setOpen(false);\r\n };\r\n\r\n const handleSelectLanguage = (lang: string) => {\r\n if (!isActive) {\r\n setCodeBlock(engine);\r\n // Language set after block creation via timeout so state updates first.\r\n setTimeout(() => setCodeBlockLanguage(lang)(engine), 0);\r\n } else {\r\n setCodeBlockLanguage(lang)(engine);\r\n }\r\n setOpen(false);\r\n };\r\n\r\n const activeLang = LANGUAGES.find((l) => l.value === currentLang);\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative flex items-center\">\r\n {/* Main toggle button */}\r\n <button\r\n type=\"button\"\r\n title=\"Code Block (Ctrl+Shift+C)\"\r\n onMouseDown={(e) => { e.preventDefault(); handleToggle(); }}\r\n className={[\r\n 'flex items-center justify-center w-8 h-8 rounded-l text-sm transition-colors',\r\n isActive\r\n ? 'bg-blue-100 text-blue-700 '\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <CodeBlockIcon />\r\n </button>\r\n\r\n {/* Chevron / language selector */}\r\n <button\r\n type=\"button\"\r\n title={isActive ? `Language: ${activeLang?.label ?? 'Plain text'}` : 'Select language'}\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setOpen((p) => !p);\r\n }}\r\n className={[\r\n 'flex items-center justify-center w-4 h-8 rounded-r border-l border-gray-200 transition-colors',\r\n open\r\n ? 'bg-gray-100 text-gray-700 '\r\n : 'text-gray-400 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <ChevronIcon />\r\n </button>\r\n\r\n {/* Language dropdown */}\r\n {open && (\r\n <div\r\n role=\"listbox\"\r\n aria-label=\"Code block language\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-xl py-1 w-44 max-h-72 overflow-y-auto\"\r\n >\r\n <p className=\"px-3 py-1.5 text-[10px] font-semibold uppercase tracking-widest text-gray-400 \">\r\n Language\r\n </p>\r\n {LANGUAGES.map((lang) => {\r\n const isSelected = isActive && currentLang === lang.value;\r\n return (\r\n <button\r\n key={lang.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n onMouseDown={(e) => { e.preventDefault(); handleSelectLanguage(lang.value); }}\r\n className={[\r\n 'w-full text-left px-3 py-1.5 text-sm flex items-center gap-2 transition-colors',\r\n isSelected\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n {isSelected && (\r\n <svg className=\"w-3 h-3 shrink-0\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\r\n <polyline points=\"1 6 4.5 9.5 11 2.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n )}\r\n <span className={isSelected ? '' : 'ml-5'}>{lang.label}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CodeBlockIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\r\n <path d=\"M9 9l-3 3 3 3\" />\r\n <path d=\"M15 9l3 3-3 3\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronIcon() {\r\n return (\r\n <svg className=\"w-2.5 h-2.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\n\nimport React from 'react';\n\ninterface SourceEditingButtonProps {\n isActive: boolean;\n onToggle: () => void;\n}\n\nexport function SourceEditingButton({ isActive, onToggle }: SourceEditingButtonProps) {\n return (\n <button\n type=\"button\"\n title=\"Source editing (HTML)\"\n aria-pressed={isActive}\n onMouseDown={(e) => { e.preventDefault(); onToggle(); }}\n className={[\n 'flex items-center justify-center w-8 h-8 rounded text-sm font-mono font-bold transition-colors',\n isActive\n ? 'bg-blue-100 text-blue-700 '\n : 'text-gray-700 hover:bg-gray-100 ',\n ].join(' ')}\n >\n <SourceIcon />\n </button>\n );\n}\n\nfunction SourceIcon() {\n return (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" strokeWidth={1.5} strokeOpacity={0.5} />\n </svg>\n );\n}\n","/**\n * HistoryManager\n *\n * Implements undo/redo by storing past EditorState snapshots.\n *\n * Architecture choice: State-snapshot model vs. Inverse-step model\n *\n * Inverse-step (ProseMirror): store the inverse of each transaction.\n * Undo = apply the inverse transaction. Efficient for large docs.\n *\n * State-snapshot (simpler): store the full EditorState at each history\n * point. Undo = restore the previous snapshot. Works great for small-to-\n * medium docs and is much easier to implement correctly.\n *\n * We use state-snapshot here. For a collaborative or very large-doc editor\n * you'd upgrade to inverse steps + rebasing.\n *\n * The HistoryManager is implemented as an EditorPlugin so it integrates\n * seamlessly with the plugin architecture.\n */\n\nimport type {\n EditorPlugin,\n EditorEngineInterface,\n EditorState,\n Transaction,\n} from '../../types';\nimport { createTransaction } from '../core/Transaction';\nimport { tr_replaceDoc, tr_setSelection } from '../core/Transaction';\n\nconst HISTORY_PLUGIN_NAME = 'history';\nconst MAX_HISTORY = 100; // max undo steps to keep\n\ninterface HistoryEntry {\n state: EditorState;\n label: string; // human-readable description for debugging\n}\n\ninterface HistoryManagerState {\n undoStack: HistoryEntry[];\n redoStack: HistoryEntry[];\n}\n\nconst managerMap = new WeakMap<EditorEngineInterface, HistoryManagerState>();\n\nfunction getManagerState(engine: EditorEngineInterface): HistoryManagerState {\n if (!managerMap.has(engine)) {\n managerMap.set(engine, { undoStack: [], redoStack: [] });\n }\n return managerMap.get(engine)!;\n}\n\nexport function createHistoryPlugin(): EditorPlugin {\n return {\n name: HISTORY_PLUGIN_NAME,\n\n init(engine: EditorEngineInterface) {\n // Seed the undo stack with the initial state so the first undo\n // can restore back to an empty document.\n const { undoStack } = getManagerState(engine);\n undoStack.push({ state: engine.getState(), label: 'initial' });\n },\n\n onTransaction(tr: Transaction, state: EditorState): Transaction {\n // Skip history-internal transactions to avoid infinite loops\n if (tr.meta.historyInternal) return tr;\n\n // Skip transactions that only update selection (no doc changes)\n const hasDocChange = tr.steps.some((s) => s.type !== 'set_selection');\n if (!hasDocChange) return tr;\n\n return tr;\n },\n\n onStateChange(state: EditorState, prevState: EditorState) {\n // This is called by the engine AFTER the transaction is applied.\n // We capture the PREVIOUS state as an undo point.\n // We skip if the doc didn't change (selection-only update).\n if (state.doc === prevState.doc) return;\n\n const engine = findEngine(this);\n if (!engine) return;\n\n const ms = getManagerState(engine);\n\n // Push the PREVIOUS state so we can undo back to it\n ms.undoStack.push({ state: prevState, label: 'change' });\n if (ms.undoStack.length > MAX_HISTORY) {\n ms.undoStack.shift(); // drop oldest\n }\n\n // Any new change clears the redo stack (standard undo semantics)\n ms.redoStack = [];\n },\n\n keyBindings: {\n 'Ctrl+z': (engine) => undo(engine),\n 'Ctrl+Z': (engine) => undo(engine),\n 'Ctrl+Shift+z': (engine) => redo(engine),\n 'Ctrl+Shift+Z': (engine) => redo(engine),\n 'Ctrl+y': (engine) => redo(engine),\n },\n };\n\n // Workaround: plugins don't naturally have a back-reference to the engine.\n // We store it via init and look it up via the WeakMap.\n function findEngine(_plugin: EditorPlugin): EditorEngineInterface | null {\n // The engine is captured via closure from the plugin registration.\n // We use the WeakMap keyed by engine, but we need to know which engine.\n // Solution: the plugin's init captures the engine reference.\n return null; // overridden below\n }\n}\n\n// ─── Stateful Plugin Factory (captures engine ref) ───────────────────────────\n\n/**\n * Create a history plugin with engine reference captured in closure.\n * Call this factory instead of createHistoryPlugin() directly.\n */\nexport function createHistoryManager(): EditorPlugin {\n let engineRef: EditorEngineInterface | null = null;\n const undoStack: HistoryEntry[] = [];\n const redoStack: HistoryEntry[] = [];\n let isDoingHistoryAction = false;\n\n return {\n name: HISTORY_PLUGIN_NAME,\n\n init(engine: EditorEngineInterface) {\n engineRef = engine;\n // Capture initial state\n undoStack.push({ state: engine.getState(), label: 'initial' });\n },\n\n onStateChange(newState: EditorState, prevState: EditorState) {\n // Skip recording during undo/redo — otherwise onStateChange would\n // push the pre-undo state back onto the stack and clear the redo stack.\n if (isDoingHistoryAction) return;\n if (newState.doc === prevState.doc) return;\n\n undoStack.push({ state: prevState, label: 'change' });\n if (undoStack.length > MAX_HISTORY) undoStack.shift();\n redoStack.length = 0;\n },\n\n keyBindings: {\n 'Ctrl+z': (_engine) => performUndo(),\n 'Ctrl+Z': (_engine) => performUndo(),\n 'Ctrl+Shift+z': (_engine) => performRedo(),\n 'Ctrl+Shift+Z': (_engine) => performRedo(),\n 'Ctrl+y': (_engine) => performRedo(),\n },\n };\n\n function performUndo(): boolean {\n if (!engineRef || undoStack.length <= 1) return false;\n\n const current = engineRef.getState();\n redoStack.push({ state: current, label: 'redo-point' });\n\n const prev = undoStack.pop()!;\n\n isDoingHistoryAction = true;\n try {\n const tr = createTransaction({ historyInternal: true });\n tr.steps.push(tr_replaceDoc(prev.state.doc));\n tr.steps.push(tr_setSelection(prev.state.selection));\n engineRef.dispatch(tr);\n } finally {\n isDoingHistoryAction = false;\n }\n return true;\n }\n\n function performRedo(): boolean {\n if (!engineRef || redoStack.length === 0) return false;\n\n const current = engineRef.getState();\n undoStack.push({ state: current, label: 'undo-point' });\n\n const next = redoStack.pop()!;\n\n isDoingHistoryAction = true;\n try {\n const tr = createTransaction({ historyInternal: true });\n tr.steps.push(tr_replaceDoc(next.state.doc));\n tr.steps.push(tr_setSelection(next.state.selection));\n engineRef.dispatch(tr);\n } finally {\n isDoingHistoryAction = false;\n }\n return true;\n }\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport function undo(engine: EditorEngineInterface): boolean {\n const plugin = engine.getPlugin\n ? (engine as import('../core/EditorEngine').EditorEngine).getPlugin(HISTORY_PLUGIN_NAME)\n : undefined;\n if (!plugin) return false;\n // Trigger via key binding\n if (plugin.keyBindings?.['Ctrl+z']) {\n return plugin.keyBindings['Ctrl+z'](engine);\n }\n return false;\n}\n\nexport function redo(engine: EditorEngineInterface): boolean {\n const plugin = engine.getPlugin\n ? (engine as import('../core/EditorEngine').EditorEngine).getPlugin(HISTORY_PLUGIN_NAME)\n : undefined;\n if (!plugin) return false;\n if (plugin.keyBindings?.['Ctrl+y']) {\n return plugin.keyBindings['Ctrl+y'](engine);\n }\n return false;\n}\n","import type { EditorToolbarItem } from \"../../types/public\";\n\nexport const DEFAULT_TOOLBAR: EditorToolbarItem[] = [\n \"heading\",\n \"|\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"strikethrough\",\n \"code\",\n \"link\",\n \"background-color\",\n \"text-color\",\n \"|\",\n \"font-family\",\n \"font-size\",\n \"|\",\n \"align\",\n \"|\",\n \"bullet-list\",\n \"ordered-list\",\n \"check-list\",\n \"|\",\n \"blockquote\",\n \"code-block\",\n \"horizontal-rule\",\n \"table\",\n \"|\",\n \"image\",\n \"special-chars\",\n \"find-replace\",\n \"|\",\n \"undo\",\n \"redo\",\n \"|\",\n \"source\",\n];\n\nexport const MINIMAL_TOOLBAR: EditorToolbarItem[] = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"|\",\n \"bullet-list\",\n \"ordered-list\",\n \"|\",\n \"link\",\n];\n\nexport const BASIC_TOOLBAR: EditorToolbarItem[] = [\n \"undo\",\n \"redo\",\n \"|\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"strikethrough\",\n \"|\",\n \"bullet-list\",\n \"ordered-list\",\n \"|\",\n \"link\",\n \"image\",\n];\n","\"use client\";\r\n\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport { ToolbarButton } from \"./ToolbarButton\";\r\nimport type { EditorEngine } from \"../../editor/core/EditorEngine\";\r\nimport { useEditorState } from \"../../hooks/useEditorState\";\r\nimport {\r\n toggleBold,\r\n toggleItalic,\r\n toggleUnderline,\r\n toggleStrikethrough,\r\n toggleCode,\r\n toggleBulletList,\r\n toggleOrderedList,\r\n setHeading,\r\n setParagraph,\r\n setBlockquote,\r\n insertLink,\r\n removeLink,\r\n} from \"../../editor/commands\";\r\nimport {\r\n getActiveMarks,\r\n getActiveBlockType,\r\n getActiveLinkHref,\r\n getActiveAlignment,\r\n getActiveFontSize,\r\n getActiveFontFamily,\r\n getActiveHighlightColor,\r\n getActiveTextColor,\r\n} from \"../../editor/selection/SelectionEngine\";\r\nimport { getDocumentMarkAttrValues } from \"../../editor/core/DocumentModel\";\r\nimport { AlignmentDropdown } from \"./AlignmentDropdown\";\r\nimport { FontSizeDropdown } from \"./FontSizeDropdown\";\r\nimport { FontFamilyDropdown } from \"./FontFamilyDropdown\";\r\nimport { BackgroundColorDropdown } from \"./BackgroundColorDropdown\";\r\nimport { TextColorDropdown } from \"./TextColorDropdown\";\r\nimport { HorizontalRuleButton } from \"./HorizontalRuleButton\";\r\nimport { ChecklistButton } from \"./ChecklistButton\";\r\nimport { TableButton } from \"./TableButton\";\r\nimport { ImageUploadButton } from \"./ImageUploadButton\";\r\nimport { SpecialCharactersButton } from \"./SpecialCharactersButton\";\r\nimport { CodeBlockButton } from \"./CodeBlockButton\";\r\nimport { SourceEditingButton } from \"./SourceEditingButton\";\r\nimport { undo, redo } from \"../../editor/history/HistoryManager\";\r\nimport type { EditorToolbarConfig } from \"../../types/public\";\r\nimport { DEFAULT_TOOLBAR } from \"./toolbarConfig\";\r\n\r\ninterface ToolbarProps {\r\n engine: EditorEngine;\r\n onFindReplace?: (mode: \"find\" | \"replace\") => void;\r\n /** When true, the link popup opens immediately (driven by Ctrl+K from Editor) */\r\n linkPopupOpen?: boolean;\r\n onLinkPopupClose?: () => void;\r\n isSourceMode?: boolean;\r\n onToggleSource?: () => void;\r\n toolbarConfig?: EditorToolbarConfig;\r\n}\r\n\r\nexport function Toolbar({\r\n engine,\r\n onFindReplace,\r\n linkPopupOpen,\r\n onLinkPopupClose,\r\n isSourceMode = false,\r\n onToggleSource,\r\n toolbarConfig,\r\n}: ToolbarProps) {\r\n const state = useEditorState(engine);\r\n const { doc, selection, marks } = state;\r\n\r\n const activeMarks =\r\n selection && !selection.isCollapsed\r\n ? getActiveMarks(doc, selection)\r\n : new Set(marks.map((m) => m.type));\r\n const activeBlock = getActiveBlockType(doc, selection);\r\n const activeLinkHref = getActiveLinkHref(doc, selection, marks);\r\n const activeAlignment = getActiveAlignment(doc, selection);\r\n const activeFontSize = getActiveFontSize(doc, selection, marks);\r\n const activeFontFamily = getActiveFontFamily(doc, selection, marks);\r\n const activeHighlightColor = getActiveHighlightColor(doc, selection, marks);\r\n const activeTextColor = getActiveTextColor(doc, selection, marks);\r\n const documentTextColors = getDocumentMarkAttrValues(doc, \"text_color\", \"color\");\r\n const documentHighlightColors = getDocumentMarkAttrValues(doc, \"highlight\", \"color\");\r\n\r\n const run = (command: (e: typeof engine) => boolean) => command(engine);\r\n\r\n // Normalize config to flat array\r\n const flatConfig: string[] = toolbarConfig\r\n ? Array.isArray(toolbarConfig[0])\r\n ? (toolbarConfig as string[][]).flat()\r\n : (toolbarConfig as string[])\r\n : DEFAULT_TOOLBAR;\r\n\r\n // source item is always-enabled — render outside the dimmed wrapper\r\n const hasSource = flatConfig.includes('source');\r\n // Strip trailing separators before source so hasSource block's own Divider is the only one\r\n let mainItems = flatConfig.filter((id) => id !== 'source');\r\n if (hasSource) {\r\n while (mainItems.length > 0 && mainItems[mainItems.length - 1] === '|') {\r\n mainItems = mainItems.slice(0, -1);\r\n }\r\n }\r\n\r\n const renderItem = (id: string, idx: number): React.ReactNode => {\r\n if (id === '|') return <Divider key={`sep-${idx}`} />;\r\n switch (id) {\r\n case 'heading':\r\n return <HeadingDropdown key=\"heading\" engine={engine} activeBlock={activeBlock} />;\r\n case 'bold':\r\n return <ToolbarButton key=\"bold\" label=\"B\" title=\"Bold (Ctrl+B)\" onClick={() => run(toggleBold)} isActive={activeMarks.has(\"bold\")} icon={<span className=\"font-bold text-sm\">B</span>} />;\r\n case 'italic':\r\n return <ToolbarButton key=\"italic\" label=\"I\" title=\"Italic (Ctrl+I)\" onClick={() => run(toggleItalic)} isActive={activeMarks.has(\"italic\")} icon={<span className=\"italic text-sm\">I</span>} />;\r\n case 'underline':\r\n return <ToolbarButton key=\"underline\" label=\"U\" title=\"Underline (Ctrl+U)\" onClick={() => run(toggleUnderline)} isActive={activeMarks.has(\"underline\")} icon={<span className=\"underline text-sm\">U</span>} />;\r\n case 'strikethrough':\r\n return <ToolbarButton key=\"strikethrough\" label=\"S\" title=\"Strikethrough\" onClick={() => run(toggleStrikethrough)} isActive={activeMarks.has(\"strikethrough\")} icon={<span className=\"line-through text-sm\">S</span>} />;\r\n case 'code':\r\n return <ToolbarButton key=\"code\" label=\"`\" title=\"Inline Code\" onClick={() => run(toggleCode)} isActive={activeMarks.has(\"code\")} icon={<CodeIcon />} />;\r\n case 'link':\r\n return (\r\n <LinkButton\r\n key=\"link\"\r\n engine={engine}\r\n isActive={activeMarks.has(\"link\")}\r\n activeHref={activeLinkHref}\r\n hasTextSelected={!!(selection && !selection.isCollapsed)}\r\n externalOpen={linkPopupOpen}\r\n onExternalClose={onLinkPopupClose}\r\n />\r\n );\r\n case 'highlight':\r\n case 'background-color':\r\n return <BackgroundColorDropdown key=\"background-color\" engine={engine} activeColor={activeHighlightColor} documentColors={documentHighlightColors} />;\r\n case 'text-color':\r\n return <TextColorDropdown key=\"text-color\" engine={engine} activeColor={activeTextColor} documentColors={documentTextColors} />;\r\n case 'font-family':\r\n return <FontFamilyDropdown key=\"font-family\" engine={engine} activeFontFamily={activeFontFamily} />;\r\n case 'font-size':\r\n return <FontSizeDropdown key=\"font-size\" engine={engine} activeFontSize={activeFontSize} />;\r\n case 'align':\r\n return <AlignmentDropdown key=\"align\" engine={engine} activeAlignment={activeAlignment} />;\r\n case 'bullet-list':\r\n return <ToolbarButton key=\"bullet-list\" label=\"UL\" title=\"Bullet List\" onClick={() => run(toggleBulletList)} isActive={activeBlock === \"bullet_list\"} icon={<BulletListIcon />} />;\r\n case 'ordered-list':\r\n return <ToolbarButton key=\"ordered-list\" label=\"OL\" title=\"Ordered List\" onClick={() => run(toggleOrderedList)} isActive={activeBlock === \"ordered_list\"} icon={<OrderedListIcon />} />;\r\n case 'check-list':\r\n return <ChecklistButton key=\"check-list\" engine={engine} />;\r\n case 'blockquote':\r\n return <ToolbarButton key=\"blockquote\" label=\"❝\" title=\"Blockquote\" onClick={() => run(setBlockquote)} isActive={activeBlock === \"blockquote\"} icon={<BlockquoteIcon />} />;\r\n case 'code-block':\r\n return <CodeBlockButton key=\"code-block\" engine={engine} />;\r\n case 'horizontal-rule':\r\n return <HorizontalRuleButton key=\"horizontal-rule\" engine={engine} />;\r\n case 'table':\r\n return <TableButton key=\"table\" engine={engine} />;\r\n case 'image':\r\n return <ImageUploadButton key=\"image\" engine={engine} />;\r\n case 'special-chars':\r\n return <SpecialCharactersButton key=\"special-chars\" engine={engine} />;\r\n case 'find-replace':\r\n return onFindReplace\r\n ? <ToolbarButton key=\"find-replace\" label=\"Find\" title=\"Find and Replace (Ctrl+F)\" onClick={() => onFindReplace(\"find\")} icon={<FindReplaceIcon />} />\r\n : null;\r\n case 'undo':\r\n return <ToolbarButton key=\"undo\" label=\"↩\" title=\"Undo (Ctrl+Z)\" onClick={() => undo(engine)} icon={<UndoIcon />} />;\r\n case 'redo':\r\n return <ToolbarButton key=\"redo\" label=\"↪\" title=\"Redo (Ctrl+Y)\" onClick={() => redo(engine)} icon={<RedoIcon />} />;\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n role=\"toolbar\"\r\n aria-label=\"Editor formatting toolbar\"\r\n className=\"flex flex-wrap items-center gap-px px-1.5 py-1 bg-white border-b border-gray-200 select-none\"\r\n >\r\n <div className={`flex flex-wrap items-center gap-px ${isSourceMode ? 'pointer-events-none grayscale opacity-60' : ''}`}>\r\n {mainItems.map((id, idx) => renderItem(id, idx))}\r\n </div>\r\n\r\n {hasSource && onToggleSource && (\r\n <>\r\n <Divider />\r\n <SourceEditingButton isActive={isSourceMode} onToggle={onToggleSource} />\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Heading Dropdown ─────────────────────────────────────────────────────────\r\n\r\nfunction HeadingDropdown({\r\n engine,\r\n activeBlock,\r\n}: {\r\n engine: EditorEngine;\r\n activeBlock: string;\r\n}) {\r\n const [open, setOpen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const run = (command: (e: typeof engine) => boolean) => command(engine);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node))\r\n setOpen(false);\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n const BLOCK_LABELS: Record<string, string> = {\r\n paragraph: \"Paragraph\",\r\n \"heading-1\": \"Heading 1\",\r\n \"heading-2\": \"Heading 2\",\r\n \"heading-3\": \"Heading 3\",\r\n \"heading-4\": \"Heading 4\",\r\n \"heading-5\": \"Heading 5\",\r\n \"heading-6\": \"Heading 6\",\r\n blockquote: \"Quote\",\r\n code_block: \"Code\",\r\n };\r\n const label = BLOCK_LABELS[activeBlock] ?? \"Paragraph\";\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => { e.preventDefault(); setOpen((v) => !v); }}\r\n className=\"flex items-center gap-1 px-2 h-8 rounded text-sm font-medium text-gray-700 hover:bg-gray-100 cursor-pointer\"\r\n >\r\n <span className=\"min-w-[72px] text-left\">{label}</span>\r\n <span className=\"text-xs\">▾</span>\r\n </button>\r\n\r\n {open && <div className=\"absolute top-full left-0 mt-0.5 w-40 bg-white border border-gray-200 rounded shadow-lg z-50\">\r\n {[\r\n {\r\n label: \"Paragraph\",\r\n cmd: setParagraph,\r\n active: activeBlock === \"paragraph\",\r\n },\r\n {\r\n label: \"Heading 1\",\r\n cmd: setHeading(1),\r\n active: activeBlock === \"heading-1\",\r\n },\r\n {\r\n label: \"Heading 2\",\r\n cmd: setHeading(2),\r\n active: activeBlock === \"heading-2\",\r\n },\r\n {\r\n label: \"Heading 3\",\r\n cmd: setHeading(3),\r\n active: activeBlock === \"heading-3\",\r\n },\r\n {\r\n label: \"Heading 4\",\r\n cmd: setHeading(4),\r\n active: activeBlock === \"heading-4\",\r\n },\r\n {\r\n label: \"Heading 5\",\r\n cmd: setHeading(5),\r\n active: activeBlock === \"heading-5\",\r\n },\r\n {\r\n label: \"Heading 6\",\r\n cmd: setHeading(6),\r\n active: activeBlock === \"heading-6\",\r\n },\r\n ].map(({ label, cmd, active }) => (\r\n <button\r\n key={label}\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n run(cmd);\r\n setOpen(false);\r\n }}\r\n className={[\r\n \"w-full text-left px-3 py-1.5 text-sm hover:bg-gray-100 \",\r\n active\r\n ? \"font-semibold text-blue-600 \"\r\n : \"text-gray-700 \",\r\n ].join(\" \")}\r\n >\r\n {label}\r\n </button>\r\n ))}\r\n </div>}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Link Button ──────────────────────────────────────────────────────────────\r\n\r\nfunction LinkButton({\r\n engine,\r\n isActive,\r\n activeHref,\r\n hasTextSelected,\r\n externalOpen,\r\n onExternalClose,\r\n}: {\r\n engine: EditorEngine;\r\n isActive: boolean;\r\n activeHref: string | null;\r\n hasTextSelected: boolean;\r\n /** Ctrl+K from Editor drives this to true */\r\n externalOpen?: boolean;\r\n onExternalClose?: () => void;\r\n}) {\r\n const [open, setOpen] = useState(false);\r\n const [editMode, setEditMode] = useState(false);\r\n const [url, setUrl] = useState(\"\");\r\n const [displayText, setDisplayText] = useState(\"\");\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const urlInputRef = useRef<HTMLInputElement>(null);\r\n const textInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const openPopup = () => {\r\n if (isActive) {\r\n setUrl(activeHref ?? \"\");\r\n setDisplayText(\"\");\r\n setEditMode(true); // editing existing link → straight to edit\r\n } else {\r\n setUrl(\"\");\r\n setDisplayText(\"\");\r\n setEditMode(true); // inserting new link → edit mode\r\n }\r\n setOpen(true);\r\n };\r\n\r\n const closePopup = () => {\r\n setOpen(false);\r\n setEditMode(false);\r\n setUrl(\"\");\r\n setDisplayText(\"\");\r\n onExternalClose?.();\r\n };\r\n\r\n // Ctrl+K external trigger — open popup from keyboard shortcut\r\n useEffect(() => {\r\n if (!externalOpen) return;\r\n const t = setTimeout(() => {\r\n setUrl(isActive ? (activeHref ?? \"\") : \"\");\r\n setDisplayText(\"\");\r\n setEditMode(true);\r\n setOpen(true);\r\n }, 0);\r\n return () => clearTimeout(t);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [externalOpen]);\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n ) {\r\n closePopup();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [open]);\r\n\r\n // Auto-focus URL field whenever edit mode opens\r\n useEffect(() => {\r\n if (open && editMode) {\r\n // Small defer so the popup is in the DOM before focus\r\n setTimeout(() => urlInputRef.current?.focus(), 0);\r\n }\r\n }, [open, editMode]);\r\n\r\n const handleToolbarClick = () => {\r\n if (open) {\r\n closePopup();\r\n return;\r\n }\r\n openPopup();\r\n };\r\n\r\n const handleApply = () => {\r\n const trimmed = url.trim();\r\n if (!trimmed) return;\r\n const href = trimmed;\r\n const text = displayText.trim() || undefined;\r\n insertLink(href, text)(engine);\r\n closePopup();\r\n };\r\n\r\n const handleRemove = () => {\r\n removeLink(engine);\r\n closePopup();\r\n };\r\n\r\n const handleStartEdit = () => {\r\n setUrl(activeHref ?? \"\");\r\n setDisplayText(\"\");\r\n setEditMode(true);\r\n };\r\n\r\n // Show \"Display text\" field only when cursor is collapsed and no text is selected\r\n // (i.e. user is inserting a brand-new link with custom anchor text)\r\n const showTextInput = !hasTextSelected && !isActive;\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n <ToolbarButton\r\n label=\"link\"\r\n title=\"Link (Ctrl+K)\"\r\n onClick={handleToolbarClick}\r\n isActive={isActive || open}\r\n icon={<LinkIcon />}\r\n />\r\n\r\n {open && (\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Link editor\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-xl p-3 w-80\"\r\n >\r\n {/* ── Preview mode: cursor sits on an existing link ── */}\r\n {isActive && !editMode ? (\r\n <>\r\n <p className=\"text-xs font-medium text-gray-400 mb-2 uppercase tracking-wide\">\r\n Link\r\n </p>\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n <a\r\n href={activeHref ?? \"#\"}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"flex-1 text-sm text-blue-600 hover:underline truncate\"\r\n title={activeHref ?? \"\"}\r\n >\r\n {activeHref}\r\n </a>\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleStartEdit();\r\n }}\r\n className=\"shrink-0 text-xs text-gray-500 hover:text-gray-700 px-2 py-1 rounded hover:bg-gray-100 \"\r\n aria-label=\"Edit link\"\r\n >\r\n Edit\r\n </button>\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleRemove();\r\n }}\r\n className=\"shrink-0 text-xs text-red-500 hover:text-red-700 px-2 py-1 rounded hover:bg-red-50 \"\r\n aria-label=\"Remove link\"\r\n >\r\n Remove\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n /* ── Edit / Insert mode ── */\r\n <>\r\n <p className=\"text-xs font-medium text-gray-400 mb-3 uppercase tracking-wide\">\r\n {isActive ? \"Edit link\" : \"Insert link\"}\r\n </p>\r\n\r\n {/* Display text — only shown when inserting at collapsed cursor */}\r\n {showTextInput && (\r\n <div className=\"mb-2\">\r\n <label className=\"block text-xs text-gray-600 mb-1\">\r\n Display text\r\n </label>\r\n <input\r\n ref={textInputRef}\r\n type=\"text\"\r\n value={displayText}\r\n onChange={(e) => setDisplayText(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n urlInputRef.current?.focus();\r\n }\r\n if (e.key === \"Escape\") closePopup();\r\n }}\r\n placeholder=\"Link text\"\r\n className=\"w-full border border-gray-300 rounded px-2 py-1.5 text-sm bg-white text-gray-900 focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* URL field */}\r\n <div className=\"mb-3\">\r\n <label className=\"block text-xs text-gray-600 mb-1\">\r\n URL\r\n </label>\r\n <input\r\n ref={urlInputRef}\r\n type=\"url\"\r\n value={url}\r\n onChange={(e) => setUrl(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n handleApply();\r\n }\r\n if (e.key === \"Escape\") closePopup();\r\n }}\r\n placeholder=\"https://example.com\"\r\n className=\"w-full border border-gray-300 rounded px-2 py-1.5 text-sm bg-white text-gray-900 focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n />\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleApply();\r\n }}\r\n disabled={\r\n !url.trim() ||\r\n (showTextInput &&\r\n !displayText.trim() &&\r\n !hasTextSelected &&\r\n !isActive)\r\n }\r\n className=\"flex-1 px-3 py-1.5 bg-blue-600 text-white text-sm rounded hover:bg-blue-700 disabled:opacity-40 disabled:cursor-not-allowed\"\r\n >\r\n {isActive ? \"Update\" : \"Insert\"}\r\n </button>\r\n {isActive && (\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleRemove();\r\n }}\r\n className=\"px-3 py-1.5 text-sm text-red-600 border border-red-200 rounded hover:bg-red-50 \"\r\n >\r\n Remove\r\n </button>\r\n )}\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n closePopup();\r\n }}\r\n className=\"px-3 py-1.5 text-sm text-gray-500 hover:text-gray-700 \"\r\n aria-label=\"Cancel\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Separator ────────────────────────────────────────────────────────────────\r\n\r\nfunction Divider() {\r\n return (\r\n <div\r\n className=\"w-px h-5 bg-gray-200 mx-0.5\"\r\n aria-hidden=\"true\"\r\n />\r\n );\r\n}\r\n\r\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\r\n\r\nfunction UndoIcon() {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M3.33333 6.66672L2.74417 7.25589L2.155 6.66672L2.74417 6.07756L3.33333 6.66672ZM7.5 16.6667C7.27899 16.6667 7.06702 16.5789 6.91074 16.4226C6.75446 16.2664 6.66667 16.0544 6.66667 15.8334C6.66667 15.6124 6.75446 15.4004 6.91074 15.2441C7.06702 15.0879 7.27899 15.0001 7.5 15.0001V16.6667ZM6.91083 11.4226L2.74417 7.25589L3.9225 6.07756L8.08917 10.2442L6.91083 11.4226ZM2.74417 6.07756L6.91083 1.91089L8.08917 3.08922L3.9225 7.25589L2.74417 6.07756ZM3.33333 5.83339H12.0833V7.50005H3.33333V5.83339ZM12.0833 16.6667H7.5V15.0001H12.0833V16.6667ZM17.5 11.2501C17.5 12.6866 16.9293 14.0644 15.9135 15.0802C14.8977 16.096 13.5199 16.6667 12.0833 16.6667V15.0001C12.5758 15.0001 13.0634 14.9031 13.5184 14.7146C13.9734 14.5261 14.3868 14.2499 14.735 13.9017C15.0832 13.5535 15.3594 13.1401 15.5479 12.6851C15.7363 12.2301 15.8333 11.7425 15.8333 11.2501H17.5ZM12.0833 5.83339C13.5199 5.83339 14.8977 6.40407 15.9135 7.41989C16.9293 8.43572 17.5 9.81347 17.5 11.2501H15.8333C15.8333 10.7576 15.7363 10.27 15.5479 9.81499C15.3594 9.36002 15.0832 8.94662 14.735 8.5984C14.3868 8.25019 13.9734 7.97396 13.5184 7.78551C13.0634 7.59705 12.5758 7.50005 12.0833 7.50005V5.83339Z\"\r\n fill=\"black\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction RedoIcon() {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M16.6667 6.66672L17.2558 7.25589L17.845 6.66672L17.2558 6.07756L16.6667 6.66672ZM12.5 16.6667C12.721 16.6667 12.933 16.5789 13.0893 16.4226C13.2455 16.2664 13.3333 16.0544 13.3333 15.8334C13.3333 15.6124 13.2455 15.4004 13.0893 15.2441C12.933 15.0879 12.721 15.0001 12.5 15.0001V16.6667ZM13.0892 11.4226L17.2558 7.25589L16.0775 6.07756L11.9108 10.2442L13.0892 11.4226ZM17.2558 6.07756L13.0892 1.91089L11.9108 3.08922L16.0775 7.25589L17.2558 6.07756ZM16.6667 5.83339H7.91667V7.50005H16.6667V5.83339ZM7.91667 16.6667H12.5V15.0001H7.91667V16.6667ZM2.5 11.2501C2.5 12.6866 3.07068 14.0644 4.0865 15.0802C5.10233 16.096 6.48008 16.6667 7.91667 16.6667V15.0001C7.42421 15.0001 6.93657 14.9031 6.4816 14.7146C6.02663 14.5261 5.61322 14.2499 5.26501 13.9017C4.9168 13.5535 4.64057 13.1401 4.45211 12.6851C4.26366 12.2301 4.16667 11.7425 4.16667 11.2501H2.5ZM7.91667 5.83339C6.48008 5.83339 5.10233 6.40407 4.0865 7.41989C3.07068 8.43572 2.5 9.81347 2.5 11.2501H4.16667C4.16667 10.7576 4.26366 10.27 4.45211 9.81499C4.64057 9.36002 4.9168 8.94662 5.26501 8.5984C5.61322 8.25019 6.02663 7.97396 6.4816 7.78551C6.93657 7.59705 7.42421 7.50005 7.91667 7.50005V5.83339Z\"\r\n fill=\"black\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CodeIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <polyline\r\n points=\"16 18 22 12 16 6\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <polyline\r\n points=\"8 6 2 12 8 18\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BulletListIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\" strokeLinecap=\"round\" />\r\n <line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\" strokeLinecap=\"round\" />\r\n <line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\" strokeLinecap=\"round\" />\r\n <circle cx=\"4\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\r\n <circle cx=\"4\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\r\n <circle cx=\"4\" cy=\"18\" r=\"1\" fill=\"currentColor\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction OrderedListIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" strokeLinecap=\"round\" />\r\n <line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" strokeLinecap=\"round\" />\r\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" strokeLinecap=\"round\" />\r\n <text\r\n x=\"2\"\r\n y=\"7\"\r\n fontSize=\"7\"\r\n fill=\"currentColor\"\r\n stroke=\"none\"\r\n fontWeight=\"bold\"\r\n >\r\n 1\r\n </text>\r\n <text\r\n x=\"2\"\r\n y=\"13\"\r\n fontSize=\"7\"\r\n fill=\"currentColor\"\r\n stroke=\"none\"\r\n fontWeight=\"bold\"\r\n >\r\n 2\r\n </text>\r\n <text\r\n x=\"2\"\r\n y=\"19\"\r\n fontSize=\"7\"\r\n fill=\"currentColor\"\r\n stroke=\"none\"\r\n fontWeight=\"bold\"\r\n >\r\n 3\r\n </text>\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BlockquoteIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z\" />\r\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z\" />\r\n </svg>\r\n );\r\n}\r\n\r\n\r\nfunction LinkIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path\r\n d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction FindReplaceIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <circle cx=\"10\" cy=\"10\" r=\"6\" />\r\n <line x1=\"14.5\" y1=\"14.5\" x2=\"20\" y2=\"20\" />\r\n <path d=\"M7 10h6\" />\r\n <path d=\"M10 7v6\" />\r\n </svg>\r\n );\r\n}\r\n","/**\n * SearchEngine\n *\n * Pure functions for finding text matches in the document model\n * and applying visual highlights via the CSS Custom Highlight API.\n *\n * CSS Custom Highlight API (Chrome 105+, Firefox 117+, Safari 17.2+)\n * highlights text without modifying the DOM structure, so they survive\n * the DOMRenderer's full re-render cycle.\n */\n\nimport type { Document, EditorNode, TextNode } from '../../types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface SearchMatch {\n path: number[];\n startOffset: number;\n endOffset: number;\n}\n\nexport interface SearchOptions {\n caseSensitive: boolean;\n wholeWord: boolean;\n}\n\n// ─── Match Finding ────────────────────────────────────────────────────────────\n\nexport function findMatches(\n doc: Document,\n query: string,\n opts: SearchOptions,\n): SearchMatch[] {\n if (!query) return [];\n const matches: SearchMatch[] = [];\n walkNode(doc as unknown as { children?: EditorNode[] }, [], query, opts, matches);\n return matches;\n}\n\nfunction walkNode(\n node: { children?: EditorNode[]; type?: string; text?: string },\n path: number[],\n query: string,\n opts: SearchOptions,\n out: SearchMatch[],\n): void {\n if (node.type === 'text') {\n findInText((node as unknown as TextNode).text, path, query, opts, out);\n return;\n }\n const children = node.children;\n if (!children) return;\n for (let i = 0; i < children.length; i++) {\n walkNode(\n children[i] as unknown as { children?: EditorNode[]; type?: string; text?: string },\n [...path, i],\n query,\n opts,\n out,\n );\n }\n}\n\nfunction findInText(\n text: string,\n path: number[],\n query: string,\n opts: SearchOptions,\n out: SearchMatch[],\n): void {\n const haystack = opts.caseSensitive ? text : text.toLowerCase();\n const needle = opts.caseSensitive ? query : query.toLowerCase();\n\n let pos = 0;\n while (pos <= haystack.length - needle.length) {\n const idx = haystack.indexOf(needle, pos);\n if (idx === -1) break;\n\n if (!opts.wholeWord || isWholeWord(text, idx, idx + needle.length)) {\n out.push({ path: [...path], startOffset: idx, endOffset: idx + needle.length });\n }\n pos = idx + needle.length; // non-overlapping\n }\n}\n\nfunction isWholeWord(text: string, start: number, end: number): boolean {\n const w = /\\w/;\n if (start > 0 && w.test(text[start - 1])) return false;\n if (end < text.length && w.test(text[end])) return false;\n return true;\n}\n\n// ─── CSS Custom Highlight API ─────────────────────────────────────────────────\n\nconst HL_ALL = 'editor-search';\nconst HL_CURRENT = 'editor-search-current';\n\nfunction getCSSHighlights(): Map<string, unknown> | null {\n if (typeof CSS === 'undefined') return null;\n return (CSS as unknown as { highlights?: Map<string, unknown> }).highlights ?? null;\n}\n\nfunction getHighlightCtor(): (new (...ranges: Range[]) => unknown) | null {\n if (typeof window === 'undefined') return null;\n return (window as unknown as { Highlight?: new (...ranges: Range[]) => unknown }).Highlight ?? null;\n}\n\nexport function applySearchHighlights(\n container: HTMLElement,\n matches: SearchMatch[],\n currentIndex: number,\n): void {\n const cssHL = getCSSHighlights();\n const Hl = getHighlightCtor();\n if (!cssHL || !Hl) return;\n\n cssHL.delete(HL_ALL);\n cssHL.delete(HL_CURRENT);\n\n if (matches.length === 0) return;\n\n const allRanges: Range[] = [];\n const currentRanges: Range[] = [];\n\n for (let i = 0; i < matches.length; i++) {\n const range = matchToRange(container, matches[i]);\n if (!range) continue;\n (i === currentIndex ? currentRanges : allRanges).push(range);\n }\n\n if (allRanges.length) cssHL.set(HL_ALL, new Hl(...allRanges));\n if (currentRanges.length) cssHL.set(HL_CURRENT, new Hl(...currentRanges));\n}\n\nexport function clearSearchHighlights(): void {\n const cssHL = getCSSHighlights();\n if (!cssHL) return;\n cssHL.delete(HL_ALL);\n cssHL.delete(HL_CURRENT);\n}\n\n// ─── DOM Helpers ──────────────────────────────────────────────────────────────\n\nfunction matchToRange(container: HTMLElement, match: SearchMatch): Range | null {\n const el = container.querySelector(`[data-path='${JSON.stringify(match.path)}']`);\n if (!el) return null;\n\n const textNode = findLeafText(el);\n if (!textNode || match.endOffset > textNode.length) return null;\n\n try {\n const range = document.createRange();\n range.setStart(textNode, match.startOffset);\n range.setEnd(textNode, match.endOffset);\n return range;\n } catch {\n return null;\n }\n}\n\nfunction findLeafText(el: Element): Text | null {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n return walker.nextNode() as Text | null;\n}\n\nexport function scrollMatchIntoView(container: HTMLElement, match: SearchMatch): void {\n const el = container.querySelector(`[data-path='${JSON.stringify(match.path)}']`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n}\n","/**\n * SearchCommands\n *\n * Commands for replacing text matches found by SearchEngine.\n * Processes replacements last-to-first within each text node so that\n * earlier offsets remain valid after each delete/insert pair.\n */\n\nimport type { Command, TextNode, EditorNode } from '../../types';\nimport { createTransaction, tr_setSelection } from '../core/Transaction';\nimport { getNodeAtPath } from '../core/DocumentModel';\nimport { makePosition, makeCollapsedSelection } from '../selection/SelectionEngine';\nimport type { SearchMatch } from './SearchEngine';\n\n// ─── Replace Single Match ─────────────────────────────────────────────────────\n\nexport function replaceMatch(match: SearchMatch, replacement: string): Command {\n return (engine) => {\n const state = engine.getState();\n const node = getNodeAtPath(state.doc, match.path) as EditorNode | null;\n if (!node || node.type !== 'text') return false;\n\n const textNode = node as TextNode;\n const marks = textNode.marks;\n const tr = createTransaction();\n\n // When the match spans the entire text node, deleteTextAtPath removes the\n // node entirely (newText === ''). A subsequent insert_text at the same\n // path would find nothing and silently drop the replacement. Use\n // insert_node at the parent block's index instead so the replacement lands\n // at exactly the right position regardless of sibling count.\n const wholeNode =\n match.startOffset === 0 && match.endOffset === textNode.text.length;\n\n tr.steps.push({ type: 'delete_text', path: match.path, from: match.startOffset, to: match.endOffset });\n\n if (replacement) {\n if (wholeNode) {\n tr.steps.push({\n type: 'insert_node',\n parentPath: match.path.slice(0, -1),\n index: match.path[match.path.length - 1],\n node: { type: 'text', text: replacement, marks } as TextNode,\n });\n } else {\n tr.steps.push({ type: 'insert_text', path: match.path, offset: match.startOffset, text: replacement, marks });\n }\n }\n\n tr.steps.push(tr_setSelection(\n makeCollapsedSelection(makePosition(match.path, match.startOffset + replacement.length)),\n ));\n\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Replace All Matches ──────────────────────────────────────────────────────\n\nexport function replaceAllMatches(matches: SearchMatch[], replacement: string): Command {\n return (engine) => {\n if (matches.length === 0) return false;\n\n const state = engine.getState();\n const tr = createTransaction();\n\n // Reverse so we process last-to-first — earlier offsets stay valid\n // even after each delete/insert modifies the text node length.\n const reversed = [...matches].reverse();\n\n for (const match of reversed) {\n const node = getNodeAtPath(state.doc, match.path) as EditorNode | null;\n if (!node || node.type !== 'text') continue;\n\n const textNode = node as TextNode;\n const marks = textNode.marks;\n const wholeNode =\n match.startOffset === 0 && match.endOffset === textNode.text.length;\n\n tr.steps.push({ type: 'delete_text', path: match.path, from: match.startOffset, to: match.endOffset });\n\n if (replacement) {\n if (wholeNode) {\n tr.steps.push({\n type: 'insert_node',\n parentPath: match.path.slice(0, -1),\n index: match.path[match.path.length - 1],\n node: { type: 'text', text: replacement, marks } as TextNode,\n });\n } else {\n tr.steps.push({ type: 'insert_text', path: match.path, offset: match.startOffset, text: replacement, marks });\n }\n }\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n","'use client';\n\nimport React, {\n useState,\n useMemo,\n useEffect,\n useRef,\n useCallback,\n} from 'react';\nimport type { EditorEngine } from '../editor/core/EditorEngine';\nimport { useEditorState } from '../hooks/useEditorState';\nimport {\n findMatches,\n applySearchHighlights,\n clearSearchHighlights,\n scrollMatchIntoView,\n} from '../editor/search/SearchEngine';\nimport { replaceMatch, replaceAllMatches } from '../editor/search/SearchCommands';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface FindReplaceModalProps {\n engine: EditorEngine;\n editorContainer: React.RefObject<HTMLDivElement | null>;\n initialMode: 'find' | 'replace';\n onClose: () => void;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function FindReplaceModal({\n engine,\n editorContainer,\n initialMode,\n onClose,\n}: FindReplaceModalProps) {\n const state = useEditorState(engine);\n\n const [query, setQuery] = useState('');\n const [replacement, setReplacement] = useState('');\n const [caseSensitive, setCaseSensitive] = useState(false);\n const [wholeWord, setWholeWord] = useState(false);\n const [showAdvanced, setShowAdvanced] = useState(false);\n const [currentIndex, setCurrentIndex] = useState(0);\n const [mode, setMode] = useState<'find' | 'replace'>(initialMode);\n\n const findInputRef = useRef<HTMLInputElement>(null);\n const replaceInputRef = useRef<HTMLInputElement>(null);\n\n // ── Compute matches whenever doc / query / options change ──────────────────\n\n const matches = useMemo(\n () => findMatches(state.doc, query, { caseSensitive, wholeWord }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [state.doc, query, caseSensitive, wholeWord],\n );\n\n // Safe index — clamps to valid range without needing an extra state update\n const safeIndex = matches.length > 0 ? Math.min(currentIndex, matches.length - 1) : 0;\n\n // Reset index to 0 when matches drop to zero (e.g. after Replace All)\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n if (matches.length === 0) setCurrentIndex(0);\n }, [matches.length]);\n\n // ── Apply CSS Custom Highlights after each render ──────────────────────────\n // useEffect (not useLayoutEffect) so it runs AFTER Editor's useLayoutEffect\n // has already rebuilt the DOM, avoiding highlight flicker.\n\n useEffect(() => {\n const container = editorContainer.current;\n if (!container) return;\n applySearchHighlights(container, matches, safeIndex);\n return () => clearSearchHighlights();\n }, [matches, safeIndex, editorContainer]);\n\n // ── Scroll current match into view ─────────────────────────────────────────\n\n useEffect(() => {\n const container = editorContainer.current;\n if (!container || matches.length === 0) return;\n scrollMatchIntoView(container, matches[safeIndex]);\n }, [safeIndex, matches, editorContainer]);\n\n // ── Auto-focus the find input on mount ────────────────────────────────────\n\n useEffect(() => {\n findInputRef.current?.focus();\n findInputRef.current?.select();\n }, []);\n\n // ── Global keyboard shortcuts ─────────────────────────────────────────────\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n handleClose();\n return;\n }\n // Ctrl/Cmd+F refocuses the find input\n if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n e.preventDefault();\n setMode('find');\n findInputRef.current?.focus();\n findInputRef.current?.select();\n return;\n }\n // Ctrl/Cmd+H switches to replace mode\n if ((e.ctrlKey || e.metaKey) && e.key === 'h') {\n e.preventDefault();\n setMode('replace');\n replaceInputRef.current?.focus();\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ── Navigation ────────────────────────────────────────────────────────────\n\n const navigateNext = useCallback(() => {\n if (matches.length === 0) return;\n setCurrentIndex((i) => (i + 1) % matches.length);\n }, [matches.length]);\n\n const navigatePrev = useCallback(() => {\n if (matches.length === 0) return;\n setCurrentIndex((i) => (i - 1 + matches.length) % matches.length);\n }, [matches.length]);\n\n // ── Replace ───────────────────────────────────────────────────────────────\n\n function handleReplace() {\n if (matches.length === 0) return;\n replaceMatch(matches[safeIndex], replacement)(engine);\n // After state update, matches recompute; safeIndex naturally points to next match\n }\n\n function handleReplaceAll() {\n if (matches.length === 0) return;\n replaceAllMatches(matches, replacement)(engine);\n }\n\n // ── Close ─────────────────────────────────────────────────────────────────\n\n function handleClose() {\n clearSearchHighlights();\n onClose();\n }\n\n // ── Helpers ───────────────────────────────────────────────────────────────\n\n const hasQuery = query.length > 0;\n const noResults = hasQuery && matches.length === 0;\n const countLabel = hasQuery && matches.length > 0\n ? `${safeIndex + 1} / ${matches.length}`\n : null;\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Find and replace\"\n aria-modal=\"false\"\n className=\"absolute top-12 right-64 z-50 w-96 bg-white border border-gray-200 rounded-xl shadow-2xl\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* ── Header ── */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-100 \">\n <div className=\"flex items-center gap-2\">\n <SearchIcon />\n <span className=\"text-sm font-semibold text-gray-800 \">\n Find and replace\n </span>\n </div>\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={handleClose}\n className=\"p-1 rounded text-gray-400 hover:text-gray-600 hover:bg-gray-100 transition-colors\"\n >\n <XIcon />\n </button>\n </div>\n\n <div className=\"p-4 space-y-3\">\n {/* ── Find input ── */}\n <div className=\"flex items-center gap-2\">\n <div className=\"relative flex-1\">\n <input\n ref={findInputRef}\n type=\"text\"\n value={query}\n onChange={(e) => { setQuery(e.target.value); setCurrentIndex(0); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); e.shiftKey ? navigatePrev() : navigateNext(); }\n }}\n placeholder=\"Find in text…\"\n aria-label=\"Find\"\n className={[\n 'w-full px-3 py-2 text-sm rounded-lg border bg-white ',\n 'text-gray-900 placeholder-gray-400',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent',\n noResults\n ? 'border-red-300 bg-red-50 '\n : 'border-gray-300 ',\n ].join(' ')}\n />\n {/* No results indicator */}\n {noResults && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 text-xs text-red-400 pointer-events-none\">\n Not found\n </span>\n )}\n </div>\n\n {/* Prev / Next / Count */}\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n type=\"button\"\n title=\"Previous (Shift+Enter)\"\n onClick={navigatePrev}\n disabled={matches.length === 0}\n className=\"p-1.5 rounded text-gray-500 hover:bg-gray-100 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\n >\n <ChevronUpIcon />\n </button>\n <button\n type=\"button\"\n title=\"Next (Enter)\"\n onClick={navigateNext}\n disabled={matches.length === 0}\n className=\"p-1.5 rounded text-gray-500 hover:bg-gray-100 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\n >\n <ChevronDownIcon />\n </button>\n {countLabel && (\n <span className=\"text-xs text-gray-500 min-w-[44px] text-center tabular-nums\">\n {countLabel}\n </span>\n )}\n </div>\n </div>\n\n {/* ── Replace input ── */}\n <input\n ref={replaceInputRef}\n type=\"text\"\n value={replacement}\n onChange={(e) => setReplacement(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); handleReplace(); }\n }}\n placeholder=\"Replace with…\"\n aria-label=\"Replace with\"\n className=\"w-full px-3 py-2 text-sm rounded-lg border border-gray-300 bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n\n {/* ── Advanced options ── */}\n <div>\n <button\n type=\"button\"\n onClick={() => setShowAdvanced((p) => !p)}\n className=\"flex items-center gap-1.5 text-xs text-gray-500 hover:text-gray-700 transition-colors\"\n >\n <span className={`transition-transform ${showAdvanced ? 'rotate-90' : ''}`}>▶</span>\n <span>Advanced options</span>\n </button>\n\n {showAdvanced && (\n <div className=\"mt-2.5 flex items-center gap-5\">\n <label className=\"flex items-center gap-1.5 text-sm text-gray-600 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={caseSensitive}\n onChange={(e) => { setCaseSensitive(e.target.checked); setCurrentIndex(0); }}\n className=\"w-3.5 h-3.5 accent-blue-600\"\n />\n Match case\n </label>\n <label className=\"flex items-center gap-1.5 text-sm text-gray-600 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={wholeWord}\n onChange={(e) => { setWholeWord(e.target.checked); setCurrentIndex(0); }}\n className=\"w-3.5 h-3.5 accent-blue-600\"\n />\n Whole words\n </label>\n </div>\n )}\n </div>\n </div>\n\n {/* ── Action buttons ── */}\n <div className=\"flex items-center justify-end gap-2 px-4 py-3 border-t border-gray-100 bg-gray-50 rounded-b-xl\">\n <button\n type=\"button\"\n onClick={handleReplaceAll}\n disabled={matches.length === 0}\n className=\"px-3 py-1.5 text-sm rounded-lg border border-gray-300 text-gray-700 hover:bg-gray-100 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n >\n Replace all\n </button>\n <button\n type=\"button\"\n onClick={handleReplace}\n disabled={matches.length === 0}\n className=\"px-3 py-1.5 text-sm rounded-lg border border-gray-300 text-gray-700 hover:bg-gray-100 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n >\n Replace\n </button>\n <button\n type=\"button\"\n onClick={navigateNext}\n disabled={matches.length === 0}\n className=\"px-3 py-1.5 text-sm rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-medium disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n >\n Find\n </button>\n </div>\n </div>\n );\n}\n\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\n\nfunction SearchIcon() {\n return (\n <svg className=\"w-4 h-4 text-gray-500 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction XIcon() {\n return (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction ChevronUpIcon() {\n return (\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n );\n}\n\nfunction ChevronDownIcon() {\n return (\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n","'use client';\n\n/**\n * TableContextMenu\n *\n * Right-click context menu for table operations. Rendered as a portal so it\n * floats above the editor canvas. Closes on outside click, Escape, or scroll.\n *\n * Props:\n * x, y – screen position (from contextmenu event)\n * tablePath – path to the table node\n * row, col – cell that was right-clicked\n * isMerged – true when the clicked cell has colspan/rowspan > 1\n * hasTableSelection – true when multiple cells are selected (enables Merge)\n * engine – editor engine\n * tableSelection – current cell selection (for Merge Cells)\n * onClose – called when the menu should dismiss\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport type { EditorEngine } from '../editor/core/EditorEngine';\nimport {\n addRowAbove,\n addRowBelow,\n deleteRow,\n addColumnLeft,\n addColumnRight,\n deleteColumn,\n mergeCells,\n splitCell,\n deleteTable,\n} from '../editor/table/TableCommands';\n\nexport interface TableContextMenuProps {\n x: number;\n y: number;\n tablePath: number[];\n row: number;\n col: number;\n isMerged: boolean;\n tableSelection: {\n tablePath: number[];\n anchorCell: [number, number];\n focusCell: [number, number];\n } | null;\n engine: EditorEngine;\n onClose: () => void;\n}\n\nexport function TableContextMenu({\n x,\n y,\n tablePath,\n row: _row,\n col: _col,\n isMerged,\n tableSelection,\n engine,\n onClose,\n}: TableContextMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click / scroll / Escape\n useEffect(() => {\n const handleDown = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) onClose();\n };\n const handleKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n const handleScroll = () => onClose();\n\n document.addEventListener('mousedown', handleDown);\n document.addEventListener('keydown', handleKey);\n document.addEventListener('scroll', handleScroll, true);\n return () => {\n document.removeEventListener('mousedown', handleDown);\n document.removeEventListener('keydown', handleKey);\n document.removeEventListener('scroll', handleScroll, true);\n };\n }, [onClose]);\n\n // Clamp menu position to stay within viewport\n const menuStyle: React.CSSProperties = {\n position: 'fixed',\n left: Math.min(x, window.innerWidth - 220),\n top: Math.min(y, window.innerHeight - 350),\n zIndex: 9999,\n };\n\n const run = (cmd: (e: typeof engine) => boolean) => {\n cmd(engine);\n onClose();\n };\n\n const hasMultiCellSelection =\n tableSelection !== null &&\n (tableSelection.anchorCell[0] !== tableSelection.focusCell[0] ||\n tableSelection.anchorCell[1] !== tableSelection.focusCell[1]);\n\n return (\n <div\n ref={menuRef}\n role=\"menu\"\n aria-label=\"Table options\"\n style={menuStyle}\n className=\"min-w-[200px] rounded-lg border border-gray-200 bg-white py-1 shadow-xl \"\n >\n <MenuSection label=\"Row\">\n <MenuItem onClick={() => run(addRowAbove)}>Insert row above</MenuItem>\n <MenuItem onClick={() => run(addRowBelow)}>Insert row below</MenuItem>\n <MenuItem onClick={() => run(deleteRow)} danger>Delete row</MenuItem>\n </MenuSection>\n\n <Divider />\n\n <MenuSection label=\"Column\">\n <MenuItem onClick={() => run(addColumnLeft)}>Insert column left</MenuItem>\n <MenuItem onClick={() => run(addColumnRight)}>Insert column right</MenuItem>\n <MenuItem onClick={() => run(deleteColumn)} danger>Delete column</MenuItem>\n </MenuSection>\n\n <Divider />\n\n <MenuSection label=\"Cell\">\n {hasMultiCellSelection && tableSelection && (\n <MenuItem onClick={() => run(mergeCells(tableSelection))}>\n Merge cells\n </MenuItem>\n )}\n {isMerged && (\n <MenuItem onClick={() => run(splitCell)}>Split cell</MenuItem>\n )}\n {!hasMultiCellSelection && !isMerged && (\n <MenuItem disabled>Merge cells (select multiple)</MenuItem>\n )}\n </MenuSection>\n\n <Divider />\n\n <MenuItem onClick={() => run(deleteTable)} danger>\n Delete table\n </MenuItem>\n </div>\n );\n}\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nfunction MenuSection({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div>\n <p className=\"px-3 py-1 text-[10px] font-semibold uppercase tracking-wider text-gray-400 \">\n {label}\n </p>\n {children}\n </div>\n );\n}\n\nfunction Divider() {\n return <hr className=\"my-1 border-gray-100 \" />;\n}\n\ninterface MenuItemProps {\n onClick?: () => void;\n danger?: boolean;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nfunction MenuItem({ onClick, danger, disabled, children }: MenuItemProps) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={disabled}\n onClick={disabled ? undefined : onClick}\n className={[\n 'flex w-full items-center px-3 py-1.5 text-sm',\n disabled\n ? 'cursor-default text-gray-300 '\n : danger\n ? 'cursor-pointer text-red-600 hover:bg-red-50 '\n : 'cursor-pointer text-gray-700 hover:bg-gray-100 ',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n","'use client';\n\nimport React, { useLayoutEffect, useRef } from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport {\n addRowAbove,\n addRowBelow,\n deleteRow,\n addColumnLeft,\n addColumnRight,\n deleteColumn,\n mergeCells,\n splitCell,\n deleteTable,\n toggleHeaderRow,\n} from '../../editor/table/TableCommands';\nimport { getNodeAtPath } from '../../editor/core/DocumentModel';\nimport type { BlockNode } from '../../types';\n\ninterface TableToolbarProps {\n engine: EditorEngine;\n tablePath: number[];\n cellPos: { row: number; col: number };\n tableSelection: {\n tablePath: number[];\n anchorCell: [number, number];\n focusCell: [number, number];\n } | null;\n editorContainer: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function TableToolbar({\n engine,\n tablePath,\n cellPos,\n tableSelection,\n editorContainer,\n}: TableToolbarProps) {\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = editorContainer.current;\n const toolbar = toolbarRef.current;\n if (!container || !toolbar) return;\n const tableWrapper = container.querySelector(\n `[data-block-path=\"${JSON.stringify(tablePath)}\"]`,\n ) as HTMLElement | null;\n if (!tableWrapper) return;\n const rect = tableWrapper.getBoundingClientRect();\n const toolbarH = toolbar.offsetHeight || 36;\n const top = Math.max(4, rect.top - toolbarH - 6);\n toolbar.style.top = `${top}px`;\n toolbar.style.left = `${rect.left}px`;\n toolbar.style.visibility = 'visible';\n });\n\n const run = (cmd: (e: typeof engine) => boolean) => {\n cmd(engine);\n };\n\n const hasMultiCellSelection =\n tableSelection !== null &&\n tableSelection.tablePath.join(',') === tablePath.join(',') &&\n (tableSelection.anchorCell[0] !== tableSelection.focusCell[0] ||\n tableSelection.anchorCell[1] !== tableSelection.focusCell[1]);\n\n const state = engine.getState();\n const cellNode = getNodeAtPath(state.doc, [...tablePath, cellPos.row, cellPos.col]) as BlockNode | null;\n const isMerged =\n !!cellNode &&\n (((cellNode.attrs?.colspan as number) ?? 1) > 1 ||\n ((cellNode.attrs?.rowspan as number) ?? 1) > 1);\n\n const tableNode = getNodeAtPath(state.doc, tablePath) as BlockNode | null;\n const hasHeaderRow = !!tableNode && (tableNode.children[0] as BlockNode)?.children?.some(\n (c) => (c as BlockNode).type === 'table_header',\n );\n\n return (\n <div\n ref={toolbarRef}\n style={{ position: 'fixed', visibility: 'hidden', zIndex: 9000 }}\n onMouseDown={(e) => e.preventDefault()}\n className=\"flex items-center gap-px rounded-md border border-gray-200 bg-white px-1 py-0.5 shadow-lg \"\n >\n {/* Header row toggle */}\n <Btn\n title=\"Toggle header row\"\n active={hasHeaderRow}\n onClick={() => run(toggleHeaderRow(tablePath))}\n >\n <HeaderRowIcon />\n </Btn>\n <Sep />\n\n {/* Row ops */}\n <Btn title=\"Insert row above\" onClick={() => run(addRowAbove)}>\n <RowAboveIcon />\n </Btn>\n <Btn title=\"Insert row below\" onClick={() => run(addRowBelow)}>\n <RowBelowIcon />\n </Btn>\n <Btn title=\"Delete row\" onClick={() => run(deleteRow)} danger>\n <DeleteRowIcon />\n </Btn>\n <Sep />\n\n {/* Column ops */}\n <Btn title=\"Insert column left\" onClick={() => run(addColumnLeft)}>\n <ColLeftIcon />\n </Btn>\n <Btn title=\"Insert column right\" onClick={() => run(addColumnRight)}>\n <ColRightIcon />\n </Btn>\n <Btn title=\"Delete column\" onClick={() => run(deleteColumn)} danger>\n <DeleteColIcon />\n </Btn>\n\n {/* Merge / split */}\n {(hasMultiCellSelection || isMerged) && <Sep />}\n {hasMultiCellSelection && tableSelection && (\n <Btn title=\"Merge cells\" onClick={() => run(mergeCells(tableSelection))}>\n <MergeIcon />\n </Btn>\n )}\n {isMerged && (\n <Btn title=\"Split cell\" onClick={() => run(splitCell)}>\n <SplitIcon />\n </Btn>\n )}\n\n <Sep />\n <Btn title=\"Delete table\" onClick={() => run(deleteTable)} danger>\n <DeleteTableIcon />\n </Btn>\n </div>\n );\n}\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nfunction Btn({\n title,\n onClick,\n active,\n danger,\n children,\n}: {\n title: string;\n onClick: () => void;\n active?: boolean;\n danger?: boolean;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n title={title}\n onMouseDown={(e) => { e.preventDefault(); onClick(); }}\n className={[\n 'flex h-7 w-7 items-center justify-center rounded transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\n danger\n ? 'text-red-500 hover:bg-red-50 '\n : active\n ? 'bg-blue-100 text-blue-700 '\n : 'text-gray-600 hover:bg-gray-100 ',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nfunction Sep() {\n return <div className=\"mx-0.5 h-5 w-px bg-gray-200 \" />;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nfunction HeaderRowIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" />\n <line x1=\"1\" y1=\"6\" x2=\"15\" y2=\"6\" />\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"5\" rx=\"1.5\" fill=\"currentColor\" opacity=\"0.18\" stroke=\"none\" />\n </svg>\n );\n}\n\nfunction RowAboveIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"7\" width=\"14\" height=\"8\" rx=\"1\" />\n <line x1=\"5\" y1=\"7\" x2=\"5\" y2=\"15\" />\n <line x1=\"10\" y1=\"7\" x2=\"10\" y2=\"15\" />\n <line x1=\"8\" y1=\"1\" x2=\"8\" y2=\"6\" />\n <polyline points=\"5 3 8 1 11 3\" />\n </svg>\n );\n}\n\nfunction RowBelowIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"8\" rx=\"1\" />\n <line x1=\"5\" y1=\"1\" x2=\"5\" y2=\"9\" />\n <line x1=\"10\" y1=\"1\" x2=\"10\" y2=\"9\" />\n <line x1=\"8\" y1=\"10\" x2=\"8\" y2=\"15\" />\n <polyline points=\"5 13 8 15 11 13\" />\n </svg>\n );\n}\n\nfunction DeleteRowIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"4\" width=\"14\" height=\"8\" rx=\"1\" />\n <line x1=\"5\" y1=\"4\" x2=\"5\" y2=\"12\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"12\" />\n <line x1=\"6\" y1=\"8\" x2=\"10\" y2=\"8\" />\n </svg>\n );\n}\n\nfunction ColLeftIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"7\" y=\"1\" width=\"8\" height=\"14\" rx=\"1\" />\n <line x1=\"7\" y1=\"5\" x2=\"15\" y2=\"5\" />\n <line x1=\"7\" y1=\"10\" x2=\"15\" y2=\"10\" />\n <line x1=\"1\" y1=\"8\" x2=\"6\" y2=\"8\" />\n <polyline points=\"3 5 1 8 3 11\" />\n </svg>\n );\n}\n\nfunction ColRightIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"14\" rx=\"1\" />\n <line x1=\"1\" y1=\"5\" x2=\"9\" y2=\"5\" />\n <line x1=\"1\" y1=\"10\" x2=\"9\" y2=\"10\" />\n <line x1=\"10\" y1=\"8\" x2=\"15\" y2=\"8\" />\n <polyline points=\"13 5 15 8 13 11\" />\n </svg>\n );\n}\n\nfunction DeleteColIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"4\" y=\"1\" width=\"8\" height=\"14\" rx=\"1\" />\n <line x1=\"4\" y1=\"5\" x2=\"12\" y2=\"5\" />\n <line x1=\"4\" y1=\"10\" x2=\"12\" y2=\"10\" />\n <line x1=\"8\" y1=\"5\" x2=\"8\" y2=\"10\" />\n </svg>\n );\n}\n\nfunction MergeIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" />\n <line x1=\"8\" y1=\"1\" x2=\"8\" y2=\"15\" />\n <line x1=\"1\" y1=\"8\" x2=\"15\" y2=\"8\" />\n <polyline points=\"5 5 8 8 11 5\" />\n <polyline points=\"5 11 8 8 11 11\" />\n </svg>\n );\n}\n\nfunction SplitIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" />\n <line x1=\"8\" y1=\"1\" x2=\"8\" y2=\"15\" />\n <line x1=\"1\" y1=\"8\" x2=\"15\" y2=\"8\" />\n <polyline points=\"5 6 8 3 11 6\" />\n <polyline points=\"5 10 8 13 11 10\" />\n </svg>\n );\n}\n\nfunction DeleteTableIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" />\n <line x1=\"5\" y1=\"5\" x2=\"11\" y2=\"11\" />\n <line x1=\"11\" y1=\"5\" x2=\"5\" y2=\"11\" />\n </svg>\n );\n}\n","'use client';\n\nimport React, { useLayoutEffect, useRef, useState } from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { setImageAttr, deleteImageAtPath } from '../../editor/commands';\n\ninterface ImageToolbarProps {\n engine: EditorEngine;\n imagePath: number[];\n editorContainer: React.RefObject<HTMLDivElement | null>;\n onClose: () => void;\n}\n\nexport function ImageToolbar({ engine, imagePath, editorContainer, onClose }: ImageToolbarProps) {\n const toolbarRef = useRef<HTMLDivElement>(null);\n const [captionOpen, setCaptionOpen] = useState(false);\n const [captionInput, setCaptionInput] = useState('');\n\n const state = engine.getState();\n const imageNode = (() => {\n let node: unknown = state.doc;\n for (const idx of imagePath) {\n node = (node as { children: unknown[] }).children?.[idx];\n if (!node) return null;\n }\n return node as { attrs: Record<string, unknown> };\n })();\n\n const currentAlign = (imageNode?.attrs?.align as string) ?? 'none';\n const hasCaption = imageNode?.attrs?.caption !== undefined;\n\n useLayoutEffect(() => {\n const container = editorContainer.current;\n const toolbar = toolbarRef.current;\n if (!container || !toolbar) return;\n\n const fig = container.querySelector(\n `[data-image-path=\"${JSON.stringify(imagePath)}\"]`,\n ) as HTMLElement | null;\n if (!fig) return;\n\n const rect = fig.getBoundingClientRect();\n const toolbarH = toolbar.offsetHeight || 36;\n const top = Math.max(4, rect.top - toolbarH - 6);\n toolbar.style.top = `${top}px`;\n toolbar.style.left = `${rect.left}px`;\n toolbar.style.minWidth = `${rect.width}px`;\n toolbar.style.visibility = 'visible';\n });\n\n const run = (attrs: Record<string, unknown>) => {\n setImageAttr(imagePath, attrs)(engine);\n };\n\n const handleDelete = () => {\n deleteImageAtPath(imagePath)(engine);\n onClose();\n };\n\n const commitCaption = () => {\n run({ caption: captionInput });\n setCaptionOpen(false);\n };\n\n const removeCaption = () => {\n // Remove caption attr by setting undefined — spread will drop it\n const s = engine.getState();\n let node: unknown = s.doc;\n for (const idx of imagePath) {\n node = (node as { children: unknown[] }).children?.[idx];\n }\n if (!node) return;\n const n = node as { type: string; attrs: Record<string, unknown>; children: unknown[] };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { caption: _caption, ...restAttrs } = n.attrs;\n const tr = { steps: [\n { type: 'delete_node' as const, path: imagePath },\n { type: 'insert_node' as const, parentPath: imagePath.slice(0, -1), index: imagePath[imagePath.length - 1], node: { ...n, attrs: restAttrs } },\n ], meta: {} };\n engine.dispatch(tr as Parameters<typeof engine.dispatch>[0]);\n setCaptionOpen(false);\n };\n\n return (\n <>\n <div\n ref={toolbarRef}\n style={{ position: 'fixed', visibility: 'hidden', zIndex: 9100 }}\n onMouseDown={(e) => e.preventDefault()}\n className=\"flex items-center gap-px rounded-md border border-gray-200 bg-white px-1 py-0.5 shadow-lg \"\n >\n {/* Alignment */}\n <Btn title=\"Align left\" active={currentAlign === 'left'} onClick={() => run({ align: 'left' })}> <AlignLeftIcon /> </Btn>\n <Btn title=\"Align center\" active={currentAlign === 'center'} onClick={() => run({ align: 'center' })}> <AlignCenterIcon /> </Btn>\n <Btn title=\"Align right\" active={currentAlign === 'right'} onClick={() => run({ align: 'right' })}> <AlignRightIcon /> </Btn>\n\n <Sep />\n\n {/* Caption */}\n <Btn\n title={hasCaption ? 'Edit caption' : 'Add caption'}\n active={hasCaption}\n onClick={() => {\n setCaptionInput((imageNode?.attrs?.caption as string) ?? '');\n setCaptionOpen((v) => !v);\n }}\n >\n <CaptionIcon />\n </Btn>\n\n <Sep />\n\n {/* Delete */}\n <Btn title=\"Delete image\" danger onClick={handleDelete}>\n <DeleteIcon />\n </Btn>\n </div>\n\n {/* Caption editor popover */}\n {captionOpen && (\n <CaptionPopover\n value={captionInput}\n hasCaption={hasCaption}\n onChange={setCaptionInput}\n onCommit={commitCaption}\n onRemove={removeCaption}\n onCancel={() => setCaptionOpen(false)}\n imagePath={imagePath}\n editorContainer={editorContainer}\n />\n )}\n </>\n );\n}\n\n// ─── Caption popover ──────────────────────────────────────────────────────────\n\nfunction CaptionPopover({\n value, hasCaption, onChange, onCommit, onRemove, onCancel, imagePath, editorContainer,\n}: {\n value: string;\n hasCaption: boolean;\n onChange: (v: string) => void;\n onCommit: () => void;\n onRemove: () => void;\n onCancel: () => void;\n imagePath: number[];\n editorContainer: React.RefObject<HTMLDivElement | null>;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = editorContainer.current;\n const el = ref.current;\n if (!container || !el) return;\n const fig = container.querySelector(\n `[data-image-path=\"${JSON.stringify(imagePath)}\"]`,\n ) as HTMLElement | null;\n if (!fig) return;\n const rect = fig.getBoundingClientRect();\n el.style.top = `${rect.bottom + 6}px`;\n el.style.left = `${rect.left}px`;\n el.style.visibility = 'visible';\n });\n\n return (\n <div\n ref={ref}\n style={{ position: 'fixed', visibility: 'hidden', zIndex: 9200 }}\n onMouseDown={(e) => e.stopPropagation()}\n className=\"w-64 rounded-lg border border-gray-200 bg-white p-3 shadow-xl \"\n >\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5\">\n Image caption\n </p>\n <input\n autoFocus\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') onCommit(); if (e.key === 'Escape') onCancel(); }}\n placeholder=\"Enter caption…\"\n className=\"w-full px-2.5 py-1.5 text-xs rounded border outline-none\n border-gray-300 \n bg-white text-gray-900 \n focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n <div className=\"flex justify-between mt-2\">\n <div>\n {hasCaption && (\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"text-xs text-red-500 hover:text-red-600\"\n >\n Remove\n </button>\n )}\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"text-xs text-gray-500 hover:text-gray-700 \"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={onCommit}\n className=\"px-2.5 py-1 text-xs bg-blue-600 text-white rounded hover:bg-blue-700\"\n >\n Save\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nfunction Btn({\n title, onClick, active, danger, children,\n}: {\n title: string; onClick: () => void; active?: boolean; danger?: boolean; children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n title={title}\n onMouseDown={(e) => { e.preventDefault(); onClick(); }}\n className={[\n 'flex h-7 w-7 items-center justify-center rounded transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\n danger\n ? 'text-red-500 hover:bg-red-50 '\n : active\n ? 'bg-blue-100 text-blue-700 '\n : 'text-gray-600 hover:bg-gray-100 ',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nfunction Sep() {\n return <div className=\"mx-0.5 h-5 w-px bg-gray-200 \" />;\n}\n\nfunction AlignLeftIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\"/><line x1=\"2\" y1=\"8\" x2=\"10\" y2=\"8\"/><line x1=\"2\" y1=\"12\" x2=\"12\" y2=\"12\"/>\n </svg>\n );\n}\n\nfunction AlignCenterIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\"/><line x1=\"4\" y1=\"8\" x2=\"12\" y2=\"8\"/><line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\"/>\n </svg>\n );\n}\n\nfunction AlignRightIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\"/><line x1=\"6\" y1=\"8\" x2=\"14\" y2=\"8\"/><line x1=\"4\" y1=\"12\" x2=\"14\" y2=\"12\"/>\n </svg>\n );\n}\n\nfunction CaptionIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"2\" width=\"14\" height=\"9\" rx=\"1.5\"/>\n <line x1=\"4\" y1=\"14\" x2=\"12\" y2=\"14\"/>\n </svg>\n );\n}\n\nfunction DeleteIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"2 4 4 4 14 4\"/><path d=\"M5 4V3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1\"/><path d=\"M6 7v5m4-5v5\"/><rect x=\"3\" y=\"4\" width=\"10\" height=\"10\" rx=\"1\"/>\n </svg>\n );\n}\n","/**\n * JSONSerializer\n *\n * Converts the document model to/from a JSON representation.\n * The JSON format IS the model — this serializer is essentially\n * a thin validation + round-trip layer.\n *\n * Use case: persist editor content to a database, load it back.\n */\n\nimport type { Document, Serializer } from '../../types';\nimport { createEmptyDocument } from '../core/DocumentModel';\n\nexport const jsonSerializer: Serializer<string> = {\n serialize(doc: Document): string {\n return JSON.stringify(doc, null, 2);\n },\n\n deserialize(json: string): Document {\n try {\n const parsed = JSON.parse(json);\n if (parsed?.type !== 'doc' || !Array.isArray(parsed?.children)) {\n console.warn('[JSONSerializer] Invalid document JSON, returning empty doc');\n return createEmptyDocument();\n }\n return parsed as Document;\n } catch {\n console.warn('[JSONSerializer] Failed to parse JSON');\n return createEmptyDocument();\n }\n },\n};\n","'use client';\r\n\r\nimport React, {\r\n useRef,\r\n useEffect,\r\n useLayoutEffect,\r\n useCallback,\r\n useState,\r\n} from 'react';\r\n\r\nimport type { EditorEngine } from '../editor/core/EditorEngine';\r\nimport type { EditorState } from '../types';\r\n\r\nimport { useEditorState } from '../hooks/useEditorState';\r\n\r\nimport { renderDocument } from '../editor/rendering/DOMRenderer';\r\n\r\nimport {\r\n captureSelection,\r\n restoreSelection,\r\n isSelectionInContainer,\r\n makeCollapsedSelection,\r\n} from '../editor/selection/SelectionEngine';\r\n\r\nimport { attachClipboardHandlers } from '../editor/plugins/PastePlugin';\r\n\r\nimport {\r\n createTransaction,\r\n tr_setSelection,\r\n tr_replaceDoc,\r\n} from '../editor/core/Transaction';\r\n\r\nimport {\r\n handleEnter,\r\n handleBackspace,\r\n handleDelete,\r\n insertText,\r\n toggleCheckItemAt,\r\n indentListItem,\r\n outdentListItem,\r\n} from '../editor/commands';\r\nimport { findContentBlockPath } from '../editor/core/DocumentModel';\r\n\r\nimport { Toolbar } from './toolbar/Toolbar';\r\nimport { FindReplaceModal } from './FindReplaceModal';\r\nimport { TableContextMenu } from './TableContextMenu';\r\nimport { TableToolbar } from './toolbar/TableToolbar';\r\nimport { ImageToolbar } from './toolbar/ImageToolbar';\r\nimport { getNodeAtPath } from '../editor/core/DocumentModel';\r\nimport { findCellPosition } from '../editor/table/TableModel';\r\nimport { setColumnWidth } from '../editor/table/TableCommands';\r\nimport type { BlockNode } from '../types';\r\n\r\nimport { htmlSerializer } from '../editor/serialization/HTMLSerializer';\r\nimport { jsonSerializer } from '../editor/serialization/JSONSerializer';\r\n\r\nimport { insertImage, deleteImageAtPath, setImageAttr } from '../editor/commands';\r\n\r\nexport interface EditorCoreProps {\r\n engine: EditorEngine;\r\n placeholder?: string;\r\n className?: string;\r\n readOnly?: boolean;\r\n onHTMLChange?: (html: string) => void;\r\n onJSONChange?: (json: string) => void;\r\n /** Called when Ctrl/Cmd+K is pressed — parent opens the link popup */\r\n onOpenLinkPopup?: () => void;\r\n /** Custom upload handler. Receives a File, returns the final URL. If omitted, blob URLs are used. */\r\n onUploadImage?: (file: File) => Promise<string>;\r\n /** Called when the editor receives focus */\r\n onFocus?: () => void;\r\n /** Called when the editor loses focus */\r\n onBlur?: () => void;\r\n /** Hide toolbar without enabling readOnly (toolbar=false prop on public Editor) */\r\n hideToolbar?: boolean;\r\n /** Ordered list of toolbar items to render */\r\n toolbarConfig?: import('../types/public').EditorToolbarConfig;\r\n}\r\n\r\nexport function EditorCore({\r\n engine,\r\n placeholder = 'Start writing...',\r\n className = '',\r\n readOnly = false,\r\n onHTMLChange,\r\n onJSONChange,\r\n onOpenLinkPopup,\r\n onUploadImage: _onUploadImage,\r\n onFocus: onFocusProp,\r\n onBlur: onBlurProp,\r\n hideToolbar = false,\r\n toolbarConfig,\r\n}: EditorCoreProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const isRenderingRef = useRef(false);\r\n // True when selection change came from user gesture (click/drag/keyboard).\r\n // The selection-only useLayoutEffect must NOT call restoreSelection in that case —\r\n // DOM already correct, writing back fights the browser mid-gesture → stuck highlight.\r\n const skipRestoreSelectionRef = useRef(false);\r\n\r\n // ── Caret scroll helper ──────────────────────────────────────────────────────\r\n // After DOM rebuild + restoreSelection, browser loses native scroll-to-caret.\r\n // Replicates that behavior: find caret rect, scroll nearest scrollable ancestor.\r\n const scrollCaretIntoView = useCallback(() => {\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n\r\n const range = sel.getRangeAt(0).cloneRange();\r\n range.collapse(true);\r\n const caretRect = range.getBoundingClientRect();\r\n\r\n let rect = caretRect;\r\n if (!rect || (rect.top === 0 && rect.bottom === 0 && rect.left === 0)) {\r\n const node = range.startContainer;\r\n const el = node.nodeType === Node.ELEMENT_NODE\r\n ? (node as Element)\r\n : node.parentElement;\r\n if (el) rect = el.getBoundingClientRect();\r\n }\r\n\r\n if (!rect || rect.bottom === 0) return;\r\n\r\n let scrollEl: Element | null = containerRef.current?.parentElement ?? null;\r\n while (scrollEl) {\r\n const style = window.getComputedStyle(scrollEl);\r\n const overflow = style.overflow + style.overflowY;\r\n if (/auto|scroll/.test(overflow)) break;\r\n scrollEl = scrollEl.parentElement;\r\n }\r\n\r\n const PADDING = 24;\r\n\r\n if (scrollEl) {\r\n const containerRect = scrollEl.getBoundingClientRect();\r\n if (rect.bottom > containerRect.bottom - PADDING) {\r\n scrollEl.scrollBy({ top: rect.bottom - containerRect.bottom + PADDING, behavior: 'smooth' });\r\n } else if (rect.top < containerRect.top + PADDING) {\r\n scrollEl.scrollBy({ top: rect.top - containerRect.top - PADDING, behavior: 'smooth' });\r\n }\r\n } else {\r\n if (rect.bottom > window.innerHeight - PADDING) {\r\n window.scrollBy({ top: rect.bottom - window.innerHeight + PADDING, behavior: 'smooth' });\r\n } else if (rect.top < PADDING) {\r\n window.scrollBy({ top: rect.top - PADDING, behavior: 'smooth' });\r\n }\r\n }\r\n }, []);\r\n const isComposingRef = useRef(false);\r\n\r\n const stateRef = useRef<EditorState>(engine.getState());\r\n\r\n const [selectedImagePath, setSelectedImagePath] = useState<number[] | null>(null);\r\n const [imageDragging, setImageDragging] = useState(false);\r\n const [findReplaceOpen, setFindReplaceOpen] = useState(false);\r\n const [findReplaceMode, setFindReplaceMode] = useState<'find' | 'replace'>('find');\r\n const [linkPopupOpen, setLinkPopupOpen] = useState(false);\r\n const [isSourceMode, setIsSourceMode] = useState(false);\r\n const [sourceHTML, setSourceHTML] = useState('');\r\n const [editorHeight, setEditorHeight] = useState<number | null>(null);\r\n const editorRootRef = useRef<HTMLDivElement>(null);\r\n const resizeDragRef = useRef<{ startY: number; startHeight: number } | null>(null);\r\n const [linkTooltip, setLinkTooltip] = useState<{\r\n href: string; x: number; y: number;\r\n } | null>(null);\r\n const linkTooltipTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n // ── Source editing toggle ────────────────────────────────────────────────────\r\n const handleToggleSource = useCallback(() => {\r\n if (!isSourceMode) {\r\n // Visual → Source: serialize current doc to formatted HTML\r\n const html = htmlSerializer.serialize(engine.getState().doc);\r\n setSourceHTML(prettyPrintHTML(html));\r\n setIsSourceMode(true);\r\n } else {\r\n // Source → Visual: parse HTML, dispatch replace_doc\r\n const newDoc = htmlSerializer.deserialize(sourceHTML);\r\n const tr = createTransaction();\r\n tr.steps.push(tr_replaceDoc(newDoc));\r\n engine.dispatch(tr);\r\n setIsSourceMode(false);\r\n }\r\n }, [isSourceMode, sourceHTML, engine]);\r\n\r\n // ── Editor resize drag ───────────────────────────────────────────────────────\r\n useEffect(() => {\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = resizeDragRef.current;\r\n if (!drag) return;\r\n const newHeight = Math.max(120, drag.startHeight + (e.clientY - drag.startY));\r\n setEditorHeight(newHeight);\r\n };\r\n const onMouseUp = () => { resizeDragRef.current = null; };\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, []);\r\n\r\n // ── Table state ─────────────────────────────────────────────────────────────\r\n const [tableContextMenu, setTableContextMenu] = useState<{\r\n x: number; y: number;\r\n tablePath: number[]; row: number; col: number; isMerged: boolean;\r\n } | null>(null);\r\n\r\n const [tableSelection, setTableSelection] = useState<{\r\n tablePath: number[];\r\n anchorCell: [number, number];\r\n focusCell: [number, number];\r\n } | null>(null);\r\n\r\n // Tracks an active cell-range drag (mousedown on a td → mousemove across cells)\r\n const cellDragRef = useRef<{\r\n tablePath: number[]; startRow: number; startCol: number;\r\n } | null>(null);\r\n\r\n // Tracks an active column resize drag\r\n const colResizeRef = useRef<{\r\n tablePath: number[]; colIndex: number;\r\n startX: number; startWidth: number;\r\n } | null>(null);\r\n\r\n const state = useEditorState(engine);\r\n\r\n // Detect cursor inside a table for the floating TableToolbar\r\n const inTableCellPos = state.selection\r\n ? findCellPosition(state.doc, state.selection.anchor.path)\r\n : null;\r\n\r\n /*\r\n * Keep latest state in ref\r\n */\r\n useLayoutEffect(() => {\r\n stateRef.current = state;\r\n }, [state]);\r\n\r\n /*\r\n * INITIAL RENDER + DOM SYNC\r\n *\r\n * IMPORTANT:\r\n * - useLayoutEffect instead of useEffect\r\n * - no requestAnimationFrame\r\n * - restore selection synchronously\r\n * - depend only on state.doc\r\n */\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n\r\n if (!container) return;\r\n\r\n isRenderingRef.current = true;\r\n\r\n renderDocument(state.doc, container);\r\n\r\n // Focus the editor before restoring selection so the cursor is visible.\r\n // This is needed when focus was in a toolbar popover (e.g. link input).\r\n if (!container.contains(document.activeElement)) {\r\n container.focus({ preventScroll: true });\r\n }\r\n\r\n if (state.selection) {\r\n restoreSelection(container, state.selection);\r\n scrollCaretIntoView();\r\n }\r\n\r\n isRenderingRef.current = false;\r\n\r\n if (onHTMLChange) {\r\n onHTMLChange(htmlSerializer.serialize(state.doc));\r\n }\r\n\r\n if (onJSONChange) {\r\n onJSONChange(jsonSerializer.serialize(state.doc));\r\n }\r\n }, [state.doc]);\r\n\r\n /*\r\n * Selection-only sync — runs when selection changes but doc does NOT change.\r\n * (e.g. Tab cell navigation, Shift+Tab, toolbar cursor moves, find/replace jumps)\r\n * The doc-change layout effect above already calls restoreSelection after\r\n * renderDocument; this covers the case where only state.selection changed.\r\n */\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || !state.selection) return;\r\n // User-initiated change: DOM already has correct selection; skip roundtrip.\r\n if (skipRestoreSelectionRef.current) {\r\n skipRestoreSelectionRef.current = false;\r\n return;\r\n }\r\n // Programmatic change (Tab, find/replace, command cursor move) → write to DOM.\r\n isRenderingRef.current = true;\r\n restoreSelection(container, state.selection);\r\n scrollCaretIntoView();\r\n isRenderingRef.current = false;\r\n }, [state.selection]);\r\n\r\n /*\r\n * Paste handler\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n\r\n if (!container || readOnly) return;\r\n\r\n return attachClipboardHandlers(container, engine);\r\n }, [engine, readOnly]);\r\n\r\n /*\r\n * Table cell-selection highlight — apply/remove CSS class on selected cells\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n // Clear previous highlights\r\n container.querySelectorAll('.editor-cell-selected').forEach((el) => {\r\n el.classList.remove('editor-cell-selected');\r\n });\r\n if (!tableSelection) return;\r\n const { tablePath, anchorCell, focusCell } = tableSelection;\r\n const minRow = Math.min(anchorCell[0], focusCell[0]);\r\n const maxRow = Math.max(anchorCell[0], focusCell[0]);\r\n const minCol = Math.min(anchorCell[1], focusCell[1]);\r\n const maxCol = Math.max(anchorCell[1], focusCell[1]);\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (let c = minCol; c <= maxCol; c++) {\r\n const cellPath = [...tablePath, r, c];\r\n const td = container.querySelector(\r\n `[data-block-path=\"${JSON.stringify(cellPath)}\"]`,\r\n ) as HTMLElement | null;\r\n if (td) td.classList.add('editor-cell-selected');\r\n }\r\n }\r\n }, [tableSelection, state.doc]);\r\n\r\n /*\r\n * Active cell highlight — outline the cell the cursor is currently inside.\r\n * Also clears tableSelection (multi-cell drag) when cursor moves to a different\r\n * single cell so editor-cell-selected and editor-cell-active never coexist.\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n container.querySelectorAll('.editor-cell-active').forEach((el) => {\r\n el.classList.remove('editor-cell-active');\r\n });\r\n\r\n if (!inTableCellPos) {\r\n setTableSelection(null);\r\n return;\r\n }\r\n\r\n if (tableSelection) {\r\n const { anchorCell, focusCell, tablePath } = tableSelection;\r\n const sameTable = JSON.stringify(tablePath) === JSON.stringify(inTableCellPos.tablePath);\r\n const singleCell = anchorCell[0] === focusCell[0] && anchorCell[1] === focusCell[1];\r\n if (!sameTable || singleCell) {\r\n setTableSelection(null);\r\n }\r\n }\r\n\r\n const cellPath = [...inTableCellPos.tablePath, inTableCellPos.row, inTableCellPos.col];\r\n const td = container.querySelector(\r\n `[data-block-path=\"${JSON.stringify(cellPath)}\"]`,\r\n ) as HTMLElement | null;\r\n if (td) td.classList.add('editor-cell-active');\r\n }, [inTableCellPos, state.doc]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n /*\r\n * Selection Sync\r\n */\r\n useEffect(() => {\r\n const onSelectionChange = () => {\r\n if (isRenderingRef.current) return;\r\n\r\n const container = containerRef.current;\r\n\r\n if (!container) return;\r\n\r\n if (!isSelectionInContainer(container)) return;\r\n\r\n const captured = captureSelection(container);\r\n\r\n if (!captured) return;\r\n\r\n const currentSelection = engine.getState().selection;\r\n\r\n if (\r\n currentSelection &&\r\n JSON.stringify(currentSelection.anchor) ===\r\n JSON.stringify(captured.anchor) &&\r\n JSON.stringify(currentSelection.focus) ===\r\n JSON.stringify(captured.focus)\r\n ) {\r\n return;\r\n }\r\n\r\n skipRestoreSelectionRef.current = true;\r\n const tr = createTransaction();\r\n tr.steps.push(tr_setSelection(captured));\r\n engine.dispatch(tr);\r\n };\r\n\r\n document.addEventListener(\r\n 'selectionchange',\r\n onSelectionChange,\r\n );\r\n\r\n return () => {\r\n document.removeEventListener(\r\n 'selectionchange',\r\n onSelectionChange,\r\n );\r\n };\r\n }, [engine]);\r\n\r\n /*\r\n * Focus handling\r\n */\r\n const handleFocus = useCallback(() => {\r\n const currentState = engine.getState();\r\n\r\n if (!currentState.selection) {\r\n const tr = createTransaction();\r\n tr.steps.push(\r\n tr_setSelection(\r\n makeCollapsedSelection({ path: [0], offset: 0 }),\r\n ),\r\n );\r\n engine.dispatch(tr);\r\n }\r\n\r\n onFocusProp?.();\r\n }, [engine, onFocusProp]);\r\n\r\n const handleBlur = useCallback(() => {\r\n onBlurProp?.();\r\n }, [onBlurProp]);\r\n\r\n /*\r\n * Keyboard handling\r\n */\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (readOnly) return;\r\n\r\n // Find / Replace shortcuts — handled before the plugin system\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\r\n e.preventDefault();\r\n setFindReplaceMode('find');\r\n setFindReplaceOpen(true);\r\n return;\r\n }\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'h') {\r\n e.preventDefault();\r\n setFindReplaceMode('replace');\r\n setFindReplaceOpen(true);\r\n return;\r\n }\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\r\n e.preventDefault();\r\n setLinkPopupOpen(true);\r\n onOpenLinkPopup?.();\r\n return;\r\n }\r\n\r\n // Ctrl+A — select all editor content\r\n if ((e.ctrlKey || e.metaKey) && (e.key === 'a' || e.key === 'A')) {\r\n e.preventDefault();\r\n const container = containerRef.current;\r\n if (container) {\r\n const spans = container.querySelectorAll<HTMLElement>('[data-path]');\r\n const first = spans[0];\r\n const last = spans[spans.length - 1];\r\n if (first && last) {\r\n const sel = window.getSelection();\r\n const range = document.createRange();\r\n range.setStart(leafTextNode(first, 'first') ?? first, 0);\r\n const lastLeaf = leafTextNode(last, 'last');\r\n range.setEnd(lastLeaf ?? last, lastLeaf?.textContent?.length ?? 0);\r\n sel?.removeAllRanges();\r\n sel?.addRange(range);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Delete/Backspace on a selected image\r\n if (selectedImagePath && (e.key === 'Delete' || e.key === 'Backspace')) {\r\n e.preventDefault();\r\n deleteImageAtPath(selectedImagePath)(engine);\r\n setSelectedImagePath(null);\r\n return;\r\n }\r\n // Any key clears image selection so typing resumes normally\r\n if (selectedImagePath) setSelectedImagePath(null);\r\n\r\n // Tab inside code_block → insert 2 spaces; inside list → indent/outdent;\r\n // inside table cell → cell navigation (handled by TablePlugin, but\r\n // preventDefault here so browser never gets a chance to move focus out).\r\n if (e.key === 'Tab') {\r\n const { doc, selection: sel } = engine.getState();\r\n if (sel) {\r\n const bp = findContentBlockPath(doc, sel.anchor.path);\r\n const block = bp ? (getNodeAtPath(doc, bp) as BlockNode | null) : null;\r\n if (block?.type === 'code_block') {\r\n e.preventDefault();\r\n insertText(' ')(engine);\r\n return;\r\n }\r\n if (block?.type === 'list_item') {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n outdentListItem(engine);\r\n } else {\r\n indentListItem(engine);\r\n }\r\n return;\r\n }\r\n // Prevent browser default (focus jump / tab-char insertion) for table cells.\r\n if (findCellPosition(doc, sel.anchor.path)) {\r\n e.preventDefault();\r\n // TablePlugin's Tab / Shift+Tab binding handles the actual navigation.\r\n }\r\n }\r\n }\r\n\r\n const handled = engine.handleKeyDown(\r\n e.nativeEvent,\r\n );\r\n\r\n if (handled) return;\r\n\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault();\r\n\r\n handleEnter(engine);\r\n\r\n return;\r\n }\r\n\r\n if (e.key === 'Backspace') {\r\n e.preventDefault();\r\n handleBackspace(engine);\r\n return;\r\n }\r\n\r\n if (e.key === 'Delete') {\r\n e.preventDefault();\r\n handleDelete(engine);\r\n return;\r\n }\r\n\r\n if (e.key === 'Enter' && e.shiftKey) {\r\n e.preventDefault();\r\n insertText('\\n')(engine);\r\n return;\r\n }\r\n },\r\n [engine, readOnly, onOpenLinkPopup, selectedImagePath],\r\n );\r\n\r\n /*\r\n * Native beforeinput handler.\r\n *\r\n * IMPORTANT: We attach this via addEventListener instead of React's\r\n * `onBeforeInput` because React polyfills `onBeforeInput` on top of `onInput`,\r\n * which fires AFTER the browser has mutated the DOM. preventDefault() on the\r\n * synthetic event does nothing. The native `beforeinput` event is the only\r\n * place we can intercept input before the DOM drifts from the model.\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || readOnly) return;\r\n\r\n const onBeforeInput = (e: InputEvent) => {\r\n if (e.isComposing || isComposingRef.current) return;\r\n\r\n switch (e.inputType) {\r\n case 'insertText':\r\n case 'insertReplacementText': {\r\n if (!e.data) return;\r\n e.preventDefault();\r\n insertText(e.data)(engine);\r\n return;\r\n }\r\n case 'insertParagraph': {\r\n e.preventDefault();\r\n handleEnter(engine);\r\n return;\r\n }\r\n case 'insertLineBreak': {\r\n e.preventDefault();\r\n insertText('\\n')(engine);\r\n return;\r\n }\r\n case 'deleteContentBackward':\r\n case 'deleteWordBackward':\r\n case 'deleteSoftLineBackward': {\r\n e.preventDefault();\r\n handleBackspace(engine);\r\n return;\r\n }\r\n case 'insertFromPaste':\r\n case 'insertFromDrop':\r\n // PastePlugin owns these.\r\n return;\r\n default:\r\n // Block any input type we don't model so the DOM can't drift.\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n container.addEventListener('beforeinput', onBeforeInput);\r\n return () => container.removeEventListener('beforeinput', onBeforeInput);\r\n }, [engine, readOnly]);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || readOnly) return;\r\n\r\n const onCompositionStart = () => {\r\n isComposingRef.current = true;\r\n };\r\n const onCompositionEnd = (e: CompositionEvent) => {\r\n isComposingRef.current = false;\r\n if (e.data) insertText(e.data)(engine);\r\n };\r\n\r\n container.addEventListener('compositionstart', onCompositionStart);\r\n container.addEventListener('compositionend', onCompositionEnd);\r\n return () => {\r\n container.removeEventListener('compositionstart', onCompositionStart);\r\n container.removeEventListener('compositionend', onCompositionEnd);\r\n };\r\n }, [engine, readOnly]);\r\n\r\n /*\r\n * Link tooltip — show on hover, open on Ctrl+Click\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const onMouseOver = (e: MouseEvent) => {\r\n const anchor = (e.target as HTMLElement).closest<HTMLAnchorElement>('a.editor-link');\r\n if (!anchor) return;\r\n const href = anchor.getAttribute('href') ?? '';\r\n if (!href) return;\r\n if (linkTooltipTimerRef.current) clearTimeout(linkTooltipTimerRef.current);\r\n linkTooltipTimerRef.current = setTimeout(() => {\r\n const rect = anchor.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n setLinkTooltip({\r\n href,\r\n x: rect.left - containerRect.left,\r\n y: rect.bottom - containerRect.top + 6,\r\n });\r\n }, 200);\r\n };\r\n\r\n const onMouseOut = (e: MouseEvent) => {\r\n const anchor = (e.target as HTMLElement).closest('a.editor-link');\r\n if (!anchor) return;\r\n if (linkTooltipTimerRef.current) clearTimeout(linkTooltipTimerRef.current);\r\n setLinkTooltip(null);\r\n };\r\n\r\n const onClick = (e: MouseEvent) => {\r\n // Ctrl/Cmd + click on a link → open in new tab\r\n if (!(e.ctrlKey || e.metaKey)) return;\r\n const anchor = (e.target as HTMLElement).closest<HTMLAnchorElement>('a.editor-link');\r\n if (!anchor) return;\r\n e.preventDefault();\r\n const href = anchor.getAttribute('href');\r\n if (href) window.open(href, '_blank', 'noopener,noreferrer');\r\n };\r\n\r\n container.addEventListener('mouseover', onMouseOver);\r\n container.addEventListener('mouseout', onMouseOut);\r\n container.addEventListener('click', onClick);\r\n return () => {\r\n container.removeEventListener('mouseover', onMouseOver);\r\n container.removeEventListener('mouseout', onMouseOut);\r\n container.removeEventListener('click', onClick);\r\n if (linkTooltipTimerRef.current) clearTimeout(linkTooltipTimerRef.current);\r\n };\r\n }, []);\r\n\r\n /*\r\n * Column resize — document-level mouse tracking while drag is active\r\n */\r\n useEffect(() => {\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = colResizeRef.current;\r\n if (!drag) return;\r\n const delta = e.clientX - drag.startX;\r\n const newWidth = Math.max(40, drag.startWidth + delta);\r\n // Apply width visually to the col element without dispatching (perf)\r\n const container = containerRef.current;\r\n if (container) {\r\n const colEl = container.querySelector(\r\n `col[data-col-index=\"${drag.colIndex}\"]`,\r\n ) as HTMLElement | null;\r\n if (colEl) colEl.style.width = `${newWidth}px`;\r\n }\r\n };\r\n\r\n const onMouseUp = (e: MouseEvent) => {\r\n const drag = colResizeRef.current;\r\n if (!drag) return;\r\n const delta = e.clientX - drag.startX;\r\n const newWidth = Math.max(40, drag.startWidth + delta);\r\n colResizeRef.current = null;\r\n setColumnWidth(drag.tablePath, drag.colIndex, newWidth)(engine);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, [engine]);\r\n\r\n /*\r\n * Cell selection drag — track which cells are highlighted as mouse moves\r\n */\r\n useEffect(() => {\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = cellDragRef.current;\r\n if (!drag) return;\r\n const td = (e.target as HTMLElement).closest('[data-cell-row]') as HTMLElement | null;\r\n if (!td) return;\r\n const row = parseInt(td.dataset.cellRow ?? '0');\r\n const col = parseInt(td.dataset.cellCol ?? '0');\r\n const tdTablePath = td.dataset.cellTablePath\r\n ? (JSON.parse(td.dataset.cellTablePath) as number[])\r\n : null;\r\n if (!tdTablePath || JSON.stringify(tdTablePath) !== JSON.stringify(drag.tablePath)) return;\r\n setTableSelection({\r\n tablePath: drag.tablePath,\r\n anchorCell: [drag.startRow, drag.startCol],\r\n focusCell: [row, col],\r\n });\r\n };\r\n\r\n const onMouseUp = () => {\r\n cellDragRef.current = null;\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, []);\r\n\r\n /*\r\n * Context menu — right-click inside a table cell\r\n */\r\n const handleContextMenu = useCallback(\r\n (e: React.MouseEvent<HTMLDivElement>) => {\r\n const td = (e.target as HTMLElement).closest('[data-cell-row]') as HTMLElement | null;\r\n if (!td) return;\r\n e.preventDefault();\r\n const row = parseInt(td.dataset.cellRow ?? '0');\r\n const col = parseInt(td.dataset.cellCol ?? '0');\r\n const tablePath = td.dataset.cellTablePath\r\n ? (JSON.parse(td.dataset.cellTablePath) as number[])\r\n : null;\r\n if (!tablePath) return;\r\n\r\n const cellNode = getNodeAtPath(\r\n engine.getState().doc,\r\n [...tablePath, row, col],\r\n ) as BlockNode | null;\r\n const isMerged =\r\n !!cellNode &&\r\n (((cellNode.attrs?.colspan as number) ?? 1) > 1 ||\r\n ((cellNode.attrs?.rowspan as number) ?? 1) > 1);\r\n\r\n setTableContextMenu({ x: e.clientX, y: e.clientY, tablePath, row, col, isMerged });\r\n },\r\n [engine],\r\n );\r\n\r\n /*\r\n * Checkbox mousedown — toggle check_list_item without moving cursor to the input\r\n */\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (readOnly) return;\r\n const target = e.target as HTMLElement;\r\n\r\n // Image resize handle\r\n if (target.dataset.resizeImagePath) {\r\n e.preventDefault();\r\n const imagePath = JSON.parse(target.dataset.resizeImagePath) as number[];\r\n const corner = target.dataset.resizeImagePos ?? 'se';\r\n const container = containerRef.current;\r\n let startWidth = 300;\r\n if (container) {\r\n const fig = container.querySelector(`[data-image-path=\"${JSON.stringify(imagePath)}\"]`);\r\n const img = fig?.querySelector('img') as HTMLImageElement | null;\r\n if (img) startWidth = img.getBoundingClientRect().width || 300;\r\n }\r\n imageResizeRef.current = {\r\n imagePath, corner, startX: e.clientX, startY: e.clientY,\r\n startWidth, startHeight: 0,\r\n };\r\n return;\r\n }\r\n\r\n // Image click / drag start — select image and begin potential drag\r\n const fig = target.closest('[data-image-path]') as HTMLElement | null;\r\n if (fig?.dataset.imagePath) {\r\n e.preventDefault();\r\n const path = JSON.parse(fig.dataset.imagePath) as number[];\r\n setSelectedImagePath(path);\r\n const imgEl = fig.querySelector('img') as HTMLImageElement | null;\r\n const figRect = (fig as HTMLElement).getBoundingClientRect();\r\n imageDragRef.current = {\r\n imagePath: path,\r\n startX: e.clientX, startY: e.clientY,\r\n active: false,\r\n ghostW: Math.min(figRect.width || 300, 320),\r\n ghostH: Math.min(figRect.height || 200, 200),\r\n ghostSrc: imgEl?.src || '',\r\n offsetX: e.clientX - figRect.left,\r\n offsetY: e.clientY - figRect.top,\r\n };\r\n return;\r\n }\r\n // Clear image selection when clicking elsewhere\r\n setSelectedImagePath(null);\r\n\r\n // Column resize handle\r\n if ((target as HTMLElement).dataset.resizeTable) {\r\n e.preventDefault();\r\n const tablePath = JSON.parse((target as HTMLElement).dataset.resizeTable!) as number[];\r\n const colIndex = parseInt((target as HTMLElement).dataset.resizeCol ?? '0');\r\n // Read current col width from DOM\r\n const container = containerRef.current;\r\n let startWidth = 120;\r\n if (container) {\r\n const colEl = container.querySelector(\r\n `col[data-col-index=\"${colIndex}\"]`,\r\n ) as HTMLElement | null;\r\n if (colEl) startWidth = colEl.getBoundingClientRect().width || 120;\r\n }\r\n colResizeRef.current = { tablePath, colIndex, startX: e.clientX, startWidth };\r\n return;\r\n }\r\n\r\n // Cell selection drag start — clear selection if clicking outside any table\r\n const td = (target as HTMLElement).closest('[data-cell-row]') as HTMLElement | null;\r\n if (!td) setTableSelection(null);\r\n if (td && !readOnly) {\r\n const row = parseInt(td.dataset.cellRow ?? '0');\r\n const col = parseInt(td.dataset.cellCol ?? '0');\r\n const tdTablePath = td.dataset.cellTablePath\r\n ? (JSON.parse(td.dataset.cellTablePath) as number[])\r\n : null;\r\n if (tdTablePath) {\r\n cellDragRef.current = { tablePath: tdTablePath, startRow: row, startCol: col };\r\n setTableSelection({\r\n tablePath: tdTablePath,\r\n anchorCell: [row, col],\r\n focusCell: [row, col],\r\n });\r\n }\r\n }\r\n\r\n // Checkbox toggle — target is the custom wrapper span or its SVG child\r\n const checkTarget = target.dataset.checkPath\r\n ? target\r\n : (target.closest('[data-check-path]') as HTMLElement | null);\r\n if (checkTarget?.dataset.checkPath) {\r\n e.preventDefault();\r\n toggleCheckItemAt(JSON.parse(checkTarget.dataset.checkPath))(engine);\r\n }\r\n },\r\n [engine, readOnly],\r\n );\r\n\r\n /*\r\n * Click handling\r\n */\r\n const handleClick = useCallback(() => {\r\n const container = containerRef.current;\r\n\r\n if (!container) return;\r\n\r\n const selection = captureSelection(container);\r\n\r\n if (!selection) return;\r\n\r\n skipRestoreSelectionRef.current = true;\r\n const tr = createTransaction();\r\n tr.steps.push(tr_setSelection(selection));\r\n engine.dispatch(tr);\r\n }, [engine]);\r\n\r\n /*\r\n * Image resize drag — document-level tracking\r\n */\r\n const imageResizeRef = useRef<{\r\n imagePath: number[]; corner: string;\r\n startX: number; startY: number; startWidth: number; startHeight: number;\r\n } | null>(null);\r\n\r\n /*\r\n * Image free-position drag — document-level tracking\r\n */\r\n const imageDragRef = useRef<{\r\n imagePath: number[];\r\n startX: number; startY: number;\r\n active: boolean;\r\n ghostW: number; ghostH: number; ghostSrc: string;\r\n offsetX: number; offsetY: number;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = imageResizeRef.current;\r\n if (!drag) return;\r\n const deltaX = e.clientX - drag.startX;\r\n const isRight = drag.corner === 'ne' || drag.corner === 'se';\r\n const newWidth = Math.max(60, drag.startWidth + (isRight ? deltaX : -deltaX));\r\n // Update DOM visually without dispatching\r\n const container = containerRef.current;\r\n if (container) {\r\n const fig = container.querySelector(\r\n `[data-image-path=\"${JSON.stringify(drag.imagePath)}\"]`,\r\n ) as HTMLElement | null;\r\n const img = fig?.querySelector('img') as HTMLImageElement | null;\r\n if (img) img.style.width = `${newWidth}px`;\r\n }\r\n };\r\n const onMouseUp = (e: MouseEvent) => {\r\n const drag = imageResizeRef.current;\r\n if (!drag) return;\r\n const deltaX = e.clientX - drag.startX;\r\n const isRight = drag.corner === 'ne' || drag.corner === 'se';\r\n const newWidth = Math.max(60, drag.startWidth + (isRight ? deltaX : -deltaX));\r\n imageResizeRef.current = null;\r\n setImageAttr(drag.imagePath, { width: newWidth })(engine);\r\n };\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, [engine]);\r\n\r\n /*\r\n * Image free-position drag — document-level mouse tracking\r\n */\r\n useEffect(() => {\r\n const DRAG_THRESHOLD = 4;\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = imageDragRef.current;\r\n if (!drag) return;\r\n const dx = e.clientX - drag.startX;\r\n const dy = e.clientY - drag.startY;\r\n if (!drag.active && Math.sqrt(dx * dx + dy * dy) < DRAG_THRESHOLD) return;\r\n if (!drag.active) {\r\n drag.active = true;\r\n setImageDragging(true);\r\n document.body.style.userSelect = 'none';\r\n }\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const cr = container.getBoundingClientRect();\r\n const x = Math.max(0, e.clientX - cr.left - drag.offsetX + container.scrollLeft);\r\n const y = Math.max(0, e.clientY - cr.top - drag.offsetY + container.scrollTop);\r\n // Update DOM directly (no dispatch — avoids re-render lag)\r\n const fig = container.querySelector(\r\n `[data-image-path=\"${JSON.stringify(drag.imagePath)}\"]`,\r\n ) as HTMLElement | null;\r\n if (fig) {\r\n fig.style.position = 'absolute';\r\n fig.style.left = `${x}px`;\r\n fig.style.top = `${y}px`;\r\n fig.style.margin = '0';\r\n fig.style.zIndex = '10';\r\n }\r\n };\r\n const onMouseUp = (e: MouseEvent) => {\r\n const drag = imageDragRef.current;\r\n if (!drag) return;\r\n imageDragRef.current = null;\r\n document.body.style.userSelect = '';\r\n setImageDragging(false);\r\n if (!drag.active) return;\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const cr = container.getBoundingClientRect();\r\n const x = Math.max(0, e.clientX - cr.left - drag.offsetX + container.scrollLeft);\r\n const y = Math.max(0, e.clientY - cr.top - drag.offsetY + container.scrollTop);\r\n setImageAttr(drag.imagePath, { x: Math.round(x), y: Math.round(y) })(engine);\r\n };\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, [engine]);\r\n\r\n /*\r\n * Apply / remove selected-image highlight in DOM\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n container.querySelectorAll('[data-image-path]').forEach((el) => {\r\n el.removeAttribute('data-selected');\r\n });\r\n if (selectedImagePath) {\r\n const fig = container.querySelector(\r\n `[data-image-path=\"${JSON.stringify(selectedImagePath)}\"]`,\r\n );\r\n if (fig) fig.setAttribute('data-selected', 'true');\r\n }\r\n }, [selectedImagePath, state.doc]);\r\n\r\n /*\r\n * Drag & drop image files onto the editor canvas\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || readOnly) return;\r\n const onDragOver = (e: DragEvent) => {\r\n if (e.dataTransfer?.types.includes('Files')) e.preventDefault();\r\n };\r\n const onDrop = (e: DragEvent) => {\r\n e.preventDefault();\r\n const file = e.dataTransfer?.files[0];\r\n if (!file || !file.type.startsWith('image/')) return;\r\n const blobUrl = URL.createObjectURL(file);\r\n insertImage(blobUrl, file.name.replace(/\\.[^.]+$/, ''))(engine);\r\n };\r\n container.addEventListener('dragover', onDragOver);\r\n container.addEventListener('drop', onDrop);\r\n return () => {\r\n container.removeEventListener('dragover', onDragOver);\r\n container.removeEventListener('drop', onDrop);\r\n };\r\n }, [engine, readOnly]);\r\n\r\n /*\r\n * Empty state\r\n */\r\n const isVisualEmpty =\r\n state.doc.children.length === 1 &&\r\n state.doc.children[0].type === 'paragraph' &&\r\n state.doc.children[0].children.length === 0;\r\n\r\n return (\r\n <div\r\n ref={editorRootRef}\r\n className={`editor-root relative flex flex-col ${className}`}\r\n style={editorHeight ? { minHeight: editorHeight } : undefined}\r\n >\r\n {!readOnly && !hideToolbar && (\r\n <Toolbar\r\n engine={engine}\r\n onFindReplace={(mode) => {\r\n setFindReplaceMode(mode);\r\n setFindReplaceOpen(true);\r\n }}\r\n linkPopupOpen={linkPopupOpen}\r\n onLinkPopupClose={() => setLinkPopupOpen(false)}\r\n isSourceMode={isSourceMode}\r\n onToggleSource={handleToggleSource}\r\n toolbarConfig={toolbarConfig}\r\n />\r\n )}\r\n\r\n <div className=\"relative\">\r\n {/* Source editing textarea */}\r\n {isSourceMode ? (\r\n <textarea\r\n aria-label=\"HTML source editor\"\r\n value={sourceHTML}\r\n onChange={(e) => {\r\n setSourceHTML(e.target.value);\r\n const t = e.target;\r\n t.style.height = 'auto';\r\n t.style.height = t.scrollHeight + 'px';\r\n }}\r\n ref={(el) => {\r\n if (el) { el.style.height = 'auto'; el.style.height = el.scrollHeight + 'px'; }\r\n }}\r\n spellCheck={false}\r\n className=\"w-full block px-6 py-4 font-mono text-sm leading-relaxed bg-gray-950 text-green-300 outline-none resize-none border-0 overflow-hidden\"\r\n />\r\n ) : (\r\n <>\r\n {isVisualEmpty && (\r\n <div\r\n className=\"\r\n absolute\r\n top-6\r\n left-6\r\n pointer-events-none\r\n select-none\r\n text-base\r\n text-gray-400\r\n \r\n \"\r\n aria-hidden=\"true\"\r\n >\r\n {placeholder}\r\n </div>\r\n )}\r\n\r\n <div\r\n ref={containerRef}\r\n contentEditable={!readOnly}\r\n suppressContentEditableWarning\r\n role=\"textbox\"\r\n aria-multiline=\"true\"\r\n aria-label=\"Rich text editor\"\r\n spellCheck\r\n onMouseDown={handleMouseDown}\r\n onContextMenu={handleContextMenu}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n className={[\r\n 'editor-canvas',\r\n 'min-h-[300px]',\r\n 'px-6',\r\n 'py-4',\r\n 'outline-none',\r\n 'text-base',\r\n 'leading-relaxed',\r\n 'text-gray-900',\r\n '',\r\n readOnly\r\n ? 'cursor-default'\r\n : 'cursor-text',\r\n ].join(' ')}\r\n />\r\n\r\n {/* Link hover tooltip */}\r\n {linkTooltip && (\r\n <div\r\n role=\"tooltip\"\r\n style={{ left: linkTooltip.x, top: linkTooltip.y }}\r\n className=\"absolute z-50 pointer-events-none flex items-center gap-1.5 bg-gray-900 text-white text-xs px-2.5 py-1.5 rounded shadow-lg max-w-xs\"\r\n >\r\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0 opacity-70\" aria-hidden=\"true\">\r\n <path d=\"M6.5 3.5H4A2.5 2.5 0 0 0 4 8.5h2\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\r\n <path d=\"M9.5 3.5H12A2.5 2.5 0 0 1 12 8.5h-2\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\r\n <path d=\"M5.5 6h5\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\r\n </svg>\r\n <span className=\"truncate\">{linkTooltip.href}</span>\r\n <span className=\"shrink-0 opacity-50 ml-1\">Ctrl+click to open</span>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {inTableCellPos && !readOnly && (\r\n <TableToolbar\r\n engine={engine}\r\n tablePath={inTableCellPos.tablePath}\r\n cellPos={{ row: inTableCellPos.row, col: inTableCellPos.col }}\r\n tableSelection={tableSelection}\r\n editorContainer={containerRef}\r\n />\r\n )}\r\n\r\n {tableContextMenu && (\r\n <TableContextMenu\r\n x={tableContextMenu.x}\r\n y={tableContextMenu.y}\r\n tablePath={tableContextMenu.tablePath}\r\n row={tableContextMenu.row}\r\n col={tableContextMenu.col}\r\n isMerged={tableContextMenu.isMerged}\r\n tableSelection={tableSelection}\r\n engine={engine}\r\n onClose={() => setTableContextMenu(null)}\r\n />\r\n )}\r\n\r\n {findReplaceOpen && (\r\n <FindReplaceModal\r\n engine={engine}\r\n editorContainer={containerRef}\r\n initialMode={findReplaceMode}\r\n onClose={() => setFindReplaceOpen(false)}\r\n />\r\n )}\r\n\r\n {selectedImagePath && !readOnly && (\r\n <ImageToolbar\r\n engine={engine}\r\n imagePath={selectedImagePath}\r\n editorContainer={containerRef}\r\n onClose={() => setSelectedImagePath(null)}\r\n />\r\n )}\r\n\r\n {/* Resize grip */}\r\n {!readOnly && (\r\n <div\r\n title=\"Drag to resize\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n const rootEl = editorRootRef.current;\r\n if (!rootEl) return;\r\n resizeDragRef.current = {\r\n startY: e.clientY,\r\n startHeight: rootEl.getBoundingClientRect().height,\r\n };\r\n }}\r\n className=\"absolute bottom-0 right-0 w-4 h-4 cursor-s-resize flex items-end justify-end pr-0.5 pb-0.5 select-none\"\r\n aria-hidden=\"true\"\r\n >\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\r\n <path d=\"M7 1L1 7M7 4L4 7M7 7L7 7\" stroke=\"#9ca3af\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── HTML pretty-printer ──────────────────────────────────────────────────────\r\n\r\nconst BLOCK_TAGS = 'p|h[1-6]|ul|ol|li|blockquote|pre|figure|table|thead|tbody|tr|th|td';\r\nconst _OPEN_ONLY_RE = new RegExp(`^<(${BLOCK_TAGS})(?:\\\\s[^>]*)?>$`, 'i');\r\nconst _CLOSE_ONLY_RE = new RegExp(`^<\\\\/(${BLOCK_TAGS})>$`, 'i');\r\n\r\nconst _HR_RE = /^<hr(\\s[^>]*)?\\/?>$/i;\r\n\r\nfunction leafTextNode(el: HTMLElement, end: 'first' | 'last'): Text | null {\r\n let node: Node = el;\r\n while (node.hasChildNodes()) {\r\n node = end === 'first' ? node.firstChild! : node.lastChild!;\r\n }\r\n return node.nodeType === Node.TEXT_NODE ? (node as Text) : null;\r\n}\r\n\r\nfunction prettyPrintHTML(html: string): string {\r\n // Insert newlines at block open/close boundaries, then indent line-by-line.\r\n const blockOpen = new RegExp(`(<(?:${BLOCK_TAGS})(?:\\\\s[^>]*)?>)`, 'gi');\r\n const blockClose = new RegExp(`(<\\\\/(?:${BLOCK_TAGS})>)`, 'gi');\r\n\r\n const spread = html\r\n .replace(blockOpen, '\\n$1')\r\n .replace(blockClose, '$1\\n')\r\n .replace(/<hr(\\s[^>]*)?\\/?>(\\s*)/gi, '\\n<hr />\\n');\r\n\r\n let depth = 0;\r\n const result: string[] = [];\r\n\r\n for (const raw of spread.split('\\n')) {\r\n const line = raw.trim();\r\n if (!line) continue;\r\n\r\n if (_HR_RE.test(line)) {\r\n result.push(' '.repeat(depth) + line);\r\n continue;\r\n }\r\n if (_CLOSE_ONLY_RE.test(line)) {\r\n depth = Math.max(0, depth - 1);\r\n result.push(' '.repeat(depth) + line);\r\n continue;\r\n }\r\n if (_OPEN_ONLY_RE.test(line)) {\r\n result.push(' '.repeat(depth) + line);\r\n depth++;\r\n continue;\r\n }\r\n // Mixed: starts with a block open tag but also has content / close tag on same line.\r\n // Don't change depth — it's self-contained (e.g. <p>text</p>, <li>text</li>).\r\n result.push(' '.repeat(depth) + line);\r\n }\r\n\r\n return result.join('\\n');\r\n}","/**\n * TablePlugin\n *\n * EditorPlugin that handles keyboard navigation inside table cells.\n *\n * Tab → move cursor to next cell (adds row if on last cell)\n * Shift+Tab → move cursor to previous cell (no-op on first cell)\n * ArrowRight → move to next cell when at end of current cell\n * ArrowLeft → move to previous cell when at start of current cell\n * ArrowDown → move to cell below when on bottom line\n * ArrowUp → move to cell above when on top line\n *\n * Enter inside a cell is handled by the default handleEnter command because\n * findContentBlockPath correctly resolves to the paragraph inside the cell\n * (table/table_row/table_cell are all in isContainerBlock so they're skipped).\n *\n * Backspace at start of first paragraph in a cell is a safe no-op because\n * joinBlocks checks idx===0 and returns the doc unchanged.\n */\n\nimport type { EditorPlugin } from '../../types';\nimport type { BlockNode } from '../../types';\nimport { createTransaction, tr_setSelection } from '../core/Transaction';\nimport { getNodeAtPath } from '../core/DocumentModel';\nimport { makeCollapsedSelection } from '../selection/SelectionEngine';\nimport {\n findCellPosition,\n getTableDimensions,\n getCellFirstPosition,\n getCellLastPosition,\n insertTableRowAfter,\n} from './TableModel';\n\n// ─── DOM boundary helpers ──────────────────────────────────────────────────────\n\n/**\n * Return the DOM element for a cell given its data-block-path JSON string.\n * Works because DOMRenderer sets data-block-path on every block element.\n */\nfunction getCellDOMElement(cellPathJson: string): Element | null {\n return document.querySelector(`[data-block-path='${cellPathJson}']`);\n}\n\n/**\n * True when the browser caret is at the very start of the given DOM container.\n * Uses Selection API — no model knowledge needed.\n */\nfunction isCaretAtContainerStart(container: Element): boolean {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0 || !sel.isCollapsed) return false;\n const range = sel.getRangeAt(0);\n if (range.startOffset !== 0) return false;\n let node: Node | null = range.startContainer;\n while (node && node !== container) {\n if (node.previousSibling) return false;\n node = node.parentNode;\n }\n return node === container;\n}\n\n/**\n * True when the browser caret is at the very end of the given DOM container.\n */\nfunction isCaretAtContainerEnd(container: Element): boolean {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0 || !sel.isCollapsed) return false;\n const range = sel.getRangeAt(0);\n const endNode = range.endContainer;\n const endOffset = range.endOffset;\n const len = endNode.nodeType === Node.TEXT_NODE\n ? (endNode.textContent?.length ?? 0)\n : (endNode as Element).childNodes.length;\n if (endOffset !== len) return false;\n let node: Node | null = endNode;\n while (node && node !== container) {\n if (node.nextSibling) return false;\n node = node.parentNode;\n }\n return node === container;\n}\n\n/**\n * Check vertical boundary using bounding rects.\n * For ArrowUp: caret is on the top line if its rect top ≈ container top.\n * For ArrowDown: caret is on the bottom line if its rect bottom ≈ container bottom.\n */\nfunction isCaretOnEdgeLine(container: Element, direction: 'up' | 'down'): boolean {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0 || !sel.isCollapsed) return false;\n const caretRange = sel.getRangeAt(0).cloneRange();\n caretRange.collapse(true);\n const caretRects = caretRange.getClientRects();\n if (!caretRects.length) return true; // empty cell — treat as boundary\n const caretRect = caretRects[0];\n const containerRect = container.getBoundingClientRect();\n const lineHeight = parseFloat(getComputedStyle(container).lineHeight) || 20;\n if (direction === 'up') {\n return caretRect.top < containerRect.top + lineHeight;\n } else {\n return caretRect.bottom > containerRect.bottom - lineHeight;\n }\n}\n\nexport const TablePlugin: EditorPlugin = {\n name: 'table',\n\n keyBindings: {\n Tab: (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { rows, cols } = getTableDimensions(table);\n\n // Find next non-covered cell\n let nextRow = row;\n let nextCol = col + 1;\n while (nextRow < rows) {\n if (nextCol >= cols) { nextCol = 0; nextRow++; continue; }\n const c = getNodeAtPath(state.doc, [...tablePath, nextRow, nextCol]) as BlockNode;\n if (!c?.attrs?.covered) break;\n nextCol++;\n }\n\n if (nextRow >= rows) {\n // Last cell — append a new row and move cursor there\n const newTable = insertTableRowAfter(table, rows - 1);\n const newChildren = [...state.doc.children];\n newChildren[tablePath[0]] = newTable;\n const tempDoc = { type: 'doc' as const, children: newChildren };\n\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: tablePath });\n tr.steps.push({\n type: 'insert_node',\n parentPath: tablePath.length > 1 ? tablePath.slice(0, -1) : [],\n index: tablePath[tablePath.length - 1],\n node: newTable,\n });\n const pos = getCellFirstPosition(tempDoc, tablePath, rows, 0);\n if (pos) tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n }\n\n const pos = getCellFirstPosition(state.doc, tablePath, nextRow, nextCol);\n if (!pos) return false;\n\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'ArrowRight': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n const { tablePath, row, col } = cellPos;\n const cellPath = [...tablePath, row, col];\n const cellEl = getCellDOMElement(JSON.stringify(cellPath));\n if (!cellEl || !isCaretAtContainerEnd(cellEl)) return false;\n\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { rows, cols } = getTableDimensions(table);\n let nextRow = row; let nextCol = col + 1;\n while (nextRow < rows) {\n if (nextCol >= cols) { nextCol = 0; nextRow++; continue; }\n const c = getNodeAtPath(state.doc, [...tablePath, nextRow, nextCol]) as BlockNode;\n if (!c?.attrs?.covered) break;\n nextCol++;\n }\n if (nextRow >= rows) return true; // last cell — swallow\n const pos = getCellFirstPosition(state.doc, tablePath, nextRow, nextCol);\n if (!pos) return false;\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'ArrowLeft': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n const { tablePath, row, col } = cellPos;\n const cellPath = [...tablePath, row, col];\n const cellEl = getCellDOMElement(JSON.stringify(cellPath));\n if (!cellEl || !isCaretAtContainerStart(cellEl)) return false;\n\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { cols } = getTableDimensions(table);\n let prevRow = row; let prevCol = col - 1;\n while (prevRow >= 0) {\n if (prevCol < 0) { prevCol = cols - 1; prevRow--; continue; }\n const c = getNodeAtPath(state.doc, [...tablePath, prevRow, prevCol]) as BlockNode;\n if (!c?.attrs?.covered) break;\n prevCol--;\n }\n if (prevRow < 0) return true; // first cell — swallow\n const pos = getCellLastPosition(state.doc, tablePath, prevRow, prevCol);\n if (!pos) return false;\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'ArrowDown': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n const { tablePath, row, col } = cellPos;\n const cellPath = [...tablePath, row, col];\n const cellEl = getCellDOMElement(JSON.stringify(cellPath));\n if (!cellEl || !isCaretOnEdgeLine(cellEl, 'down')) return false;\n\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { rows, cols } = getTableDimensions(table);\n let nextRow = row + 1;\n while (nextRow < rows) {\n const c = getNodeAtPath(state.doc, [...tablePath, nextRow, col]) as BlockNode;\n if (c && !c.attrs?.covered) break;\n nextRow++;\n }\n if (nextRow >= rows) return false; // exit below table\n const pos = getCellFirstPosition(state.doc, tablePath, nextRow, col < cols ? col : 0);\n if (!pos) return false;\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'ArrowUp': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n const { tablePath, row, col } = cellPos;\n const cellPath = [...tablePath, row, col];\n const cellEl = getCellDOMElement(JSON.stringify(cellPath));\n if (!cellEl || !isCaretOnEdgeLine(cellEl, 'up')) return false;\n\n let prevRow = row - 1;\n while (prevRow >= 0) {\n const c = getNodeAtPath(state.doc, [...tablePath, prevRow, col]) as BlockNode;\n if (c && !c.attrs?.covered) break;\n prevRow--;\n }\n if (prevRow < 0) return false; // exit above table\n const { cols } = getTableDimensions(getNodeAtPath(state.doc, tablePath) as BlockNode);\n const pos = getCellLastPosition(state.doc, tablePath, prevRow, col < cols ? col : 0);\n if (!pos) return false;\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'Shift+Tab': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { cols } = getTableDimensions(table);\n\n // Find prev non-covered cell\n let prevRow = row;\n let prevCol = col - 1;\n while (prevRow >= 0) {\n if (prevCol < 0) { prevCol = cols - 1; prevRow--; continue; }\n const c = getNodeAtPath(state.doc, [...tablePath, prevRow, prevCol]) as BlockNode;\n if (!c?.attrs?.covered) break;\n prevCol--;\n }\n\n if (prevRow < 0) return true; // first cell — swallow Tab, do nothing\n\n const pos = getCellLastPosition(state.doc, tablePath, prevRow, prevCol);\n if (!pos) return false;\n\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n },\n};\n","/**\n * useEditorEngine\n *\n * Creates and manages an EditorEngine instance for the lifetime of the\n * component that mounts the editor. Registers built-in plugins.\n *\n * Usage:\n * const engine = useEditorEngine();\n * // Pass engine to <EditorCanvas engine={engine} />\n */\n\n'use client';\n\nimport { useMemo } from 'react';\nimport { createEditorEngine } from '../editor/core/EditorEngine';\nimport { createHistoryManager } from '../editor/history/HistoryManager';\nimport { defaultKeyboardPlugin } from '../editor/commands';\nimport { TablePlugin } from '../editor/table/TablePlugin';\nimport type { EditorState } from '../types';\n\nexport function useEditorEngine(initialState?: Partial<EditorState>) {\n const engine = useMemo(() => {\n const e = createEditorEngine(initialState);\n e.registerPlugin(createHistoryManager());\n e.registerPlugin(defaultKeyboardPlugin);\n e.registerPlugin(TablePlugin);\n return e;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return engine;\n}\n","/**\n * MarkdownSerializer\n *\n * Converts the document model to Markdown.\n * Deserialization is intentionally basic — use an HTML-first paste flow for\n * rich Markdown imports (convert MD→HTML, then HTML→model).\n */\n\nimport type { Document, BlockNode, TextNode, EditorNode, Mark, Serializer } from '../../types';\nimport { isTextNode, createParagraph } from '../core/DocumentModel';\nimport { htmlSerializer } from './HTMLSerializer';\n\nexport const markdownSerializer: Serializer<string> = {\n serialize(doc: Document): string {\n return doc.children.map((block) => serializeMDBlock(block, 0)).join('\\n\\n');\n },\n\n deserialize(markdown: string): Document {\n // Simple MD→HTML→model pipeline\n const html = markdownToHTML(markdown);\n return htmlSerializer.deserialize(html);\n },\n};\n\nfunction serializeMDBlock(node: BlockNode, depth: number): string {\n switch (node.type) {\n case 'paragraph':\n return serializeMDInline(node.children);\n\n case 'heading': {\n const level = (node.attrs?.level as number) ?? 1;\n const prefix = '#'.repeat(level);\n return `${prefix} ${serializeMDInline(node.children)}`;\n }\n\n case 'blockquote':\n return serializeMDInline(node.children)\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n');\n\n case 'bullet_list':\n return node.children\n .map((child) => {\n const text = serializeMDBlock(child as BlockNode, depth + 1);\n return `${' '.repeat(depth)}- ${text}`;\n })\n .join('\\n');\n\n case 'ordered_list':\n return node.children\n .map((child, i) => {\n const text = serializeMDBlock(child as BlockNode, depth + 1);\n return `${' '.repeat(depth)}${i + 1}. ${text}`;\n })\n .join('\\n');\n\n case 'list_item':\n return serializeMDInline(node.children);\n\n case 'code_block': {\n const lang = (node.attrs?.language as string) ?? '';\n const text = node.children\n .filter((c) => isTextNode(c))\n .map((c) => (c as TextNode).text)\n .join('');\n return `\\`\\`\\`${lang}\\n${text}\\n\\`\\`\\``;\n }\n\n case 'image':\n return ``;\n\n case 'horizontal_rule':\n return '---';\n\n default:\n return serializeMDInline(node.children);\n }\n}\n\nfunction serializeMDInline(children: EditorNode[] | undefined): string {\n if (!children) return '';\n return children\n .map((child) => {\n if (!child) return '';\n if (!isTextNode(child)) return serializeMDBlock(child as BlockNode, 0);\n return serializeMDText(child as TextNode);\n })\n .join('');\n}\n\nfunction serializeMDText(node: TextNode): string {\n let text = node.text;\n\n for (const mark of node.marks) {\n text = wrapWithMDMark(text, mark);\n }\n\n return text;\n}\n\nfunction wrapWithMDMark(text: string, mark: Mark): string {\n switch (mark.type) {\n case 'bold': return `**${text}**`;\n case 'italic': return `*${text}*`;\n case 'underline': return `<u>${text}</u>`; // MD has no underline\n case 'strikethrough': return `~~${text}~~`;\n case 'code': return `\\`${text}\\``;\n case 'link': return `[${text}](${mark.attrs?.href ?? '#'})`;\n case 'highlight': return `==${text}==`; // extended MD\n default: return text;\n }\n}\n\n// ─── Basic Markdown → HTML ────────────────────────────────────────────────────\n\nfunction markdownToHTML(md: string): string {\n const lines = md.split('\\n');\n const result: string[] = [];\n let inCodeBlock = false;\n let codeContent: string[] = [];\n let codeLang = '';\n\n for (const line of lines) {\n // Code fences\n if (line.startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeLang = line.slice(3).trim();\n codeContent = [];\n } else {\n const langAttr = codeLang ? ` class=\"language-${codeLang}\"` : '';\n result.push(`<pre><code${langAttr}>${escapeHTML(codeContent.join('\\n'))}</code></pre>`);\n inCodeBlock = false;\n codeContent = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeContent.push(line);\n continue;\n }\n\n // Headings\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)/);\n if (headingMatch) {\n const level = headingMatch[1].length;\n result.push(`<h${level}>${inlineMarkdownToHTML(headingMatch[2])}</h${level}>`);\n continue;\n }\n\n // Horizontal rule\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(line.trim())) {\n result.push('<hr />');\n continue;\n }\n\n // Blockquote\n if (line.startsWith('> ')) {\n result.push(`<blockquote>${inlineMarkdownToHTML(line.slice(2))}</blockquote>`);\n continue;\n }\n\n // Unordered list\n const ulMatch = line.match(/^[-*+]\\s+(.*)/);\n if (ulMatch) {\n result.push(`<ul><li>${inlineMarkdownToHTML(ulMatch[1])}</li></ul>`);\n continue;\n }\n\n // Ordered list\n const olMatch = line.match(/^\\d+\\.\\s+(.*)/);\n if (olMatch) {\n result.push(`<ol><li>${inlineMarkdownToHTML(olMatch[1])}</li></ol>`);\n continue;\n }\n\n // Empty line\n if (!line.trim()) {\n continue;\n }\n\n // Regular paragraph\n result.push(`<p>${inlineMarkdownToHTML(line)}</p>`);\n }\n\n return result.join('');\n}\n\nfunction inlineMarkdownToHTML(text: string): string {\n return text\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n .replace(/~~(.+?)~~/g, '<s>$1</s>')\n .replace(/`(.+?)`/g, '<code>$1</code>')\n .replace(/\\[(.+?)\\]\\((.+?)\\)/g, '<a href=\"$2\">$1</a>')\n .replace(/==(.+?)==/g, '<mark>$1</mark>');\n}\n\nfunction escapeHTML(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n","import type { EditorEngineInterface } from '../../types';\nimport {\n toggleBold, toggleItalic, toggleUnderline, toggleStrikethrough, toggleCode,\n toggleMark,\n setParagraph, setBlockquote, setCodeBlock,\n setHeading,\n toggleBulletList, toggleOrderedList, toggleCheckList,\n insertLink,\n setTextColor, setHighlightColor, setFontFamily, setFontSize,\n setAlignment,\n insertImage,\n insertText,\n insertHorizontalRule,\n} from './index';\nimport { insertTable } from '../table/TableCommands';\nimport { undo, redo } from '../history/HistoryManager';\nimport { createTransaction, tr_replaceDoc } from '../core/Transaction';\nimport { createEmptyDocument } from '../core/DocumentModel';\n\ntype CommandFn = (engine: EditorEngineInterface, ...args: unknown[]) => boolean;\n\nconst REGISTRY: Record<string, CommandFn> = {\n bold: (e) => toggleBold(e),\n italic: (e) => toggleItalic(e),\n underline: (e) => toggleUnderline(e),\n strikethrough: (e) => toggleStrikethrough(e),\n code: (e) => toggleCode(e),\n blockquote: (e) => setBlockquote(e),\n 'code-block': (e) => setCodeBlock(e),\n paragraph: (e) => setParagraph(e),\n 'bullet-list': (e) => toggleBulletList(e),\n 'ordered-list':(e) => toggleOrderedList(e),\n 'check-list': (e) => toggleCheckList(e),\n undo: (e) => { undo(e as Parameters<typeof undo>[0]); return true; },\n redo: (e) => { redo(e as Parameters<typeof redo>[0]); return true; },\n clear: (e) => {\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(createEmptyDocument()));\n e.dispatch(tr);\n return true;\n },\n 'insert-horizontal-rule': (e) => insertHorizontalRule(e),\n\n // Parameterized — args[0] is the value\n 'heading': (e, level) => setHeading(level as 1|2|3|4|5|6)(e),\n 'set-text-color': (e, color) => setTextColor(color as string | null)(e),\n 'set-highlight': (e, color) => setHighlightColor(color as string | null)(e),\n 'set-font-family': (e, family) => setFontFamily(family as string | null)(e),\n 'set-font-size': (e, size) => setFontSize(size as string | null)(e),\n 'set-alignment': (e, align) => setAlignment(align as 'left'|'center'|'right'|'justify')(e),\n 'insert-text': (e, text) => insertText(text as string)(e),\n 'insert-link': (e, href, text) => insertLink(href as string, text as string | undefined)(e),\n 'insert-image': (e, src, alt) => insertImage(src as string, alt as string | undefined)(e),\n 'insert-table': (e, rows, cols) => insertTable(rows as number, cols as number)(e),\n 'toggle-mark': (e, type, attrs) => toggleMark(type as Parameters<typeof toggleMark>[0], attrs as Record<string, unknown> | undefined)(e),\n};\n\nexport function execCommand(\n engine: EditorEngineInterface,\n command: string,\n ...args: unknown[]\n): boolean {\n const fn = REGISTRY[command];\n if (!fn) return false;\n try {\n return fn(engine, ...args);\n } catch {\n return false;\n }\n}\n\nexport function registerCommand(name: string, fn: CommandFn): void {\n REGISTRY[name] = fn;\n}\n","'use client';\n\nimport React, { useEffect, useRef, useImperativeHandle, forwardRef } from 'react';\nimport { EditorCore } from './EditorCore';\nimport { useEditorEngine } from '../hooks/useEditorEngine';\nimport { htmlSerializer } from '../editor/serialization/HTMLSerializer';\nimport { markdownSerializer } from '../editor/serialization/MarkdownSerializer';\nimport { createTransaction, tr_replaceDoc } from '../editor/core/Transaction';\nimport { execCommand, registerCommand } from '../editor/commands/CommandRegistry';\nimport { undo, redo } from '../editor/history/HistoryManager';\nimport type { EditorProps, EditorAPI } from '../types/public';\n\n/**\n * Self-contained rich text editor.\n *\n * Manages its own EditorEngine — consumers do not need to create one.\n * Supports controlled mode (value + onChange), uncontrolled mode (defaultValue),\n * toolbar configuration, theme, plugins, and an imperative API via onReady / ref.\n */\nexport const Editor = forwardRef<EditorAPI, EditorProps>(function Editor(\n {\n value,\n onChange,\n defaultValue,\n toolbar,\n theme: _theme,\n placeholder = 'Start writing...',\n className = '',\n style,\n minHeight,\n maxHeight,\n readOnly = false,\n plugins,\n onFocus,\n onBlur,\n onReady,\n onUploadImage,\n },\n ref,\n) {\n const engine = useEditorEngine();\n\n // Register extra plugins once\n const pluginsRegisteredRef = useRef(false);\n if (!pluginsRegisteredRef.current && plugins?.length) {\n pluginsRegisteredRef.current = true;\n for (const plugin of plugins) {\n engine.registerPlugin(plugin);\n }\n }\n\n // Load defaultValue once on mount\n const defaultLoadedRef = useRef(false);\n useEffect(() => {\n if (defaultLoadedRef.current) return;\n defaultLoadedRef.current = true;\n if (defaultValue) {\n const doc = htmlSerializer.deserialize(defaultValue);\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(doc));\n engine.dispatch(tr);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled mode — sync external value into engine when it changes\n const lastExternalValueRef = useRef<string | undefined>(undefined);\n useEffect(() => {\n if (value === undefined) return;\n if (value === lastExternalValueRef.current) return;\n lastExternalValueRef.current = value;\n const doc = htmlSerializer.deserialize(value);\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(doc));\n engine.dispatch(tr);\n }, [value, engine]);\n\n // Expose imperative API via ref and onReady\n const api: EditorAPI = {\n getHTML: () => htmlSerializer.serialize(engine.getState().doc),\n setHTML: (html: string) => {\n const doc = htmlSerializer.deserialize(html);\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(doc));\n engine.dispatch(tr);\n },\n getJSON: () => engine.getState().doc,\n getMarkdown: () => markdownSerializer.serialize(engine.getState().doc),\n focus: () => {\n // EditorCore's contentEditable div — find it in DOM\n const el = document.querySelector('[role=\"textbox\"]') as HTMLElement | null;\n el?.focus();\n },\n blur: () => {\n const el = document.querySelector('[role=\"textbox\"]') as HTMLElement | null;\n el?.blur();\n },\n clear: () => {\n const doc = htmlSerializer.deserialize('');\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(doc));\n engine.dispatch(tr);\n },\n undo: () => undo(engine),\n redo: () => redo(engine),\n execCommand: (command: string, ...args: unknown[]) =>\n execCommand(engine, command, ...args),\n registerCommand: (name: string, fn: (eng: import('../types').EditorEngineInterface, ...args: unknown[]) => boolean) =>\n registerCommand(name, fn),\n getEngine: () => engine,\n };\n\n useImperativeHandle(ref, () => api);\n\n useEffect(() => {\n onReady?.(api);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Build container style\n const containerStyle: React.CSSProperties = { ...style };\n if (minHeight !== undefined) {\n containerStyle.minHeight = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n }\n if (maxHeight !== undefined) {\n containerStyle.maxHeight = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n containerStyle.overflow = 'auto';\n }\n\n const hideToolbar = toolbar === false;\n const toolbarConfig = toolbar === false || toolbar === undefined\n ? undefined\n : (Array.isArray(toolbar) ? toolbar as import('../types/public').EditorToolbarConfig : undefined);\n\n return (\n <div style={containerStyle}>\n <EditorCore\n engine={engine}\n placeholder={placeholder}\n className={className}\n readOnly={readOnly}\n onHTMLChange={(html) => {\n lastExternalValueRef.current = html;\n onChange?.(html);\n }}\n onFocus={onFocus}\n onBlur={onBlur}\n hideToolbar={hideToolbar}\n toolbarConfig={toolbarConfig}\n onUploadImage={onUploadImage}\n />\n </div>\n );\n});\n\nEditor.displayName = 'Editor';\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/editor/core/DocumentModel.ts","../src/editor/core/Transaction.ts","../src/editor/core/EditorEngine.ts","../src/hooks/useEditorState.ts","../src/editor/rendering/DOMRenderer.ts","../src/editor/selection/SelectionEngine.ts","../src/editor/serialization/HTMLSerializer.ts","../src/editor/plugins/PastePlugin.ts","../src/editor/commands/index.ts","../src/components/toolbar/ToolbarButton.tsx","../src/components/toolbar/AlignmentDropdown.tsx","../src/components/toolbar/FontSizeDropdown.tsx","../src/components/toolbar/FontFamilyDropdown.tsx","../src/components/toolbar/BackgroundColorDropdown.tsx","../src/components/toolbar/TextColorDropdown.tsx","../src/components/toolbar/HorizontalRuleButton.tsx","../src/components/toolbar/ChecklistButton.tsx","../src/editor/table/TableModel.ts","../src/editor/table/TableCommands.ts","../src/components/toolbar/TableButton.tsx","../src/components/toolbar/ImageUploadButton.tsx","../src/data/specialCharacters.ts","../src/components/toolbar/SpecialCharactersButton.tsx","../src/components/toolbar/CodeBlockButton.tsx","../src/components/toolbar/SourceEditingButton.tsx","../src/editor/history/HistoryManager.ts","../src/components/toolbar/toolbarConfig.ts","../src/components/toolbar/Toolbar.tsx","../src/editor/search/SearchEngine.ts","../src/editor/search/SearchCommands.ts","../src/components/FindReplaceModal.tsx","../src/components/TableContextMenu.tsx","../src/components/toolbar/TableToolbar.tsx","../src/components/toolbar/ImageToolbar.tsx","../src/editor/serialization/JSONSerializer.ts","../src/components/EditorCore.tsx","../src/editor/table/TablePlugin.ts","../src/hooks/useEditorEngine.ts","../src/editor/serialization/MarkdownSerializer.ts","../src/editor/commands/CommandRegistry.ts","../src/components/Editor.tsx"],"names":["newTextNode","result","useSyncExternalStore","node","items","_a","_b","state","sel","tr","e","mergedChildren","escapeAttr","escapeHTML","html","setBlockType","listNode","blockNode","jsx","useState","useRef","useEffect","jsxs","ChevronDownIcon","CheckIcon","useCallback","Fragment","PRESET_COLORS","normalizeHex","RemoveColorIcon","Swatch","hexInputToPreview","isLight","_","useMemo","createPortal","label","Divider","useLayoutEffect","handleDelete","Btn","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","Sep","fig","pos","forwardRef","Editor","useImperativeHandle"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * DocumentModel\n *\n * Provides utilities for navigating, reading, and immutably modifying the\n * document tree. None of these functions mutate their inputs — they always\n * return new objects. This is the single source of truth for document shape.\n *\n * Architecture note:\n * The document is a tree: doc → [block] → [block | text]*\n * All positions are expressed as (path, offset) pairs, not DOM positions.\n * This makes every operation deterministic and testable outside the browser.\n */\n\nimport type {\n Document,\n EditorNode,\n BlockNode,\n TextNode,\n Mark,\n MarkType,\n NodePosition,\n BlockNodeType,\n NodeAttrs,\n} from '../../types';\n\n// ─── Predicates ──────────────────────────────────────────────────────────────\n\nexport function isTextNode(node: EditorNode): node is TextNode {\n return node.type === 'text';\n}\n\nexport function isBlockNode(node: EditorNode): node is BlockNode {\n return node.type !== 'text';\n}\n\n/**\n * Container blocks hold other blocks (not inline content directly).\n * Used to skip past list wrappers when finding the \"content block\" a cursor is in.\n */\nexport function isContainerBlock(type: string): boolean {\n return (\n type === 'bullet_list' || type === 'ordered_list' || type === 'check_list' ||\n type === 'table' || type === 'table_row' || type === 'table_cell' || type === 'table_header' ||\n type === 'doc'\n );\n}\n\n// ─── Path & Position Comparison ───────────────────────────────────────────────\n\n/**\n * Compare two paths in document order.\n * [0] < [0,0] < [0,1] < [1]\n * Returns -1 if a < b, 0 if equal, 1 if a > b.\n */\nexport function comparePaths(a: number[], b: number[]): -1 | 0 | 1 {\n const min = Math.min(a.length, b.length);\n for (let i = 0; i < min; i++) {\n if (a[i] < b[i]) return -1;\n if (a[i] > b[i]) return 1;\n }\n if (a.length < b.length) return -1;\n if (a.length > b.length) return 1;\n return 0;\n}\n\nexport function comparePositions(a: NodePosition, b: NodePosition): -1 | 0 | 1 {\n const c = comparePaths(a.path, b.path);\n if (c !== 0) return c;\n if (a.offset < b.offset) return -1;\n if (a.offset > b.offset) return 1;\n return 0;\n}\n\n/**\n * Return from/to in document order (from ≤ to).\n */\nexport function normalizeRange(\n from: NodePosition,\n to: NodePosition,\n): { from: NodePosition; to: NodePosition } {\n return comparePositions(from, to) <= 0 ? { from, to } : { from: to, to: from };\n}\n\n/**\n * Walk up the path to find the deepest *content* block containing it.\n * Skips container blocks (bullet_list, ordered_list, doc).\n * Used by commands to find the block to set type on, split, etc.\n */\nexport function findContentBlockPath(doc: Document, path: number[]): number[] | null {\n for (let depth = path.length; depth >= 1; depth--) {\n const candidate = path.slice(0, depth);\n const node = getNodeAtPath(doc, candidate);\n if (!node) continue;\n if (isTextNode(node as EditorNode)) continue;\n if (isContainerBlock((node as EditorNode).type)) continue;\n return candidate;\n }\n return null;\n}\n\n// ─── Navigation ──────────────────────────────────────────────────────────────\n\n/**\n * Walk a path through the document to retrieve a node.\n * path=[] returns the doc root itself.\n * path=[0] returns doc.children[0].\n * path=[0,2] returns doc.children[0].children[2].\n */\nexport function getNodeAtPath(doc: Document, path: number[]): EditorNode | Document | null {\n if (path.length === 0) return doc;\n let current: EditorNode | Document = doc;\n for (const idx of path) {\n if (isTextNode(current as EditorNode)) return null;\n const block = current as BlockNode | Document;\n const children = (block as BlockNode).children ?? (block as Document).children;\n if (!children || idx >= children.length) return null;\n current = children[idx];\n }\n return current;\n}\n\n/**\n * Immutably replace the node at path with a new node.\n * Uses structural sharing: only nodes on the path are copied.\n */\nexport function setNodeAtPath(\n doc: Document,\n path: number[],\n newNode: EditorNode,\n): Document {\n if (path.length === 0) {\n // Replacing the root — caller should use replaceDoc step instead\n return doc;\n }\n return setChildAtPath(doc, path, newNode) as Document;\n}\n\nfunction setChildAtPath(\n node: Document | EditorNode,\n path: number[],\n newNode: EditorNode,\n): Document | EditorNode {\n if (path.length === 0) return newNode;\n\n const [idx, ...rest] = path;\n const parent = node as BlockNode | Document;\n const children = [...(parent.children as EditorNode[])];\n children[idx] = setChildAtPath(children[idx], rest, newNode) as EditorNode;\n\n if ((node as Document).type === 'doc') {\n return { ...(node as Document), children: children as BlockNode[] };\n }\n return { ...(node as BlockNode), children };\n}\n\n/**\n * Insert a node into a parent's children array at a given index.\n */\nexport function insertNodeAtPath(\n doc: Document,\n parentPath: number[],\n index: number,\n newNode: EditorNode,\n): Document {\n const parent = getNodeAtPath(doc, parentPath);\n if (!parent || isTextNode(parent as EditorNode)) return doc;\n\n const block = parent as BlockNode | Document;\n const children = [...(block.children as EditorNode[])];\n children.splice(index, 0, newNode);\n\n if (parentPath.length === 0) {\n return { ...(doc as Document), children: children as BlockNode[] };\n }\n\n const updatedParent: EditorNode = { ...(block as BlockNode), children };\n return setNodeAtPath(doc, parentPath, updatedParent);\n}\n\n/**\n * Remove the node at path from the tree.\n */\nexport function removeNodeAtPath(doc: Document, path: number[]): Document {\n if (path.length === 0) return doc;\n const parentPath = path.slice(0, -1);\n const idx = path[path.length - 1];\n\n const parent = getNodeAtPath(doc, parentPath);\n if (!parent || isTextNode(parent as EditorNode)) return doc;\n\n const block = parent as BlockNode | Document;\n const children = [...(block.children as EditorNode[])];\n children.splice(idx, 1);\n\n if (parentPath.length === 0) {\n return { ...doc, children: children as BlockNode[] };\n }\n\n const updatedParent: EditorNode = { ...(block as BlockNode), children };\n return setNodeAtPath(doc, parentPath, updatedParent);\n}\n\n// ─── Text Manipulation ────────────────────────────────────────────────────────\n\n/**\n * Insert text at offset inside a TextNode at path, applying marks.\n * If the path points to a block node (e.g. empty paragraph), a new text node\n * is created and inserted as the first child, then text is placed inside it.\n * Returns the modified document AND the resolved path to the text node\n * (callers use this to correctly advance the cursor).\n */\nexport function insertTextAtPath(\n doc: Document,\n path: number[],\n offset: number,\n text: string,\n marks: Mark[],\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node) return doc;\n\n // ── Path points to a block node (empty paragraph, etc.) ──────────────────\n if (!isTextNode(node as EditorNode)) {\n const block = node as BlockNode;\n // Find or create the first text child\n if (block.children.length === 0) {\n // Truly empty block: create a new text node\n const newTextNode: TextNode = { type: 'text', text, marks };\n return setNodeAtPath(doc, path, { ...block, children: [newTextNode] });\n }\n // Has children: delegate to the first text child\n const firstTextIdx = block.children.findIndex((c) => isTextNode(c));\n if (firstTextIdx !== -1) {\n return insertTextAtPath(doc, [...path, firstTextIdx], offset, text, marks);\n }\n // No text children but has block children: prepend a new text node\n const newTextNode: TextNode = { type: 'text', text, marks };\n const updated: BlockNode = { ...block, children: [newTextNode, ...block.children] };\n return setNodeAtPath(doc, path, updated);\n }\n\n const textNode = node as TextNode;\n\n if (marksEqual(textNode.marks, marks)) {\n // Same marks: just splice the string in\n const newText = textNode.text.slice(0, offset) + text + textNode.text.slice(offset);\n return setNodeAtPath(doc, path, { ...textNode, text: newText });\n }\n\n // Different marks: split the text node into up to 3 parts\n const parentPath = path.slice(0, -1);\n const nodeIndex = path[path.length - 1];\n const before = textNode.text.slice(0, offset);\n const after = textNode.text.slice(offset);\n\n const newNodes: EditorNode[] = [];\n if (before) newNodes.push({ type: 'text', text: before, marks: textNode.marks });\n newNodes.push({ type: 'text', text, marks });\n if (after) newNodes.push({ type: 'text', text: after, marks: textNode.marks });\n\n // Remove the original node and insert the new parts\n let result = removeNodeAtPath(doc, path);\n for (let i = newNodes.length - 1; i >= 0; i--) {\n result = insertNodeAtPath(result, parentPath, nodeIndex, newNodes[i]);\n }\n return result;\n}\n\n/**\n * Delete characters in range [from, to) within a TextNode at path.\n */\nexport function deleteTextAtPath(\n doc: Document,\n path: number[],\n from: number,\n to: number,\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || !isTextNode(node as EditorNode)) return doc;\n const textNode = node as TextNode;\n const newText = textNode.text.slice(0, from) + textNode.text.slice(to);\n\n if (newText === '') {\n // Remove the empty text node entirely\n return removeNodeAtPath(doc, path);\n }\n return setNodeAtPath(doc, path, { ...textNode, text: newText });\n}\n\n// ─── Mark Application ─────────────────────────────────────────────────────────\n\n/**\n * Add a mark to an entire TextNode at path. Used internally; commands should\n * prefer applyMarkToRange for partial selections.\n */\nexport function addMarkToNode(doc: Document, path: number[], mark: Mark): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || !isTextNode(node as EditorNode)) return doc;\n const textNode = node as TextNode;\n\n if (textNode.marks.some((m) => m.type === mark.type)) return doc;\n return setNodeAtPath(doc, path, {\n ...textNode,\n marks: [...textNode.marks, mark],\n });\n}\n\n/**\n * Remove a mark from an entire TextNode at path. Internal — use removeMarkFromRange.\n */\nexport function removeMarkFromNode(\n doc: Document,\n path: number[],\n markType: MarkType,\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || !isTextNode(node as EditorNode)) return doc;\n const textNode = node as TextNode;\n return setNodeAtPath(doc, path, {\n ...textNode,\n marks: textNode.marks.filter((m) => m.type !== markType),\n });\n}\n\n/**\n * Split a TextNode at a character offset, producing two adjacent text nodes\n * that share the original's marks. Returns the path to each half.\n * If offset is at a boundary, no split is performed.\n */\nexport function splitTextNodeAt(\n doc: Document,\n path: number[],\n offset: number,\n): { doc: Document; firstPath: number[]; secondPath: number[] } {\n const node = getNodeAtPath(doc, path);\n if (!node || !isTextNode(node as EditorNode)) {\n return { doc, firstPath: path, secondPath: path };\n }\n const textNode = node as TextNode;\n\n const parentPath = path.slice(0, -1);\n const idx = path[path.length - 1];\n\n if (offset <= 0) {\n return { doc, firstPath: path, secondPath: path };\n }\n if (offset >= textNode.text.length) {\n return { doc, firstPath: path, secondPath: [...parentPath, idx + 1] };\n }\n\n const firstNode: TextNode = {\n type: 'text',\n text: textNode.text.slice(0, offset),\n marks: textNode.marks,\n };\n const secondNode: TextNode = {\n type: 'text',\n text: textNode.text.slice(offset),\n marks: textNode.marks,\n };\n\n let result = setNodeAtPath(doc, path, firstNode);\n result = insertNodeAtPath(result, parentPath, idx + 1, secondNode);\n\n return { doc: result, firstPath: path, secondPath: [...parentPath, idx + 1] };\n}\n\n/**\n * Apply (or remove) a mark across an arbitrary text range.\n * Splits text nodes at the range boundaries when offsets fall mid-node,\n * then mutates the marks of every text node strictly inside the range.\n */\nexport function applyMarkToRange(\n doc: Document,\n from: NodePosition,\n to: NodePosition,\n mark: Mark,\n): Document {\n return mutateMarksInRange(doc, from, to, (marks) =>\n marks.some((m) => m.type === mark.type) ? marks : [...marks, mark],\n );\n}\n\nexport function removeMarkFromRange(\n doc: Document,\n from: NodePosition,\n to: NodePosition,\n markType: MarkType,\n): Document {\n return mutateMarksInRange(doc, from, to, (marks) =>\n marks.filter((m) => m.type !== markType),\n );\n}\n\n/**\n * Atomically replace a mark type across a range in one pass.\n * If mark is null, the mark type is removed from every node in the range.\n * This avoids the path-shift bug that occurs when remove_mark + add_mark\n * steps are used separately in sequence.\n */\nexport function setMarkOnRange(\n doc: Document,\n from: NodePosition,\n to: NodePosition,\n markType: MarkType,\n mark: Mark | null,\n): Document {\n return mutateMarksInRange(doc, from, to, (marks) => {\n const filtered = marks.filter((m) => m.type !== markType);\n return mark ? [...filtered, mark] : filtered;\n });\n}\n\nfunction mutateMarksInRange(\n doc: Document,\n rawFrom: NodePosition,\n rawTo: NodePosition,\n mutate: (marks: Mark[]) => Mark[],\n): Document {\n const { from, to } = normalizeRange(rawFrom, rawTo);\n\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return doc;\n\n let result = doc;\n\n // Iterate in reverse so splitting earlier nodes doesn't shift later paths.\n for (let i = nodes.length - 1; i >= 0; i--) {\n const { path, node } = nodes[i];\n const isFirst = i === 0;\n const isLast = i === nodes.length - 1;\n\n let markPath = path;\n\n if (isLast && comparePaths(path, to.path) === 0 && to.offset < node.text.length) {\n const split = splitTextNodeAt(result, path, to.offset);\n result = split.doc;\n markPath = split.firstPath;\n }\n\n if (isFirst && comparePaths(path, from.path) === 0 && from.offset > 0) {\n const split = splitTextNodeAt(result, markPath, from.offset);\n result = split.doc;\n markPath = split.secondPath;\n }\n\n const target = getNodeAtPath(result, markPath);\n if (target && isTextNode(target as EditorNode)) {\n const t = target as TextNode;\n const newMarks = mutate(t.marks);\n result = setNodeAtPath(result, markPath, { ...t, marks: newMarks });\n }\n }\n\n return mergeAdjacentTextNodesInDoc(result);\n}\n\n/**\n * Walk the doc and merge consecutive text-node siblings that share identical marks.\n * Called after mark/delete operations to keep the model tidy.\n */\nexport function mergeAdjacentTextNodesInDoc(doc: Document): Document {\n function mergeChildren(children: EditorNode[]): EditorNode[] {\n const merged: EditorNode[] = [];\n for (const child of children) {\n if (isTextNode(child)) {\n const last = merged[merged.length - 1];\n if (last && isTextNode(last) && marksEqual(last.marks, child.marks)) {\n merged[merged.length - 1] = { ...last, text: last.text + child.text };\n continue;\n }\n merged.push(child);\n } else {\n const block = child as BlockNode;\n merged.push({ ...block, children: mergeChildren(block.children) });\n }\n }\n return merged;\n }\n\n return { ...doc, children: mergeChildren(doc.children) as BlockNode[] };\n}\n\n/**\n * Delete the text in [from, to). Handles three cases:\n * 1. Both positions in the same text node → splice the string.\n * 2. Both positions in the same content block but different text nodes →\n * trim the from-node tail, remove middle nodes, trim the to-node head.\n * 3. Positions in different content blocks → trim each end, remove blocks in\n * between, then join the surviving blocks.\n * Returns the new document and the resulting collapsed cursor position.\n */\nexport function deleteRange(\n doc: Document,\n rawFrom: NodePosition,\n rawTo: NodePosition,\n): { doc: Document; cursor: NodePosition } {\n const { from, to } = normalizeRange(rawFrom, rawTo);\n if (comparePositions(from, to) === 0) return { doc, cursor: from };\n\n // Case 1: same text node\n if (comparePaths(from.path, to.path) === 0) {\n const node = getNodeAtPath(doc, from.path);\n if (node && isTextNode(node as EditorNode)) {\n const t = node as TextNode;\n const newText = t.text.slice(0, from.offset) + t.text.slice(to.offset);\n const result =\n newText === ''\n ? removeNodeAtPath(doc, from.path)\n : setNodeAtPath(doc, from.path, { ...t, text: newText });\n return {\n doc: mergeAdjacentTextNodesInDoc(result),\n cursor: { path: from.path, offset: from.offset },\n };\n }\n return { doc, cursor: from };\n }\n\n const fromBlockPath = findContentBlockPath(doc, from.path);\n const toBlockPath = findContentBlockPath(doc, to.path);\n if (!fromBlockPath || !toBlockPath) return { doc, cursor: from };\n\n // Case 2: same content block, different text nodes\n if (comparePaths(fromBlockPath, toBlockPath) === 0) {\n const result = deleteWithinBlock(doc, from, to);\n return {\n doc: mergeAdjacentTextNodesInDoc(result),\n cursor: { path: from.path, offset: from.offset },\n };\n }\n\n // Case 3: cross-block delete + join\n let result = doc;\n result = trimBlockAfter(result, fromBlockPath, from);\n const toBlockPathAfter = toBlockPath;\n result = trimBlockBefore(result, toBlockPathAfter, to);\n result = removeBlocksBetween(result, fromBlockPath, toBlockPathAfter);\n\n // For same-depth same-parent blocks, join at that level.\n // For cross-depth (e.g. list_item[0,0] → paragraph[N]), join at the top level\n // so the to-block's content merges into the from-block's top-level ancestor.\n const sameLevelSameParent =\n fromBlockPath.length === toBlockPath.length &&\n JSON.stringify(fromBlockPath.slice(0, -1)) === JSON.stringify(toBlockPath.slice(0, -1));\n const joinPath = sameLevelSameParent\n ? [...fromBlockPath.slice(0, -1), fromBlockPath[fromBlockPath.length - 1] + 1]\n : [fromBlockPath[0] + 1];\n result = joinBlocks(result, joinPath);\n\n return {\n doc: mergeAdjacentTextNodesInDoc(result),\n cursor: { path: from.path, offset: from.offset },\n };\n}\n\nfunction deleteWithinBlock(doc: Document, from: NodePosition, to: NodePosition): Document {\n let result = doc;\n\n // Step 1: trim to-node head (remove [0, to.offset))\n const toNode = getNodeAtPath(result, to.path);\n if (toNode && isTextNode(toNode as EditorNode)) {\n const t = toNode as TextNode;\n if (to.offset >= t.text.length) {\n result = removeNodeAtPath(result, to.path);\n } else if (to.offset > 0) {\n result = setNodeAtPath(result, to.path, { ...t, text: t.text.slice(to.offset) });\n }\n }\n\n // Step 2: remove all text nodes strictly between from.path and to.path (exclusive)\n // We re-fetch each pass since paths shift after each removal. Walk in reverse.\n const between = collectPathsStrictlyBetween(result, from.path, to.path);\n for (let i = between.length - 1; i >= 0; i--) {\n result = removeNodeAtPath(result, between[i]);\n }\n\n // Step 3: trim from-node tail (remove [from.offset, end))\n const fromNode = getNodeAtPath(result, from.path);\n if (fromNode && isTextNode(fromNode as EditorNode)) {\n const t = fromNode as TextNode;\n if (from.offset <= 0) {\n result = removeNodeAtPath(result, from.path);\n } else if (from.offset < t.text.length) {\n result = setNodeAtPath(result, from.path, { ...t, text: t.text.slice(0, from.offset) });\n }\n }\n\n return result;\n}\n\nfunction collectPathsStrictlyBetween(\n doc: Document,\n from: number[],\n to: number[],\n): number[][] {\n const results: number[][] = [];\n walkDocument(doc, (node, path) => {\n if (!isTextNode(node as EditorNode)) return;\n if (comparePaths(path, from) > 0 && comparePaths(path, to) < 0) {\n results.push([...path]);\n }\n });\n return results;\n}\n\nfunction trimBlockAfter(doc: Document, blockPath: number[], from: NodePosition): Document {\n let result = doc;\n // Trim from-node tail\n const fromNode = getNodeAtPath(result, from.path);\n if (fromNode && isTextNode(fromNode as EditorNode)) {\n const t = fromNode as TextNode;\n if (from.offset <= 0) {\n result = removeNodeAtPath(result, from.path);\n } else if (from.offset < t.text.length) {\n result = setNodeAtPath(result, from.path, { ...t, text: t.text.slice(0, from.offset) });\n }\n }\n // Remove later children of the block (after from.path within blockPath)\n const block = getNodeAtPath(result, blockPath);\n if (block && !isTextNode(block as EditorNode)) {\n const b = block as BlockNode;\n const fromChildIdx = from.path[blockPath.length];\n const keep = b.children.slice(0, fromChildIdx + 1);\n result = setNodeAtPath(result, blockPath, { ...b, children: keep });\n }\n return result;\n}\n\nfunction trimBlockBefore(doc: Document, blockPath: number[], to: NodePosition): Document {\n let result = doc;\n // Trim to-node head\n const toNode = getNodeAtPath(result, to.path);\n if (toNode && isTextNode(toNode as EditorNode)) {\n const t = toNode as TextNode;\n if (to.offset >= t.text.length) {\n result = removeNodeAtPath(result, to.path);\n } else if (to.offset > 0) {\n result = setNodeAtPath(result, to.path, { ...t, text: t.text.slice(to.offset) });\n }\n }\n // Remove earlier children of the block (before to.path within blockPath)\n const block = getNodeAtPath(result, blockPath);\n if (block && !isTextNode(block as EditorNode)) {\n const b = block as BlockNode;\n const toChildIdx = to.path[blockPath.length];\n const keep = b.children.slice(toChildIdx);\n result = setNodeAtPath(result, blockPath, { ...b, children: keep });\n }\n return result;\n}\n\nfunction removeBlocksBetween(doc: Document, fromBlockPath: number[], toBlockPath: number[]): Document {\n const fromTop = fromBlockPath[0];\n const toTop = toBlockPath[0];\n\n // Cross-depth or different top-level ancestors: remove top-level blocks strictly\n // between fromTop and toTop so the join step can merge the survivors.\n if (fromBlockPath.length !== toBlockPath.length || fromTop !== toTop) {\n let result = doc;\n for (let i = toTop - 1; i > fromTop; i--) {\n result = removeNodeAtPath(result, [i]);\n }\n return result;\n }\n\n // Same depth, same top-level ancestor: remove siblings strictly between the two paths.\n const parent = fromBlockPath.slice(0, -1);\n for (let i = 0; i < parent.length; i++) {\n if (parent[i] !== toBlockPath[i]) return doc;\n }\n const fromIdx = fromBlockPath[fromBlockPath.length - 1];\n const toIdx = toBlockPath[toBlockPath.length - 1];\n let result = doc;\n for (let i = toIdx - 1; i > fromIdx; i--) {\n result = removeNodeAtPath(result, [...parent, i]);\n }\n return result;\n}\n\n// ─── Block Manipulation ───────────────────────────────────────────────────────\n\n/**\n * Split a block at a character offset (measured in flat text of the block).\n * Preserves marks: each side keeps the formatting it had.\n * The second block's type is decided by SPLIT_TYPE_RULES (e.g. heading → paragraph,\n * list_item → list_item).\n */\nexport function splitBlock(doc: Document, path: number[], offset: number): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || isTextNode(node as EditorNode)) return doc;\n const block = node as BlockNode;\n\n const { left, right } = splitChildrenAtOffset(block.children, offset);\n\n const secondType: BlockNodeType = SPLIT_TYPE_RULES[block.type] ?? 'paragraph';\n const firstBlock: BlockNode = { ...block, children: left };\n const secondBlock: BlockNode = {\n type: secondType,\n attrs: secondType === block.type ? { ...block.attrs } : {},\n children: right,\n };\n\n const parentPath = path.slice(0, -1);\n const blockIndex = path[path.length - 1];\n\n let result = removeNodeAtPath(doc, path);\n result = insertNodeAtPath(result, parentPath, blockIndex, secondBlock);\n result = insertNodeAtPath(result, parentPath, blockIndex, firstBlock);\n return result;\n}\n\n/**\n * When you press Enter inside a block of `type`, the *new* block created below\n * should be of this type. Most content blocks split into a paragraph; lists\n * and code blocks continue as the same type.\n */\nconst SPLIT_TYPE_RULES: Partial<Record<BlockNodeType, BlockNodeType>> = {\n paragraph: 'paragraph',\n heading: 'paragraph',\n blockquote: 'paragraph',\n list_item: 'list_item',\n check_list_item: 'check_list_item',\n code_block: 'code_block',\n};\n\n/**\n * Split a children array into two halves at a flat text offset, preserving marks.\n * Text nodes that span the split point are sliced; both halves keep the original marks.\n */\nfunction splitChildrenAtOffset(\n children: EditorNode[],\n offset: number,\n): { left: EditorNode[]; right: EditorNode[] } {\n const left: EditorNode[] = [];\n const right: EditorNode[] = [];\n let consumed = 0;\n let done = false;\n\n for (const child of children) {\n if (done) {\n right.push(child);\n continue;\n }\n if (isTextNode(child)) {\n const len = child.text.length;\n if (consumed + len <= offset) {\n left.push(child);\n consumed += len;\n continue;\n }\n const cut = offset - consumed;\n if (cut > 0) {\n left.push({ ...child, text: child.text.slice(0, cut) });\n }\n if (cut < len) {\n right.push({ ...child, text: child.text.slice(cut) });\n }\n done = true;\n } else {\n // Non-text child: keep on left until offset is reached, then on right.\n // For mixed content blocks we don't try to split inside an inline block.\n const len = collectText(child as BlockNode).length;\n if (consumed + len <= offset) {\n left.push(child);\n consumed += len;\n } else {\n right.push(child);\n done = true;\n }\n }\n }\n\n return { left, right };\n}\n\n/**\n * Join the block at path with the previous sibling block.\n */\nexport function joinBlocks(doc: Document, path: number[]): Document {\n const idx = path[path.length - 1];\n if (idx === 0) return doc;\n\n const parentPath = path.slice(0, -1);\n const prevPath = [...parentPath, idx - 1];\n\n const prevNode = getNodeAtPath(doc, prevPath);\n const curNode = getNodeAtPath(doc, path);\n\n if (\n !prevNode ||\n !curNode ||\n isTextNode(prevNode as EditorNode) ||\n isTextNode(curNode as EditorNode)\n )\n return doc;\n\n const prevBlock = prevNode as BlockNode;\n const curBlock = curNode as BlockNode;\n\n const mergedChildren = [...prevBlock.children, ...curBlock.children];\n const mergedBlock: BlockNode = { ...prevBlock, children: mergedChildren };\n\n let result = removeNodeAtPath(doc, path);\n result = setNodeAtPath(result, prevPath, mergedBlock);\n return mergeAdjacentTextNodesInDoc(result);\n}\n\n/**\n * Merge attrs into a block node without changing its type.\n * Values in `attrs` override existing attrs; keys set to undefined are removed.\n */\nexport function setNodeAttrs(\n doc: Document,\n path: number[],\n attrs: NodeAttrs,\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || isTextNode(node as EditorNode)) return doc;\n const block = node as BlockNode;\n // Merge: explicit undefined values remove the key\n const merged: NodeAttrs = { ...block.attrs };\n for (const [k, v] of Object.entries(attrs)) {\n if (v === undefined) {\n delete merged[k];\n } else {\n merged[k] = v;\n }\n }\n return setNodeAtPath(doc, path, { ...block, attrs: merged });\n}\n\n/**\n * Change the type of a block node.\n */\nexport function setBlockType(\n doc: Document,\n path: number[],\n nodeType: BlockNodeType,\n attrs: NodeAttrs = {},\n): Document {\n const node = getNodeAtPath(doc, path);\n if (!node || isTextNode(node as EditorNode)) return doc;\n const block = node as BlockNode;\n return setNodeAtPath(doc, path, { ...block, type: nodeType, attrs: { ...block.attrs, ...attrs } });\n}\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Flatten all text content of a block node into a single string.\n */\nexport function collectText(node: BlockNode | Document): string {\n return (node.children as EditorNode[])\n .map((child) => {\n if (isTextNode(child)) return child.text;\n if (isBlockNode(child)) return collectText(child as BlockNode);\n return '';\n })\n .join('');\n}\n\n/**\n * Check if two mark arrays are equivalent (type AND attrs must match).\n * Attrs comparison prevents adjacent text nodes with different font-size/link\n * marks from being incorrectly merged into one.\n */\nexport function marksEqual(a: Mark[], b: Mark[]): boolean {\n if (a.length !== b.length) return false;\n const sortedA = [...a].sort((x, y) => x.type.localeCompare(y.type));\n const sortedB = [...b].sort((x, y) => x.type.localeCompare(y.type));\n return sortedA.every((m, i) => {\n if (m.type !== sortedB[i].type) return false;\n const aAttrs = m.attrs ?? {};\n const bAttrs = sortedB[i].attrs ?? {};\n const aKeys = Object.keys(aAttrs);\n const bKeys = Object.keys(bAttrs);\n if (aKeys.length !== bKeys.length) return false;\n return aKeys.every((k) => aAttrs[k] === bAttrs[k]);\n });\n}\n\n/**\n * Create an empty paragraph block.\n */\nexport function createParagraph(text = ''): BlockNode {\n return {\n type: 'paragraph',\n attrs: {},\n children: text ? [{ type: 'text', text, marks: [] }] : [],\n };\n}\n\n/**\n * Create an empty document.\n */\nexport function createEmptyDocument(): Document {\n return {\n type: 'doc',\n children: [createParagraph()],\n };\n}\n\n/**\n * Walk every node in the document (depth-first), calling visitor.\n * Visitor receives (node, path). Return false to stop traversal.\n */\nexport function walkDocument(\n doc: Document,\n visitor: (node: EditorNode | Document, path: number[]) => boolean | void,\n): void {\n function walk(node: EditorNode | Document, path: number[]): boolean {\n const result = visitor(node, path);\n if (result === false) return false;\n\n if (!isTextNode(node as EditorNode)) {\n const parent = node as BlockNode | Document;\n const children = parent.children as EditorNode[];\n for (let i = 0; i < children.length; i++) {\n if (!walk(children[i], [...path, i])) return false;\n }\n }\n return true;\n }\n walk(doc, []);\n}\n\n/**\n * Walk the document and collect all unique values of a specific mark attribute.\n * Used to populate \"Document colors\" sections in color pickers.\n * Returns values in first-seen order, deduplicated.\n */\nexport function getDocumentMarkAttrValues(\n doc: Document,\n markType: MarkType,\n attrKey: string,\n): string[] {\n const seen = new Set<string>();\n walkDocument(doc, (node) => {\n if (!isTextNode(node as EditorNode)) return;\n const m = (node as TextNode).marks.find((mk) => mk.type === markType);\n const v = m?.attrs?.[attrKey];\n if (typeof v === 'string' && v) seen.add(v);\n });\n return [...seen];\n}\n\n/**\n * Compute the total text length of the document (sum of all text nodes).\n */\nexport function getDocumentLength(doc: Document): number {\n let len = 0;\n walkDocument(doc, (node) => {\n if (isTextNode(node as EditorNode)) {\n len += (node as TextNode).text.length;\n }\n });\n return len;\n}\n\n/**\n * Return the absolute character offset of `nodePos` within its immediate parent block.\n * Used to map positions through text-node splits caused by mark operations.\n */\nexport function getCharOffsetInBlock(\n doc: Document,\n blockPath: number[],\n nodePos: NodePosition,\n): number {\n const block = getNodeAtPath(doc, blockPath);\n if (!block || !('children' in block)) return nodePos.offset;\n const children = (block as BlockNode).children;\n const targetIdx = nodePos.path[blockPath.length] ?? 0;\n let offset = 0;\n for (let i = 0; i < targetIdx && i < children.length; i++) {\n const child = children[i];\n if (isTextNode(child as EditorNode)) offset += (child as TextNode).text.length;\n }\n return offset + nodePos.offset;\n}\n\n/**\n * Inverse of getCharOffsetInBlock — find the (path, offset) in `newDoc` that\n * corresponds to a given character offset within a block. Handles the case\n * where text nodes were split/merged since the char offset was captured.\n */\nexport function getPosFromCharOffset(\n newDoc: Document,\n blockPath: number[],\n charOffset: number,\n): NodePosition {\n const block = getNodeAtPath(newDoc, blockPath);\n if (!block || !('children' in block)) return { path: [...blockPath, 0], offset: charOffset };\n const children = (block as BlockNode).children;\n let remaining = charOffset;\n for (let i = 0; i < children.length; i++) {\n const child = children[i];\n if (!isTextNode(child as EditorNode)) continue;\n const len = (child as TextNode).text.length;\n if (remaining <= len) return { path: [...blockPath, i], offset: remaining };\n remaining -= len;\n }\n // Clamp to end of last text node\n for (let i = children.length - 1; i >= 0; i--) {\n const child = children[i];\n if (isTextNode(child as EditorNode)) {\n return { path: [...blockPath, i], offset: (child as TextNode).text.length };\n }\n }\n return { path: [...blockPath, 0], offset: 0 };\n}\n\n/**\n * Find all text nodes that fall within a selection range (inclusive of both ends).\n * Caller must pass `from` and `to` in document order; use normalizeRange first.\n */\nexport function getTextNodesBetween(\n doc: Document,\n from: NodePosition,\n to: NodePosition,\n): Array<{ path: number[]; node: TextNode }> {\n const results: Array<{ path: number[]; node: TextNode }> = [];\n\n walkDocument(doc, (node, path) => {\n if (!isTextNode(node as EditorNode)) return;\n if (comparePaths(path, from.path) >= 0 && comparePaths(path, to.path) <= 0) {\n results.push({ path: [...path], node: node as TextNode });\n }\n });\n\n return results;\n}\n","/**\n * Transaction Engine\n *\n * A Transaction is a list of Steps applied atomically to produce a new\n * EditorState. This is the ONLY way state changes — never mutate state directly.\n *\n * Architecture (ProseMirror-inspired):\n * dispatch(transaction) → apply steps → new EditorState → notify listeners\n *\n * Why transactions?\n * 1. Undo/redo: store the inverse transaction, replay to undo.\n * 2. Plugins: intercept and modify transactions before apply.\n * 3. Collaboration: merge remote transactions via OT/CRDT.\n * 4. Debugging: log every change as a serializable step list.\n */\n\nimport type {\n EditorState,\n Transaction,\n Step,\n Document,\n EditorSelection,\n Mark,\n} from '../../types';\n\nimport {\n insertTextAtPath,\n deleteTextAtPath,\n insertNodeAtPath,\n removeNodeAtPath,\n splitBlock,\n joinBlocks,\n setBlockType,\n setNodeAttrs,\n applyMarkToRange,\n removeMarkFromRange,\n setMarkOnRange,\n deleteRange,\n getNodeAtPath,\n normalizeRange,\n getCharOffsetInBlock,\n getPosFromCharOffset,\n collectText,\n} from './DocumentModel';\n\nimport type { TextNode, NodePosition } from '../../types';\n\n// ─── Transaction Builder ──────────────────────────────────────────────────────\n\nlet txCounter = 0;\n\n/**\n * Create a new empty transaction.\n */\nexport function createTransaction(meta: Record<string, unknown> = {}): Transaction {\n return {\n id: `tx-${++txCounter}-${Date.now()}`,\n steps: [],\n meta,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Add a step to an existing transaction (returns a new transaction object).\n */\nexport function addStep(tr: Transaction, step: Step): Transaction {\n return { ...tr, steps: [...tr.steps, step] };\n}\n\n// ─── Apply Transaction ────────────────────────────────────────────────────────\n\n/**\n * Apply a transaction to the current state, producing a new state.\n * This is a pure function: same inputs → same output.\n */\nexport function applyTransaction(state: EditorState, tr: Transaction): EditorState {\n let doc = state.doc;\n let selection = state.selection;\n let marks = state.marks;\n\n for (const step of tr.steps) {\n switch (step.type) {\n case 'insert_text':\n doc = insertTextAtPath(doc, step.path, step.offset, step.text, step.marks);\n break;\n\n case 'delete_text':\n doc = deleteTextAtPath(doc, step.path, step.from, step.to);\n break;\n\n case 'delete_range': {\n const result = deleteRange(doc, step.from, step.to);\n doc = result.doc;\n selection = {\n anchor: result.cursor,\n focus: result.cursor,\n isCollapsed: true,\n };\n break;\n }\n\n case 'insert_node':\n doc = insertNodeAtPath(doc, step.parentPath, step.index, step.node);\n break;\n\n case 'delete_node':\n doc = removeNodeAtPath(doc, step.path);\n break;\n\n case 'split_block':\n doc = splitBlock(doc, step.path, step.offset);\n break;\n\n case 'join_blocks': {\n const joinIdx = step.path[step.path.length - 1];\n const prevPath = [...step.path.slice(0, -1), joinIdx - 1];\n const prevNode = getNodeAtPath(doc, prevPath);\n const prevTextLen = prevNode && 'children' in prevNode\n ? collectText(prevNode as import('../../types').BlockNode).length\n : 0;\n doc = joinBlocks(doc, step.path);\n const joinPos = getPosFromCharOffset(doc, prevPath, prevTextLen);\n selection = { anchor: joinPos, focus: joinPos, isCollapsed: true };\n break;\n }\n\n case 'set_node_type':\n doc = setBlockType(doc, step.path, step.nodeType, step.attrs);\n break;\n\n case 'set_node_attrs':\n doc = setNodeAttrs(doc, step.path, step.attrs);\n break;\n\n case 'add_mark':\n case 'remove_mark':\n case 'set_mark': {\n // Capture char-based positions before text-node splits so we can\n // restore the selection accurately after mergeAdjacentTextNodesInDoc.\n const { from: nFrom, to: nTo } = normalizeRange(step.from, step.to);\n const fromBlock = nFrom.path.slice(0, -1);\n const toBlock = nTo.path.slice(0, -1);\n const sameBlock = JSON.stringify(fromBlock) === JSON.stringify(toBlock);\n const fromChar = getCharOffsetInBlock(doc, fromBlock, nFrom);\n const toChar = sameBlock\n ? getCharOffsetInBlock(doc, toBlock, nTo)\n : getCharOffsetInBlock(doc, toBlock, nTo);\n\n if (step.type === 'add_mark') {\n doc = applyMarkToRange(doc, step.from, step.to, step.mark);\n } else if (step.type === 'remove_mark') {\n doc = removeMarkFromRange(doc, step.from, step.to, step.markType);\n } else {\n doc = setMarkOnRange(doc, step.from, step.to, step.markType, step.mark);\n }\n\n // Fix up selection so it spans the (possibly re-pathed) marked region.\n if (selection && !selection.isCollapsed) {\n const newFrom = getPosFromCharOffset(doc, fromBlock, fromChar);\n const newTo = getPosFromCharOffset(doc, toBlock, toChar);\n // Preserve anchor/focus direction from the original selection.\n const { from: origFrom } = normalizeRange(selection.anchor, selection.focus);\n const anchorWasFirst =\n JSON.stringify(origFrom) === JSON.stringify(selection.anchor);\n selection = {\n anchor: anchorWasFirst ? newFrom : newTo,\n focus: anchorWasFirst ? newTo : newFrom,\n isCollapsed: false,\n };\n }\n break;\n }\n\n case 'set_selection':\n selection = step.selection;\n // When cursor moves to a collapsed position, inherit marks from the\n // text node at the cursor so toolbar state reflects the context.\n if (selection && selection.isCollapsed) {\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && node.type === 'text') {\n marks = (node as TextNode).marks;\n }\n }\n break;\n\n case 'replace_doc':\n doc = step.doc;\n selection = null;\n break;\n\n default:\n console.warn('[EditorEngine] Unknown step type:', (step as Step).type);\n }\n }\n\n // Merge pending marks from the transaction if provided\n if (tr.meta.pendingMarks !== undefined) {\n marks = tr.meta.pendingMarks as Mark[];\n }\n\n return {\n doc,\n selection,\n marks,\n version: state.version + 1,\n };\n}\n\n// ─── Convenience Transaction Builders ─────────────────────────────────────────\n// These are helpers used by commands so commands don't need to know step shapes.\n\nexport function tr_insertText(\n path: number[],\n offset: number,\n text: string,\n marks: Mark[],\n): Step {\n return { type: 'insert_text', path, offset, text, marks };\n}\n\nexport function tr_deleteText(path: number[], from: number, to: number): Step {\n return { type: 'delete_text', path, from, to };\n}\n\nexport function tr_deleteRange(from: NodePosition, to: NodePosition): Step {\n return { type: 'delete_range', from, to };\n}\n\nexport function tr_splitBlock(path: number[], offset: number): Step {\n return { type: 'split_block', path, offset };\n}\n\nexport function tr_joinBlocks(path: number[]): Step {\n return { type: 'join_blocks', path };\n}\n\nexport function tr_setNodeType(\n path: number[],\n nodeType: import('../../types').BlockNodeType,\n attrs?: import('../../types').NodeAttrs,\n): Step {\n return { type: 'set_node_type', path, nodeType, attrs };\n}\n\nexport function tr_addMark(\n from: import('../../types').NodePosition,\n to: import('../../types').NodePosition,\n mark: Mark,\n): Step {\n return { type: 'add_mark', from, to, mark };\n}\n\nexport function tr_removeMark(\n from: import('../../types').NodePosition,\n to: import('../../types').NodePosition,\n markType: import('../../types').MarkType,\n): Step {\n return { type: 'remove_mark', from, to, markType };\n}\n\nexport function tr_setSelection(\n selection: EditorSelection | null,\n): Step {\n return { type: 'set_selection', selection };\n}\n\nexport function tr_replaceDoc(doc: Document): Step {\n return { type: 'replace_doc', doc };\n}\n\nexport function tr_setNodeAttrs(path: number[], attrs: import('../../types').NodeAttrs): Step {\n return { type: 'set_node_attrs', path, attrs };\n}\n\nexport function tr_setMark(\n from: import('../../types').NodePosition,\n to: import('../../types').NodePosition,\n markType: import('../../types').MarkType,\n mark: Mark | null,\n): Step {\n return { type: 'set_mark', from, to, markType, mark };\n}\n","/**\n * EditorEngine\n *\n * The central controller of the editor. It owns:\n * - the current EditorState (immutable)\n * - the plugin registry\n * - the subscriber list (React re-renders listen here)\n *\n * The engine is framework-agnostic. React hooks wrap it for component use.\n * This means the same engine could power a terminal editor, a native app, etc.\n *\n * Data flow:\n * User action → Command → Transaction → dispatch() → applyTransaction()\n * → new EditorState → notify subscribers → React re-render → DOM update\n *\n * The DOM is NEVER the source of truth. It is always derived from EditorState.\n */\n\nimport type {\n EditorState,\n Transaction,\n EditorPlugin,\n EditorEngineInterface,\n StateListener,\n} from '../../types';\n\nimport { applyTransaction, createTransaction } from './Transaction';\nimport { createEmptyDocument } from './DocumentModel';\n\nexport class EditorEngine implements EditorEngineInterface {\n private state: EditorState;\n private plugins: EditorPlugin[] = [];\n private listeners: Set<StateListener> = new Set();\n\n constructor(initialState?: Partial<EditorState>) {\n this.state = {\n doc: initialState?.doc ?? createEmptyDocument(),\n selection: initialState?.selection ?? null,\n marks: initialState?.marks ?? [],\n version: 0,\n };\n }\n\n // ─── State Access ───────────────────────────────────────────────────────────\n\n getState(): EditorState {\n return this.state;\n }\n\n // ─── Dispatch ───────────────────────────────────────────────────────────────\n\n /**\n * The single entry point for all state changes.\n *\n * 1. Let plugins intercept and transform the transaction.\n * 2. Apply the (possibly modified) transaction to produce a new state.\n * 3. Notify all subscribers.\n *\n * Transactions are synchronous. Never dispatch inside a plugin's onTransaction\n * handler (it would cause re-entrancy). Use setTimeout if you need deferred\n * dispatch (rare).\n */\n dispatch(tr: Transaction): void {\n // Plugin interception phase\n let intercepted = tr;\n for (const plugin of this.plugins) {\n if (plugin.onTransaction) {\n intercepted = plugin.onTransaction(intercepted, this.state);\n }\n }\n\n const prevState = this.state;\n this.state = applyTransaction(this.state, intercepted);\n\n // Notify plugins of state change\n for (const plugin of this.plugins) {\n if (plugin.onStateChange) {\n plugin.onStateChange(this.state, prevState);\n }\n }\n\n // Notify React subscribers\n for (const listener of this.listeners) {\n listener(this.state, prevState);\n }\n }\n\n // ─── Plugin Registry ────────────────────────────────────────────────────────\n\n registerPlugin(plugin: EditorPlugin): void {\n if (this.plugins.some((p) => p.name === plugin.name)) {\n console.warn(`[EditorEngine] Plugin \"${plugin.name}\" is already registered.`);\n return;\n }\n this.plugins.push(plugin);\n if (plugin.init) {\n plugin.init(this);\n }\n }\n\n getPlugin<T extends EditorPlugin>(name: string): T | undefined {\n return this.plugins.find((p) => p.name === name) as T | undefined;\n }\n\n getPlugins(): EditorPlugin[] {\n return [...this.plugins];\n }\n\n // ─── Subscriptions ──────────────────────────────────────────────────────────\n\n /**\n * Subscribe to state changes. Returns an unsubscribe function.\n * This is what React hooks use to trigger re-renders.\n */\n subscribe(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n // ─── Keyboard Dispatch ──────────────────────────────────────────────────────\n\n /**\n * Handle a keyboard event. Plugins register key bindings; the engine\n * tries them in registration order and stops at the first that returns true.\n */\n handleKeyDown(event: KeyboardEvent): boolean {\n const key = buildKeyString(event);\n\n for (const plugin of this.plugins) {\n if (plugin.keyBindings && plugin.keyBindings[key]) {\n const handled = plugin.keyBindings[key](this);\n if (handled) {\n event.preventDefault();\n return true;\n }\n }\n }\n return false;\n }\n\n // ─── Convenience ────────────────────────────────────────────────────────────\n\n /**\n * Create a new transaction. Commands call this before adding steps.\n */\n createTransaction(meta?: Record<string, unknown>): Transaction {\n return createTransaction(meta);\n }\n}\n\n/**\n * Build a canonical key string from a KeyboardEvent.\n * Examples: 'Ctrl+b', 'Shift+Alt+ArrowDown', 'Enter'\n */\nfunction buildKeyString(event: KeyboardEvent): string {\n const parts: string[] = [];\n if (event.ctrlKey || event.metaKey) parts.push('Ctrl');\n if (event.altKey) parts.push('Alt');\n if (event.shiftKey) parts.push('Shift');\n parts.push(event.key);\n return parts.join('+');\n}\n\n// ─── Singleton factory ────────────────────────────────────────────────────────\n\n/**\n * Create a new EditorEngine instance.\n * Each editor instance on the page gets its own engine.\n */\nexport function createEditorEngine(initialState?: Partial<EditorState>): EditorEngine {\n return new EditorEngine(initialState);\n}\n","/**\n * useEditorState\n *\n * Subscribes a React component to an EditorEngine and re-renders\n * whenever the state changes. This is the React integration layer.\n *\n * This hook uses React's useSyncExternalStore — the correct primitive\n * for subscribing to external mutable stores in React 18+.\n * It avoids the tearing issues of useEffect+setState patterns.\n */\n\n'use client';\n\nimport { useSyncExternalStore } from 'react';\nimport type { EditorEngine } from '../editor/core/EditorEngine';\nimport type { EditorState } from '../types';\n\nexport function useEditorState(engine: EditorEngine): EditorState {\n return useSyncExternalStore(\n (onStoreChange) => engine.subscribe(() => onStoreChange()),\n () => engine.getState(),\n () => engine.getState(), // server snapshot (SSR)\n );\n}\n","/**\n * DOMRenderer\n *\n * Converts our document model into DOM elements and keeps them in sync.\n *\n * Architecture:\n * renderDocument(doc, container) → wipes container, rebuilds DOM from scratch.\n *\n * Why rebuild instead of diff?\n * For this engine we use \"controlled full render\" — similar to how React\n * worked before the virtual DOM. For a production editor with very large\n * documents you would layer a diffing reconciler on top. For our purposes\n * the controlled render + cursor restoration pattern is correct and fast\n * enough for documents up to ~50,000 characters.\n *\n * The KEY contract of this renderer:\n * Every rendered element that corresponds to a TextNode gets:\n * data-path=\"[0,1,2]\" ← the path to that node in the document tree\n * This is what SelectionEngine uses to map between DOM and model positions.\n *\n * Marks map to HTML elements:\n * bold → <strong>\n * italic → <em>\n * underline → <u>\n * strikethrough → <s>\n * code → <code>\n * link → <a href=\"...\">\n * highlight → <mark>\n *\n * Block nodes map to:\n * paragraph → <p>\n * heading → <h1>...<h6>\n * blockquote → <blockquote>\n * bullet_list → <ul>\n * ordered_list→ <ol>\n * list_item → <li>\n * code_block → <pre><code>\n * image → <img>\n * hard_break → <br>\n */\n\nimport type {\n Document,\n EditorNode,\n BlockNode,\n TextNode,\n Mark,\n} from '../../types';\n\nimport { isTextNode, isBlockNode } from '../core/DocumentModel';\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Render the entire document into the container element.\n * Clears existing content and rebuilds from the model.\n */\nexport function renderDocument(doc: Document, container: HTMLElement): void {\n container.innerHTML = '';\n for (let i = 0; i < doc.children.length; i++) {\n const blockEl = renderBlock(doc.children[i], [i]);\n container.appendChild(blockEl);\n }\n}\n\n// ─── Block Rendering ──────────────────────────────────────────────────────────\n\nfunction renderBlock(node: BlockNode, path: number[]): HTMLElement {\n switch (node.type) {\n case 'paragraph':\n return renderParagraph(node, path);\n case 'heading':\n return renderHeading(node, path);\n case 'blockquote':\n return renderBlockquote(node, path);\n case 'bullet_list':\n return renderList(node, path, 'ul');\n case 'ordered_list':\n return renderList(node, path, 'ol');\n case 'list_item':\n return renderListItem(node, path);\n case 'code_block':\n return renderCodeBlock(node, path);\n case 'image':\n return renderImage(node, path);\n case 'hard_break':\n return renderHardBreak();\n case 'check_list':\n return renderCheckList(node, path);\n case 'check_list_item':\n return renderCheckListItem(node, path);\n case 'horizontal_rule':\n return renderHorizontalRule();\n case 'table':\n return renderTable(node, path);\n case 'table_row':\n return renderTableRow(node, path);\n case 'table_cell':\n return renderTableCell(node, path);\n case 'table_header':\n return renderTableHeader(node, path);\n default:\n return renderParagraph(node, path);\n }\n}\n\n// ─── Alignment ────────────────────────────────────────────────────────────────\n\nfunction alignClass(node: BlockNode): string {\n const align = node.attrs?.align as string | undefined;\n return align && align !== 'left' ? ` editor-align-${align}` : '';\n}\n\nfunction renderParagraph(node: BlockNode, path: number[]): HTMLElement {\n const el = document.createElement('p');\n el.dataset.blockPath = JSON.stringify(path);\n el.className = `editor-paragraph${alignClass(node)}`;\n renderChildren(node, path, el);\n if (el.innerHTML === '') {\n // Ensure empty paragraphs are clickable / show a cursor\n el.appendChild(document.createElement('br'));\n }\n return el;\n}\n\nfunction renderHeading(node: BlockNode, path: number[]): HTMLElement {\n const level = (node.attrs?.level as number) ?? 1;\n const el = document.createElement(`h${level}`) as HTMLElement;\n el.dataset.blockPath = JSON.stringify(path);\n el.className = `editor-heading editor-heading-${level}${alignClass(node)}`;\n renderChildren(node, path, el);\n if (el.innerHTML === '') el.appendChild(document.createElement('br'));\n return el;\n}\n\nfunction renderBlockquote(node: BlockNode, path: number[]): HTMLElement {\n const el = document.createElement('blockquote');\n el.dataset.blockPath = JSON.stringify(path);\n el.className = `editor-blockquote${alignClass(node)}`;\n renderChildren(node, path, el);\n return el;\n}\n\nfunction renderList(node: BlockNode, path: number[], tag: 'ul' | 'ol'): HTMLElement {\n const el = document.createElement(tag);\n el.dataset.blockPath = JSON.stringify(path);\n el.className = tag === 'ul' ? 'editor-bullet-list' : 'editor-ordered-list';\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childPath = [...path, i];\n if (isBlockNode(child)) {\n const li = renderBlock(child as BlockNode, childPath);\n el.appendChild(li);\n }\n }\n\n if (el.children.length === 0) {\n // Empty list: add a placeholder li\n const li = document.createElement('li');\n li.appendChild(document.createElement('br'));\n el.appendChild(li);\n }\n\n return el;\n}\n\nfunction renderListItem(node: BlockNode, path: number[]): HTMLElement {\n const el = document.createElement('li');\n el.dataset.blockPath = JSON.stringify(path);\n el.className = `editor-list-item${alignClass(node)}`;\n renderChildren(node, path, el);\n if (el.innerHTML === '') el.appendChild(document.createElement('br'));\n return el;\n}\n\nconst CODE_BLOCK_LANGUAGE_LABELS: Record<string, string> = {\n plaintext: 'Plain text', c: 'C', cs: 'C#', cpp: 'C++', css: 'CSS',\n diff: 'Diff', go: 'Go', html: 'HTML', java: 'Java', javascript: 'JavaScript',\n json: 'JSON', php: 'PHP', python: 'Python', sql: 'SQL',\n typescript: 'TypeScript', xml: 'XML',\n};\n\nfunction renderCodeBlock(node: BlockNode, path: number[]): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.dataset.blockPath = JSON.stringify(path);\n wrapper.className = 'editor-code-block-wrapper';\n\n const lang = (node.attrs?.language as string | undefined) ?? '';\n\n // Language label header (CKEditor-style)\n const header = document.createElement('div');\n header.className = 'editor-code-block-header';\n header.contentEditable = 'false';\n header.textContent = CODE_BLOCK_LANGUAGE_LABELS[lang] ?? (lang || 'Plain text');\n wrapper.appendChild(header);\n\n const pre = document.createElement('pre');\n pre.className = 'editor-code-block';\n if (lang) pre.dataset.language = lang;\n\n const code = document.createElement('code');\n if (lang) code.className = `language-${lang}`;\n\n renderChildren(node, path, code);\n if (code.innerHTML === '') {\n code.appendChild(document.createElement('br'));\n } else if ((code.textContent ?? '').endsWith('\\n')) {\n // Browser collapses a trailing \\n in <pre>, making cursor invisible on the new line.\n // Append a phantom \\n (DOM-only) so the browser renders the cursor correctly.\n code.appendChild(document.createTextNode('\\n'));\n }\n\n pre.appendChild(code);\n wrapper.appendChild(pre);\n return wrapper;\n}\n\nfunction renderImage(node: BlockNode, path: number[]): HTMLElement {\n const wrapper = document.createElement('figure');\n wrapper.dataset.blockPath = JSON.stringify(path);\n wrapper.dataset.imagePath = JSON.stringify(path);\n wrapper.contentEditable = 'false';\n\n const align = node.attrs?.align as string | undefined;\n const fx = node.attrs?.x as number | undefined;\n const fy = node.attrs?.y as number | undefined;\n wrapper.className = [\n 'editor-image-wrapper',\n fx !== undefined ? 'editor-image-floating' : '',\n !fx && align === 'center' ? 'editor-image-center' : '',\n !fx && align === 'right' ? 'editor-image-right' : '',\n !fx && align === 'left' ? 'editor-image-left' : '',\n ].filter(Boolean).join(' ');\n if (fx !== undefined) {\n wrapper.style.left = `${fx}px`;\n wrapper.style.top = `${fy ?? 0}px`;\n }\n\n const img = document.createElement('img');\n img.src = (node.attrs?.src as string) ?? '';\n img.alt = (node.attrs?.alt as string) ?? '';\n img.className = 'editor-image';\n img.draggable = false;\n if (node.attrs?.width) (img as HTMLImageElement).style.width = `${node.attrs.width as number}px`;\n\n wrapper.appendChild(img);\n\n // Caption\n const caption = node.attrs?.caption as string | undefined;\n if (caption !== undefined) {\n const figcaption = document.createElement('figcaption');\n figcaption.className = 'editor-image-caption';\n figcaption.textContent = caption;\n wrapper.appendChild(figcaption);\n }\n\n // Resize handles (corners) — shown only when wrapper[data-selected]\n for (const pos of ['nw', 'ne', 'sw', 'se'] as const) {\n const handle = document.createElement('div');\n handle.className = `editor-image-resize-handle editor-image-resize-${pos}`;\n handle.contentEditable = 'false';\n handle.dataset.resizeImagePath = JSON.stringify(path);\n handle.dataset.resizeImagePos = pos;\n wrapper.appendChild(handle);\n }\n\n return wrapper;\n}\n\nfunction renderHardBreak(): HTMLElement {\n const span = document.createElement('span');\n span.appendChild(document.createElement('br'));\n return span;\n}\n\nfunction renderCheckList(node: BlockNode, path: number[]): HTMLElement {\n const ul = document.createElement('ul');\n ul.dataset.blockPath = JSON.stringify(path);\n ul.className = 'editor-check-list';\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childPath = [...path, i];\n if (isBlockNode(child)) {\n ul.appendChild(renderBlock(child as BlockNode, childPath));\n }\n }\n\n if (ul.children.length === 0) {\n const li = document.createElement('li');\n li.appendChild(document.createElement('br'));\n ul.appendChild(li);\n }\n\n return ul;\n}\n\nfunction renderCheckListItem(node: BlockNode, path: number[]): HTMLElement {\n const li = document.createElement('li');\n li.dataset.blockPath = JSON.stringify(path);\n const isChecked = !!node.attrs?.checked;\n li.className = `editor-check-list-item${isChecked ? ' editor-check-list-item--checked' : ''}`;\n\n // CKEditor-style custom checkbox wrapper — contentEditable=false keeps it\n // outside the editable flow so clicks don't move the cursor.\n const checkboxWrapper = document.createElement('span');\n checkboxWrapper.contentEditable = 'false';\n checkboxWrapper.className = `editor-checkbox-wrapper${isChecked ? ' editor-checkbox-wrapper--checked' : ''}`;\n checkboxWrapper.dataset.checkPath = JSON.stringify(path);\n checkboxWrapper.setAttribute('role', 'checkbox');\n checkboxWrapper.setAttribute('aria-checked', String(isChecked));\n checkboxWrapper.setAttribute('tabindex', '-1');\n\n // Inner checkmark SVG shown when checked\n const checkmark = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n checkmark.setAttribute('viewBox', '0 0 10 10');\n checkmark.setAttribute('class', 'editor-checkbox-checkmark');\n const polyline = document.createElementNS('http://www.w3.org/2000/svg', 'polyline');\n polyline.setAttribute('points', '1.5 5 4 7.5 8.5 2.5');\n polyline.setAttribute('fill', 'none');\n polyline.setAttribute('stroke', 'white');\n polyline.setAttribute('stroke-width', '1.5');\n polyline.setAttribute('stroke-linecap', 'round');\n polyline.setAttribute('stroke-linejoin', 'round');\n checkmark.appendChild(polyline);\n checkboxWrapper.appendChild(checkmark);\n\n li.appendChild(checkboxWrapper);\n\n // Text content area\n const content = document.createElement('span');\n content.className = 'editor-check-list-content';\n renderChildren(node, path, content);\n if (content.innerHTML === '') content.appendChild(document.createElement('br'));\n li.appendChild(content);\n\n return li;\n}\n\nfunction renderHorizontalRule(): HTMLElement {\n const el = document.createElement('hr');\n el.className = 'editor-hr';\n el.contentEditable = 'false';\n return el;\n}\n\n// ─── Table Rendering ──────────────────────────────────────────────────────────\n\nfunction renderTable(node: BlockNode, path: number[]): HTMLElement {\n const wrapper = document.createElement('div');\n wrapper.dataset.blockPath = JSON.stringify(path);\n wrapper.className = 'editor-table-wrapper';\n\n const colWidths = (node.attrs?.colWidths as number[]) ?? [];\n\n const table = document.createElement('table');\n table.className = 'editor-table';\n\n // <colgroup> drives column widths with table-layout:fixed\n // Use percentages so table always fits within its 100% container\n if (colWidths.length > 0) {\n const total = colWidths.reduce((s, w) => s + w, 0) || colWidths.length * 120;\n const colgroup = document.createElement('colgroup');\n for (let i = 0; i < colWidths.length; i++) {\n const col = document.createElement('col');\n col.style.width = `${((colWidths[i] / total) * 100).toFixed(4)}%`;\n col.dataset.colIndex = String(i);\n colgroup.appendChild(col);\n }\n table.appendChild(colgroup);\n }\n\n const tbody = document.createElement('tbody');\n for (let r = 0; r < node.children.length; r++) {\n const row = node.children[r] as BlockNode;\n tbody.appendChild(renderTableRow(row, [...path, r], colWidths));\n }\n table.appendChild(tbody);\n wrapper.appendChild(table);\n return wrapper;\n}\n\nfunction renderTableRow(\n node: BlockNode,\n path: number[],\n _colWidths?: number[],\n): HTMLElement {\n const tr = document.createElement('tr');\n tr.dataset.blockPath = JSON.stringify(path);\n tr.className = 'editor-table-row';\n\n for (let c = 0; c < node.children.length; c++) {\n const cell = node.children[c] as BlockNode;\n const covered = cell.attrs?.covered as boolean | undefined;\n if (covered) continue; // spanning ancestor covers this slot — omit from DOM\n const cellEl = cell.type === 'table_header'\n ? renderTableHeader(cell, [...path, c])\n : renderTableCell(cell, [...path, c]);\n tr.appendChild(cellEl);\n }\n return tr;\n}\n\nfunction renderTableCellBase(\n tag: 'td' | 'th',\n node: BlockNode,\n path: number[],\n): HTMLElement {\n const el = document.createElement(tag);\n el.dataset.blockPath = JSON.stringify(path);\n el.className = tag === 'th' ? 'editor-table-header-cell' : 'editor-table-cell';\n\n const colspan = (node.attrs?.colspan as number) ?? 1;\n const rowspan = (node.attrs?.rowspan as number) ?? 1;\n if (colspan > 1) el.colSpan = colspan;\n if (rowspan > 1) el.rowSpan = rowspan;\n\n // data attrs for cell-selection and resize tracking\n const row = path[path.length - 2];\n const col = path[path.length - 1];\n const tablePath = path.slice(0, -2);\n el.dataset.cellRow = String(row);\n el.dataset.cellCol = String(col);\n el.dataset.cellTablePath = JSON.stringify(tablePath);\n\n renderChildren(node, path, el);\n if (el.innerHTML === '') el.appendChild(document.createElement('br'));\n\n // Resize handle — contentEditable=false so it doesn't capture caret\n const handle = document.createElement('div');\n handle.className = 'editor-col-resize-handle';\n handle.contentEditable = 'false';\n handle.dataset.resizeTable = JSON.stringify(tablePath);\n handle.dataset.resizeCol = String(col);\n el.appendChild(handle);\n\n return el;\n}\n\nfunction renderTableCell(node: BlockNode, path: number[]): HTMLElement {\n return renderTableCellBase('td', node, path);\n}\n\nfunction renderTableHeader(node: BlockNode, path: number[]): HTMLElement {\n return renderTableCellBase('th', node, path);\n}\n\n// ─── Children / Inline Rendering ──────────────────────────────────────────────\n\nfunction renderChildren(node: BlockNode, path: number[], container: HTMLElement): void {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childPath = [...path, i];\n\n if (isTextNode(child)) {\n const textEl = renderTextNode(child as TextNode, childPath);\n container.appendChild(textEl);\n } else if (isBlockNode(child)) {\n const blockEl = renderBlock(child as BlockNode, childPath);\n container.appendChild(blockEl);\n }\n }\n}\n\n/**\n * Render a TextNode into a <span> with nested mark elements.\n * The span gets data-path so the SelectionEngine can find it.\n *\n * Mark nesting: bold+italic → <strong><em>text</em></strong>\n */\nfunction renderTextNode(node: TextNode, path: number[]): HTMLElement {\n const span = document.createElement('span');\n span.dataset.path = JSON.stringify(path);\n span.className = 'editor-text';\n\n // Build the mark-wrapped text node\n const textNode = document.createTextNode(node.text);\n const wrapped = wrapWithMarks(textNode, node.marks);\n span.appendChild(wrapped);\n\n return span;\n}\n\n/**\n * Wrap a DOM node with the given marks (innermost first).\n */\nfunction wrapWithMarks(inner: Node, marks: Mark[]): Node {\n let current: Node = inner;\n for (const mark of [...marks].reverse()) {\n const wrapper = createMarkElement(mark);\n wrapper.appendChild(current);\n current = wrapper;\n }\n return current;\n}\n\nfunction createMarkElement(mark: Mark): HTMLElement {\n switch (mark.type) {\n case 'bold':\n return document.createElement('strong');\n case 'italic':\n return document.createElement('em');\n case 'underline': {\n const u = document.createElement('u');\n return u;\n }\n case 'strikethrough':\n return document.createElement('s');\n case 'code': {\n const code = document.createElement('code');\n code.className = 'editor-inline-code';\n return code;\n }\n case 'link': {\n const a = document.createElement('a');\n a.href = (mark.attrs?.href as string) ?? '#';\n a.target = '_blank';\n a.rel = 'noopener noreferrer';\n a.className = 'editor-link';\n return a;\n }\n case 'highlight': {\n const mark_ = document.createElement('mark');\n if (mark.attrs?.color) {\n (mark_ as HTMLElement).style.backgroundColor = mark.attrs.color as string;\n }\n return mark_;\n }\n case 'font_size': {\n const span = document.createElement('span');\n if (mark.attrs?.size) span.style.fontSize = mark.attrs.size as string;\n return span;\n }\n case 'font_family': {\n const span = document.createElement('span');\n if (mark.attrs?.family) span.style.fontFamily = mark.attrs.family as string;\n return span;\n }\n case 'text_color': {\n const span = document.createElement('span');\n if (mark.attrs?.color) span.style.color = mark.attrs.color as string;\n return span;\n }\n default:\n return document.createElement('span');\n }\n}\n","/**\n * SelectionEngine\n *\n * Bridges the browser's Selection/Range API to our internal EditorSelection\n * model. This is one of the hardest parts of building a custom editor.\n *\n * THE CORE PROBLEM:\n * The browser's Selection gives you DOM nodes + character offsets.\n * Our model uses (path, offset) pairs pointing into the document tree.\n * We need to map reliably between the two — even after DOM re-renders.\n *\n * HOW CURSOR RESTORATION WORKS:\n * 1. Before re-render: call captureSelection() → save EditorSelection.\n * 2. Re-render DOM from new state.\n * 3. After re-render: call restoreSelection(editorSelection) → walk the\n * new DOM using data-path attributes we baked in during rendering,\n * find the corresponding text nodes, and use Range API to put the\n * cursor back exactly where it was.\n *\n * WHY data-path?\n * Each rendered DOM text node gets a data-path=\"[0,1,2]\" attribute on its\n * parent span/element. The SelectionEngine uses querySelectorAll to find\n * the text node matching a given path without doing a full tree walk.\n */\n\nimport type { EditorSelection, NodePosition, Document, EditorNode, TextNode, MarkType, Mark } from '../../types';\nimport {\n isTextNode,\n getNodeAtPath,\n comparePaths,\n normalizeRange,\n getTextNodesBetween,\n} from '../core/DocumentModel';\n\n// ─── DOM → Model ──────────────────────────────────────────────────────────────\n\n/**\n * Read the browser's current Selection and convert it to an EditorSelection.\n * Returns null if there's no valid selection inside the editor container.\n */\nexport function captureSelection(container: HTMLElement): EditorSelection | null {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return null;\n\n const range = sel.getRangeAt(0);\n\n // Bail if the selection is completely outside our editor\n if (!container.contains(range.commonAncestorContainer)) return null;\n\n const anchor = domPointToNodePosition(range.startContainer, range.startOffset, container);\n const focus = domPointToNodePosition(range.endContainer, range.endOffset, container);\n\n if (!anchor || !focus) return null;\n\n return {\n anchor,\n focus,\n isCollapsed: range.collapsed,\n };\n}\n\n/**\n * Convert a (domNode, offset) pair to a (path, offset) NodePosition.\n * Walks up the DOM looking for data-path (text node span) first,\n * then falls back to data-block-path (the block element itself).\n * This handles the case of clicking inside an empty paragraph that has no\n * text children yet — the path will point to the block, and insertTextAtPath\n * knows how to create a text node there.\n */\nfunction domPointToNodePosition(\n node: Node,\n offset: number,\n container: HTMLElement,\n): NodePosition | null {\n let el: Node | null = node.nodeType === Node.TEXT_NODE ? node.parentElement : node;\n\n let blockPathFallback: NodePosition | null = null;\n\n while (el && el !== container) {\n const elem = el as HTMLElement;\n\n if (elem.dataset?.path) {\n try {\n const path = JSON.parse(elem.dataset.path) as number[];\n return { path, offset };\n } catch {\n // malformed\n }\n }\n\n // Remember the nearest block path as a fallback\n if (!blockPathFallback && elem.dataset?.blockPath) {\n try {\n const path = JSON.parse(elem.dataset.blockPath) as number[];\n blockPathFallback = { path, offset: 0 };\n } catch {\n // malformed\n }\n }\n\n el = elem.parentElement;\n }\n\n return blockPathFallback ?? { path: [0], offset: 0 };\n}\n\n// ─── Model → DOM ──────────────────────────────────────────────────────────────\n\n/**\n * Restore the browser's selection from an EditorSelection.\n * Must be called after the DOM has been re-rendered.\n *\n * Strategy:\n * Find the DOM element with data-path matching anchor.path,\n * then set the Range on its text node with the correct offset.\n */\nexport function restoreSelection(\n container: HTMLElement,\n selection: EditorSelection,\n): void {\n if (!selection) return;\n\n // Try text-node path first; fall back to block-path for block-level selections\n // (e.g. an empty paragraph whose path is [0] — it has data-block-path but no data-path).\n // If neither exists (e.g. selection pointed at [1,0] but the new block at [1] is empty),\n // walk the path up until we find a block element to anchor on.\n const anchorEl = resolveSelectionElement(container, selection.anchor.path);\n const focusEl = resolveSelectionElement(container, selection.focus.path);\n\n if (!anchorEl || !focusEl) return;\n\n const anchorText = getTextNodeOf(anchorEl);\n const focusText = getTextNodeOf(focusEl);\n\n try {\n const range = document.createRange();\n\n if (anchorText) {\n range.setStart(anchorText, Math.min(selection.anchor.offset, anchorText.length));\n } else {\n // Empty block (only a <br> inside) — place cursor at start of the element\n range.setStart(anchorEl, 0);\n }\n\n if (focusText) {\n range.setEnd(focusText, Math.min(selection.focus.offset, focusText.length));\n } else {\n range.setEnd(focusEl, 0);\n }\n\n const sel = window.getSelection();\n if (sel) {\n sel.removeAllRanges();\n sel.addRange(range);\n }\n } catch {\n // DOM may have changed between capture and restore; silently fail\n }\n}\n\n/**\n * Resolve a model path to a DOM element for selection restoration.\n *\n * Tries the exact text-node path first (data-path), then the exact block path\n * (data-block-path), and finally walks the path upward stripping the last\n * index — this handles the case where the model points at a child that doesn't\n * exist yet in the DOM (e.g. Enter at the end of a paragraph creates an empty\n * block; selection points at [1,0] but only data-block-path='[1]' exists).\n */\nfunction resolveSelectionElement(container: HTMLElement, path: number[]): HTMLElement | null {\n for (let depth = path.length; depth >= 0; depth--) {\n const candidate = path.slice(0, depth);\n const pathStr = JSON.stringify(candidate);\n const el =\n container.querySelector<HTMLElement>(`[data-path='${pathStr}']`) ??\n container.querySelector<HTMLElement>(`[data-block-path='${pathStr}']`);\n if (el) return el;\n }\n return null;\n}\n\n/**\n * Find the first descendant Text node inside an element. Recurses through mark\n * wrappers (<strong>, <em>, <u>, <s>, <code>, <a>, <mark>) since text nodes are\n * nested inside them. Returns null only for truly empty elements.\n */\nfunction getTextNodeOf(el: HTMLElement): Text | null {\n let cur: Node | null = el;\n while (cur) {\n const first: Node | null = cur.firstChild;\n if (!first) return null;\n if (first.nodeType === Node.TEXT_NODE) return first as Text;\n cur = first;\n }\n return null;\n}\n\n// ─── Mark detection ───────────────────────────────────────────────────────────\n\n/**\n * Given an EditorSelection, determine which marks are active.\n * Used by the toolbar to highlight active format buttons.\n *\n * Collapsed cursor → marks of the text node at the cursor.\n * Range → marks present on EVERY text node fully inside the range\n * (industry standard: button is \"on\" iff all selected chars\n * carry the mark).\n */\nexport function getActiveMarks(\n doc: Document,\n selection: EditorSelection | null,\n): Set<MarkType> {\n if (!selection) return new Set();\n\n if (selection.isCollapsed) {\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (!node || !isTextNode(node as EditorNode)) return new Set();\n return new Set((node as TextNode).marks.map((m) => m.type));\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return new Set();\n\n // Skip nodes that don't actually overlap the range (boundary nodes whose\n // selected slice is empty).\n const overlapping = nodes.filter(({ path, node }) => {\n if (comparePaths(path, from.path) === 0 && from.offset >= node.text.length) return false;\n if (comparePaths(path, to.path) === 0 && to.offset <= 0) return false;\n return true;\n });\n if (overlapping.length === 0) return new Set();\n\n // Intersect the marks across every overlapping text node.\n const initial = new Set(overlapping[0].node.marks.map((m) => m.type));\n for (let i = 1; i < overlapping.length; i++) {\n const here = new Set(overlapping[i].node.marks.map((m) => m.type));\n for (const m of initial) {\n if (!here.has(m)) initial.delete(m);\n }\n if (initial.size === 0) break;\n }\n return initial;\n}\n\n/**\n * Get the block node type at the current selection anchor.\n * Used by toolbar to highlight the active block type button.\n */\nexport function getActiveBlockType(\n doc: Document,\n selection: EditorSelection | null,\n): string {\n if (!selection) return 'paragraph';\n\n // Walk up from the anchor path to find the first block node\n const path = selection.anchor.path;\n for (let depth = path.length; depth >= 0; depth--) {\n const node = getNodeAtPath(doc, path.slice(0, depth));\n if (node && !isTextNode(node as EditorNode) && (node as EditorNode).type !== 'doc') {\n const type = (node as EditorNode).type;\n if (type === 'heading') {\n const level = ((node as import('../../types').BlockNode).attrs?.level as number) ?? 1;\n return `heading-${level}`;\n }\n // list_item: return the parent container type (bullet_list / ordered_list)\n // so toolbar buttons keyed on the container type activate correctly.\n if (type === 'list_item' && depth > 0) {\n const parent = getNodeAtPath(doc, path.slice(0, depth - 1));\n if (parent && !isTextNode(parent as EditorNode)) {\n const pt = (parent as EditorNode).type;\n if (pt === 'bullet_list' || pt === 'ordered_list') return pt;\n }\n }\n // check_list_item: return 'check_list' so ChecklistButton activates.\n if (type === 'check_list_item') return 'check_list';\n return type;\n }\n }\n return 'paragraph';\n}\n\n/**\n * Return the text alignment of the content block at the cursor, or 'left'.\n */\nexport function getActiveAlignment(\n doc: Document,\n selection: EditorSelection | null,\n): import('../../types').AlignmentType {\n if (!selection) return 'left';\n const path = selection.anchor.path;\n for (let depth = path.length; depth >= 1; depth--) {\n const node = getNodeAtPath(doc, path.slice(0, depth));\n if (node && !isTextNode(node as EditorNode) && (node as EditorNode).type !== 'doc') {\n return ((node as import('../../types').BlockNode).attrs?.align as import('../../types').AlignmentType) ?? 'left';\n }\n }\n return 'left';\n}\n\n/**\n * Return the href of the link mark at the current cursor/selection, or null.\n * For a collapsed cursor: checks the text node at the cursor position.\n * For a range: checks the anchor text node.\n * Also checks pendingMarks so the toolbar reflects a just-toggled link.\n */\nexport function getActiveLinkHref(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n const findHref = (marks: Mark[]): string | null => {\n const lm = marks.find((m) => m.type === 'link');\n return lm ? (lm.attrs?.href as string) ?? null : null;\n };\n\n if (selection.isCollapsed) {\n const fromPending = findHref(pendingMarks);\n if (fromPending) return fromPending;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) return findHref((node as TextNode).marks);\n return null;\n }\n\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) return findHref((node as TextNode).marks);\n return null;\n}\n\n/**\n * Return the text_color mark value at the current cursor/selection, or null.\n * Collapsed cursor: checks pending marks then the text node at the cursor.\n * Range: returns the color only if every selected text node shares the same one.\n */\nexport function getActiveTextColor(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n if (selection.isCollapsed) {\n const fromPending = pendingMarks.find((m) => m.type === 'text_color');\n if (fromPending) return (fromPending.attrs?.color as string) ?? null;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n const cm = (node as TextNode).marks.find((m) => m.type === 'text_color');\n return cm ? (cm.attrs?.color as string) ?? null : null;\n }\n return null;\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return null;\n\n let color: string | null | undefined = undefined;\n for (const { node } of nodes) {\n const cm = node.marks.find((m) => m.type === 'text_color');\n const nodeColor = cm ? (cm.attrs?.color as string) ?? null : null;\n if (color === undefined) {\n color = nodeColor;\n } else if (color !== nodeColor) {\n return null; // mixed colors — show nothing active\n }\n }\n return color ?? null;\n}\n\n/**\n * Return the highlight color at the current cursor/selection, or null.\n * Collapsed cursor: checks pending marks then the text node at the cursor.\n * Range: returns the color only if every selected text node shares the same one.\n */\nexport function getActiveHighlightColor(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n if (selection.isCollapsed) {\n const fromPending = pendingMarks.find((m) => m.type === 'highlight');\n if (fromPending) return (fromPending.attrs?.color as string) ?? null;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n const hm = (node as TextNode).marks.find((m) => m.type === 'highlight');\n return hm ? (hm.attrs?.color as string) ?? null : null;\n }\n return null;\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return null;\n\n let color: string | null | undefined = undefined;\n for (const { node } of nodes) {\n const hm = node.marks.find((m) => m.type === 'highlight');\n const nodeColor = hm ? (hm.attrs?.color as string) ?? null : null;\n if (color === undefined) {\n color = nodeColor;\n } else if (color !== nodeColor) {\n return null; // mixed colors — show nothing active\n }\n }\n return color ?? null;\n}\n\n/**\n * Return the font_family mark value at the current cursor/selection, or null.\n * Collapsed cursor: checks pending marks then the text node at the cursor.\n * Range: returns the family only if every selected text node shares the same one.\n */\n/**\n * Return the full model range that a link mark occupies starting from the cursor.\n *\n * Walks the block's text-node siblings in both directions from the anchor node,\n * collecting all consecutive nodes that carry the same link href. Returns\n * {from, to, href} so commands can operate on the whole link span — not just\n * the node the cursor happens to sit in.\n *\n * Returns null when the cursor is not on any link mark.\n */\nexport function getActiveLinkRange(\n doc: Document,\n selection: EditorSelection | null,\n): { from: NodePosition; to: NodePosition; href: string } | null {\n if (!selection) return null;\n\n const anchorPath = selection.anchor.path;\n const node = getNodeAtPath(doc, anchorPath);\n if (!node || !isTextNode(node as EditorNode)) return null;\n\n const anchorNode = node as TextNode;\n const linkMark = anchorNode.marks.find((m) => m.type === 'link');\n if (!linkMark) return null;\n\n const href = (linkMark.attrs?.href as string) ?? '';\n\n // Walk sibling text nodes in the same parent block\n const parentPath = anchorPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath);\n if (!parent || isTextNode(parent as EditorNode)) return null;\n\n const siblings = (parent as import('../../types').BlockNode).children;\n const anchorIdx = anchorPath[anchorPath.length - 1];\n\n // Expand left: include preceding siblings with the same link href\n let startIdx = anchorIdx;\n while (startIdx > 0) {\n const prev = siblings[startIdx - 1];\n if (!prev || !isTextNode(prev as EditorNode)) break;\n const prevLink = (prev as TextNode).marks.find((m) => m.type === 'link');\n if (!prevLink || (prevLink.attrs?.href as string) !== href) break;\n startIdx--;\n }\n\n // Expand right: include following siblings with the same link href\n let endIdx = anchorIdx;\n while (endIdx < siblings.length - 1) {\n const next = siblings[endIdx + 1];\n if (!next || !isTextNode(next as EditorNode)) break;\n const nextLink = (next as TextNode).marks.find((m) => m.type === 'link');\n if (!nextLink || (nextLink.attrs?.href as string) !== href) break;\n endIdx++;\n }\n\n const startNode = siblings[startIdx] as TextNode;\n const endNode = siblings[endIdx] as TextNode;\n\n return {\n from: makePosition([...parentPath, startIdx], 0),\n to: makePosition([...parentPath, endIdx], endNode.text.length),\n href,\n };\n}\n\nexport function getActiveFontFamily(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n if (selection.isCollapsed) {\n const fromPending = pendingMarks.find((m) => m.type === 'font_family');\n if (fromPending) return (fromPending.attrs?.family as string) ?? null;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n const fm = (node as TextNode).marks.find((m) => m.type === 'font_family');\n return fm ? (fm.attrs?.family as string) ?? null : null;\n }\n return null;\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return null;\n\n let family: string | null | undefined = undefined;\n for (const { node } of nodes) {\n const fm = node.marks.find((m) => m.type === 'font_family');\n const nodeFamily = fm ? (fm.attrs?.family as string) ?? null : null;\n if (family === undefined) {\n family = nodeFamily;\n } else if (family !== nodeFamily) {\n return null; // mixed families — show nothing\n }\n }\n return family ?? null;\n}\n\n/**\n * Return the font_size mark value at the current cursor/selection, or null.\n * Collapsed cursor: checks pending marks then the text node at the cursor.\n * Range: returns the size only if every selected text node shares the same size.\n */\nexport function getActiveFontSize(\n doc: Document,\n selection: EditorSelection | null,\n pendingMarks: Mark[],\n): string | null {\n if (!selection) return null;\n\n if (selection.isCollapsed) {\n const fromPending = pendingMarks.find((m) => m.type === 'font_size');\n if (fromPending) return (fromPending.attrs?.size as string) ?? null;\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n const fm = (node as TextNode).marks.find((m) => m.type === 'font_size');\n return fm ? (fm.attrs?.size as string) ?? null : null;\n }\n return null;\n }\n\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n const nodes = getTextNodesBetween(doc, from, to);\n if (nodes.length === 0) return null;\n\n let size: string | null | undefined = undefined;\n for (const { node } of nodes) {\n const fm = node.marks.find((m) => m.type === 'font_size');\n const nodeSize = fm ? (fm.attrs?.size as string) ?? null : null;\n if (size === undefined) {\n size = nodeSize;\n } else if (size !== nodeSize) {\n return null; // mixed sizes — show nothing\n }\n }\n return size ?? null;\n}\n\n/**\n * Collapse the current browser selection to the end of the range.\n */\nexport function collapseSelectionToEnd(_container: HTMLElement): void {\n const sel = window.getSelection();\n if (sel && sel.rangeCount > 0) {\n sel.collapseToEnd();\n }\n}\n\n/**\n * Returns true if the current browser selection is inside the given container.\n */\nexport function isSelectionInContainer(container: HTMLElement): boolean {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0) return false;\n const range = sel.getRangeAt(0);\n return container.contains(range.commonAncestorContainer);\n}\n\n/**\n * Build a NodePosition from a path and offset.\n */\nexport function makePosition(path: number[], offset: number): NodePosition {\n return { path, offset };\n}\n\n/**\n * Build a collapsed EditorSelection at a given position.\n */\nexport function makeCollapsedSelection(position: NodePosition): EditorSelection {\n return {\n anchor: position,\n focus: position,\n isCollapsed: true,\n };\n}\n","/**\n * HTMLSerializer\n *\n * Converts the document model to/from HTML strings.\n * serialize() → HTML string for storage or copy-paste.\n * deserialize() → Document model from a pasted HTML string.\n *\n * Paste sanitization: we whitelist only the HTML elements we understand.\n * Any unknown element is converted to its text content, stripping the tag.\n */\n\nimport type { Document, BlockNode, TextNode, EditorNode, Mark, Serializer, AlignmentType } from '../../types';\nimport { isTextNode, createParagraph, createEmptyDocument } from '../core/DocumentModel';\n\n// ─── Serialize: Model → HTML ──────────────────────────────────────────────────\n\nfunction slugify(text: string): string {\n return text\n .toLowerCase()\n .replace(/[^\\w\\s-]/g, '')\n .trim()\n .replace(/[\\s_]+/g, '-')\n .replace(/-+/g, '-');\n}\n\nexport const htmlSerializer: Serializer<string> = {\n serialize(doc: Document): string {\n const idCounts = new Map<string, number>();\n return doc.children.map((node) => serializeBlock(node, idCounts)).join('');\n },\n\n deserialize(html: string): Document {\n const parser = new DOMParser();\n const parsed = parser.parseFromString(html, 'text/html');\n return parseHTMLBody(parsed.body);\n },\n};\n\nfunction serializeBlock(node: BlockNode, idCounts: Map<string, number> = new Map(), inCell = false): string {\n switch (node.type) {\n case 'paragraph': {\n const alignVal = node.attrs?.align as string | undefined;\n const alignAttrs = alignVal ? ` data-align=\"${alignVal}\" style=\"text-align:${alignVal};\"` : '';\n const cellStyle = inCell ? ` style=\"margin:0;min-height:1.2em;${alignVal ? `text-align:${alignVal};` : ''}\"` : '';\n const attrs = inCell ? (alignVal ? ` data-align=\"${alignVal}\"${cellStyle}` : cellStyle) : alignAttrs;\n return `<p${attrs}>${serializeChildren(node.children)}</p>`;\n }\n case 'heading': {\n const l = node.attrs?.level ?? 1;\n const alignVal = node.attrs?.align as string | undefined;\n const alignAttrs = alignVal ? ` data-align=\"${alignVal}\" style=\"text-align:${alignVal};\"` : '';\n const rawText = node.children\n .filter((c): c is TextNode => 'text' in c)\n .map((c) => c.text)\n .join('');\n const base = slugify(rawText) || `heading-${l}`;\n const count = idCounts.get(base) ?? 0;\n idCounts.set(base, count + 1);\n const id = count === 0 ? base : `${base}-${count}`;\n return `<h${l} id=\"${id}\"${alignAttrs}>${serializeChildren(node.children)}</h${l}>`;\n }\n case 'blockquote': {\n const alignVal = node.attrs?.align as string | undefined;\n const alignAttrs = alignVal ? ` data-align=\"${alignVal}\" style=\"text-align:${alignVal};\"` : '';\n return `<blockquote${alignAttrs}>${serializeChildren(node.children)}</blockquote>`;\n }\n case 'bullet_list':\n return `<ul>${serializeChildren(node.children)}</ul>`;\n case 'ordered_list':\n return `<ol>${serializeChildren(node.children)}</ol>`;\n case 'list_item':\n return `<li>${serializeChildren(node.children)}</li>`;\n case 'check_list':\n return `<ul class=\"todo-list\" data-type=\"checklist\">${serializeChildren(node.children)}</ul>`;\n case 'check_list_item': {\n const checked = !!node.attrs?.checked;\n const dataChecked = checked ? ' data-checked=\"true\"' : '';\n const itemClass = `todo-list__item${checked ? ' todo-list__item_checked' : ''}`;\n const checkedAttr = checked ? ' checked=\"checked\"' : '';\n const innerContent = serializeChildren(node.children);\n return `<li class=\"${itemClass}\"${dataChecked}><label class=\"todo-list__label\"><input type=\"checkbox\" disabled=\"disabled\"${checkedAttr}><span class=\"todo-list__label__description\">${innerContent}</span></label></li>`;\n }\n case 'code_block': {\n const lang = node.attrs?.language ? ` class=\"language-${node.attrs.language}\"` : '';\n const raw = node.children.map((c) => isTextNode(c) ? escapeHTML((c as TextNode).text) : '').join('');\n return `<pre><code${lang}>${raw}</code></pre>`;\n }\n case 'image': {\n const src = escapeAttr(node.attrs?.src as string ?? '');\n const alt = escapeAttr(node.attrs?.alt as string ?? '');\n const width = node.attrs?.width ? ` width=\"${node.attrs.width}\"` : '';\n const align = node.attrs?.align ? ` data-align=\"${node.attrs.align}\"` : '';\n const caption = node.attrs?.caption ? escapeHTML(node.attrs.caption as string) : '';\n const x = node.attrs?.x as number | undefined;\n const y = node.attrs?.y as number | undefined;\n const posAttrs = x !== undefined\n ? ` data-x=\"${Math.round(x)}\" data-y=\"${Math.round(y ?? 0)}\" style=\"position:absolute;left:${Math.round(x)}px;top:${Math.round(y ?? 0)}px;\"`\n : '';\n if (caption) {\n return `<figure${align}${posAttrs}><img src=\"${src}\" alt=\"${alt}\"${width} /><figcaption>${caption}</figcaption></figure>`;\n }\n return `<figure${align}${posAttrs}><img src=\"${src}\" alt=\"${alt}\"${width} /></figure>`;\n }\n case 'horizontal_rule':\n return '<hr />';\n case 'table': {\n const rows = node.children.map((c) => serializeBlock(c as BlockNode)).join('');\n const colWidths = (node.attrs?.colWidths as number[]) ?? [];\n let colgroup = '';\n if (colWidths.length > 0) {\n const total = colWidths.reduce((s, w) => s + w, 0) || colWidths.length * 120;\n colgroup = `<colgroup>${colWidths.map((w) => `<col style=\"width:${((w / total) * 100).toFixed(4)}%\">`).join('')}</colgroup>`;\n }\n return `<div style=\"overflow-x:auto;margin:0.75em 0;\"><table style=\"border-collapse:collapse;table-layout:fixed;width:100%;font-size:inherit;font-family:inherit;\">${colgroup}<tbody>${rows}</tbody></table></div>`;\n }\n case 'table_row': {\n const cells = node.children.map((c) => serializeBlock(c as BlockNode)).join('');\n return `<tr>${cells}</tr>`;\n }\n case 'table_cell': {\n if (node.attrs?.covered) return '';\n const cs = (node.attrs?.colspan as number) > 1 ? ` colspan=\"${node.attrs?.colspan}\"` : '';\n const rs = (node.attrs?.rowspan as number) > 1 ? ` rowspan=\"${node.attrs?.rowspan}\"` : '';\n return `<td${cs}${rs} style=\"border:1px solid #d1d5db;padding:0.5em 0.75em;vertical-align:top;min-width:40px;word-break:break-word;\">${node.children.map((c) => serializeBlock(c as BlockNode, new Map(), true)).join('')}</td>`;\n }\n case 'table_header': {\n if (node.attrs?.covered) return '';\n const cs = (node.attrs?.colspan as number) > 1 ? ` colspan=\"${node.attrs?.colspan}\"` : '';\n const rs = (node.attrs?.rowspan as number) > 1 ? ` rowspan=\"${node.attrs?.rowspan}\"` : '';\n return `<th${cs}${rs} style=\"border:1px solid #d1d5db;padding:0.5em 0.75em;vertical-align:top;min-width:40px;word-break:break-word;background:#f9fafb;font-weight:600;text-align:left;\">${node.children.map((c) => serializeBlock(c as BlockNode, new Map(), true)).join('')}</th>`;\n }\n default:\n return `<p>${serializeChildren(node.children)}</p>`;\n }\n}\n\nfunction serializeChildren(children: EditorNode[]): string {\n return children.map((child) => {\n if (isTextNode(child)) return serializeTextNode(child as TextNode);\n return serializeBlock(child as BlockNode);\n }).join('');\n}\n\nfunction serializeTextNode(node: TextNode): string {\n const parts = node.text.split('\\n');\n const serializedParts = parts.map((part) => {\n let text = escapeHTML(part);\n for (const mark of node.marks) {\n text = wrapWithMarkHTML(text, mark);\n }\n return text;\n });\n return serializedParts.join('<br>');\n}\n\nfunction wrapWithMarkHTML(text: string, mark: Mark): string {\n switch (mark.type) {\n case 'bold': return `<strong>${text}</strong>`;\n case 'italic': return `<em>${text}</em>`;\n case 'underline': return `<u>${text}</u>`;\n case 'strikethrough': return `<s>${text}</s>`;\n case 'code': return `<code>${text}</code>`;\n case 'link': return `<a href=\"${escapeAttr(mark.attrs?.href as string ?? '#')}\" target=\"_blank\" rel=\"noopener noreferrer\">${text}</a>`;\n case 'highlight': return mark.attrs?.color\n ? `<mark style=\"background-color:${escapeAttr(mark.attrs.color as string)}\">${text}</mark>`\n : `<mark>${text}</mark>`;\n case 'font_size': return `<span style=\"font-size:${escapeAttr(mark.attrs?.size as string ?? '')}\">${text}</span>`;\n case 'font_family': return `<span style=\"font-family:${escapeAttr(mark.attrs?.family as string ?? '')}\">${text}</span>`;\n case 'text_color': return `<span style=\"color:${escapeAttr(mark.attrs?.color as string ?? '')}\">${text}</span>`;\n default: return text;\n }\n}\n\nfunction escapeHTML(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n}\n\nfunction escapeAttr(str: string): string {\n return str.replace(/\"/g, '"').replace(/'/g, ''');\n}\n\n// ─── Deserialize: HTML → Model ────────────────────────────────────────────────\n\nconst VALID_ALIGNS = new Set(['left', 'center', 'right', 'justify']);\n\nfunction getAlign(el: HTMLElement): AlignmentType | null {\n const da = el.getAttribute('data-align');\n if (da && VALID_ALIGNS.has(da)) return da as AlignmentType;\n const ta = el.style.textAlign;\n if (ta && VALID_ALIGNS.has(ta)) return ta as AlignmentType;\n return null;\n}\n\nfunction parseHTMLBody(body: HTMLElement): Document {\n const children: BlockNode[] = [];\n\n for (const child of Array.from(body.childNodes)) {\n const block = parseHTMLNode(child);\n if (block) children.push(block);\n }\n\n return { type: 'doc', children: children.length > 0 ? children : [createParagraph()] };\n}\n\nfunction parseHTMLNode(node: Node): BlockNode | null {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = (node.textContent ?? '').trim();\n if (!text) return null;\n return createParagraph(text);\n }\n\n const el = node as HTMLElement;\n const tag = el.tagName?.toLowerCase();\n\n switch (tag) {\n case 'p':\n case 'div': {\n const align = getAlign(el);\n return { type: 'paragraph', attrs: align ? { align } : {}, children: parseInlineChildren(el) };\n }\n case 'h1': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 1, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h2': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 2, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h3': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 3, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h4': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 4, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h5': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 5, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'h6': {\n const align = getAlign(el);\n return { type: 'heading', attrs: { level: 6, ...(align ? { align } : {}) }, children: parseInlineChildren(el) };\n }\n case 'blockquote': {\n const align = getAlign(el);\n return { type: 'blockquote', attrs: align ? { align } : {}, children: parseInlineChildren(el) };\n }\n case 'ul': {\n if (el.getAttribute('data-type') === 'checklist') {\n const items: BlockNode[] = Array.from(el.children).filter(c => c.tagName.toLowerCase() === 'li').map((li) => ({\n type: 'check_list_item' as const,\n attrs: { checked: li.getAttribute('data-checked') === 'true' },\n children: parseInlineChildren(li as HTMLElement),\n }));\n return { type: 'check_list', attrs: {}, children: items };\n }\n const items: BlockNode[] = Array.from(el.children).filter(c => c.tagName.toLowerCase() === 'li').map((li) => ({\n type: 'list_item' as const,\n attrs: {},\n children: parseListItemChildren(li as HTMLElement, 'bullet_list'),\n }));\n return { type: 'bullet_list', attrs: {}, children: items };\n }\n case 'ol': {\n const items: BlockNode[] = Array.from(el.children).filter(c => c.tagName.toLowerCase() === 'li').map((li) => ({\n type: 'list_item' as const,\n attrs: {},\n children: parseListItemChildren(li as HTMLElement, 'ordered_list'),\n }));\n return { type: 'ordered_list', attrs: {}, children: items };\n }\n case 'pre': {\n const codeEl = el.querySelector('code');\n const lang = codeEl?.className.match(/language-(\\S+)/)?.[1] ?? '';\n const text = codeEl?.textContent ?? el.textContent ?? '';\n return {\n type: 'code_block',\n attrs: lang ? { language: lang } : {},\n children: [{ type: 'text', text, marks: [] }],\n };\n }\n case 'figure': {\n const img = el.querySelector('img');\n const caption = el.querySelector('figcaption')?.textContent ?? '';\n const align = el.getAttribute('data-align') ?? '';\n const dxRaw = el.getAttribute('data-x');\n const dyRaw = el.getAttribute('data-y');\n const fx = dxRaw !== null ? parseFloat(dxRaw) : undefined;\n const fy = dyRaw !== null ? parseFloat(dyRaw) : undefined;\n if (img) {\n return {\n type: 'image',\n attrs: {\n src: img.getAttribute('src') ?? '',\n alt: img.getAttribute('alt') ?? '',\n ...(img.getAttribute('width') ? { width: parseFloat(img.getAttribute('width')!) } : {}),\n ...(align ? { align: align as AlignmentType } : {}),\n ...(caption ? { caption } : {}),\n ...(fx !== undefined && !isNaN(fx) ? { x: fx, y: fy ?? 0 } : {}),\n },\n children: [],\n };\n }\n return null;\n }\n case 'img':\n return {\n type: 'image',\n attrs: { src: el.getAttribute('src') ?? '', alt: el.getAttribute('alt') ?? '' },\n children: [],\n };\n case 'hr':\n return { type: 'horizontal_rule', attrs: {}, children: [] };\n case 'br':\n return null;\n case 'table': {\n const tbody = el.querySelector('tbody') ?? el;\n const rows: BlockNode[] = Array.from(tbody.children)\n .filter(c => c.tagName.toLowerCase() === 'tr')\n .map((tr) => {\n const cells: BlockNode[] = Array.from(tr.children)\n .filter(c => c.tagName.toLowerCase() === 'td' || c.tagName.toLowerCase() === 'th')\n .map((cell) => ({\n type: (cell.tagName.toLowerCase() === 'th' ? 'table_header' : 'table_cell') as 'table_header' | 'table_cell',\n attrs: {\n colspan: parseInt(cell.getAttribute('colspan') ?? '1'),\n rowspan: parseInt(cell.getAttribute('rowspan') ?? '1'),\n covered: false,\n },\n // table_cell children must be block nodes (paragraphs)\n children: [{ type: 'paragraph' as const, attrs: {}, children: parseInlineChildren(cell as HTMLElement) }],\n }));\n return { type: 'table_row' as const, attrs: {}, children: cells };\n });\n return { type: 'table', attrs: { colWidths: rows[0]?.children.map(() => 120) ?? [] }, children: rows };\n }\n default: {\n // Unknown element: extract its text and make a paragraph\n const text = el.textContent ?? '';\n if (!text.trim()) return null;\n return createParagraph(text.trim());\n }\n }\n}\n\nfunction parseListItemChildren(li: HTMLElement, _listType: 'bullet_list' | 'ordered_list'): EditorNode[] {\n const children: EditorNode[] = [];\n for (const child of Array.from(li.childNodes)) {\n if (child.nodeType === Node.ELEMENT_NODE) {\n const tag = (child as HTMLElement).tagName.toLowerCase();\n if (tag === 'ul' || tag === 'ol') {\n const nestedListType = tag === 'ul' ? 'bullet_list' : 'ordered_list';\n const items: BlockNode[] = Array.from((child as HTMLElement).children)\n .filter(c => c.tagName.toLowerCase() === 'li')\n .map((nestedLi) => ({\n type: 'list_item' as const,\n attrs: {},\n children: parseListItemChildren(nestedLi as HTMLElement, nestedListType),\n }));\n children.push({ type: nestedListType, attrs: {}, children: items });\n continue;\n }\n }\n }\n\n const inlineNodes = parseInlineChildren(li);\n if (inlineNodes.length > 0 || children.length === 0) {\n return [...inlineNodes, ...children];\n }\n return children;\n}\n\nfunction parseInlineChildren(el: HTMLElement): TextNode[] {\n const results: TextNode[] = [];\n\n function walk(node: Node, marks: Mark[]) {\n if (node.nodeType === Node.TEXT_NODE) {\n const text = node.textContent ?? '';\n if (text) results.push({ type: 'text', text, marks: [...marks] });\n return;\n }\n\n const elem = node as HTMLElement;\n const tag = elem.tagName?.toLowerCase();\n\n if (tag === 'br') {\n results.push({ type: 'text', text: '\\n', marks: [...marks] });\n return;\n }\n\n // Skip checkbox inputs inside todo-list items — they carry no text content\n if (tag === 'input') return;\n\n const newMarks = [...marks, ...getMarksForTag(tag, elem)];\n\n for (const child of Array.from(elem.childNodes)) {\n walk(child, newMarks);\n }\n }\n\n walk(el, []);\n return results;\n}\n\nfunction getMarksForTag(tag: string, el: HTMLElement): Mark[] {\n switch (tag) {\n case 'strong':\n case 'b':\n return [{ type: 'bold' }];\n case 'em':\n case 'i':\n return [{ type: 'italic' }];\n case 'u':\n return [{ type: 'underline' }];\n case 's':\n case 'del':\n case 'strike':\n return [{ type: 'strikethrough' }];\n case 'code':\n return [{ type: 'code' }];\n case 'a':\n return [{ type: 'link', attrs: { href: el.getAttribute('href') ?? '#' } }];\n case 'mark': {\n const bg = el.style.backgroundColor;\n return [{ type: 'highlight', ...(bg ? { attrs: { color: bg } } : {}) }];\n }\n case 'span': {\n const marks: Mark[] = [];\n const style = el.getAttribute('style') ?? '';\n const fontSize = style.match(/font-size:\\s*([^;]+)/)?.[1]?.trim();\n const fontFamily = style.match(/font-family:\\s*([^;]+)/)?.[1]?.trim();\n const color = style.match(/(?:^|;)\\s*color:\\s*([^;]+)/)?.[1]?.trim();\n if (fontSize) marks.push({ type: 'font_size', attrs: { size: fontSize } });\n if (fontFamily) marks.push({ type: 'font_family', attrs: { family: fontFamily } });\n if (color) marks.push({ type: 'text_color', attrs: { color } });\n return marks;\n }\n default:\n return [];\n }\n}\n","/**\n * PastePlugin / ClipboardPlugin\n *\n * CKEditor-style clipboard pipeline:\n *\n * Copy/Cut — intercept event, serialize selection from model to clean HTML,\n * write text/html + text/plain to clipboard. Cut also deletes selection.\n *\n * Paste — normalize HTML from external sources (Word, Google Docs, web),\n * deserialize to model, merge at cursor with block-split/merge logic.\n *\n * Pipeline stages:\n * 1. normalizeHTML — strip MSO/GDocs junk, preserve useful inline styles\n * 2. deserialize — HTML → model (BlockNode[])\n * 3. mergeAtCursor — split current block, insert pasted blocks, merge edges\n * 4. set cursor — place after last pasted character\n *\n * Never uses document.execCommand. Uses Clipboard API, Selection API, DOM APIs only.\n */\n\nimport type {\n EditorPlugin,\n EditorEngineInterface,\n EditorState,\n Document,\n BlockNode,\n TextNode,\n EditorNode,\n EditorSelection,\n NodePosition,\n} from '../../types';\n\nimport { htmlSerializer } from '../serialization/HTMLSerializer';\nimport {\n createTransaction,\n tr_replaceDoc,\n tr_setSelection,\n tr_deleteRange,\n} from '../core/Transaction';\nimport {\n isTextNode,\n normalizeRange,\n createParagraph,\n} from '../core/DocumentModel';\n\n// ─── Plugin factory ───────────────────────────────────────────────────────────\n\nexport function createPastePlugin(): EditorPlugin {\n return { name: 'clipboard' };\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\n/**\n * Attach copy, cut, and paste handlers to the editor container.\n * Returns a cleanup function that removes all listeners.\n */\nexport function attachClipboardHandlers(\n container: HTMLElement,\n engine: EditorEngineInterface,\n): () => void {\n const removeCopy = attachCopyOrCutHandler(container, engine, false);\n const removeCut = attachCopyOrCutHandler(container, engine, true);\n const removePaste = attachPasteHandler(container, engine);\n return () => { removeCopy(); removeCut(); removePaste(); };\n}\n\n/**\n * Attach only the paste handler (kept for backward compat).\n */\nexport function attachPasteHandler(\n container: HTMLElement,\n engine: EditorEngineInterface,\n): () => void {\n const handler = (e: ClipboardEvent) => {\n e.preventDefault();\n const clipboardData = e.clipboardData;\n if (!clipboardData) return;\n\n // ── Image blob (screenshot / copied image) ────────────────────────────\n const imageItem = Array.from(clipboardData.items).find(\n (item) => item.type.startsWith('image/'),\n );\n if (imageItem) {\n const file = imageItem.getAsFile();\n if (file) {\n const blobUrl = URL.createObjectURL(file);\n const state = engine.getState();\n const sel = state.selection;\n const insertIdx = sel ? sel.anchor.path[0] + 1 : state.doc.children.length;\n const tr = createTransaction();\n tr.steps.push({\n type: 'insert_node',\n parentPath: [],\n index: insertIdx,\n node: { type: 'image', attrs: { src: blobUrl, alt: file.name }, children: [] },\n });\n engine.dispatch(tr);\n return;\n }\n }\n\n const html = clipboardData.getData('text/html');\n const plainText = clipboardData.getData('text/plain');\n\n let pastedDoc: Document;\n\n if (html) {\n const normalized = normalizeHTML(html);\n pastedDoc = htmlSerializer.deserialize(normalized);\n } else if (plainText) {\n pastedDoc = parsePlainText(plainText);\n } else {\n return;\n }\n\n // Filter out empty placeholder paragraphs the deserializer produces\n const pastedBlocks = pastedDoc.children.filter(\n (b) => !(b.type === 'paragraph' && b.children.length === 0),\n );\n if (pastedBlocks.length === 0) return;\n\n const state = engine.getState();\n let sel = state.selection;\n\n // ── Delete selection range first if non-collapsed ─────────────────────\n if (sel && !sel.isCollapsed) {\n const { from, to } = normalizeRange(sel.anchor, sel.focus);\n const delTr = createTransaction();\n delTr.steps.push(tr_deleteRange(from, to));\n engine.dispatch(delTr);\n // Refresh state — deleteRange sets selection to collapsed cursor\n sel = engine.getState().selection;\n }\n\n // ── Merge pasted content at cursor ────────────────────────────────────\n const currentState = engine.getState();\n const { mergedDoc, cursorPos } = mergeAtCursor(\n currentState,\n { type: 'doc', children: pastedBlocks as BlockNode[] },\n sel,\n );\n\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(mergedDoc));\n if (cursorPos) {\n tr.steps.push(tr_setSelection({ anchor: cursorPos, focus: cursorPos, isCollapsed: true }));\n }\n engine.dispatch(tr);\n };\n\n container.addEventListener('paste', handler as EventListener);\n return () => container.removeEventListener('paste', handler as EventListener);\n}\n\n// ─── Copy / Cut ───────────────────────────────────────────────────────────────\n\nfunction attachCopyOrCutHandler(\n container: HTMLElement,\n engine: EditorEngineInterface,\n isCut: boolean,\n): () => void {\n const handler = (e: ClipboardEvent) => {\n const state = engine.getState();\n const sel = state.selection;\n\n // No selection or collapsed — let browser default handle it\n if (!sel || sel.isCollapsed) return;\n\n e.preventDefault();\n\n // Extract selected content from model → clean HTML\n const selectedDoc = extractSelection(state);\n const selectedHTML = htmlSerializer.serialize(selectedDoc);\n const selectedText = docToPlainText(selectedDoc);\n\n try {\n e.clipboardData!.setData('text/html', selectedHTML);\n e.clipboardData!.setData('text/plain', selectedText);\n } catch {\n // Some browsers block setData outside of user-gesture — silently ignore\n }\n\n if (isCut) {\n const { from, to } = normalizeRange(sel.anchor, sel.focus);\n const tr = createTransaction();\n tr.steps.push(tr_deleteRange(from, to));\n engine.dispatch(tr);\n }\n };\n\n const event = isCut ? 'cut' : 'copy';\n container.addEventListener(event, handler as EventListener);\n return () => container.removeEventListener(event, handler as EventListener);\n}\n\n// ─── Selection extraction (for copy/cut) ─────────────────────────────────────\n\nfunction extractSelection(state: EditorState): Document {\n const sel = state.selection;\n if (!sel || sel.isCollapsed) return { type: 'doc', children: [createParagraph()] };\n\n const { from, to } = normalizeRange(sel.anchor, sel.focus);\n const blocks = state.doc.children;\n const fromBlockIdx = from.path[0] ?? 0;\n const toBlockIdx = to.path[0] ?? 0;\n\n if (fromBlockIdx === toBlockIdx) {\n const sliced = sliceBlock(blocks[fromBlockIdx], from.path.slice(1), from.offset, to.path.slice(1), to.offset);\n return { type: 'doc', children: sliced.length > 0 ? sliced : [createParagraph()] };\n }\n\n const firstBlock = sliceBlockFrom(blocks[fromBlockIdx], from.path.slice(1), from.offset);\n const middleBlocks = blocks.slice(fromBlockIdx + 1, toBlockIdx);\n const lastBlock = sliceBlockTo(blocks[toBlockIdx], to.path.slice(1), to.offset);\n\n return { type: 'doc', children: [firstBlock, ...middleBlocks, lastBlock] };\n}\n\n/** Extract text nodes from `startIdx:startOffset` to `endIdx:endOffset` within a flat block. */\nfunction sliceBlock(\n block: BlockNode,\n fromRelPath: number[],\n fromOffset: number,\n toRelPath: number[],\n toOffset: number,\n): BlockNode[] {\n const fromIdx = fromRelPath[0] ?? 0;\n const toIdx = toRelPath[0] ?? Math.max(0, block.children.length - 1);\n\n if (!block.children.every((c) => isTextNode(c as EditorNode))) {\n return [block]; // container/complex block — return whole\n }\n\n const children: TextNode[] = [];\n for (let i = fromIdx; i <= toIdx && i < block.children.length; i++) {\n const t = block.children[i] as TextNode;\n const s = i === fromIdx ? fromOffset : 0;\n const end = i === toIdx ? toOffset : t.text.length;\n const slice = t.text.slice(s, end);\n if (slice) children.push({ type: 'text', text: slice, marks: t.marks });\n }\n\n return children.length > 0 ? [{ ...block, children }] : [];\n}\n\n/** Slice a block from cursor to end. */\nfunction sliceBlockFrom(block: BlockNode, relPath: number[], offset: number): BlockNode {\n const fromIdx = relPath[0] ?? 0;\n if (!block.children.every((c) => isTextNode(c as EditorNode))) return block;\n\n const children: TextNode[] = [];\n for (let i = fromIdx; i < block.children.length; i++) {\n const t = block.children[i] as TextNode;\n const s = i === fromIdx ? offset : 0;\n const slice = t.text.slice(s);\n if (slice) children.push({ type: 'text', text: slice, marks: t.marks });\n }\n return { ...block, children };\n}\n\n/** Slice a block from start to cursor. */\nfunction sliceBlockTo(block: BlockNode, relPath: number[], offset: number): BlockNode {\n const toIdx = relPath[0] ?? Math.max(0, block.children.length - 1);\n if (!block.children.every((c) => isTextNode(c as EditorNode))) return block;\n\n const children: TextNode[] = [];\n for (let i = 0; i <= toIdx && i < block.children.length; i++) {\n const t = block.children[i] as TextNode;\n const end = i === toIdx ? offset : t.text.length;\n const slice = t.text.slice(0, end);\n if (slice) children.push({ type: 'text', text: slice, marks: t.marks });\n }\n return { ...block, children };\n}\n\n// ─── Paste merge at cursor ────────────────────────────────────────────────────\n\n/**\n * Merge pastedDoc into existingDoc at the cursor position.\n *\n * Strategy (mirrors CKEditor):\n * 1. Split the cursor block into beforeChildren / afterChildren at cursor offset.\n * 2. If pasting a single block: merge inline — beforeChildren + pasted.children + afterChildren,\n * preserving the cursor block's type.\n * 3. If pasting multiple blocks: build firstMerged (before + pastedFirst) and\n * lastMerged (pastedLast + after), insert middle blocks between them.\n *\n * Returns the merged document and the cursor NodePosition after the paste.\n */\nfunction mergeAtCursor(\n state: EditorState,\n pastedDoc: Document,\n sel: EditorSelection | null,\n): { mergedDoc: Document; cursorPos: NodePosition | null } {\n const pasted = pastedDoc.children;\n if (pasted.length === 0) return { mergedDoc: state.doc, cursorPos: sel?.anchor ?? null };\n\n const existingBlocks = state.doc.children;\n\n // If no selection, append at end\n if (!sel) {\n const mergedDoc: Document = { ...state.doc, children: [...existingBlocks, ...pasted] };\n const lastIdx = mergedDoc.children.length - 1;\n const cursorPos = endOfBlock(mergedDoc.children[lastIdx], lastIdx);\n return { mergedDoc, cursorPos };\n }\n\n const blockIdx = sel.anchor.path[0] ?? 0;\n const relPath = sel.anchor.path.slice(1);\n const charOffset = sel.anchor.offset;\n\n const currentBlock = existingBlocks[blockIdx];\n if (!currentBlock) {\n const mergedDoc: Document = { ...state.doc, children: [...existingBlocks, ...pasted] };\n const lastIdx = mergedDoc.children.length - 1;\n return { mergedDoc, cursorPos: endOfBlock(mergedDoc.children[lastIdx], lastIdx) };\n }\n\n // ── List/checklist container: cursor is inside a list_item ───────────────\n // mergeAtCursor must operate at the list_item level, not the list level.\n // Operating at the list level corrupts list structure (text nodes inside <ul>).\n const LIST_CONTAINERS = new Set(['bullet_list', 'ordered_list', 'check_list']);\n if (LIST_CONTAINERS.has(currentBlock.type) && relPath.length > 0) {\n return mergeIntoListContainer(state, pasted, existingBlocks, blockIdx, currentBlock, relPath, charOffset);\n }\n\n // Split the cursor block at cursor position\n const [beforeChildren, afterChildren] = splitBlockChildren(currentBlock, relPath, charOffset);\n\n let newBlocks: BlockNode[];\n let cursorBlockOffset: number; // offset from blockIdx to cursor's block in newBlocks\n let cursorInBlock: NodePosition; // cursor within that block\n\n if (pasted.length === 1) {\n // ── Single-block paste: inline merge ──────────────────────────────────\n const pastedChildren = pasted[0].children as EditorNode[];\n const mergedChildren = [...beforeChildren, ...pastedChildren, ...afterChildren];\n const cleanChildren = mergedChildren.length > 0\n ? mergedChildren\n : [{ type: 'text' as const, text: '', marks: [] }];\n\n newBlocks = [{ ...currentBlock, children: cleanChildren }];\n cursorBlockOffset = 0;\n\n // Cursor right after the pasted content (before afterChildren)\n const cursorChildIdx = beforeChildren.length + pastedChildren.length;\n const nodeBeforeCursor = cleanChildren[cursorChildIdx - 1];\n if (nodeBeforeCursor && isTextNode(nodeBeforeCursor)) {\n cursorInBlock = {\n path: [blockIdx, cursorChildIdx - 1],\n offset: (nodeBeforeCursor as TextNode).text.length,\n };\n } else {\n cursorInBlock = { path: [blockIdx], offset: 0 };\n }\n\n } else {\n // ── Multi-block paste: split and insert ───────────────────────────────\n const firstPasted = pasted[0];\n const lastPasted = pasted[pasted.length - 1];\n const middleBlocks = pasted.slice(1, -1);\n\n // First merged: cursor block type + before + first pasted content\n const firstMerged: BlockNode = {\n ...currentBlock,\n children: [...beforeChildren, ...(firstPasted.children as EditorNode[])],\n };\n\n // Last merged: last pasted block type + last pasted content + after\n const lastMerged: BlockNode = {\n type: lastPasted.type,\n attrs: lastPasted.attrs,\n children: [...(lastPasted.children as EditorNode[]), ...afterChildren],\n };\n\n newBlocks = [firstMerged, ...(middleBlocks as BlockNode[]), lastMerged];\n cursorBlockOffset = newBlocks.length - 1;\n\n // Cursor at end of last pasted block content (before afterChildren)\n const lpChildren = lastPasted.children as EditorNode[];\n const absoluteLastBlockIdx = blockIdx + cursorBlockOffset;\n if (lpChildren.length > 0) {\n const lastNode = lpChildren[lpChildren.length - 1];\n cursorInBlock = {\n path: [absoluteLastBlockIdx, lpChildren.length - 1],\n offset: isTextNode(lastNode) ? (lastNode as TextNode).text.length : 0,\n };\n } else {\n cursorInBlock = { path: [absoluteLastBlockIdx], offset: 0 };\n }\n }\n\n const mergedChildren: BlockNode[] = [\n ...existingBlocks.slice(0, blockIdx),\n ...newBlocks,\n ...existingBlocks.slice(blockIdx + 1),\n ];\n\n return {\n mergedDoc: { ...state.doc, children: mergedChildren },\n cursorPos: cursorInBlock,\n };\n}\n\n/**\n * Merge pasted content into a list container at the list_item level.\n * Prevents corrupt structure (text nodes directly inside <ul>/<ol>).\n */\nfunction mergeIntoListContainer(\n state: EditorState,\n pasted: BlockNode[],\n existingBlocks: BlockNode[],\n blockIdx: number,\n listBlock: BlockNode,\n relPath: number[],\n charOffset: number,\n): { mergedDoc: Document; cursorPos: NodePosition | null } {\n const itemIdx = relPath[0];\n const itemRelPath = relPath.slice(1);\n const listItems = listBlock.children as BlockNode[];\n const currentItem = listItems[itemIdx];\n const isCheckList = listBlock.type === 'check_list';\n const itemType = isCheckList ? 'check_list_item' : 'list_item';\n\n if (!currentItem) {\n // Cursor out of bounds — append pasted blocks after the list\n const newBlocks = [...existingBlocks, ...pasted];\n const lastIdx = newBlocks.length - 1;\n return {\n mergedDoc: { ...state.doc, children: newBlocks },\n cursorPos: endOfBlock(newBlocks[lastIdx], lastIdx),\n };\n }\n\n const [beforeChildren, afterChildren] = splitBlockChildren(currentItem, itemRelPath, charOffset);\n\n const makeItem = (children: EditorNode[]): BlockNode => ({\n type: itemType as BlockNode['type'],\n attrs: isCheckList ? { checked: false } : {},\n children: children.length > 0 ? children : [{ type: 'text', text: '', marks: [] }],\n });\n\n let newItems: BlockNode[];\n let cursorItemIdx: number;\n\n if (pasted.length === 1) {\n // Single block: inline-merge pasted children into the current item\n const pastedChildren = (pasted[0].children ?? []) as EditorNode[];\n const merged = [...beforeChildren, ...pastedChildren, ...afterChildren];\n newItems = [\n ...listItems.slice(0, itemIdx),\n { ...currentItem, children: merged.length > 0 ? merged : [{ type: 'text' as const, text: '', marks: [] }] },\n ...listItems.slice(itemIdx + 1),\n ];\n cursorItemIdx = itemIdx;\n } else {\n // Multi-block: first+last merge with split halves, middle become new items\n const firstPasted = pasted[0];\n const lastPasted = pasted[pasted.length - 1];\n const middlePasted = pasted.slice(1, -1);\n\n const firstItem = { ...currentItem, children: [...beforeChildren, ...(firstPasted.children ?? [] as EditorNode[])] };\n const lastItem = makeItem([...(lastPasted.children ?? [] as EditorNode[]), ...afterChildren]);\n const midItems = middlePasted.map((p) => makeItem((p.children ?? []) as EditorNode[]));\n\n newItems = [\n ...listItems.slice(0, itemIdx),\n firstItem,\n ...midItems,\n lastItem,\n ...listItems.slice(itemIdx + 1),\n ];\n cursorItemIdx = itemIdx + 1 + midItems.length;\n }\n\n const newList: BlockNode = { ...listBlock, children: newItems };\n const mergedBlocks: BlockNode[] = [\n ...existingBlocks.slice(0, blockIdx),\n newList,\n ...existingBlocks.slice(blockIdx + 1),\n ];\n\n // Compute cursor: end of last pasted content in target item\n const targetItem = newItems[cursorItemIdx];\n let cursorPos: NodePosition;\n if (pasted.length === 1) {\n const pastedChildren = (pasted[0].children ?? []) as EditorNode[];\n const cursorChildIdx = beforeChildren.length + pastedChildren.length;\n const nodeBefore = targetItem?.children[cursorChildIdx - 1];\n cursorPos = nodeBefore && isTextNode(nodeBefore)\n ? { path: [blockIdx, cursorItemIdx, cursorChildIdx - 1], offset: (nodeBefore as TextNode).text.length }\n : { path: [blockIdx, cursorItemIdx], offset: 0 };\n } else {\n const lpChildren = (pasted[pasted.length - 1].children ?? []) as EditorNode[];\n if (lpChildren.length > 0) {\n const lastNode = lpChildren[lpChildren.length - 1];\n cursorPos = {\n path: [blockIdx, cursorItemIdx, lpChildren.length - 1],\n offset: isTextNode(lastNode) ? (lastNode as TextNode).text.length : 0,\n };\n } else {\n cursorPos = { path: [blockIdx, cursorItemIdx], offset: 0 };\n }\n }\n\n return { mergedDoc: { ...state.doc, children: mergedBlocks }, cursorPos };\n}\n\n/**\n * Split a block's children array at the cursor position.\n * Returns [beforeChildren, afterChildren].\n *\n * relPath: path within block to the text node, e.g. [2] for children[2].\n * offset: char offset within that text node.\n */\nfunction splitBlockChildren(\n block: BlockNode,\n relPath: number[],\n offset: number,\n): [EditorNode[], EditorNode[]] {\n const children = block.children;\n\n if (children.length === 0) return [[], []];\n\n // If cursor is at block level (empty block or cursor on block itself)\n if (relPath.length === 0) return [[], [...children]];\n\n const textIdx = relPath[0];\n if (textIdx >= children.length) return [[...children], []];\n\n const node = children[textIdx];\n\n if (!isTextNode(node)) {\n // Split at block boundary\n return [[...children.slice(0, textIdx)], [...children.slice(textIdx)]];\n }\n\n const textNode = node as TextNode;\n const before: EditorNode[] = [\n ...children.slice(0, textIdx),\n ...(offset > 0\n ? [{ type: 'text' as const, text: textNode.text.slice(0, offset), marks: textNode.marks }]\n : []),\n ];\n const after: EditorNode[] = [\n ...(offset < textNode.text.length\n ? [{ type: 'text' as const, text: textNode.text.slice(offset), marks: textNode.marks }]\n : []),\n ...children.slice(textIdx + 1),\n ];\n\n return [before, after];\n}\n\n/** Return a NodePosition pointing to the end of the last text node in a block. */\nfunction endOfBlock(block: BlockNode, blockIdx: number): NodePosition {\n const children = block.children;\n for (let i = children.length - 1; i >= 0; i--) {\n const n = children[i];\n if (isTextNode(n)) {\n return { path: [blockIdx, i], offset: (n as TextNode).text.length };\n }\n }\n return { path: [blockIdx], offset: 0 };\n}\n\n// ─── Plain text parsing ───────────────────────────────────────────────────────\n\nfunction parsePlainText(text: string): Document {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').trim();\n\n // Check if it's a URL\n if (isURL(normalized)) {\n const href = /^https?:\\/\\//i.test(normalized) ? normalized : `https://${normalized}`;\n return htmlSerializer.deserialize(\n `<p><a href=\"${escapeAttr(href)}\">${escapeHTML(normalized)}</a></p>`,\n );\n }\n\n // Double newline = new paragraph; single newline = <br> within paragraph\n const paragraphs = normalized.split(/\\n{2,}/);\n\n if (paragraphs.length === 1) {\n const lines = normalized.split('\\n');\n if (lines.length === 1) {\n return htmlSerializer.deserialize(`<p>${escapeHTML(normalized)}</p>`);\n }\n const html = lines.map((l) => escapeHTML(l)).join('<br>');\n return htmlSerializer.deserialize(`<p>${html}</p>`);\n }\n\n const html = paragraphs\n .map((p) => `<p>${p.split('\\n').map((l) => escapeHTML(l)).join('<br>')}</p>`)\n .join('');\n return htmlSerializer.deserialize(html);\n}\n\n// ─── HTML normalization ───────────────────────────────────────────────────────\n\n/**\n * Normalize pasted HTML for safe insertion.\n *\n * Handles:\n * - CF_HTML clipboard markers (<!--StartFragment-->, etc.)\n * - Microsoft Word / Office MSO conditional comments and namespace tags\n * - Google Docs wrapper elements (<b style=\"font-weight:normal\">)\n * - Inline style preservation: font-size, font-family, color, background-color\n * - Strips: scripts, iframes, event handlers, class, id, MSO-specific styles\n */\nfunction normalizeHTML(html: string): string {\n // 1. Strip HTML/XML comments (CF_HTML markers, MSO conditionals)\n let out = html.replace(/<!--[\\s\\S]*?-->/g, '');\n\n // 2. Strip MSO conditional blocks that survived comment removal\n out = out.replace(/<!\\[if[^\\]]*\\]>[\\s\\S]*?<!\\[endif\\]>/gi, '');\n\n // 3. Strip MSO / Office namespace tags (o:p, w:sdtPr, v:shape, etc.)\n out = out.replace(/<\\/?(?:o|w|m|v|st\\d?|x):[^>]*>/gi, '');\n\n // 4. Parse cleaned HTML\n const parser = new DOMParser();\n const doc = parser.parseFromString(out, 'text/html');\n\n // 5. Remove dangerous elements\n doc\n .querySelectorAll(\n 'script, style, iframe, object, embed, form, button, select, textarea, meta, link',\n )\n .forEach((el) => el.remove());\n\n // Remove all inputs except checkbox inputs inside todo-list items\n doc.querySelectorAll('input').forEach((el) => {\n const isCheckbox = el.getAttribute('type')?.toLowerCase() === 'checkbox';\n const inTodoList = !!el.closest('ul[data-type=\"checklist\"], ul.todo-list, li.todo-list__item, li[data-checked]');\n if (!isCheckbox || !inTodoList) el.remove();\n });\n\n // 6. Unwrap Google Docs' <b style=\"font-weight:normal|400|inherit\"> wrappers\n doc.querySelectorAll('b').forEach((el) => {\n const fw = (el as HTMLElement).style.fontWeight;\n if (fw === 'normal' || fw === '400' || fw === 'inherit' || fw === '') {\n // Keep children, remove the tag\n const parent = el.parentNode;\n if (!parent) return;\n while (el.firstChild) parent.insertBefore(el.firstChild, el);\n el.remove();\n }\n });\n\n // 7. For every remaining element: strip unsafe attributes, preserve useful styles\n doc.querySelectorAll('*').forEach((node) => {\n const el = node as HTMLElement;\n const tag = el.tagName.toLowerCase();\n\n // ── Preserve safe CSS properties, strip the rest ──────────────────────\n const fontSize = el.style?.fontSize ?? '';\n const fontFamily = el.style?.fontFamily ?? '';\n const color = el.style?.color ?? '';\n const bgColor = el.style?.backgroundColor ?? '';\n\n el.removeAttribute('style');\n\n const safeStyle: string[] = [];\n if (fontSize) safeStyle.push(`font-size:${fontSize}`);\n if (fontFamily) safeStyle.push(`font-family:${fontFamily}`);\n if (color) safeStyle.push(`color:${color}`);\n // Only keep background-color if it's non-trivial (not white or transparent)\n if (\n bgColor &&\n !['transparent', 'rgba(0, 0, 0, 0)', 'white', 'rgb(255, 255, 255)', '#ffffff', '#fff'].includes(\n bgColor.toLowerCase().replace(/\\s/g, ''),\n )\n ) {\n safeStyle.push(`background-color:${bgColor}`);\n }\n if (safeStyle.length > 0) el.setAttribute('style', safeStyle.join(';'));\n\n // ── Remove class, id, and all event handlers ──────────────────────────\n el.removeAttribute('class');\n el.removeAttribute('id');\n Array.from(el.attributes).forEach((attr) => {\n if (attr.name.startsWith('on')) el.removeAttribute(attr.name);\n });\n\n // ── Strip non-semantic / dangerous data-* except our own ──────────────\n Array.from(el.attributes).forEach((attr) => {\n if (attr.name.startsWith('data-') && !['data-align', 'data-type', 'data-checked'].includes(attr.name)) {\n el.removeAttribute(attr.name);\n }\n });\n\n // ── For <a>: keep href, target, rel only ─────────────────────────────\n if (tag === 'a') {\n const href = el.getAttribute('href') ?? '';\n const isUnsafe = /^(javascript:|vbscript:|data:)/i.test(href.trim());\n Array.from(el.attributes).forEach((attr) => {\n if (!['href', 'target', 'rel', 'style'].includes(attr.name)) el.removeAttribute(attr.name);\n });\n if (isUnsafe) el.removeAttribute('href');\n }\n\n // ── For <img>: keep src, alt, width ───────────────────────────────────\n if (tag === 'img') {\n Array.from(el.attributes).forEach((attr) => {\n if (!['src', 'alt', 'width', 'height', 'style'].includes(attr.name)) el.removeAttribute(attr.name);\n });\n }\n\n // ── For table cells: keep colspan/rowspan ─────────────────────────────\n if (tag === 'td' || tag === 'th') {\n Array.from(el.attributes).forEach((attr) => {\n if (!['colspan', 'rowspan', 'style'].includes(attr.name)) el.removeAttribute(attr.name);\n });\n }\n\n // ── For <code>: keep class (language-*) ──────────────────────────────\n if (tag === 'code') {\n Array.from(el.attributes).forEach((attr) => {\n if (!['class', 'style'].includes(attr.name)) el.removeAttribute(attr.name);\n });\n }\n });\n\n // 8. Detect and promote MSO heading classes (Word pastes headings as <p class=\"MsoHeading1\">)\n // These were stripped above, but we can detect them from the raw string before parsing\n // (already handled by heading tag detection — Word also outputs <h1>/<h2> sometimes)\n\n return doc.body.innerHTML;\n}\n\n// ─── Utilities ────────────────────────────────────────────────────────────────\n\nfunction docToPlainText(doc: Document): string {\n return doc.children.map(blockToPlainText).join('\\n\\n');\n}\n\nfunction blockToPlainText(block: BlockNode): string {\n if (block.children.length === 0) return '';\n return block.children\n .map((c) => {\n if (isTextNode(c)) return (c as TextNode).text;\n return blockToPlainText(c as BlockNode);\n })\n .join('');\n}\n\nfunction escapeHTML(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nfunction escapeAttr(str: string): string {\n return str.replace(/&/g, '&').replace(/\"/g, '"').replace(/'/g, ''');\n}\n\nconst URL_RE = /^(https?:\\/\\/|www\\.)[^\\s]{2,}$/i;\n\nfunction isURL(text: string): boolean {\n if (!URL_RE.test(text)) return false;\n try {\n new URL(text.startsWith('http') ? text : `https://${text}`);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * Editor Commands\n *\n * A Command is a pure function: (engine) → boolean.\n * It creates a Transaction, adds steps, and dispatches it.\n * Returns true if it handled the action (for key binding chains).\n *\n * Commands are the ONLY place that should call engine.dispatch().\n * Components and plugins should call commands, not dispatch directly.\n *\n * Architecture note:\n * Commands don't know about React or the DOM.\n * They only know about EditorState and Transactions.\n * This makes them trivially testable.\n */\n\nimport type {\n Command,\n Mark,\n MarkType,\n BlockNodeType,\n EditorNode,\n TextNode,\n BlockNode,\n NodeAttrs,\n EditorEngineInterface,\n} from '../../types';\n\nimport {\n createTransaction,\n tr_addMark,\n tr_removeMark,\n tr_setMark,\n tr_setNodeType,\n tr_setNodeAttrs,\n tr_splitBlock,\n tr_joinBlocks,\n tr_insertText,\n tr_setSelection,\n tr_deleteRange,\n} from '../core/Transaction';\n\nimport {\n isTextNode,\n findContentBlockPath,\n normalizeRange,\n getNodeAtPath,\n createParagraph,\n marksEqual,\n} from '../core/DocumentModel';\n\nimport {\n getActiveMarks,\n getActiveLinkRange,\n makePosition,\n makeCollapsedSelection,\n} from '../selection/SelectionEngine';\n\n// ─── Mark Commands ────────────────────────────────────────────────────────────\n\n/**\n * Toggle a mark on the current selection.\n * If the selection has the mark → remove it.\n * If not → add it.\n */\nexport function toggleMark(markType: MarkType, attrs?: Record<string, unknown>): Command {\n return (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n\n const mark: Mark = { type: markType, attrs: attrs as Mark['attrs'] };\n\n const tr = createTransaction();\n if (!state.selection) tr.steps.push(tr_setSelection(selection));\n\n if (selection.isCollapsed) {\n // Collapsed cursor: toggle against pending marks (state.marks), NOT the\n // text node at cursor. getActiveMarks reads the text node which never\n // reflects pending marks set before typing — using it here caused the\n // mark to keep accumulating instead of toggling off.\n const isPendingActive = state.marks.some((m) => m.type === markType);\n tr.meta.pendingMarks = isPendingActive\n ? state.marks.filter((m) => m.type !== markType)\n : [...state.marks, mark];\n engine.dispatch(tr);\n return true;\n }\n\n const activeMarks = getActiveMarks(doc, selection);\n const isActive = activeMarks.has(markType);\n\n const from = selection.anchor;\n const to = selection.focus;\n\n if (isActive) {\n tr.steps.push(tr_removeMark(from, to, markType));\n } else {\n tr.steps.push(tr_addMark(from, to, mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport const toggleBold: Command = toggleMark('bold');\nexport const toggleItalic: Command = toggleMark('italic');\nexport const toggleUnderline: Command = toggleMark('underline');\nexport const toggleStrikethrough: Command = toggleMark('strikethrough');\nexport const toggleCode: Command = toggleMark('code');\n\n// ─── Block Type Commands ──────────────────────────────────────────────────────\n\n/**\n * Set the block type of the paragraph containing the cursor.\n * If the block is already the target type, revert to paragraph.\n */\nexport function setBlockType(nodeType: BlockNodeType, attrs: NodeAttrs = {}): Command {\n return (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const currentBlock = getNodeAtPath(doc, blockPath) as import('../../types').BlockNode | null;\n const currentType = currentBlock?.type ?? 'paragraph';\n\n // For headings compare both type and level so H1→H2 changes level rather than toggling off\n const isSame = currentType === nodeType &&\n (nodeType !== 'heading' || (currentBlock?.attrs?.level ?? 1) === (attrs.level ?? 1));\n\n const targetType = isSame ? 'paragraph' : nodeType;\n const targetAttrs = isSame ? {} : attrs;\n\n const tr = createTransaction();\n tr.steps.push(tr_setNodeType(blockPath, targetType, targetAttrs));\n if (!state.selection) tr.steps.push(tr_setSelection(selection));\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport const setHeading = (level: 1 | 2 | 3 | 4 | 5 | 6): Command =>\n setBlockType('heading', { level });\n\nexport const setParagraph: Command = setBlockType('paragraph');\nexport const setBlockquote: Command = setBlockType('blockquote');\nexport const setCodeBlock: Command = setBlockType('code_block');\n\n/**\n * Toggle bullet list. Wraps the current block in a bullet_list > list_item,\n * or unwraps it back to a paragraph if already inside a list.\n */\nconst toggleListOfType = (listType: 'bullet_list' | 'ordered_list'): Command => (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block) return false;\n\n const parentPath = blockPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath) as BlockNode | import('../../types').Document | null;\n const parentType = (parent && 'type' in parent) ? parent.type : 'doc';\n\n const blockIdx = blockPath[blockPath.length - 1];\n const tr = createTransaction();\n\n // Already inside a list of the target kind → unwrap back to a paragraph.\n if (block.type === 'list_item' && parentType === listType) {\n const listPath = parentPath;\n const grandParentPath = listPath.slice(0, -1);\n const listIdx = listPath[listPath.length - 1];\n\n const paragraph: BlockNode = {\n type: 'paragraph',\n attrs: {},\n children: block.children,\n };\n\n // Split remaining items into before/after so the list is properly divided\n // around the extracted paragraph (CKEditor behavior).\n const listNode = parent as BlockNode;\n const beforeItems = (listNode.children as BlockNode[]).slice(0, blockIdx);\n const afterItems = (listNode.children as BlockNode[]).slice(blockIdx + 1);\n\n tr.steps.push({ type: 'delete_node', path: listPath });\n let insertIdx = listIdx;\n if (beforeItems.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: insertIdx, node: { ...listNode, children: beforeItems } });\n insertIdx++;\n }\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: insertIdx, node: paragraph });\n insertIdx++;\n if (afterItems.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: insertIdx, node: { ...listNode, children: afterItems } });\n }\n engine.dispatch(tr);\n return true;\n }\n\n // Inside a DIFFERENT regular list type (bullet ↔ ordered) → convert parent list type.\n // Do NOT wrap again — that would nest a new list inside the existing one.\n if (block.type === 'list_item' && (parentType === 'bullet_list' || parentType === 'ordered_list')) {\n tr.steps.push(tr_setNodeType(parentPath, listType, {}));\n engine.dispatch(tr);\n return true;\n }\n\n // Inside a check_list → convert entire check_list to the requested list type,\n // mapping each check_list_item → list_item.\n if (block.type === 'check_list_item' && parentType === 'check_list') {\n const checkList = parent as BlockNode;\n const grandParentPath = parentPath.slice(0, -1);\n const listIdx = parentPath[parentPath.length - 1];\n const convertedList: BlockNode = {\n type: listType,\n attrs: {},\n children: (checkList.children as BlockNode[]).map((item) => ({\n type: 'list_item' as const,\n attrs: {},\n children: item.children,\n })),\n };\n tr.steps.push({ type: 'delete_node', path: parentPath });\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: listIdx, node: convertedList });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...grandParentPath, listIdx, blockIdx, 0], 0))));\n engine.dispatch(tr);\n return true;\n }\n\n // Wrap the current block in a list. Preserve its inline children as a list_item.\n const listItem: BlockNode = {\n type: 'list_item',\n attrs: {},\n children: block.children,\n };\n const listNode: BlockNode = {\n type: listType,\n attrs: {},\n children: [listItem],\n };\n\n tr.steps.push({ type: 'delete_node', path: blockPath });\n tr.steps.push({\n type: 'insert_node',\n parentPath,\n index: blockIdx,\n node: listNode,\n });\n // Move the cursor into the new list_item's first text node.\n tr.steps.push(\n tr_setSelection(\n makeCollapsedSelection(makePosition([...blockPath, 0, 0], 0)),\n ),\n );\n engine.dispatch(tr);\n return true;\n};\n\nexport const toggleBulletList: Command = toggleListOfType('bullet_list');\nexport const toggleOrderedList: Command = toggleListOfType('ordered_list');\n\n// ─── Code Block Helpers ───────────────────────────────────────────────────────\n\n/**\n * Exit code block: strip the trailing '\\n', insert a paragraph after the block,\n * move cursor there. Mirrors CKEditor double-Enter exit behavior.\n */\nfunction exitCodeBlock(\n engine: EditorEngineInterface,\n doc: import('../../types').Document,\n blockPath: number[],\n): boolean {\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block || block.type !== 'code_block') return false;\n\n // Remove the trailing '\\n' from the last text node.\n const children = block.children as EditorNode[];\n const lastTextIdx = [...children].reverse().findIndex((c) => c.type === 'text');\n if (lastTextIdx === -1) return false;\n const realIdx = children.length - 1 - lastTextIdx;\n const lastText = children[realIdx] as TextNode;\n if (!lastText.text.endsWith('\\n')) return false;\n\n const trimmedText = lastText.text.slice(0, -1);\n const tr = createTransaction();\n\n // Replace last text node content.\n if (trimmedText.length === 0) {\n // Remove empty text node entirely only if there are siblings; else keep with empty text.\n if (children.length > 1) {\n tr.steps.push({ type: 'delete_text', path: [...blockPath, realIdx], from: 0, to: lastText.text.length });\n } else {\n tr.steps.push({ type: 'delete_text', path: [...blockPath, realIdx], from: lastText.text.length - 1, to: lastText.text.length });\n }\n } else {\n tr.steps.push({ type: 'delete_text', path: [...blockPath, realIdx], from: trimmedText.length, to: lastText.text.length });\n }\n\n // Insert paragraph after code block.\n const parentPath = blockPath.slice(0, -1);\n const blockIdx = blockPath[blockPath.length - 1];\n const para = createParagraph();\n tr.steps.push({ type: 'insert_node', parentPath, index: blockIdx + 1, node: para });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...parentPath, blockIdx + 1, 0], 0))));\n\n engine.dispatch(tr);\n return true;\n}\n\n/**\n * Set or clear the language on the code_block under the cursor.\n */\nexport function setCodeBlockLanguage(language: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block || block.type !== 'code_block') return false;\n const tr = createTransaction();\n tr.steps.push(tr_setNodeAttrs(blockPath, { ...(block.attrs ?? {}), language: language ?? '' }));\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Check List ───────────────────────────────────────────────────────────────\n\n/**\n * Exit a list_item from a bullet_list or ordered_list: extract it as a paragraph,\n * splitting the surrounding list into before/after parts as needed.\n * Mirrors CKEditor behavior for Backspace at start of first item / Enter on empty item.\n */\nfunction exitListItem(\n engine: EditorEngineInterface,\n doc: import('../../types').Document,\n blockPath: number[],\n): boolean {\n const parentPath = blockPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath) as BlockNode | null;\n if (!parent || (parent.type !== 'bullet_list' && parent.type !== 'ordered_list')) return false;\n\n const blockIdx = blockPath[blockPath.length - 1];\n const listIdx = parentPath[parentPath.length - 1];\n const grandPath = parentPath.slice(0, -1);\n\n const listItem = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!listItem) return false;\n\n const before = (parent.children as BlockNode[]).slice(0, blockIdx);\n const after = (parent.children as BlockNode[]).slice(blockIdx + 1);\n\n const tr = createTransaction();\n\n tr.steps.push({ type: 'delete_node', path: parentPath });\n\n let insertAt = listIdx;\n if (before.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: { ...parent, children: before } as BlockNode });\n insertAt++;\n }\n\n const para: BlockNode = { type: 'paragraph', attrs: {}, children: listItem.children };\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: para });\n const paraPath = [...grandPath, insertAt];\n insertAt++;\n\n if (after.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: { ...parent, children: after } as BlockNode });\n }\n\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...paraPath, 0], 0))));\n engine.dispatch(tr);\n return true;\n}\n\n/**\n * Exit an empty check_list_item: extract it as a paragraph, splitting the\n * surrounding check_list into before/after parts as needed.\n */\nfunction exitCheckListItem(\n engine: EditorEngineInterface,\n doc: import('../../types').Document,\n blockPath: number[],\n): boolean {\n const parentPath = blockPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath) as BlockNode | null;\n if (!parent || parent.type !== 'check_list') return false;\n\n const blockIdx = blockPath[blockPath.length - 1];\n const listIdx = parentPath[parentPath.length - 1];\n const grandPath = parentPath.slice(0, -1);\n\n const before = (parent.children as BlockNode[]).slice(0, blockIdx);\n const after = (parent.children as BlockNode[]).slice(blockIdx + 1);\n\n const tr = createTransaction();\n\n // Remove the whole list then re-assemble around an empty paragraph.\n tr.steps.push({ type: 'delete_node', path: parentPath });\n\n let insertAt = listIdx;\n if (before.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: { ...parent, children: before } as BlockNode });\n insertAt++;\n }\n\n const para = createParagraph();\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: para });\n const paraPath = [...grandPath, insertAt];\n insertAt++;\n\n if (after.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandPath, index: insertAt, node: { ...parent, children: after } as BlockNode });\n }\n\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(paraPath, 0))));\n engine.dispatch(tr);\n return true;\n}\n\n/**\n * Toggle checklist. Wraps the current block in check_list > check_list_item,\n * or unwraps it back to a paragraph if already inside a checklist.\n */\nexport const toggleCheckList: Command = (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const selection = state.selection ?? makeCollapsedSelection(makePosition([0], 0));\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block) return false;\n\n const parentPath = blockPath.slice(0, -1);\n const parent = getNodeAtPath(doc, parentPath) as BlockNode | import('../../types').Document | null;\n const parentType = (parent && 'type' in parent) ? parent.type : 'doc';\n const blockIdx = blockPath[blockPath.length - 1];\n const tr = createTransaction();\n\n // Already in a check_list_item → unwrap to paragraph.\n if (block.type === 'check_list_item' && parentType === 'check_list') {\n const listPath = parentPath;\n const grandParentPath = listPath.slice(0, -1);\n const listIdx = listPath[listPath.length - 1];\n\n const paragraph: BlockNode = { type: 'paragraph', attrs: {}, children: block.children };\n const listNode = parent as BlockNode;\n const remainingItems = listNode.children.filter((_, i) => i !== blockIdx);\n\n tr.steps.push({ type: 'delete_node', path: listPath });\n let insertIdx = listIdx;\n if (remainingItems.length > 0) {\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: listIdx, node: { ...listNode, children: remainingItems } });\n insertIdx = listIdx + 1;\n }\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: insertIdx, node: paragraph });\n engine.dispatch(tr);\n return true;\n }\n\n // Inside a regular list (bullet/ordered) → convert entire list to check_list,\n // mapping each list_item → check_list_item.\n // Do NOT nest a check_list inside the existing list.\n if (block.type === 'list_item' && (parentType === 'bullet_list' || parentType === 'ordered_list')) {\n const listNode = parent as BlockNode;\n const grandParentPath = parentPath.slice(0, -1);\n const listIdx = parentPath[parentPath.length - 1];\n const convertedList: BlockNode = {\n type: 'check_list',\n attrs: {},\n children: (listNode.children as BlockNode[]).map((item) => ({\n type: 'check_list_item' as const,\n attrs: { checked: false },\n children: item.children,\n })),\n };\n tr.steps.push({ type: 'delete_node', path: parentPath });\n tr.steps.push({ type: 'insert_node', parentPath: grandParentPath, index: listIdx, node: convertedList });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...grandParentPath, listIdx, blockIdx, 0], 0))));\n engine.dispatch(tr);\n return true;\n }\n\n // Wrap current block in check_list > check_list_item.\n const checkListItem: BlockNode = { type: 'check_list_item', attrs: { checked: false }, children: block.children };\n const checkListNode: BlockNode = { type: 'check_list', attrs: {}, children: [checkListItem] };\n\n tr.steps.push({ type: 'delete_node', path: blockPath });\n tr.steps.push({ type: 'insert_node', parentPath, index: blockIdx, node: checkListNode });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...blockPath, 0, 0], 0))));\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Toggle the checked state of the check_list_item at path.\n * Called by the Editor's mousedown handler when the user clicks a checkbox.\n */\nexport function toggleCheckItemAt(path: number[]): Command {\n return (engine) => {\n const state = engine.getState();\n const node = getNodeAtPath(state.doc, path) as BlockNode | null;\n if (!node || node.type !== 'check_list_item') return false;\n\n const tr = createTransaction();\n tr.steps.push(tr_setNodeAttrs(path, { checked: !node.attrs?.checked }));\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Text Insertion ───────────────────────────────────────────────────────────\n\n/**\n * Insert text at the current cursor position with the current pending marks.\n * If a range is selected, deletes it first (industry-standard \"type-to-replace\").\n */\nexport function insertText(text: string): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection, marks, doc } = state;\n if (!selection) return false;\n\n const tr = createTransaction();\n let insertAt = selection.anchor;\n\n if (!selection.isCollapsed) {\n const { from } = normalizeRange(selection.anchor, selection.focus);\n tr.steps.push(tr_deleteRange(selection.anchor, selection.focus));\n insertAt = from;\n }\n\n // Resolve the cursor's text-node path. If the selection points at a block\n // (empty paragraph), the cursor lands at [...blockPath, 0] after insertion.\n const node = getNodeAtPath(doc, insertAt.path);\n const isAtBlock = !node || !isTextNode(node as EditorNode);\n let cursorPath: number[];\n let cursorOffset: number;\n\n if (isAtBlock) {\n cursorPath = [...insertAt.path, 0];\n cursorOffset = text.length;\n } else {\n const textNode = node as TextNode;\n if (marksEqual(textNode.marks, marks)) {\n // Same marks: text spliced in-place, cursor stays on same node.\n cursorPath = insertAt.path;\n cursorOffset = insertAt.offset + text.length;\n } else {\n // Different marks: insertTextAtPath splits the node. The new text node\n // lands at parentPath[nodeIndex + (hasBefore ? 1 : 0)]. Using the\n // pre-split path here caused set_selection to read the wrong node's\n // marks, resetting state.marks and breaking continued formatting.\n const parentPath = insertAt.path.slice(0, -1);\n const nodeIndex = insertAt.path[insertAt.path.length - 1];\n const hasBefore = insertAt.offset > 0;\n cursorPath = [...parentPath, nodeIndex + (hasBefore ? 1 : 0)];\n cursorOffset = text.length;\n }\n }\n\n tr.steps.push(tr_insertText(insertAt.path, insertAt.offset, text, marks));\n tr.steps.push(\n tr_setSelection(\n makeCollapsedSelection(makePosition(cursorPath, cursorOffset)),\n ),\n );\n\n engine.dispatch(tr);\n return true;\n };\n}\n\n/**\n * Replace the current selection with the given text. Used by handleBeforeInput\n * to implement \"typing replaces selected text\".\n */\nexport const replaceSelectionWithText = (text: string): Command => insertText(text);\n\n// ─── Enter / Backspace ───────────────────────────────────────────────────────\n\n/**\n * Handle Enter key: split the current block at the cursor. If a range is selected,\n * delete the range first.\n */\nexport const handleEnter: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n const tr = createTransaction();\n\n let cursor = selection.anchor;\n if (!selection.isCollapsed) {\n const { from } = normalizeRange(selection.anchor, selection.focus);\n tr.steps.push(tr_deleteRange(selection.anchor, selection.focus));\n cursor = from;\n }\n\n const blockPath = findContentBlockPath(doc, cursor.path);\n if (!blockPath) return false;\n\n // Enter on an empty check_list_item exits the list instead of splitting.\n if (selection.isCollapsed) {\n const blockNode = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (blockNode?.type === 'check_list_item') {\n const isEmpty = blockNode.children.length === 0 ||\n (blockNode.children as EditorNode[]).every(\n (c) => c.type !== 'text' || (c as TextNode).text.length === 0,\n );\n if (isEmpty) return exitCheckListItem(engine, doc, blockPath);\n }\n\n // Enter on an empty list_item exits the list (CKEditor behavior)\n if (blockNode?.type === 'list_item') {\n const isEmpty = blockNode.children.length === 0 ||\n (blockNode.children as EditorNode[]).every(\n (c) => c.type !== 'text' || (c as TextNode).text.length === 0,\n );\n if (isEmpty) return exitListItem(engine, doc, blockPath);\n }\n\n // Enter inside code_block: insert '\\n' instead of splitting into a new block.\n // Double-Enter on an empty last line exits the code block (CKEditor behavior).\n if (blockNode?.type === 'code_block') {\n const fullText = (blockNode.children as EditorNode[])\n .filter((c): c is TextNode => c.type === 'text')\n .map((c) => c.text)\n .join('');\n // If block ends with '\\n' and cursor is at the very end → exit to paragraph.\n if (fullText.endsWith('\\n') && cursor.offset === fullText.length) {\n return exitCodeBlock(engine, doc, blockPath);\n }\n return insertText('\\n')(engine);\n }\n }\n\n // Compute the text offset within the block where the cursor sits.\n // For a text-node path this is the same as the offset within that text node\n // PLUS the sum of preceding sibling text lengths in the block.\n const blockOffset = computeBlockOffset(doc, blockPath, cursor);\n tr.steps.push(tr_splitBlock(blockPath, blockOffset));\n\n // Cursor lands at the start of the new (second) block.\n const newBlockPath = [...blockPath.slice(0, -1), blockPath[blockPath.length - 1] + 1];\n\n // New check_list_item must always start unchecked regardless of parent.\n const blockNode = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (blockNode?.type === 'check_list_item') {\n tr.steps.push(tr_setNodeAttrs(newBlockPath, { checked: false }));\n }\n\n tr.steps.push(\n tr_setSelection(makeCollapsedSelection(makePosition([...newBlockPath, 0], 0))),\n );\n\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Handle Backspace: delete a character, or if a range is selected delete the range,\n * or if at the start of a block join with the previous block.\n */\nexport const handleBackspace: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n // Range selected → delete it.\n if (!selection.isCollapsed) {\n const tr = createTransaction();\n tr.steps.push(tr_deleteRange(selection.anchor, selection.focus));\n engine.dispatch(tr);\n return true;\n }\n\n const { path, offset } = selection.anchor;\n\n if (offset > 0) {\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_text', path, from: offset - 1, to: offset });\n tr.steps.push(\n tr_setSelection(makeCollapsedSelection(makePosition(path, offset - 1))),\n );\n engine.dispatch(tr);\n return true;\n }\n\n // At the start of a text node: if there's a previous sibling in the block,\n // move cursor there. Otherwise join with previous block.\n const blockPath = findContentBlockPath(doc, path);\n if (!blockPath) return false;\n\n // Backspace on an empty check_list_item exits the list.\n const blockNode = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (blockNode?.type === 'check_list_item') {\n const isEmpty = blockNode.children.length === 0 ||\n (blockNode.children as EditorNode[]).every(\n (c) => c.type !== 'text' || (c as TextNode).text.length === 0,\n );\n if (isEmpty) return exitCheckListItem(engine, doc, blockPath);\n }\n\n const blockIdx = blockPath[blockPath.length - 1];\n if (blockIdx === 0 && path.length === blockPath.length + 1 && path[blockPath.length] === 0) {\n // At start of first text in first content block.\n // If it's a list_item, exit the list (CKEditor behavior: Backspace → paragraph above list).\n const blockAtPath = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (blockAtPath?.type === 'list_item') {\n return exitListItem(engine, doc, blockPath);\n }\n return true; // first text in first top-level block; nothing to delete\n }\n\n const tr = createTransaction();\n tr.steps.push(tr_joinBlocks(blockPath));\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Compute the flat text offset of a position within a block.\n * For Enter/split: we need the character offset within the block's flat text.\n */\nfunction computeBlockOffset(\n doc: import('../../types').Document,\n blockPath: number[],\n pos: import('../../types').NodePosition,\n): number {\n // Walk the block's children up to pos.path, summing text lengths;\n // add pos.offset for the text node containing the cursor.\n const block = (function get(d: typeof doc, p: number[]): unknown {\n let cur: unknown = d;\n for (const i of p) {\n cur = (cur as { children: unknown[] }).children[i];\n }\n return cur;\n })(doc, blockPath) as import('../../types').BlockNode | null;\n if (!block) return 0;\n\n let offset = 0;\n const targetIdx = pos.path[blockPath.length];\n if (targetIdx === undefined) return 0;\n\n for (let i = 0; i < targetIdx; i++) {\n const child = block.children[i];\n if (child && child.type === 'text') {\n offset += (child as TextNode).text.length;\n }\n }\n offset += pos.offset;\n return offset;\n}\n\n// ─── Link ─────────────────────────────────────────────────────────────────────\n\n/**\n * Insert or update a link — mirrors CKEditor 5 link behaviour:\n *\n * 1. Cursor collapsed, text provided → insert a new text node with the link\n * mark at the cursor position, then place cursor after it.\n * 2. Cursor collapsed inside existing link → update the href on the whole link\n * span (all adjacent same-href nodes) using tr_setMark to avoid duplicates.\n * 3. Range selected → atomically replace any existing link on that range with\n * the new href via tr_setMark (also prevents duplicate <a> tags).\n */\nexport function insertLink(href: string, displayText?: string): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection, doc, marks } = state;\n if (!selection) return false;\n\n const linkMark: Mark = { type: 'link', attrs: { href } };\n const tr = createTransaction();\n\n // ── Case 1: collapsed cursor ──────────────────────────────────────────────\n if (selection.isCollapsed) {\n const linkRange = getActiveLinkRange(doc, selection);\n\n if (linkRange) {\n // Update existing link span href atomically\n tr.steps.push(tr_setMark(linkRange.from, linkRange.to, 'link', linkMark));\n engine.dispatch(tr);\n return true;\n }\n\n if (displayText && displayText.trim()) {\n // Insert brand-new linked text at cursor\n const text = displayText.trim();\n const insertAt = selection.anchor;\n const node = getNodeAtPath(doc, insertAt.path);\n const isAtBlock = !node || !isTextNode(node as EditorNode);\n\n // Build marks for the new node: current pending marks + link\n const baseMarks = marks.filter((m) => m.type !== 'link');\n const newMarks: Mark[] = [...baseMarks, linkMark];\n\n // Calculate cursor position after insertion (same split-aware logic as insertText)\n let cursorPath: number[];\n let cursorOffset: number;\n if (isAtBlock) {\n cursorPath = [...insertAt.path, 0];\n cursorOffset = text.length;\n } else {\n const textNode = node as TextNode;\n if (marksEqual(textNode.marks, newMarks)) {\n cursorPath = insertAt.path;\n cursorOffset = insertAt.offset + text.length;\n } else {\n const parentPath = insertAt.path.slice(0, -1);\n const nodeIndex = insertAt.path[insertAt.path.length - 1];\n const hasBefore = insertAt.offset > 0;\n cursorPath = [...parentPath, nodeIndex + (hasBefore ? 1 : 0)];\n cursorOffset = text.length;\n }\n }\n\n tr.steps.push(tr_insertText(insertAt.path, insertAt.offset, text, newMarks));\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(cursorPath, cursorOffset))));\n engine.dispatch(tr);\n return true;\n }\n\n // Collapsed with no text and no existing link — nothing to do\n return false;\n }\n\n // ── Case 2: range selected ────────────────────────────────────────────────\n // tr_setMark atomically removes any existing link mark then adds the new\n // one in a single pass — prevents nested/duplicate <a> tags.\n const { from, to } = normalizeRange(selection.anchor, selection.focus);\n tr.steps.push(tr_setMark(from, to, 'link', linkMark));\n\n // Restore the selection so the user sees the highlighted text after apply\n tr.steps.push(tr_setSelection(selection));\n engine.dispatch(tr);\n return true;\n };\n}\n\n/**\n * Remove the link mark from the whole link span the cursor is inside,\n * or from the explicit range when text is selected. Uses getActiveLinkRange\n * to walk sibling nodes with the same href so removing a collapsed-cursor\n * link clears the entire hyperlink, not just the one text node.\n */\nexport const removeLink: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n let from = selection.anchor;\n let to = selection.focus;\n\n if (selection.isCollapsed) {\n // Expand to full link span (all adjacent nodes sharing the same href)\n const linkRange = getActiveLinkRange(doc, selection);\n if (linkRange) {\n from = linkRange.from;\n to = linkRange.to;\n } else {\n // Fallback: at least cover the current text node\n const node = getNodeAtPath(doc, selection.anchor.path);\n if (node && isTextNode(node as EditorNode)) {\n from = makePosition(selection.anchor.path, 0);\n to = makePosition(selection.anchor.path, (node as TextNode).text.length);\n }\n }\n }\n\n const tr = createTransaction();\n tr.steps.push(tr_removeMark(from, to, 'link'));\n engine.dispatch(tr);\n return true;\n};\n\n// ─── Font Size ────────────────────────────────────────────────────────────────\n\n/**\n * Set font size on the current selection, or null to remove it.\n * Collapsed cursor: updates pending marks so the next typed char gets the size.\n * Range selection: atomically replaces any existing font_size mark across the range.\n */\n/**\n * Set highlight (background) color on the current selection, or null to remove it.\n * Uses setMarkOnRange for atomic replace so mixed-color ranges are handled cleanly.\n * Collapsed cursor: stores in pending marks for the next typed character.\n */\n/**\n * Set text (foreground) color on the current selection, or null to remove it.\n * Collapsed cursor: stores in pending marks for the next typed character.\n * Range: atomically replaces any existing text_color mark across the range.\n */\nexport function setTextColor(color: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const mark: Mark | null = color ? { type: 'text_color', attrs: { color } } : null;\n const tr = createTransaction();\n\n if (selection.isCollapsed) {\n const filtered = state.marks.filter((m) => m.type !== 'text_color');\n tr.meta.pendingMarks = mark ? [...filtered, mark] : filtered;\n } else {\n tr.steps.push(tr_setMark(selection.anchor, selection.focus, 'text_color', mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function setHighlightColor(color: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const mark: Mark | null = color ? { type: 'highlight', attrs: { color } } : null;\n const tr = createTransaction();\n\n if (selection.isCollapsed) {\n const filtered = state.marks.filter((m) => m.type !== 'highlight');\n tr.meta.pendingMarks = mark ? [...filtered, mark] : filtered;\n } else {\n tr.steps.push(tr_setMark(selection.anchor, selection.focus, 'highlight', mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function setFontFamily(family: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const mark: Mark | null = family ? { type: 'font_family', attrs: { family } } : null;\n const tr = createTransaction();\n\n if (selection.isCollapsed) {\n const filtered = state.marks.filter((m) => m.type !== 'font_family');\n tr.meta.pendingMarks = mark ? [...filtered, mark] : filtered;\n } else {\n tr.steps.push(tr_setMark(selection.anchor, selection.focus, 'font_family', mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function setFontSize(size: string | null): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const mark: Mark | null = size ? { type: 'font_size', attrs: { size } } : null;\n const tr = createTransaction();\n\n if (selection.isCollapsed) {\n const filtered = state.marks.filter((m) => m.type !== 'font_size');\n tr.meta.pendingMarks = mark ? [...filtered, mark] : filtered;\n } else {\n tr.steps.push(tr_setMark(selection.anchor, selection.focus, 'font_size', mark));\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Alignment ───────────────────────────────────────────────────────────────\n\n/**\n * Set text alignment on the content block at the cursor.\n * Clicking the active alignment again removes it (reverts to default left).\n * Applies to: paragraph, heading, blockquote, list_item.\n */\nexport function setAlignment(align: import('../../types').AlignmentType): Command {\n return (engine) => {\n const state = engine.getState();\n const { doc, selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as import('../../types').BlockNode | null;\n if (!block) return false;\n\n // Toggle off if same alignment is clicked again\n const current = block.attrs?.align as string | undefined;\n const next = current === align ? undefined : align;\n\n const tr = createTransaction();\n tr.steps.push(tr_setNodeAttrs(blockPath, { align: next }));\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport const alignLeft = setAlignment('left');\nexport const alignCenter = setAlignment('center');\nexport const alignRight = setAlignment('right');\nexport const alignJustify = setAlignment('justify');\n\n// ─── Image ────────────────────────────────────────────────────────────────────\n\nexport function insertImage(src: string, alt = '', extraAttrs?: Record<string, unknown>): Command {\n return (engine) => {\n const state = engine.getState();\n const { selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(state.doc, selection.anchor.path) ?? [0];\n const parentPath = blockPath.slice(0, -1);\n const insertIdx = blockPath[blockPath.length - 1] + 1;\n\n const imageNode: BlockNode = {\n type: 'image',\n attrs: { src, alt, ...extraAttrs },\n children: [],\n };\n\n const tr = createTransaction();\n tr.steps.push({ type: 'insert_node', parentPath, index: insertIdx, node: imageNode });\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function setImageAttr(imagePath: number[], attrs: Record<string, unknown>): Command {\n return (engine) => {\n const state = engine.getState();\n const node = getNodeAtPath(state.doc, imagePath);\n if (!node || (node as BlockNode).type !== 'image') return false;\n const updated: BlockNode = {\n ...(node as BlockNode),\n attrs: { ...(node as BlockNode).attrs, ...attrs },\n };\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: imagePath });\n tr.steps.push({\n type: 'insert_node',\n parentPath: imagePath.length > 1 ? imagePath.slice(0, -1) : [],\n index: imagePath[imagePath.length - 1],\n node: updated,\n });\n engine.dispatch(tr);\n return true;\n };\n}\n\nexport function deleteImageAtPath(imagePath: number[]): Command {\n return (engine) => {\n const state = engine.getState();\n const node = getNodeAtPath(state.doc, imagePath);\n if (!node || (node as BlockNode).type !== 'image') return false;\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: imagePath });\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Horizontal Rule ─────────────────────────────────────────────────────────\n\n/**\n * Insert a horizontal rule after the current block.\n * Always appends an empty paragraph after the HR so the cursor has\n * somewhere to land and the user can continue typing.\n */\nexport const insertHorizontalRule: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path) ?? [0];\n const parentPath = blockPath.slice(0, -1);\n const afterIdx = blockPath[blockPath.length - 1] + 1;\n\n const hrNode: BlockNode = { type: 'horizontal_rule', attrs: {}, children: [] };\n const paraNode = createParagraph();\n\n const tr = createTransaction();\n tr.steps.push({ type: 'insert_node', parentPath, index: afterIdx, node: hrNode });\n tr.steps.push({ type: 'insert_node', parentPath, index: afterIdx + 1, node: paraNode });\n // Land cursor at the new empty paragraph (block-level path, offset 0).\n tr.steps.push(tr_setSelection(\n makeCollapsedSelection(makePosition([...parentPath, afterIdx + 1], 0)),\n ));\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Skip the cursor over an adjacent horizontal_rule node.\n * Returns true (consumed) only when it actually jumps over an HR.\n * Only handles top-level blocks — HRs inside lists are not expected.\n */\nfunction jumpOverHR(engine: EditorEngineInterface, dir: 'down' | 'up'): boolean {\n const state = engine.getState();\n const { doc, selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath || blockPath.length !== 1) return false;\n\n const idx = blockPath[0];\n const neighborIdx = dir === 'down' ? idx + 1 : idx - 1;\n const neighbor = doc.children[neighborIdx];\n if (!neighbor || neighbor.type !== 'horizontal_rule') return false;\n\n const destIdx = dir === 'down' ? neighborIdx + 1 : neighborIdx - 1;\n const dest = doc.children[destIdx];\n if (!dest) return false;\n\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(\n makeCollapsedSelection(makePosition([destIdx], 0)),\n ));\n engine.dispatch(tr);\n return true;\n}\n\n// ─── Forward Delete ───────────────────────────────────────────────────────────\n\n/**\n * Handle the Delete key: delete one character forward, or if a range is selected\n * delete the range, or if at the end of a block join the next block into this one.\n */\nexport const handleDelete: Command = (engine) => {\n const state = engine.getState();\n const { selection, doc } = state;\n if (!selection) return false;\n\n // Non-collapsed → same delete-range logic as Backspace\n if (!selection.isCollapsed) {\n const tr = createTransaction();\n tr.steps.push(tr_deleteRange(selection.anchor, selection.focus));\n engine.dispatch(tr);\n return true;\n }\n\n const { path, offset } = selection.anchor;\n const node = getNodeAtPath(doc, path);\n\n // Delete forward within text node\n if (node && isTextNode(node as EditorNode)) {\n const textNode = node as TextNode;\n if (offset < textNode.text.length) {\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_text', path, from: offset, to: offset + 1 });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(path, offset))));\n engine.dispatch(tr);\n return true;\n }\n }\n\n // At end of text node / block → join next sibling block into current\n const blockPath = findContentBlockPath(doc, path);\n if (!blockPath) return true;\n\n const parentPath = blockPath.slice(0, -1);\n const blockIdx = blockPath[blockPath.length - 1];\n const nextPath = [...parentPath, blockIdx + 1];\n\n if (!getNodeAtPath(doc, nextPath)) {\n // No next sibling at this level — try one level up (e.g. end of last list item)\n if (parentPath.length > 0) {\n const outerBlockPath = parentPath.slice(0, -1);\n const outerIdx = parentPath[parentPath.length - 1];\n const outerNext = [...outerBlockPath, outerIdx + 1];\n if (getNodeAtPath(doc, outerNext)) {\n const tr = createTransaction();\n tr.steps.push(tr_joinBlocks(outerNext));\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(path, offset))));\n engine.dispatch(tr);\n return true;\n }\n }\n return true; // nothing to delete\n }\n\n const tr = createTransaction();\n tr.steps.push(tr_joinBlocks(nextPath));\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition(path, offset))));\n engine.dispatch(tr);\n return true;\n};\n\n// ─── List Indent / Outdent ────────────────────────────────────────────────────\n\n/**\n * Tab inside a list_item: nest the item one level deeper under the previous item.\n * Mirrors CKEditor Tab behaviour in lists.\n */\nexport const indentListItem: Command = (engine) => {\n const state = engine.getState();\n const { doc, selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block || block.type !== 'list_item') return false;\n\n const listPath = blockPath.slice(0, -1);\n const list = getNodeAtPath(doc, listPath) as BlockNode | null;\n if (!list || (list.type !== 'bullet_list' && list.type !== 'ordered_list')) return false;\n\n const itemIdx = blockPath[blockPath.length - 1];\n if (itemIdx === 0) return false; // cannot indent first item\n\n const prevItemPath = [...listPath, itemIdx - 1];\n const prevItem = getNodeAtPath(doc, prevItemPath) as BlockNode | null;\n if (!prevItem) return false;\n\n // Check if prevItem already ends with a nested list of the same type\n const prevChildren = prevItem.children as EditorNode[];\n const lastChild = prevChildren[prevChildren.length - 1] as BlockNode | undefined;\n const hasNested = lastChild && !isTextNode(lastChild as EditorNode) && lastChild.type === list.type;\n\n const newPrevChildren: EditorNode[] = hasNested\n ? [\n ...prevChildren.slice(0, -1),\n { ...lastChild!, children: [...(lastChild!.children as BlockNode[]), block] },\n ]\n : [...prevChildren, { type: list.type, attrs: {}, children: [block] } as BlockNode];\n\n // Nested item's path after transaction:\n // prevItemPath + [newPrevChildren.length - 1 (nested list)] + [hasNested ? lastChild.children.length : 0]\n const nestedListIdxInPrev = newPrevChildren.length - 1;\n const nestedItemIdx = hasNested ? (lastChild!.children as BlockNode[]).length : 0;\n const nestedItemPath = [...prevItemPath, nestedListIdxInPrev, nestedItemIdx];\n\n const updatedPrev: BlockNode = { ...prevItem, children: newPrevChildren };\n\n const tr = createTransaction();\n // Delete current item first (higher index), then prev item, then re-insert prev\n tr.steps.push({ type: 'delete_node', path: blockPath });\n tr.steps.push({ type: 'delete_node', path: prevItemPath });\n tr.steps.push({ type: 'insert_node', parentPath: listPath, index: itemIdx - 1, node: updatedPrev });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...nestedItemPath, 0], 0))));\n engine.dispatch(tr);\n return true;\n};\n\n/**\n * Shift+Tab inside a nested list_item: promote it one level up.\n * Mirrors CKEditor Shift+Tab behaviour in lists.\n */\nexport const outdentListItem: Command = (engine) => {\n const state = engine.getState();\n const { doc, selection } = state;\n if (!selection) return false;\n\n const blockPath = findContentBlockPath(doc, selection.anchor.path);\n if (!blockPath) return false;\n\n const block = getNodeAtPath(doc, blockPath) as BlockNode | null;\n if (!block || block.type !== 'list_item') return false;\n\n const nestedListPath = blockPath.slice(0, -1);\n const nestedList = getNodeAtPath(doc, nestedListPath) as BlockNode | null;\n if (!nestedList || (nestedList.type !== 'bullet_list' && nestedList.type !== 'ordered_list')) return false;\n\n // Must be inside another list_item (truly nested)\n const parentItemPath = nestedListPath.slice(0, -1);\n const parentItem = getNodeAtPath(doc, parentItemPath) as BlockNode | null;\n if (!parentItem || parentItem.type !== 'list_item') return false;\n\n const parentListPath = parentItemPath.slice(0, -1);\n const parentList = getNodeAtPath(doc, parentListPath) as BlockNode | null;\n if (!parentList) return false;\n\n const itemIdx = blockPath[blockPath.length - 1];\n const nestedListIdx = nestedListPath[nestedListPath.length - 1];\n const parentItemIdx = parentItemPath[parentItemPath.length - 1];\n\n // Split the nested list around the extracted item\n const beforeNested = (nestedList.children as BlockNode[]).slice(0, itemIdx);\n const afterNested = (nestedList.children as BlockNode[]).slice(itemIdx + 1);\n\n const parentItemChildren = parentItem.children as EditorNode[];\n let newParentChildren: EditorNode[];\n\n if (beforeNested.length === 0 && afterNested.length === 0) {\n // Remove nested list entirely\n newParentChildren = [\n ...parentItemChildren.slice(0, nestedListIdx),\n ...parentItemChildren.slice(nestedListIdx + 1),\n ];\n } else if (beforeNested.length === 0) {\n newParentChildren = [\n ...parentItemChildren.slice(0, nestedListIdx),\n { ...nestedList, children: afterNested },\n ...parentItemChildren.slice(nestedListIdx + 1),\n ];\n } else if (afterNested.length === 0) {\n newParentChildren = [\n ...parentItemChildren.slice(0, nestedListIdx),\n { ...nestedList, children: beforeNested },\n ...parentItemChildren.slice(nestedListIdx + 1),\n ];\n } else {\n // Split into two nested lists\n newParentChildren = [\n ...parentItemChildren.slice(0, nestedListIdx),\n { ...nestedList, children: beforeNested },\n { ...nestedList, children: afterNested },\n ...parentItemChildren.slice(nestedListIdx + 1),\n ];\n }\n\n const updatedParent: BlockNode = { ...parentItem, children: newParentChildren };\n const insertIdx = parentItemIdx + 1; // extracted item goes right after parent item\n const newBlockPath = [...parentListPath, insertIdx];\n\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: parentItemPath });\n tr.steps.push({ type: 'insert_node', parentPath: parentListPath, index: parentItemIdx, node: updatedParent });\n tr.steps.push({ type: 'insert_node', parentPath: parentListPath, index: insertIdx, node: block });\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([...newBlockPath, 0], 0))));\n engine.dispatch(tr);\n return true;\n};\n\n// ─── Select All ───────────────────────────────────────────────────────────────\n\nexport const selectAll: Command = (engine) => {\n const state = engine.getState();\n const { doc } = state;\n const lastBlock = doc.children[doc.children.length - 1];\n if (!lastBlock) return false;\n\n const lastIdx = doc.children.length - 1;\n const lastChildren = lastBlock.children;\n const focusChildIdx = Math.max(lastChildren.length - 1, 0);\n const lastChild = lastChildren[focusChildIdx];\n const lastTextOffset =\n lastChild && isTextNode(lastChild) ? (lastChild as TextNode).text.length : 0;\n\n const tr = createTransaction();\n tr.steps.push(tr_setSelection({\n anchor: makePosition([0, 0], 0),\n focus: makePosition([lastIdx, focusChildIdx], lastTextOffset),\n isCollapsed: false,\n }));\n engine.dispatch(tr);\n return true;\n};\n\n// ─── Keyboard Shortcut Bindings ───────────────────────────────────────────────\n\n/**\n * Default keyboard shortcuts. Register this as a plugin.\n */\nexport const defaultKeyboardPlugin = {\n name: 'default-keyboard',\n keyBindings: {\n 'ArrowDown': (engine: EditorEngineInterface) => jumpOverHR(engine, 'down'),\n 'ArrowUp': (engine: EditorEngineInterface) => jumpOverHR(engine, 'up'),\n 'Ctrl+b': toggleBold,\n 'Ctrl+B': toggleBold,\n 'Ctrl+i': toggleItalic,\n 'Ctrl+I': toggleItalic,\n 'Ctrl+u': toggleUnderline,\n 'Ctrl+U': toggleUnderline,\n 'Ctrl+Shift+x': toggleStrikethrough,\n 'Ctrl+Shift+X': toggleStrikethrough,\n 'Ctrl+e': toggleCode,\n 'Ctrl+E': toggleCode,\n 'Ctrl+a': selectAll,\n 'Ctrl+A': selectAll,\n 'Ctrl+Shift+7': toggleOrderedList,\n 'Ctrl+Shift+8': toggleBulletList,\n 'Ctrl+Shift+9': toggleCheckList,\n 'Ctrl+Shift+.': setBlockquote,\n 'Ctrl+Shift+c': setCodeBlock,\n 'Ctrl+Shift+C': setCodeBlock,\n // Alignment shortcuts (Shift produces uppercase key)\n 'Ctrl+Shift+L': alignLeft,\n 'Ctrl+Shift+E': alignCenter,\n 'Ctrl+Shift+R': alignRight,\n 'Ctrl+Shift+J': alignJustify,\n },\n};\n","'use client';\n\nimport React from 'react';\n\ninterface ToolbarButtonProps {\n label: string;\n title: string;\n onClick: () => void;\n isActive?: boolean;\n isDisabled?: boolean;\n icon?: React.ReactNode;\n}\n\nexport function ToolbarButton({\n label,\n title,\n onClick,\n isActive = false,\n isDisabled = false,\n icon,\n}: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n title={title}\n aria-label={title}\n aria-pressed={isActive}\n disabled={isDisabled}\n onMouseDown={(e) => {\n // Prevent the editor from losing focus on toolbar click\n e.preventDefault();\n if (!isDisabled) onClick();\n }}\n className={[\n 'flex items-center justify-center w-7 h-7 rounded text-sm transition-colors',\n 'focus:outline-none focus-visible:ring-1 focus-visible:ring-blue-500',\n isActive\n ? 'bg-blue-100 text-blue-700 '\n : 'text-gray-600 hover:bg-gray-100 ',\n isDisabled ? 'opacity-40 cursor-not-allowed' : 'cursor-pointer',\n ].join(' ')}\n >\n {icon ?? label}\n </button>\n );\n}\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport type { AlignmentType } from '../../types';\r\nimport { setAlignment } from '../../editor/commands';\r\n\r\n// ─── Config ───────────────────────────────────────────────────────────────────\r\n\r\ninterface AlignmentOption {\r\n value: AlignmentType;\r\n label: string;\r\n shortcut: string;\r\n icon: React.ReactNode;\r\n}\r\n\r\nconst OPTIONS: AlignmentOption[] = [\r\n {\r\n value: 'left',\r\n label: 'Align Left',\r\n shortcut: 'Ctrl+Shift+L',\r\n icon: <AlignLeftIcon />,\r\n },\r\n {\r\n value: 'center',\r\n label: 'Align Center',\r\n shortcut: 'Ctrl+Shift+E',\r\n icon: <AlignCenterIcon />,\r\n },\r\n {\r\n value: 'right',\r\n label: 'Align Right',\r\n shortcut: 'Ctrl+Shift+R',\r\n icon: <AlignRightIcon />,\r\n },\r\n {\r\n value: 'justify',\r\n label: 'Justify',\r\n shortcut: 'Ctrl+Shift+J',\r\n icon: <AlignJustifyIcon />,\r\n },\r\n];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface AlignmentDropdownProps {\r\n engine: EditorEngine;\r\n activeAlignment: AlignmentType;\r\n}\r\n\r\nexport function AlignmentDropdown({ engine, activeAlignment }: AlignmentDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n // Close on Escape\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n const activeOption = OPTIONS.find((o) => o.value === activeAlignment) ?? OPTIONS[0];\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n {/* Trigger: current-alignment icon + chevron */}\r\n <button\r\n type=\"button\"\r\n title={`Text alignment (${activeOption.label})`}\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault(); // keep editor focus\r\n setOpen((prev) => !prev);\r\n }}\r\n className={[\r\n 'flex items-center gap-0.5 px-1.5 h-8 rounded text-sm font-medium transition-colors',\r\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\r\n open\r\n ? 'bg-gray-100 text-gray-900 '\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n {activeOption.icon}\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {/* Dropdown panel */}\r\n {open && (\r\n <div\r\n role=\"listbox\"\r\n aria-label=\"Text alignment\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-lg py-1 min-w-[168px]\"\r\n >\r\n {OPTIONS.map((option) => {\r\n const isActive = activeAlignment === option.value;\r\n return (\r\n <button\r\n key={option.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n title={`${option.label} (${option.shortcut})`}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setAlignment(option.value)(engine);\r\n setOpen(false);\r\n }}\r\n className={[\r\n 'w-full flex items-center gap-3 px-3 py-1.5 text-sm transition-colors',\r\n isActive\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span className=\"flex-shrink-0\">{option.icon}</span>\r\n <span className=\"flex-1 text-left\">{option.label}</span>\r\n {isActive && <CheckIcon />}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\r\n\r\nfunction AlignLeftIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"3\" y1=\"10\" x2=\"15\" y2=\"10\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"15\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction AlignCenterIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"6\" y1=\"10\" x2=\"18\" y2=\"10\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" />\r\n <line x1=\"6\" y1=\"18\" x2=\"18\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction AlignRightIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"9\" y1=\"10\" x2=\"21\" y2=\"10\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" />\r\n <line x1=\"9\" y1=\"18\" x2=\"21\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction AlignJustifyIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\">\r\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\r\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\r\n <line x1=\"3\" y1=\"14\" x2=\"21\" y2=\"14\" />\r\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg className=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CheckIcon() {\r\n return (\r\n <svg className=\"w-3.5 h-3.5 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport { setFontSize } from '../../editor/commands';\r\n\r\n// ─── Config ───────────────────────────────────────────────────────────────────\r\n\r\nconst SIZES = ['8', '10', '12', '14', '16', '18', '24', '32', '48'];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface FontSizeDropdownProps {\r\n engine: EditorEngine;\r\n activeFontSize: string | null; // stored as e.g. '12px', null = default\r\n}\r\n\r\nexport function FontSizeDropdown({ engine, activeFontSize }: FontSizeDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n setOpen(false);\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n // Show the numeric part only (e.g. '12' from '12px')\r\n const activeNum = activeFontSize ? activeFontSize.replace('px', '') : null;\r\n const label = activeNum ?? 'Size';\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n <button\r\n type=\"button\"\r\n title=\"Font size\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setOpen((prev) => !prev);\r\n }}\r\n className={[\r\n 'flex items-center gap-0.5 px-1.5 h-8 rounded text-sm font-medium transition-colors min-w-[52px]',\r\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\r\n open\r\n ? 'bg-gray-100 text-gray-900 '\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span className=\"flex-1 text-left\">{label}</span>\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {open && (\r\n <div\r\n role=\"listbox\"\r\n aria-label=\"Font size\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-lg py-1 min-w-[88px] max-h-64 overflow-y-auto\"\r\n >\r\n {/* Default / reset */}\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={activeFontSize === null}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setFontSize(null)(engine);\r\n setOpen(false);\r\n }}\r\n className={[\r\n 'w-full flex items-center justify-between px-3 py-1.5 text-sm transition-colors',\r\n activeFontSize === null\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span>Default</span>\r\n {activeFontSize === null && <CheckIcon />}\r\n </button>\r\n\r\n {SIZES.map((size) => {\r\n const isActive = activeNum === size;\r\n return (\r\n <button\r\n key={size}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setFontSize(`${size}px`)(engine);\r\n setOpen(false);\r\n }}\r\n className={[\r\n 'w-full flex items-center justify-between px-3 py-1.5 transition-colors',\r\n isActive\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span style={{ fontSize: `${size}px`, lineHeight: 1.3 }}>{size}</span>\r\n {isActive && <CheckIcon />}\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg className=\"w-3 h-3\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CheckIcon() {\r\n return (\r\n <svg className=\"w-3.5 h-3.5 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport { setFontFamily } from '../../editor/commands';\r\n\r\n// ─── Config ───────────────────────────────────────────────────────────────────\r\n\r\ninterface FontOption {\r\n label: string;\r\n value: string; // stored in mark attrs and applied as CSS font-family\r\n}\r\n\r\nconst FONTS: FontOption[] = [\r\n { label: 'Inter', value: 'Inter, sans-serif' },\r\n { label: 'Arial', value: 'Arial, sans-serif' },\r\n { label: 'Courier New', value: '\"Courier New\", Courier, monospace' },\r\n { label: 'Georgia', value: 'Georgia, serif' },\r\n { label: 'Lucida Sans Unicode', value: '\"Lucida Sans Unicode\", \"Lucida Grande\", sans-serif' },\r\n { label: 'Tahoma', value: 'Tahoma, Geneva, sans-serif' },\r\n { label: 'Times New Roman', value: '\"Times New Roman\", Times, serif' },\r\n { label: 'Trebuchet MS', value: '\"Trebuchet MS\", Helvetica, sans-serif' },\r\n { label: 'Verdana', value: 'Verdana, Geneva, sans-serif' },\r\n];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface FontFamilyDropdownProps {\r\n engine: EditorEngine;\r\n activeFontFamily: string | null;\r\n}\r\n\r\nexport function FontFamilyDropdown({ engine, activeFontFamily }: FontFamilyDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const [showCustomInput, setShowCustomInput] = useState(false);\r\n const [customValue, setCustomValue] = useState('');\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const customInputRef = useRef<HTMLInputElement>(null);\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n closeDropdown();\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n // Close on Escape\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') closeDropdown(); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n // Focus custom input when it appears\r\n useEffect(() => {\r\n if (showCustomInput) customInputRef.current?.focus();\r\n }, [showCustomInput]);\r\n\r\n function closeDropdown() {\r\n setOpen(false);\r\n setShowCustomInput(false);\r\n setCustomValue('');\r\n }\r\n\r\n function applyFont(value: string | null) {\r\n setFontFamily(value)(engine);\r\n closeDropdown();\r\n }\r\n\r\n function applyCustom() {\r\n const trimmed = customValue.trim();\r\n if (!trimmed) return;\r\n applyFont(trimmed);\r\n }\r\n\r\n // Find the predefined option matching the active family (if any)\r\n const activeOption = activeFontFamily\r\n ? FONTS.find((f) => f.value === activeFontFamily) ?? null\r\n : null;\r\n\r\n // Trigger label: predefined name, or first ~10 chars of custom value, or placeholder\r\n const triggerLabel = activeOption\r\n ? activeOption.label\r\n : activeFontFamily\r\n ? activeFontFamily.split(',')[0].replace(/['\"]/g, '').trim().slice(0, 10)\r\n : 'Font';\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n {/* Trigger button */}\r\n <button\r\n type=\"button\"\r\n title=\"Font family\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n if (open) { closeDropdown(); return; }\r\n setShowCustomInput(false);\r\n setCustomValue('');\r\n setOpen(true);\r\n }}\r\n className={[\r\n 'flex items-center gap-0.5 px-1.5 h-8 rounded text-sm font-medium transition-colors min-w-[60px] max-w-[120px]',\r\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\r\n open\r\n ? 'bg-gray-100 text-gray-900 '\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <FontIcon />\r\n <span className=\"flex-1 text-left truncate\">{triggerLabel}</span>\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {/* Dropdown panel */}\r\n {open && (\r\n <div\r\n role=\"listbox\"\r\n aria-label=\"Font family\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-lg py-1 min-w-[200px]\"\r\n >\r\n {/* Default / reset */}\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={activeFontFamily === null}\r\n onMouseDown={(e) => { e.preventDefault(); applyFont(null); }}\r\n className={[\r\n 'w-full flex items-center justify-between px-3 py-1.5 text-sm transition-colors',\r\n activeFontFamily === null\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span>Default</span>\r\n {activeFontFamily === null && <CheckIcon />}\r\n </button>\r\n\r\n <div className=\"my-1 border-t border-gray-100 \" />\r\n\r\n {/* Predefined fonts */}\r\n {FONTS.map((font) => {\r\n const isActive = activeFontFamily === font.value;\r\n return (\r\n <button\r\n key={font.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n onMouseDown={(e) => { e.preventDefault(); applyFont(font.value); }}\r\n className={[\r\n 'w-full flex items-center justify-between px-3 py-1.5 text-sm transition-colors',\r\n isActive\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <span style={{ fontFamily: font.value }}>{font.label}</span>\r\n {isActive && <CheckIcon />}\r\n </button>\r\n );\r\n })}\r\n\r\n {/* <div className=\"my-1 border-t border-gray-100 \" /> */}\r\n\r\n {/* Custom font */}\r\n \r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\r\n\r\nfunction FontIcon() {\r\n return (\r\n <svg className=\"w-4 h-4 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"4 7 4 4 20 4 20 7\" />\r\n <line x1=\"9\" y1=\"20\" x2=\"15\" y2=\"20\" />\r\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"20\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg className=\"w-3 h-3 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CheckIcon() {\r\n return (\r\n <svg className=\"w-3.5 h-3.5 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction PlusIcon() {\r\n return (\r\n <svg className=\"w-3.5 h-3.5 flex-shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <line x1=\"12\" y1=\"5\" x2=\"12\" y2=\"19\" />\r\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\r\n </svg>\r\n );\r\n}\r\n","\"use client\";\r\n\r\nimport { useState, useRef, useEffect, useCallback } from \"react\";\r\nimport type { EditorEngine } from \"../../editor/core/EditorEngine\";\r\nimport { setHighlightColor } from \"../../editor/commands\";\r\n\r\n// ─── CKEditor 5-matching colour palette ───────────────────────────────────────\r\n// Same hue/saturation grid CKEditor ships by default:\r\n// row 1 — neutral grey ramp\r\n// row 2 — warm spectrum (hsl h=0..120, s=75%, l=60%)\r\n// row 3 — cool spectrum (hsl h=150..270, s=75%, l=60%)\r\n\r\ninterface ColorOption {\r\n label: string;\r\n value: string; // lowercase hex\r\n hasBorder?: boolean;\r\n}\r\n\r\nconst PRESET_COLORS: ColorOption[] = [\r\n // Row 1 — neutrals\r\n { label: \"Black\", value: \"#000000\" },\r\n { label: \"Dim grey\", value: \"#4d4d4d\" },\r\n { label: \"Grey\", value: \"#999999\" },\r\n { label: \"Light grey\", value: \"#e6e6e6\" },\r\n { label: \"White\", value: \"#ffffff\", hasBorder: true },\r\n // Row 2 — warm\r\n { label: \"Red\", value: \"#e64d4d\" },\r\n { label: \"Orange\", value: \"#f99a4d\" },\r\n { label: \"Yellow\", value: \"#f9e04d\" },\r\n { label: \"Light green\", value: \"#91e44d\" },\r\n { label: \"Green\", value: \"#54d454\" },\r\n // Row 3 — cool\r\n { label: \"Aquamarine\", value: \"#54d4a6\" },\r\n { label: \"Turquoise\", value: \"#54d4d4\" },\r\n { label: \"Light blue\", value: \"#4d91e4\" },\r\n { label: \"Blue\", value: \"#4d4de4\" },\r\n { label: \"Purple\", value: \"#9d4de4\" },\r\n];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface BackgroundColorDropdownProps {\r\n engine: EditorEngine;\r\n activeColor: string | null;\r\n documentColors: string[];\r\n}\r\n\r\nexport function BackgroundColorDropdown({\r\n engine,\r\n activeColor,\r\n documentColors,\r\n}: BackgroundColorDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const [lastColor, setLastColor] = useState(PRESET_COLORS[6].value); // Yellow default\r\n const [hexInput, setHexInput] = useState(\"\");\r\n const [hexError, setHexError] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n // Outside-click → close\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n )\r\n setOpen(false);\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n }, [open]);\r\n\r\n // Escape → close\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => {\r\n if (e.key === \"Escape\") setOpen(false);\r\n };\r\n document.addEventListener(\"keydown\", handler);\r\n return () => document.removeEventListener(\"keydown\", handler);\r\n }, [open]);\r\n\r\n const applyColor = useCallback(\r\n (color: string | null) => {\r\n if (color) setLastColor(normalizeHex(color));\r\n setHighlightColor(color)(engine);\r\n setOpen(false);\r\n },\r\n [engine],\r\n );\r\n\r\n const handleQuickApply = () => {\r\n const norm = normalizeHex(lastColor);\r\n if (activeColor && normalizeHex(activeColor) === norm) {\r\n setHighlightColor(null)(engine);\r\n } else {\r\n setHighlightColor(norm)(engine);\r\n }\r\n };\r\n\r\n const commitHexInput = () => {\r\n const raw = hexInput.trim().replace(/^#/, \"\");\r\n if (/^[0-9a-f]{6}$/i.test(raw) || /^[0-9a-f]{3}$/i.test(raw)) {\r\n applyColor(`#${raw.toLowerCase()}`);\r\n setHexError(false);\r\n } else {\r\n setHexError(true);\r\n }\r\n };\r\n\r\n // Non-preset document colors\r\n const extraDocColors = documentColors.filter(\r\n (c) =>\r\n !PRESET_COLORS.some((p) => normalizeHex(p.value) === normalizeHex(c)),\r\n );\r\n\r\n const normActive = activeColor ? normalizeHex(activeColor) : null;\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative flex items-center\">\r\n {/* ── Quick-apply split button ──────────────────────────────────────── */}\r\n <button\r\n type=\"button\"\r\n title={`Background color: ${lastColor}`}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleQuickApply();\r\n }}\r\n className=\"flex flex-col items-center justify-center gap-0.5 w-8 h-8 rounded-l\r\n text-gray-700 \r\n hover:bg-gray-100 \r\n focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500\r\n transition-colors\"\r\n >\r\n <BgColorIcon />\r\n <ColorBar color={normActive ?? lastColor} />\r\n </button>\r\n\r\n {/* ── Chevron button ───────────────────────────────────────────────── */}\r\n <button\r\n type=\"button\"\r\n title=\"More background colors\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setOpen((p) => {\r\n if (!p) {\r\n setHexInput(\"\");\r\n setHexError(false);\r\n }\r\n return !p;\r\n });\r\n }}\r\n className={[\r\n \"flex items-center justify-center w-4 h-8 rounded-r border-l border-gray-200 \",\r\n \"focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500\",\r\n \"transition-colors\",\r\n open\r\n ? \"bg-gray-100 text-gray-700 \"\r\n : \"text-gray-400 hover:bg-gray-100 \",\r\n ].join(\" \")}\r\n >\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {/* ── Dropdown panel ───────────────────────────────────────────────── */}\r\n {open && (\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Background color\"\r\n className=\"absolute top-full left-0 mt-1 z-50\r\n bg-white \r\n border border-gray-200 \r\n rounded-lg shadow-xl\r\n p-3 w-[208px]\"\r\n >\r\n {/* Remove background */}\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n applyColor(null);\r\n }}\r\n className=\"flex items-center gap-2 w-full px-2 py-1.5 mb-2.5 text-xs font-medium\r\n text-gray-600 \r\n rounded hover:bg-gray-100 \r\n transition-colors\"\r\n >\r\n <RemoveColorIcon />\r\n Remove background\r\n </button>\r\n\r\n {/* Separator */}\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n\r\n {/* Document colors — non-preset colors already in doc */}\r\n {extraDocColors.length > 0 && (\r\n <>\r\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5 px-0.5\">\r\n Document colors\r\n </p>\r\n <div className=\"grid grid-cols-5 gap-1 mb-2.5\">\r\n {extraDocColors.slice(0, 10).map((c) => (\r\n <Swatch\r\n key={c}\r\n color={{ label: c, value: c }}\r\n isActive={normActive === normalizeHex(c)}\r\n onSelect={applyColor}\r\n />\r\n ))}\r\n </div>\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n </>\r\n )}\r\n\r\n {/* Preset grid 5×3 */}\r\n <div className=\"grid grid-cols-5 gap-1 mb-3\">\r\n {PRESET_COLORS.map((c) => (\r\n <Swatch\r\n key={c.value}\r\n color={c}\r\n isActive={normActive === normalizeHex(c.value)}\r\n onSelect={applyColor}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Custom hex input — CKEditor-style inline, no native dialog */}\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5 px-0.5\">\r\n Custom color\r\n </p>\r\n <div className=\"flex items-center gap-1.5\">\r\n {/* Live color preview */}\r\n <div\r\n className=\"shrink-0 w-7 h-7 rounded border border-gray-300 \"\r\n style={{ backgroundColor: hexInputToPreview(hexInput) }}\r\n />\r\n <div\r\n className=\"flex flex-1 items-center border rounded overflow-hidden\r\n border-gray-300 \r\n focus-within:ring-2 focus-within:ring-blue-500\"\r\n >\r\n <span className=\"pl-2 text-xs text-gray-400 select-none\">#</span>\r\n <input\r\n type=\"text\"\r\n maxLength={6}\r\n value={hexInput}\r\n onChange={(e) => {\r\n setHexInput(e.target.value.replace(/[^0-9a-fA-F]/g, \"\"));\r\n setHexError(false);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n commitHexInput();\r\n }\r\n if (e.key === \"Escape\") setOpen(false);\r\n }}\r\n placeholder=\"e.g. ffff00\"\r\n className={[\r\n \"flex-1 px-1 py-1.5 text-xs bg-transparent outline-none font-mono\",\r\n \"text-gray-900 \",\r\n hexError ? \"text-red-500\" : \"\",\r\n ].join(\" \")}\r\n aria-label=\"Hex colour value\"\r\n />\r\n </div>\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n commitHexInput();\r\n }}\r\n className=\"shrink-0 px-2 py-1.5 text-xs bg-blue-600 text-white rounded\r\n hover:bg-blue-700 transition-colors\"\r\n >\r\n ✓\r\n </button>\r\n </div>\r\n {hexError && (\r\n <p className=\"text-[10px] text-red-500 mt-1 px-0.5\">\r\n Invalid hex colour\r\n </p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Swatch ───────────────────────────────────────────────────────────────────\r\n\r\nfunction Swatch({\r\n color,\r\n isActive,\r\n onSelect,\r\n}: {\r\n color: ColorOption;\r\n isActive: boolean;\r\n onSelect: (v: string) => void;\r\n}) {\r\n return (\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n title={color.label}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n onSelect(color.value);\r\n }}\r\n className={[\r\n \"relative w-[30px] h-[30px] rounded transition-transform\",\r\n \"hover:scale-110 focus:outline-none\",\r\n \"focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-blue-500\",\r\n isActive ? \"ring-2 ring-offset-1 ring-blue-500 scale-105\" : \"\",\r\n color.hasBorder ? \"border border-gray-300 \" : \"\",\r\n ].join(\" \")}\r\n style={{ backgroundColor: color.value }}\r\n >\r\n {isActive && <CheckIcon light={isLight(color.value)} />}\r\n </button>\r\n );\r\n}\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\nfunction normalizeHex(hex: string): string {\r\n return hex.trim().toLowerCase();\r\n}\r\n\r\nfunction hexInputToPreview(input: string): string {\r\n const raw = input.replace(/^#/, \"\");\r\n if (/^[0-9a-f]{6}$/i.test(raw)) return `#${raw}`;\r\n if (/^[0-9a-f]{3}$/i.test(raw)) return `#${raw}`;\r\n return \"transparent\";\r\n}\r\n\r\nfunction isLight(hex: string): boolean {\r\n const h = hex.replace(\"#\", \"\");\r\n if (h.length < 6) return true;\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n return (r * 299 + g * 587 + b * 114) / 1000 > 128;\r\n}\r\n\r\n// ─── Sub-components ───────────────────────────────────────────────────────────\r\n\r\nfunction ColorBar({ color }: { color: string }) {\r\n return (\r\n <span\r\n className=\"block w-4 h-[3px] rounded-sm\"\r\n style={{ backgroundColor: color }}\r\n />\r\n );\r\n}\r\n\r\nfunction CheckIcon({ light }: { light: boolean }) {\r\n return (\r\n <svg\r\n className=\"absolute inset-0 m-auto w-3.5 h-3.5 drop-shadow\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke={light ? \"rgba(0,0,0,0.65)\" : \"rgba(255,255,255,0.9)\"}\r\n strokeWidth={3.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ─── Icons ────────────────────────────────────────────────────────────────────\r\n\r\nfunction BgColorIcon() {\r\n return (\r\n <svg\r\n width=\"16\"\r\n height=\"16\"\r\n viewBox=\"0 0 1024 1024\"\r\n fill=\"currentColor\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path d=\"M766.4 744.3c43.7 0 79.4-36.2 79.4-80.5 0-53.5-79.4-140.8-79.4-140.8S687 610.3 687 663.8c0 44.3 35.7 80.5 79.4 80.5zm-377.1-44.1c7.1 7.1 18.6 7.1 25.6 0l256.1-256c7.1-7.1 7.1-18.6 0-25.6l-256-256c-.6-.6-1.3-1.2-2-1.7l-78.2-78.2a9.11 9.11 0 0 0-12.8 0l-48 48a9.11 9.11 0 0 0 0 12.8l67.2 67.2-207.8 207.9c-7.1 7.1-7.1 18.6 0 25.6l255.9 256zm12.9-448.6l178.9 178.9H223.4l178.8-178.9zM904 816H120c-4.4 0-8 3.6-8 8v80c0 4.4 3.6 8 8 8h784c4.4 0 8-3.6 8-8v-80c0-4.4-3.6-8-8-8z\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg\r\n className=\"w-2.5 h-2.5\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction RemoveColorIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4 shrink-0\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <path d=\"M7 21h14\" />\r\n <path d=\"m5 11 9-9 7 7-9 9H5l-2-2 2-5Z\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\r\n\r\nimport { useState, useRef, useEffect, useCallback } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport { setTextColor } from '../../editor/commands';\r\n\r\n// ─── CKEditor 5-matching colour palette ───────────────────────────────────────\r\n// Row 1 — neutral grey ramp\r\n// Row 2 — warm spectrum (hsl h=0..120, s=75%, l=60%)\r\n// Row 3 — cool spectrum (hsl h=150..270, s=75%, l=60%)\r\n\r\ninterface ColorOption {\r\n label: string;\r\n value: string;\r\n hasBorder?: boolean;\r\n}\r\n\r\nconst PRESET_COLORS: ColorOption[] = [\r\n // Row 1 — neutrals\r\n { label: 'Black', value: '#000000' },\r\n { label: 'Dim grey', value: '#4d4d4d' },\r\n { label: 'Grey', value: '#999999' },\r\n { label: 'Light grey', value: '#e6e6e6' },\r\n { label: 'White', value: '#ffffff', hasBorder: true },\r\n // Row 2 — warm\r\n { label: 'Red', value: '#e64d4d' },\r\n { label: 'Orange', value: '#f99a4d' },\r\n { label: 'Yellow', value: '#f9e04d' },\r\n { label: 'Light green', value: '#91e44d' },\r\n { label: 'Green', value: '#54d454' },\r\n // Row 3 — cool\r\n { label: 'Aquamarine', value: '#54d4a6' },\r\n { label: 'Turquoise', value: '#54d4d4' },\r\n { label: 'Light blue', value: '#4d91e4' },\r\n { label: 'Blue', value: '#4d4de4' },\r\n { label: 'Purple', value: '#9d4de4' },\r\n];\r\n\r\n// ─── Component ────────────────────────────────────────────────────────────────\r\n\r\ninterface TextColorDropdownProps {\r\n engine: EditorEngine;\r\n activeColor: string | null;\r\n documentColors: string[];\r\n}\r\n\r\nexport function TextColorDropdown({\r\n engine,\r\n activeColor,\r\n documentColors,\r\n}: TextColorDropdownProps) {\r\n const [open, setOpen] = useState(false);\r\n const [lastColor, setLastColor] = useState(PRESET_COLORS[0].value); // Black default\r\n const [hexInput, setHexInput] = useState('');\r\n const [hexError, setHexError] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node))\r\n setOpen(false);\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') setOpen(false); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open]);\r\n\r\n const applyColor = useCallback((color: string | null) => {\r\n if (color) setLastColor(normalizeHex(color));\r\n setTextColor(color)(engine);\r\n setOpen(false);\r\n }, [engine]);\r\n\r\n const handleQuickApply = () => {\r\n const norm = normalizeHex(lastColor);\r\n if (activeColor && normalizeHex(activeColor) === norm) {\r\n setTextColor(null)(engine);\r\n } else {\r\n setTextColor(norm)(engine);\r\n }\r\n };\r\n\r\n const commitHexInput = () => {\r\n const raw = hexInput.trim().replace(/^#/, '');\r\n if (/^[0-9a-f]{6}$/i.test(raw) || /^[0-9a-f]{3}$/i.test(raw)) {\r\n applyColor(`#${raw.toLowerCase()}`);\r\n setHexError(false);\r\n } else {\r\n setHexError(true);\r\n }\r\n };\r\n\r\n const extraDocColors = documentColors.filter(\r\n (c) => !PRESET_COLORS.some((p) => normalizeHex(p.value) === normalizeHex(c)),\r\n );\r\n\r\n const normActive = activeColor ? normalizeHex(activeColor) : null;\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative flex items-center\">\r\n\r\n {/* ── Quick-apply split button ── */}\r\n <button\r\n type=\"button\"\r\n title={`Text color: ${lastColor}`}\r\n onMouseDown={(e) => { e.preventDefault(); handleQuickApply(); }}\r\n className=\"flex flex-col items-center justify-center gap-0.5 w-8 h-8 rounded-l\r\n text-gray-700 \r\n hover:bg-gray-100 \r\n focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500\r\n transition-colors\"\r\n >\r\n <TextColorIcon />\r\n <span\r\n className=\"block w-4 h-[3px] rounded-sm\"\r\n style={{ backgroundColor: normActive ?? lastColor }}\r\n />\r\n </button>\r\n\r\n {/* ── Chevron button ── */}\r\n <button\r\n type=\"button\"\r\n title=\"More text colors\"\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => { e.preventDefault(); setOpen((p) => { if (!p) { setHexInput(''); setHexError(false); } return !p; }); }}\r\n className={[\r\n 'flex items-center justify-center w-4 h-8 rounded-r border-l border-gray-200 ',\r\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-blue-500',\r\n 'transition-colors',\r\n open\r\n ? 'bg-gray-100 text-gray-700 '\r\n : 'text-gray-400 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <ChevronDownIcon />\r\n </button>\r\n\r\n {/* ── Dropdown panel ── */}\r\n {open && (\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Text color\"\r\n className=\"absolute top-full left-0 mt-1 z-50\r\n bg-white \r\n border border-gray-200 \r\n rounded-lg shadow-xl\r\n p-3 w-[208px]\"\r\n >\r\n {/* Remove color */}\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => { e.preventDefault(); applyColor(null); }}\r\n className=\"flex items-center gap-2 w-full px-2 py-1.5 mb-2.5 text-xs font-medium\r\n text-gray-600 \r\n rounded hover:bg-gray-100 \r\n transition-colors\"\r\n >\r\n <RemoveColorIcon />\r\n Remove color\r\n </button>\r\n\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n\r\n {/* Document colors */}\r\n {extraDocColors.length > 0 && (\r\n <>\r\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5 px-0.5\">\r\n Document colors\r\n </p>\r\n <div className=\"grid grid-cols-5 gap-1 mb-2.5\">\r\n {extraDocColors.slice(0, 10).map((c) => (\r\n <Swatch\r\n key={c}\r\n color={{ label: c, value: c }}\r\n isActive={normActive === normalizeHex(c)}\r\n onSelect={applyColor}\r\n />\r\n ))}\r\n </div>\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n </>\r\n )}\r\n\r\n {/* Preset grid 5×3 */}\r\n <div className=\"grid grid-cols-5 gap-1 mb-3\">\r\n {PRESET_COLORS.map((c) => (\r\n <Swatch\r\n key={c.value}\r\n color={c}\r\n isActive={normActive === normalizeHex(c.value)}\r\n onSelect={applyColor}\r\n />\r\n ))}\r\n </div>\r\n\r\n {/* Custom hex input */}\r\n <div className=\"h-px bg-gray-100 mb-2.5\" />\r\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5 px-0.5\">\r\n Custom color\r\n </p>\r\n <div className=\"flex items-center gap-1.5\">\r\n <div\r\n className=\"shrink-0 w-7 h-7 rounded border border-gray-300 \"\r\n style={{ backgroundColor: hexInputToPreview(hexInput) }}\r\n />\r\n <div className=\"flex flex-1 items-center border rounded overflow-hidden\r\n border-gray-300 \r\n focus-within:ring-2 focus-within:ring-blue-500\">\r\n <span className=\"pl-2 text-xs text-gray-400 select-none\">#</span>\r\n <input\r\n type=\"text\"\r\n maxLength={6}\r\n value={hexInput}\r\n onChange={(e) => {\r\n setHexInput(e.target.value.replace(/[^0-9a-fA-F]/g, ''));\r\n setHexError(false);\r\n }}\r\n onKeyDown={(e) => {\r\n if (e.key === 'Enter') { e.preventDefault(); commitHexInput(); }\r\n if (e.key === 'Escape') setOpen(false);\r\n }}\r\n placeholder=\"e.g. 000000\"\r\n className={[\r\n 'flex-1 px-1 py-1.5 text-xs bg-transparent outline-none font-mono',\r\n 'text-gray-900 ',\r\n hexError ? 'text-red-500' : '',\r\n ].join(' ')}\r\n aria-label=\"Hex colour value\"\r\n />\r\n </div>\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => { e.preventDefault(); commitHexInput(); }}\r\n className=\"shrink-0 px-2 py-1.5 text-xs bg-blue-600 text-white rounded\r\n hover:bg-blue-700 transition-colors\"\r\n >\r\n ✓\r\n </button>\r\n </div>\r\n {hexError && (\r\n <p className=\"text-[10px] text-red-500 mt-1 px-0.5\">Invalid hex colour</p>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Swatch ───────────────────────────────────────────────────────────────────\r\n\r\nfunction Swatch({\r\n color,\r\n isActive,\r\n onSelect,\r\n}: {\r\n color: ColorOption;\r\n isActive: boolean;\r\n onSelect: (v: string) => void;\r\n}) {\r\n return (\r\n <button\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isActive}\r\n title={color.label}\r\n onMouseDown={(e) => { e.preventDefault(); onSelect(color.value); }}\r\n className={[\r\n 'relative w-[30px] h-[30px] rounded transition-transform',\r\n 'hover:scale-110 focus:outline-none',\r\n 'focus-visible:ring-2 focus-visible:ring-offset-1 focus-visible:ring-blue-500',\r\n isActive ? 'ring-2 ring-offset-1 ring-blue-500 scale-105' : '',\r\n color.hasBorder ? 'border border-gray-300 ' : '',\r\n ].join(' ')}\r\n style={{ backgroundColor: color.value }}\r\n >\r\n {isActive && <CheckIcon light={isLight(color.value)} />}\r\n </button>\r\n );\r\n}\r\n\r\n// ─── Helpers ──────────────────────────────────────────────────────────────────\r\n\r\nfunction normalizeHex(hex: string): string {\r\n return hex.trim().toLowerCase();\r\n}\r\n\r\nfunction hexInputToPreview(input: string): string {\r\n const raw = input.replace(/^#/, '');\r\n if (/^[0-9a-f]{6}$/i.test(raw) || /^[0-9a-f]{3}$/i.test(raw)) return `#${raw}`;\r\n return 'transparent';\r\n}\r\n\r\nfunction isLight(hex: string): boolean {\r\n const h = hex.replace('#', '');\r\n if (h.length < 6) return true;\r\n const r = parseInt(h.slice(0, 2), 16);\r\n const g = parseInt(h.slice(2, 4), 16);\r\n const b = parseInt(h.slice(4, 6), 16);\r\n return (r * 299 + g * 587 + b * 114) / 1000 > 128;\r\n}\r\n\r\n// ─── Sub-components ───────────────────────────────────────────────────────────\r\n\r\nfunction CheckIcon({ light }: { light: boolean }) {\r\n return (\r\n <svg\r\n className=\"absolute inset-0 m-auto w-3.5 h-3.5 drop-shadow\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke={light ? 'rgba(0,0,0,0.65)' : 'rgba(255,255,255,0.9)'}\r\n strokeWidth={3.5}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <polyline points=\"20 6 9 17 4 12\" />\r\n </svg>\r\n );\r\n}\r\n\r\n// ─── Icons ────────────────────────────────────────────────────────────────────\r\n\r\nfunction TextColorIcon() {\r\n return (\r\n <svg width=\"14\" height=\"12\" viewBox=\"0 0 24 22\" fill=\"none\" stroke=\"currentColor\"\r\n strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M4 20 L12 4 L20 20\" />\r\n <path d=\"M7.5 13 L16.5 13\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronDownIcon() {\r\n return (\r\n <svg className=\"w-2.5 h-2.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction RemoveColorIcon() {\r\n return (\r\n <svg className=\"w-4 h-4 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\r\n strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <path d=\"M7 21h14\" />\r\n <path d=\"m5 11 9-9 7 7-9 9H5l-2-2 2-5Z\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\n\nimport React from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { insertHorizontalRule } from '../../editor/commands';\nimport { ToolbarButton } from './ToolbarButton';\n\ninterface HorizontalRuleButtonProps {\n engine: EditorEngine;\n}\n\nexport function HorizontalRuleButton({ engine }: HorizontalRuleButtonProps) {\n return (\n <ToolbarButton\n label=\"HR\"\n title=\"Insert Horizontal Rule\"\n onClick={() => insertHorizontalRule(engine)}\n icon={<HRIcon />}\n />\n );\n}\n\nfunction HRIcon() {\n return (\n <svg\n className=\"w-4 h-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n >\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"7\" x2=\"9\" y2=\"7\" strokeWidth={1.5} strokeOpacity={0.5} />\n <line x1=\"3\" y1=\"17\" x2=\"9\" y2=\"17\" strokeWidth={1.5} strokeOpacity={0.5} />\n </svg>\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { ToolbarButton } from './ToolbarButton';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { useEditorState } from '../../hooks/useEditorState';\nimport { getActiveBlockType } from '../../editor/selection/SelectionEngine';\nimport { toggleCheckList } from '../../editor/commands';\n\ninterface ChecklistButtonProps {\n engine: EditorEngine;\n}\n\nexport function ChecklistButton({ engine }: ChecklistButtonProps) {\n const state = useEditorState(engine);\n const activeBlock = getActiveBlockType(state.doc, state.selection);\n\n return (\n <ToolbarButton\n label=\"☑\"\n title=\"Checklist (Ctrl+Shift+9)\"\n onClick={() => toggleCheckList(engine)}\n isActive={activeBlock === 'check_list'}\n icon={<ChecklistIcon />}\n />\n );\n}\n\nfunction ChecklistIcon() {\n return (\n <svg\n className=\"w-4 h-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <rect x=\"3\" y=\"5\" width=\"6\" height=\"6\" rx=\"1\" />\n <polyline points=\"4 8 6 10 9 6\" />\n <line x1=\"13\" y1=\"8\" x2=\"21\" y2=\"8\" />\n <rect x=\"3\" y=\"14\" width=\"6\" height=\"6\" rx=\"1\" />\n <line x1=\"13\" y1=\"17\" x2=\"21\" y2=\"17\" />\n </svg>\n );\n}\n","/**\n * TableModel\n *\n * Pure, immutable operations on table nodes. No DOM, no React, no side effects.\n * Mirrors the pattern of DocumentModel.ts for the table sub-tree.\n *\n * Table structure in the document:\n * table { attrs: { colWidths: number[] }, children: [table_row, ...] }\n * table_row { children: [table_cell | table_header, ...] }\n * table_cell { attrs: { colspan, rowspan, covered }, children: [paragraph, ...] }\n *\n * Covered cells: when a cell spans multiple cols/rows, the \"shadowed\" grid\n * positions still have a table_cell node with attrs.covered=true and empty\n * children. The renderer skips them; the model keeps the grid rectangular.\n */\n\nimport type { BlockNode, Document, EditorNode, NodePosition } from '../../types';\nimport { getNodeAtPath, isTextNode, createParagraph } from '../core/DocumentModel';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface TableDimensions {\n rows: number;\n cols: number;\n}\n\nexport interface CellPosition {\n tablePath: number[];\n row: number;\n col: number;\n}\n\n// ─── Factory ──────────────────────────────────────────────────────────────────\n\nexport function createTableNode(rows: number, cols: number, defaultColWidth = 120): BlockNode {\n const colWidths = Array.from({ length: cols }, () => defaultColWidth);\n return {\n type: 'table',\n attrs: { colWidths },\n children: Array.from({ length: rows }, () => createTableRow(cols)),\n };\n}\n\nfunction createTableRow(cols: number): BlockNode {\n return {\n type: 'table_row',\n attrs: {},\n children: Array.from({ length: cols }, () => createTableCell()),\n };\n}\n\nexport function createTableCell(content = ''): BlockNode {\n return {\n type: 'table_cell',\n attrs: { colspan: 1, rowspan: 1, covered: false },\n children: [createParagraph(content)],\n };\n}\n\n// ─── Queries ──────────────────────────────────────────────────────────────────\n\nexport function getTableDimensions(table: BlockNode): TableDimensions {\n const rows = table.children.length;\n const cols = rows > 0 ? (table.children[0] as BlockNode).children.length : 0;\n return { rows, cols };\n}\n\nexport function getTableCell(table: BlockNode, row: number, col: number): BlockNode | null {\n const rowNode = table.children[row] as BlockNode | undefined;\n if (!rowNode) return null;\n return (rowNode.children[col] as BlockNode) ?? null;\n}\n\n/**\n * Walk from a node path upward to find the ancestor table path.\n * Returns null if not inside a table.\n */\nexport function findTablePath(doc: Document, path: number[]): number[] | null {\n for (let depth = path.length - 1; depth >= 1; depth--) {\n const candidate = path.slice(0, depth);\n const node = getNodeAtPath(doc, candidate);\n if (node && !isTextNode(node as EditorNode) && (node as BlockNode).type === 'table') {\n return candidate;\n }\n }\n return null;\n}\n\n/**\n * Derive { tablePath, row, col } from a selection path inside a table.\n * path=[2,0,1,...] → tablePath=[2], row=0, col=1\n */\nexport function findCellPosition(doc: Document, path: number[]): CellPosition | null {\n const tablePath = findTablePath(doc, path);\n if (!tablePath) return null;\n\n const rowIdx = path[tablePath.length];\n const colIdx = path[tablePath.length + 1];\n if (rowIdx === undefined || colIdx === undefined) return null;\n\n return { tablePath, row: rowIdx, col: colIdx };\n}\n\n/**\n * Get the NodePosition for the first editable position in a cell.\n * Navigates: cell → first paragraph → first text node (or block).\n */\nexport function getCellFirstPosition(\n doc: Document,\n tablePath: number[],\n row: number,\n col: number,\n): NodePosition | null {\n const cellPath = [...tablePath, row, col];\n const cell = getNodeAtPath(doc, cellPath);\n if (!cell || isTextNode(cell as EditorNode)) return null;\n\n const cellBlock = cell as BlockNode;\n if (cellBlock.attrs.covered) return null;\n\n if (cellBlock.children.length === 0) return { path: cellPath, offset: 0 };\n\n const firstChildPath = [...cellPath, 0];\n const firstChild = cellBlock.children[0];\n\n if (isTextNode(firstChild)) return { path: firstChildPath, offset: 0 };\n\n // First child is a block (paragraph) — go one level deeper\n const firstParagraph = firstChild as BlockNode;\n if (firstParagraph.children.length > 0) {\n return { path: [...firstChildPath, 0], offset: 0 };\n }\n return { path: firstChildPath, offset: 0 };\n}\n\n/**\n * Get the NodePosition for the last editable position in a cell (for Shift+Tab).\n */\nexport function getCellLastPosition(\n doc: Document,\n tablePath: number[],\n row: number,\n col: number,\n): NodePosition | null {\n const cellPath = [...tablePath, row, col];\n const cell = getNodeAtPath(doc, cellPath);\n if (!cell || isTextNode(cell as EditorNode)) return null;\n\n const cellBlock = cell as BlockNode;\n if (cellBlock.attrs.covered) return null;\n\n if (cellBlock.children.length === 0) return { path: cellPath, offset: 0 };\n\n const lastParaIdx = cellBlock.children.length - 1;\n const lastParaPath = [...cellPath, lastParaIdx];\n const lastPara = cellBlock.children[lastParaIdx] as BlockNode;\n\n if (lastPara.children.length > 0) {\n const lastTextIdx = lastPara.children.length - 1;\n const lastText = lastPara.children[lastTextIdx];\n if (isTextNode(lastText)) {\n return { path: [...lastParaPath, lastTextIdx], offset: lastText.text.length };\n }\n }\n return { path: lastParaPath, offset: 0 };\n}\n\n// ─── Row Operations ───────────────────────────────────────────────────────────\n\n/** Insert a new empty row after rowIndex. */\nexport function insertTableRowAfter(table: BlockNode, rowIndex: number): BlockNode {\n const { cols } = getTableDimensions(table);\n const newRow = createTableRow(cols);\n const rows = [...(table.children as BlockNode[])];\n rows.splice(rowIndex + 1, 0, newRow);\n return { ...table, children: rows };\n}\n\n/** Insert a new empty row before rowIndex. */\nexport function insertTableRowBefore(table: BlockNode, rowIndex: number): BlockNode {\n if (rowIndex <= 0) return insertTableRowAfter(table, -1);\n return insertTableRowAfter(table, rowIndex - 1);\n}\n\n/** Delete row at rowIndex. No-op if it's the only row. */\nexport function deleteTableRow(table: BlockNode, rowIndex: number): BlockNode {\n const rows = table.children as BlockNode[];\n if (rows.length <= 1) return table;\n return { ...table, children: rows.filter((_, i) => i !== rowIndex) };\n}\n\n// ─── Column Operations ────────────────────────────────────────────────────────\n\n/** Insert a new empty column after colIndex. */\nexport function insertTableColumnAfter(table: BlockNode, colIndex: number): BlockNode {\n const newRows = (table.children as BlockNode[]).map((row) => {\n const cells = [...(row.children as BlockNode[])];\n cells.splice(colIndex + 1, 0, createTableCell());\n return { ...row, children: cells };\n });\n\n const colWidths = [...((table.attrs.colWidths as number[]) ?? [])];\n const insertWidth = colWidths[colIndex] ?? 120;\n colWidths.splice(colIndex + 1, 0, insertWidth);\n\n return { ...table, attrs: { ...table.attrs, colWidths }, children: newRows };\n}\n\n/** Insert a new empty column before colIndex. */\nexport function insertTableColumnBefore(table: BlockNode, colIndex: number): BlockNode {\n if (colIndex <= 0) return insertTableColumnAfter(table, -1);\n return insertTableColumnAfter(table, colIndex - 1);\n}\n\n/** Delete column at colIndex. No-op if it's the only column. */\nexport function deleteTableColumn(table: BlockNode, colIndex: number): BlockNode {\n const { cols } = getTableDimensions(table);\n if (cols <= 1) return table;\n\n const newRows = (table.children as BlockNode[]).map((row) => ({\n ...row,\n children: (row.children as BlockNode[]).filter((_, i) => i !== colIndex),\n }));\n\n const colWidths = [...((table.attrs.colWidths as number[]) ?? [])];\n colWidths.splice(colIndex, 1);\n\n return { ...table, attrs: { ...table.attrs, colWidths }, children: newRows };\n}\n\n// ─── Merge / Split ────────────────────────────────────────────────────────────\n\n/**\n * Merge the rectangular cell range from (r1,c1) to (r2,c2) into one cell.\n * The top-left anchor cell absorbs all content; others become covered.\n */\nexport function mergeTableCells(\n table: BlockNode,\n from: [number, number],\n to: [number, number],\n): BlockNode {\n const minRow = Math.min(from[0], to[0]);\n const maxRow = Math.max(from[0], to[0]);\n const minCol = Math.min(from[1], to[1]);\n const maxCol = Math.max(from[1], to[1]);\n\n const colspan = maxCol - minCol + 1;\n const rowspan = maxRow - minRow + 1;\n\n // Collect all non-covered cell content\n const allChildren: BlockNode[] = [];\n for (let r = minRow; r <= maxRow; r++) {\n for (let c = minCol; c <= maxCol; c++) {\n const cell = getTableCell(table, r, c);\n if (cell && !cell.attrs.covered) {\n allChildren.push(...(cell.children as BlockNode[]));\n }\n }\n }\n\n const mergedContent =\n allChildren.filter((b) => {\n if (b.type !== 'paragraph') return true;\n // Filter out empty paragraphs from non-anchor cells\n return b.children.length > 0;\n });\n\n const anchorContent = mergedContent.length > 0 ? mergedContent : [createParagraph()];\n\n const newRows = (table.children as BlockNode[]).map((rowNode, r) => {\n if (r < minRow || r > maxRow) return rowNode;\n const newCells = (rowNode.children as BlockNode[]).map((cellNode, c) => {\n if (c < minCol || c > maxCol) return cellNode;\n if (r === minRow && c === minCol) {\n return {\n ...cellNode,\n attrs: { ...cellNode.attrs, colspan, rowspan, covered: false },\n children: anchorContent,\n };\n }\n return {\n ...cellNode,\n attrs: { ...cellNode.attrs, colspan: 1, rowspan: 1, covered: true },\n children: [createParagraph()],\n };\n });\n return { ...rowNode, children: newCells };\n });\n\n return { ...table, children: newRows };\n}\n\n/**\n * Split a merged cell back to individual cells, restoring the covered cells.\n */\nexport function splitTableCell(table: BlockNode, row: number, col: number): BlockNode {\n const cell = getTableCell(table, row, col);\n if (!cell) return table;\n\n const colspan = (cell.attrs.colspan as number) ?? 1;\n const rowspan = (cell.attrs.rowspan as number) ?? 1;\n if (colspan <= 1 && rowspan <= 1) return table;\n\n const newRows = (table.children as BlockNode[]).map((rowNode, r) => {\n if (r < row || r >= row + rowspan) return rowNode;\n const newCells = (rowNode.children as BlockNode[]).map((cellNode, c) => {\n if (c < col || c >= col + colspan) return cellNode;\n if (r === row && c === col) {\n return { ...cellNode, attrs: { ...cellNode.attrs, colspan: 1, rowspan: 1, covered: false } };\n }\n return {\n ...cellNode,\n attrs: { ...cellNode.attrs, colspan: 1, rowspan: 1, covered: false },\n children: [createParagraph()],\n };\n });\n return { ...rowNode, children: newCells };\n });\n\n return { ...table, children: newRows };\n}\n\n// ─── Column Resize ────────────────────────────────────────────────────────────\n\nexport function updateColumnWidth(table: BlockNode, colIndex: number, width: number): BlockNode {\n const colWidths = [...((table.attrs.colWidths as number[]) ?? [])];\n colWidths[colIndex] = Math.max(40, width);\n return { ...table, attrs: { ...table.attrs, colWidths } };\n}\n","/**\n * TableCommands\n *\n * All table-related Commands. Each is a pure function (engine) → boolean.\n * Table mutations use delete_node + insert_node to replace the table atomically,\n * which keeps undo/redo working via the existing HistoryManager snapshots.\n */\n\nimport type { Command, BlockNode, Document } from '../../types';\nimport { createTransaction, tr_setSelection } from '../core/Transaction';\nimport { getNodeAtPath } from '../core/DocumentModel';\nimport { makeCollapsedSelection, makePosition } from '../selection/SelectionEngine';\nimport {\n createTableNode,\n getTableDimensions,\n insertTableRowAfter,\n insertTableRowBefore,\n deleteTableRow,\n insertTableColumnAfter,\n insertTableColumnBefore,\n deleteTableColumn,\n mergeTableCells,\n splitTableCell,\n updateColumnWidth,\n findCellPosition,\n getCellFirstPosition,\n} from './TableModel';\n\n// ─── Helpers ──────────────────────────────────────────────────────────────────\n\n/**\n * Replace the table at tablePath with newTable in a single transaction.\n * Optionally sets cursor to (cursorRow, cursorCol) in the new table.\n */\nfunction replaceTable(\n engine: Parameters<Command>[0],\n tablePath: number[],\n newTable: BlockNode,\n cursorRow?: number,\n cursorCol?: number,\n): boolean {\n const state = engine.getState();\n const tr = createTransaction();\n\n tr.steps.push({ type: 'delete_node', path: tablePath });\n tr.steps.push({\n type: 'insert_node',\n parentPath: tablePath.length > 1 ? tablePath.slice(0, -1) : [],\n index: tablePath[tablePath.length - 1],\n node: newTable,\n });\n\n if (cursorRow !== undefined && cursorCol !== undefined) {\n // Build a temporary doc with the new table to resolve the position\n const newChildren = [...state.doc.children];\n newChildren[tablePath[0]] = newTable;\n const tempDoc: Document = { type: 'doc', children: newChildren };\n const pos = getCellFirstPosition(tempDoc, tablePath, cursorRow, cursorCol);\n if (pos) tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n }\n\n engine.dispatch(tr);\n return true;\n}\n\n// ─── Insert Table ─────────────────────────────────────────────────────────────\n\nexport function insertTable(rows: number, cols: number): Command {\n return (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n const tableNode = createTableNode(rows, cols);\n\n // Insert after the current top-level block (or at 0 if no selection)\n const insertIndex = sel ? sel.anchor.path[0] + 1 : state.doc.children.length;\n\n const tr = createTransaction();\n tr.steps.push({ type: 'insert_node', parentPath: [], index: insertIndex, node: tableNode });\n\n // Set cursor to first cell of new table\n const newChildren = [...state.doc.children];\n newChildren.splice(insertIndex, 0, tableNode);\n const tempDoc: Document = { type: 'doc', children: newChildren };\n const pos = getCellFirstPosition(tempDoc, [insertIndex], 0, 0);\n if (pos) tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Row Commands ─────────────────────────────────────────────────────────────\n\nexport const addRowAbove: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = insertTableRowBefore(table, row);\n // Cursor stays at same logical row (which is now row+1 after insert)\n return replaceTable(engine, tablePath, newTable, row + 1, col);\n};\n\nexport const addRowBelow: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = insertTableRowAfter(table, row);\n return replaceTable(engine, tablePath, newTable, row + 1, col);\n};\n\nexport const deleteRow: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = deleteTableRow(table, row);\n const { rows } = getTableDimensions(newTable);\n return replaceTable(engine, tablePath, newTable, Math.min(row, rows - 1), col);\n};\n\n// ─── Column Commands ──────────────────────────────────────────────────────────\n\nexport const addColumnLeft: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = insertTableColumnBefore(table, col);\n // Cursor shifts right by 1 (same column position in new grid)\n return replaceTable(engine, tablePath, newTable, row, col + 1);\n};\n\nexport const addColumnRight: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = insertTableColumnAfter(table, col);\n return replaceTable(engine, tablePath, newTable, row, col);\n};\n\nexport const deleteColumn: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = deleteTableColumn(table, col);\n const { cols } = getTableDimensions(newTable);\n return replaceTable(engine, tablePath, newTable, row, Math.min(col, cols - 1));\n};\n\n// ─── Merge / Split ────────────────────────────────────────────────────────────\n\nexport function mergeCells(\n tableSelection: { tablePath: number[]; anchorCell: [number, number]; focusCell: [number, number] },\n): Command {\n return (engine) => {\n const state = engine.getState();\n const table = getNodeAtPath(state.doc, tableSelection.tablePath) as BlockNode;\n if (!table) return false;\n\n const newTable = mergeTableCells(table, tableSelection.anchorCell, tableSelection.focusCell);\n const [anchorRow, anchorCol] = [\n Math.min(tableSelection.anchorCell[0], tableSelection.focusCell[0]),\n Math.min(tableSelection.anchorCell[1], tableSelection.focusCell[1]),\n ];\n return replaceTable(engine, tableSelection.tablePath, newTable, anchorRow, anchorCol);\n };\n}\n\nexport const splitCell: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const newTable = splitTableCell(table, row, col);\n return replaceTable(engine, tablePath, newTable, row, col);\n};\n\n// ─── Delete Table ─────────────────────────────────────────────────────────────\n\nexport const deleteTable: Command = (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath } = cellPos;\n const tableIdx = tablePath[tablePath.length - 1];\n\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: tablePath });\n\n // Land cursor on the nearest surviving block\n const newLen = state.doc.children.length - 1;\n if (newLen > 0) {\n const landIdx = Math.min(tableIdx, newLen - 1);\n tr.steps.push(tr_setSelection(makeCollapsedSelection(makePosition([landIdx], 0))));\n }\n\n engine.dispatch(tr);\n return true;\n};\n\n// ─── Header Row Toggle ────────────────────────────────────────────────────────\n\nexport function toggleHeaderRow(tablePath: number[]): Command {\n return (engine) => {\n const state = engine.getState();\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n if (!table) return false;\n\n const rows = table.children as BlockNode[];\n if (rows.length === 0) return false;\n\n const firstRow = rows[0];\n const hasHeader = (firstRow.children as BlockNode[]).some((c) => c.type === 'table_header');\n const newType = hasHeader ? 'table_cell' : 'table_header';\n\n const newFirstRow: BlockNode = {\n ...firstRow,\n children: (firstRow.children as BlockNode[]).map((cell) => ({\n ...cell,\n type: newType,\n })),\n };\n const newTable: BlockNode = {\n ...table,\n children: [newFirstRow, ...rows.slice(1)],\n };\n return replaceTable(engine, tablePath, newTable);\n };\n}\n\n// ─── Column Resize ────────────────────────────────────────────────────────────\n\nexport function setColumnWidth(tablePath: number[], colIndex: number, width: number): Command {\n return (engine) => {\n const state = engine.getState();\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n if (!table) return false;\n const newTable = updateColumnWidth(table, colIndex, width);\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: tablePath });\n tr.steps.push({\n type: 'insert_node',\n parentPath: tablePath.length > 1 ? tablePath.slice(0, -1) : [],\n index: tablePath[tablePath.length - 1],\n node: newTable,\n });\n engine.dispatch(tr);\n return true;\n };\n}\n","'use client';\n\n/**\n * TableButton\n *\n * Toolbar button that opens a CKEditor-style grid-selector popup.\n * Hovering over the grid highlights the selection area and shows a live\n * \"rows × cols\" preview. Clicking inserts the table at the cursor.\n */\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { insertTable } from '../../editor/table/TableCommands';\n\nconst MAX_ROWS = 10;\nconst MAX_COLS = 10;\n\ninterface TableButtonProps {\n engine: EditorEngine;\n}\n\nexport function TableButton({ engine }: TableButtonProps) {\n const [open, setOpen] = useState(false);\n const [hovered, setHovered] = useState<[number, number]>([0, 0]);\n const buttonRef = useRef<HTMLButtonElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n\n const close = useCallback(() => {\n setOpen(false);\n setHovered([0, 0]);\n }, []);\n\n // Close on outside click\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (\n popupRef.current &&\n !popupRef.current.contains(e.target as Node) &&\n !buttonRef.current?.contains(e.target as Node)\n ) {\n close();\n }\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open, close]);\n\n // Close on Escape\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') close(); };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, close]);\n\n const handleSelect = useCallback(\n (rows: number, cols: number) => {\n insertTable(rows, cols)(engine);\n close();\n },\n [engine, close],\n );\n\n const [hovRows, hovCols] = hovered;\n\n return (\n <div className=\"relative\">\n <button\n ref={buttonRef}\n type=\"button\"\n title=\"Insert table\"\n aria-label=\"Insert table\"\n aria-expanded={open}\n aria-haspopup=\"true\"\n onClick={() => setOpen((v) => !v)}\n className={[\n 'flex items-center gap-1 rounded px-1.5 py-1 text-sm',\n 'text-gray-700 ',\n 'hover:bg-gray-100 ',\n open ? 'bg-gray-100 ' : '',\n ].join(' ')}\n >\n <TableIcon />\n <svg\n className=\"h-2.5 w-2.5 opacity-60\"\n viewBox=\"0 0 10 6\"\n fill=\"currentColor\"\n aria-hidden=\"true\"\n >\n <path d=\"M0 0l5 6 5-6z\" />\n </svg>\n </button>\n\n {open && (\n <div\n ref={popupRef}\n role=\"dialog\"\n aria-label=\"Select table size\"\n className={[\n 'absolute left-0 top-full z-50 mt-1',\n 'rounded-lg border border-gray-200 bg-white p-3 shadow-xl',\n ' ',\n ].join(' ')}\n onMouseLeave={() => setHovered([0, 0])}\n >\n {/* Grid */}\n <div\n className=\"grid gap-0.5\"\n style={{ gridTemplateColumns: `repeat(${MAX_COLS}, 1.25rem)` }}\n >\n {Array.from({ length: MAX_ROWS }, (_, r) =>\n Array.from({ length: MAX_COLS }, (_, c) => {\n const active = r <= hovRows && c <= hovCols;\n return (\n <button\n key={`${r}-${c}`}\n type=\"button\"\n aria-label={`${r + 1} rows × ${c + 1} columns`}\n onMouseEnter={() => setHovered([r, c])}\n onFocus={() => setHovered([r, c])}\n onClick={() => handleSelect(r + 1, c + 1)}\n className={[\n 'h-5 w-5 rounded-sm border transition-colors duration-75',\n active\n ? 'border-blue-400 bg-blue-100 '\n : 'border-gray-300 bg-white ',\n ].join(' ')}\n />\n );\n }),\n )}\n </div>\n\n {/* Size preview label */}\n <p className=\"mt-2 text-center text-xs font-medium text-gray-600 \">\n {hovRows + 1} × {hovCols + 1}\n </p>\n </div>\n )}\n </div>\n );\n}\n\nfunction TableIcon() {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"h-4 w-4\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={1.8}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" />\n <line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" />\n <line x1=\"9\" y1=\"3\" x2=\"9\" y2=\"21\" />\n <line x1=\"15\" y1=\"3\" x2=\"15\" y2=\"21\" />\n </svg>\n );\n}\n","'use client';\n\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { insertImage } from '../../editor/commands';\n\ninterface ImageUploadButtonProps {\n engine: EditorEngine;\n onUploadImage?: (file: File) => Promise<string>;\n}\n\ntype Tab = 'upload' | 'url';\n\nexport function ImageUploadButton({ engine, onUploadImage }: ImageUploadButtonProps) {\n const [open, setOpen] = useState(false);\n const [tab, setTab] = useState<Tab>('upload');\n const [urlInput, setUrlInput] = useState('');\n const [urlError, setUrlError] = useState(false);\n const [altInput, setAltInput] = useState('');\n const [dragging, setDragging] = useState(false);\n const [preview, setPreview] = useState<string | null>(null);\n const [uploading, setUploading] = useState(false);\n const [progress, setProgress] = useState(0);\n\n const containerRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const altInputRef = useRef('');\n\n // Keep ref in sync so async handleFile always reads latest alt text\n useEffect(() => { altInputRef.current = altInput; }, [altInput]);\n\n const close = useCallback(() => {\n setOpen(false);\n setUrlInput('');\n setUrlError(false);\n setAltInput('');\n altInputRef.current = '';\n setPreview((prev) => { if (prev?.startsWith('blob:')) URL.revokeObjectURL(prev); return null; });\n setUploading(false);\n setProgress(0);\n setDragging(false);\n }, []);\n\n // Outside click → close\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node))\n close();\n };\n document.addEventListener('mousedown', handler);\n return () => document.removeEventListener('mousedown', handler);\n }, [open, close]);\n\n // Escape → close\n useEffect(() => {\n if (!open) return;\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') close(); };\n document.addEventListener('keydown', handler);\n return () => document.removeEventListener('keydown', handler);\n }, [open, close]);\n\n const handleFile = useCallback(async (file: File) => {\n if (!file.type.startsWith('image/')) return;\n\n // Immediate blob URL preview\n const blobUrl = URL.createObjectURL(file);\n setPreview(blobUrl);\n setAltInput(file.name.replace(/\\.[^.]+$/, ''));\n\n if (!onUploadImage) {\n // No upload service — use blob URL directly. Clear preview without revoking\n // because the blob is now the live image src in the editor.\n insertImage(blobUrl, file.name.replace(/\\.[^.]+$/, ''))(engine);\n setOpen(false);\n setUrlInput('');\n setUrlError(false);\n setAltInput('');\n altInputRef.current = '';\n setPreview(null);\n setUploading(false);\n setProgress(0);\n setDragging(false);\n return;\n }\n\n // Upload with progress simulation\n setUploading(true);\n setProgress(0);\n const fakeProgress = setInterval(() => {\n setProgress((p) => Math.min(p + 12, 85));\n }, 150);\n\n try {\n const finalUrl = await onUploadImage(file);\n clearInterval(fakeProgress);\n setProgress(100);\n insertImage(finalUrl, altInputRef.current || file.name.replace(/\\.[^.]+$/, ''))(engine);\n setTimeout(close, 300);\n } catch {\n clearInterval(fakeProgress);\n setUploading(false);\n setProgress(0);\n }\n }, [engine, onUploadImage, close]);\n\n const handleDrop = useCallback((e: React.DragEvent) => {\n e.preventDefault();\n setDragging(false);\n const file = e.dataTransfer.files[0];\n if (file) void handleFile(file);\n }, [handleFile]);\n\n const handleFileInput = useCallback((e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (file) void handleFile(file);\n e.target.value = '';\n }, [handleFile]);\n\n const commitUrl = () => {\n const url = urlInput.trim();\n if (!url) { setUrlError(true); return; }\n insertImage(url, altInput)(engine);\n close();\n };\n\n return (\n <div ref={containerRef} className=\"relative\">\n <button\n type=\"button\"\n title=\"Insert image\"\n aria-expanded={open}\n onMouseDown={(e) => { e.preventDefault(); setOpen((v) => !v); }}\n className={[\n 'flex items-center justify-center w-8 h-8 rounded text-sm',\n 'text-gray-700 ',\n 'hover:bg-gray-100 ',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\n open ? 'bg-gray-100 ' : '',\n ].join(' ')}\n >\n <ImageIcon />\n </button>\n\n {open && (\n <div\n role=\"dialog\"\n aria-label=\"Insert image\"\n className=\"absolute top-full right-0 mt-1 z-50 w-80\n bg-white \n border border-gray-200 \n rounded-lg shadow-xl overflow-y-auto\n max-h-[min(480px,calc(100vh-var(--toolbar-bottom,80px)))]\"\n >\n {/* Tabs */}\n <div className=\"flex border-b border-gray-200 \">\n {(['upload', 'url'] as Tab[]).map((t) => (\n <button\n key={t}\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); setTab(t); }}\n className={[\n 'flex-1 py-2 text-xs font-medium capitalize transition-colors',\n tab === t\n ? 'border-b-2 border-blue-500 text-blue-600 '\n : 'text-gray-500 hover:text-gray-700 ',\n ].join(' ')}\n >\n {t === 'upload' ? 'Upload file' : 'Insert URL'}\n </button>\n ))}\n </div>\n\n <div className=\"p-3 space-y-3\">\n {tab === 'upload' ? (\n <>\n {/* Drop zone */}\n {!preview && (\n <div\n onDragOver={(e) => { e.preventDefault(); setDragging(true); }}\n onDragLeave={() => setDragging(false)}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n className={[\n 'flex flex-col items-center justify-center gap-2',\n 'h-32 rounded-lg border-2 border-dashed cursor-pointer',\n 'transition-colors text-center px-4',\n dragging\n ? 'border-blue-400 bg-blue-50 '\n : 'border-gray-300 hover:border-blue-400 hover:bg-gray-50 ',\n ].join(' ')}\n >\n <UploadIcon />\n <p className=\"text-xs text-gray-500 \">\n <span className=\"font-medium text-blue-600 \">Click to upload</span>\n {' '}or drag & drop\n </p>\n <p className=\"text-[10px] text-gray-400\">PNG, JPG, GIF, WebP</p>\n </div>\n )}\n\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/*\"\n className=\"hidden\"\n onChange={handleFileInput}\n />\n\n {/* Preview */}\n {preview && (\n <div className=\"relative\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={preview}\n alt=\"preview\"\n className=\"w-full max-h-40 object-contain rounded-md border border-gray-200 \"\n />\n {uploading && (\n <div className=\"absolute inset-x-0 bottom-0 h-1 bg-gray-200 rounded-b-md overflow-hidden\">\n <div\n className=\"h-full bg-blue-500 transition-all duration-150\"\n style={{ width: `${progress}%` }}\n />\n </div>\n )}\n {!uploading && (\n <button\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); setPreview((prev) => { if (prev?.startsWith('blob:')) URL.revokeObjectURL(prev); return null; }); }}\n className=\"absolute top-1 right-1 w-5 h-5 rounded-full bg-black/50 text-white flex items-center justify-center text-xs hover:bg-black/70\"\n >\n ✕\n </button>\n )}\n </div>\n )}\n\n {uploading && (\n <p className=\"text-[10px] text-center text-gray-400\">\n Uploading… {progress}%\n </p>\n )}\n </>\n ) : (\n <>\n {/* URL tab */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1\">\n Image URL\n </label>\n <input\n type=\"url\"\n placeholder=\"https://example.com/image.jpg\"\n value={urlInput}\n onChange={(e) => { setUrlInput(e.target.value); setUrlError(false); }}\n onKeyDown={(e) => { if (e.key === 'Enter') { e.preventDefault(); commitUrl(); } }}\n autoFocus\n className={[\n 'w-full px-2.5 py-1.5 text-xs rounded border outline-none',\n 'bg-white text-gray-900 ',\n urlError\n ? 'border-red-400 focus:ring-red-400'\n : 'border-gray-300 focus:ring-2 focus:ring-blue-500 focus:border-transparent',\n ].join(' ')}\n />\n {urlError && <p className=\"text-[10px] text-red-500 mt-1\">Enter a valid URL</p>}\n </div>\n\n {/* Live preview for URL tab */}\n {urlInput && (\n // eslint-disable-next-line @next/next/no-img-element\n <img\n src={urlInput}\n alt=\"preview\"\n onError={(e) => { (e.target as HTMLImageElement).style.display = 'none'; }}\n onLoad={(e) => { (e.target as HTMLImageElement).style.display = 'block'; }}\n style={{ display: 'none' }}\n className=\"w-full max-h-28 object-contain rounded-md border border-gray-200 \"\n />\n )}\n </>\n )}\n\n {/* Alt text */}\n <div>\n <label className=\"block text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1\">\n Alt text <span className=\"normal-case font-normal\">(optional)</span>\n </label>\n <input\n type=\"text\"\n placeholder=\"Describe the image\"\n value={altInput}\n onChange={(e) => setAltInput(e.target.value)}\n className=\"w-full px-2.5 py-1.5 text-xs rounded border outline-none\n border-gray-300 \n bg-white text-gray-900 \n focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n </div>\n\n {/* Actions */}\n {tab === 'url' && (\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); close(); }}\n className=\"px-3 py-1.5 text-xs text-gray-600 rounded hover:bg-gray-100 \"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onMouseDown={(e) => { e.preventDefault(); commitUrl(); }}\n className=\"px-3 py-1.5 text-xs bg-blue-600 text-white rounded hover:bg-blue-700\"\n >\n Insert\n </button>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n );\n}\n\nfunction ImageIcon() {\n return (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"3\" width=\"18\" height=\"18\" rx=\"2\" />\n <circle cx=\"8.5\" cy=\"8.5\" r=\"1.5\" />\n <polyline points=\"21 15 16 10 5 21\" />\n </svg>\n );\n}\n\nfunction UploadIcon() {\n return (\n <svg className=\"w-8 h-8 text-gray-300 \" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={1.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n );\n}\n","export interface SpecialChar {\n char: string;\n name: string;\n category: string;\n}\n\nexport const SPECIAL_CHARACTERS: SpecialChar[] = [\n // ── Currency ──────────────────────────────────────────────────────────────\n { char: '€', name: 'Euro Sign', category: 'Currency' },\n { char: '£', name: 'Pound Sign', category: 'Currency' },\n { char: '¥', name: 'Yen Sign', category: 'Currency' },\n { char: '¢', name: 'Cent Sign', category: 'Currency' },\n { char: '₹', name: 'Indian Rupee Sign', category: 'Currency' },\n { char: '₽', name: 'Ruble Sign', category: 'Currency' },\n { char: '₩', name: 'Won Sign', category: 'Currency' },\n { char: '₺', name: 'Turkish Lira Sign', category: 'Currency' },\n { char: '₫', name: 'Dong Sign', category: 'Currency' },\n { char: '฿', name: 'Baht Sign', category: 'Currency' },\n { char: '₴', name: 'Hryvnia Sign', category: 'Currency' },\n { char: '₦', name: 'Naira Sign', category: 'Currency' },\n { char: '₲', name: 'Guarani Sign', category: 'Currency' },\n { char: '₱', name: 'Philippine Peso Sign', category: 'Currency' },\n { char: '₪', name: 'New Shekel Sign', category: 'Currency' },\n { char: '$', name: 'Fullwidth Dollar Sign', category: 'Currency' },\n { char: '¤', name: 'Currency Sign', category: 'Currency' },\n { char: '₡', name: 'Colon Sign', category: 'Currency' },\n\n // ── Mathematical ──────────────────────────────────────────────────────────\n { char: '±', name: 'Plus-Minus Sign', category: 'Mathematical' },\n { char: '×', name: 'Multiplication Sign', category: 'Mathematical' },\n { char: '÷', name: 'Division Sign', category: 'Mathematical' },\n { char: '≠', name: 'Not Equal To', category: 'Mathematical' },\n { char: '≈', name: 'Almost Equal To', category: 'Mathematical' },\n { char: '≤', name: 'Less-Than or Equal To', category: 'Mathematical' },\n { char: '≥', name: 'Greater-Than or Equal To', category: 'Mathematical' },\n { char: '∞', name: 'Infinity', category: 'Mathematical' },\n { char: '√', name: 'Square Root', category: 'Mathematical' },\n { char: '∑', name: 'N-Ary Summation', category: 'Mathematical' },\n { char: '∏', name: 'N-Ary Product', category: 'Mathematical' },\n { char: '∫', name: 'Integral', category: 'Mathematical' },\n { char: '∂', name: 'Partial Differential', category: 'Mathematical' },\n { char: '∆', name: 'Increment', category: 'Mathematical' },\n { char: '∇', name: 'Nabla', category: 'Mathematical' },\n { char: 'π', name: 'Greek Small Letter Pi', category: 'Mathematical' },\n { char: 'μ', name: 'Micro Sign', category: 'Mathematical' },\n { char: '°', name: 'Degree Sign', category: 'Mathematical' },\n { char: '∅', name: 'Empty Set', category: 'Mathematical' },\n { char: '∈', name: 'Element Of', category: 'Mathematical' },\n { char: '∉', name: 'Not an Element Of', category: 'Mathematical' },\n { char: '⊂', name: 'Subset Of', category: 'Mathematical' },\n { char: '⊃', name: 'Superset Of', category: 'Mathematical' },\n { char: '∩', name: 'Intersection', category: 'Mathematical' },\n { char: '∪', name: 'Union', category: 'Mathematical' },\n { char: '⊕', name: 'Circled Plus', category: 'Mathematical' },\n { char: '⊗', name: 'Circled Times', category: 'Mathematical' },\n { char: '‰', name: 'Per Mille Sign', category: 'Mathematical' },\n { char: '℃', name: 'Degree Celsius', category: 'Mathematical' },\n { char: '℉', name: 'Degree Fahrenheit', category: 'Mathematical' },\n\n // ── Text ──────────────────────────────────────────────────────────────────\n { char: '©', name: 'Copyright Sign', category: 'Text' },\n { char: '®', name: 'Registered Sign', category: 'Text' },\n { char: '™', name: 'Trade Mark Sign', category: 'Text' },\n { char: '§', name: 'Section Sign', category: 'Text' },\n { char: '¶', name: 'Pilcrow Sign', category: 'Text' },\n { char: '†', name: 'Dagger', category: 'Text' },\n { char: '‡', name: 'Double Dagger', category: 'Text' },\n { char: '•', name: 'Bullet', category: 'Text' },\n { char: '…', name: 'Horizontal Ellipsis', category: 'Text' },\n { char: '‣', name: 'Triangular Bullet', category: 'Text' },\n { char: '·', name: 'Middle Dot', category: 'Text' },\n { char: '¡', name: 'Inverted Exclamation Mark', category: 'Text' },\n { char: '¿', name: 'Inverted Question Mark', category: 'Text' },\n { char: 'ª', name: 'Feminine Ordinal Indicator', category: 'Text' },\n { char: 'º', name: 'Masculine Ordinal Indicator', category: 'Text' },\n { char: '№', name: 'Numero Sign', category: 'Text' },\n { char: '℗', name: 'Sound Recording Copyright', category: 'Text' },\n { char: '‼', name: 'Double Exclamation Mark', category: 'Text' },\n { char: '⁉', name: 'Exclamation Question Mark', category: 'Text' },\n\n // ── Arrows ────────────────────────────────────────────────────────────────\n { char: '←', name: 'Leftwards Arrow', category: 'Arrows' },\n { char: '→', name: 'Rightwards Arrow', category: 'Arrows' },\n { char: '↑', name: 'Upwards Arrow', category: 'Arrows' },\n { char: '↓', name: 'Downwards Arrow', category: 'Arrows' },\n { char: '↔', name: 'Left Right Arrow', category: 'Arrows' },\n { char: '↕', name: 'Up Down Arrow', category: 'Arrows' },\n { char: '↖', name: 'North West Arrow', category: 'Arrows' },\n { char: '↗', name: 'North East Arrow', category: 'Arrows' },\n { char: '↘', name: 'South East Arrow', category: 'Arrows' },\n { char: '↙', name: 'South West Arrow', category: 'Arrows' },\n { char: '⇐', name: 'Leftwards Double Arrow', category: 'Arrows' },\n { char: '⇒', name: 'Rightwards Double Arrow', category: 'Arrows' },\n { char: '⇑', name: 'Upwards Double Arrow', category: 'Arrows' },\n { char: '⇓', name: 'Downwards Double Arrow', category: 'Arrows' },\n { char: '⇔', name: 'Left Right Double Arrow', category: 'Arrows' },\n { char: '↺', name: 'Anticlockwise Open Circle Arrow', category: 'Arrows' },\n { char: '↻', name: 'Clockwise Open Circle Arrow', category: 'Arrows' },\n { char: '➔', name: 'Heavy Wide-Headed Rightwards Arrow', category: 'Arrows' },\n { char: '➡', name: 'Black Rightwards Arrow', category: 'Arrows' },\n { char: '⬅', name: 'Black Leftwards Arrow', category: 'Arrows' },\n { char: '⬆', name: 'Black Upwards Arrow', category: 'Arrows' },\n { char: '⬇', name: 'Black Downwards Arrow', category: 'Arrows' },\n { char: '↵', name: 'Downwards Arrow with Corner Leftwards', category: 'Arrows' },\n\n // ── Latin ─────────────────────────────────────────────────────────────────\n { char: 'À', name: 'Latin Capital Letter A with Grave', category: 'Latin' },\n { char: 'Á', name: 'Latin Capital Letter A with Acute', category: 'Latin' },\n { char: 'Â', name: 'Latin Capital Letter A with Circumflex', category: 'Latin' },\n { char: 'Ã', name: 'Latin Capital Letter A with Tilde', category: 'Latin' },\n { char: 'Ä', name: 'Latin Capital Letter A with Diaeresis', category: 'Latin' },\n { char: 'Å', name: 'Latin Capital Letter A with Ring Above', category: 'Latin' },\n { char: 'Æ', name: 'Latin Capital Letter AE', category: 'Latin' },\n { char: 'Ç', name: 'Latin Capital Letter C with Cedilla', category: 'Latin' },\n { char: 'È', name: 'Latin Capital Letter E with Grave', category: 'Latin' },\n { char: 'É', name: 'Latin Capital Letter E with Acute', category: 'Latin' },\n { char: 'Ê', name: 'Latin Capital Letter E with Circumflex', category: 'Latin' },\n { char: 'Ë', name: 'Latin Capital Letter E with Diaeresis', category: 'Latin' },\n { char: 'Ì', name: 'Latin Capital Letter I with Grave', category: 'Latin' },\n { char: 'Í', name: 'Latin Capital Letter I with Acute', category: 'Latin' },\n { char: 'Î', name: 'Latin Capital Letter I with Circumflex', category: 'Latin' },\n { char: 'Ï', name: 'Latin Capital Letter I with Diaeresis', category: 'Latin' },\n { char: 'Ñ', name: 'Latin Capital Letter N with Tilde', category: 'Latin' },\n { char: 'Ò', name: 'Latin Capital Letter O with Grave', category: 'Latin' },\n { char: 'Ó', name: 'Latin Capital Letter O with Acute', category: 'Latin' },\n { char: 'Ô', name: 'Latin Capital Letter O with Circumflex', category: 'Latin' },\n { char: 'Õ', name: 'Latin Capital Letter O with Tilde', category: 'Latin' },\n { char: 'Ö', name: 'Latin Capital Letter O with Diaeresis', category: 'Latin' },\n { char: 'Ø', name: 'Latin Capital Letter O with Stroke', category: 'Latin' },\n { char: 'Ù', name: 'Latin Capital Letter U with Grave', category: 'Latin' },\n { char: 'Ú', name: 'Latin Capital Letter U with Acute', category: 'Latin' },\n { char: 'Û', name: 'Latin Capital Letter U with Circumflex', category: 'Latin' },\n { char: 'Ü', name: 'Latin Capital Letter U with Diaeresis', category: 'Latin' },\n { char: 'Ý', name: 'Latin Capital Letter Y with Acute', category: 'Latin' },\n { char: 'Þ', name: 'Latin Capital Letter Thorn', category: 'Latin' },\n { char: 'ß', name: 'Latin Small Letter Sharp S', category: 'Latin' },\n { char: 'à', name: 'Latin Small Letter A with Grave', category: 'Latin' },\n { char: 'á', name: 'Latin Small Letter A with Acute', category: 'Latin' },\n { char: 'â', name: 'Latin Small Letter A with Circumflex', category: 'Latin' },\n { char: 'ã', name: 'Latin Small Letter A with Tilde', category: 'Latin' },\n { char: 'ä', name: 'Latin Small Letter A with Diaeresis', category: 'Latin' },\n { char: 'å', name: 'Latin Small Letter A with Ring Above', category: 'Latin' },\n { char: 'æ', name: 'Latin Small Letter AE', category: 'Latin' },\n { char: 'ç', name: 'Latin Small Letter C with Cedilla', category: 'Latin' },\n { char: 'è', name: 'Latin Small Letter E with Grave', category: 'Latin' },\n { char: 'é', name: 'Latin Small Letter E with Acute', category: 'Latin' },\n { char: 'ê', name: 'Latin Small Letter E with Circumflex', category: 'Latin' },\n { char: 'ë', name: 'Latin Small Letter E with Diaeresis', category: 'Latin' },\n { char: 'ì', name: 'Latin Small Letter I with Grave', category: 'Latin' },\n { char: 'í', name: 'Latin Small Letter I with Acute', category: 'Latin' },\n { char: 'î', name: 'Latin Small Letter I with Circumflex', category: 'Latin' },\n { char: 'ï', name: 'Latin Small Letter I with Diaeresis', category: 'Latin' },\n { char: 'ñ', name: 'Latin Small Letter N with Tilde', category: 'Latin' },\n { char: 'ò', name: 'Latin Small Letter O with Grave', category: 'Latin' },\n { char: 'ó', name: 'Latin Small Letter O with Acute', category: 'Latin' },\n { char: 'ô', name: 'Latin Small Letter O with Circumflex', category: 'Latin' },\n { char: 'õ', name: 'Latin Small Letter O with Tilde', category: 'Latin' },\n { char: 'ö', name: 'Latin Small Letter O with Diaeresis', category: 'Latin' },\n { char: 'ø', name: 'Latin Small Letter O with Stroke', category: 'Latin' },\n { char: 'ù', name: 'Latin Small Letter U with Grave', category: 'Latin' },\n { char: 'ú', name: 'Latin Small Letter U with Acute', category: 'Latin' },\n { char: 'û', name: 'Latin Small Letter U with Circumflex', category: 'Latin' },\n { char: 'ü', name: 'Latin Small Letter U with Diaeresis', category: 'Latin' },\n { char: 'ý', name: 'Latin Small Letter Y with Acute', category: 'Latin' },\n { char: 'þ', name: 'Latin Small Letter Thorn', category: 'Latin' },\n { char: 'ÿ', name: 'Latin Small Letter Y with Diaeresis', category: 'Latin' },\n { char: 'Œ', name: 'Latin Capital Ligature OE', category: 'Latin' },\n { char: 'œ', name: 'Latin Small Ligature OE', category: 'Latin' },\n\n // ── Quotations ────────────────────────────────────────────────────────────\n { char: '‘', name: 'Left Single Quotation Mark', category: 'Quotations' },\n { char: '’', name: 'Right Single Quotation Mark', category: 'Quotations' },\n { char: '“', name: 'Left Double Quotation Mark', category: 'Quotations' },\n { char: '”', name: 'Right Double Quotation Mark', category: 'Quotations' },\n { char: '‚', name: 'Single Low-9 Quotation Mark', category: 'Quotations' },\n { char: '„', name: 'Double Low-9 Quotation Mark', category: 'Quotations' },\n { char: '‹', name: 'Single Left-Pointing Angle Quotation Mark', category: 'Quotations' },\n { char: '›', name: 'Single Right-Pointing Angle Quotation Mark', category: 'Quotations' },\n { char: '«', name: 'Left-Pointing Double Angle Quotation Mark', category: 'Quotations' },\n { char: '»', name: 'Right-Pointing Double Angle Quotation Mark', category: 'Quotations' },\n { char: '〈', name: 'Left Angle Bracket', category: 'Quotations' },\n { char: '〉', name: 'Right Angle Bracket', category: 'Quotations' },\n\n // ── Symbols ───────────────────────────────────────────────────────────────\n { char: '♠', name: 'Black Spade Suit', category: 'Symbols' },\n { char: '♣', name: 'Black Club Suit', category: 'Symbols' },\n { char: '♥', name: 'Black Heart Suit', category: 'Symbols' },\n { char: '♦', name: 'Black Diamond Suit', category: 'Symbols' },\n { char: '★', name: 'Black Star', category: 'Symbols' },\n { char: '☆', name: 'White Star', category: 'Symbols' },\n { char: '☀', name: 'Black Sun with Rays', category: 'Symbols' },\n { char: '☁', name: 'Cloud', category: 'Symbols' },\n { char: '☂', name: 'Umbrella', category: 'Symbols' },\n { char: '☃', name: 'Snowman', category: 'Symbols' },\n { char: '☎', name: 'Black Telephone', category: 'Symbols' },\n { char: '☑', name: 'Ballot Box with Check', category: 'Symbols' },\n { char: '☒', name: 'Ballot Box with X', category: 'Symbols' },\n { char: '☓', name: 'Saltire', category: 'Symbols' },\n { char: '☕', name: 'Hot Beverage', category: 'Symbols' },\n { char: '♪', name: 'Eighth Note', category: 'Symbols' },\n { char: '♫', name: 'Beamed Eighth Notes', category: 'Symbols' },\n { char: '♯', name: 'Music Sharp Sign', category: 'Symbols' },\n { char: '♭', name: 'Music Flat Sign', category: 'Symbols' },\n { char: '⚡', name: 'High Voltage Sign', category: 'Symbols' },\n { char: '⚠', name: 'Warning Sign', category: 'Symbols' },\n { char: '✓', name: 'Check Mark', category: 'Symbols' },\n { char: '✗', name: 'Ballot X', category: 'Symbols' },\n { char: '✦', name: 'Black Four Pointed Star', category: 'Symbols' },\n { char: '❤', name: 'Heavy Black Heart', category: 'Symbols' },\n { char: '⚙', name: 'Gear', category: 'Symbols' },\n { char: '⚓', name: 'Anchor', category: 'Symbols' },\n { char: '⚔', name: 'Crossed Swords', category: 'Symbols' },\n { char: '⚖', name: 'Scales', category: 'Symbols' },\n { char: '♻', name: 'Black Universal Recycling Symbol', category: 'Symbols' },\n];\n\nexport const CATEGORIES = ['All', 'Currency', 'Mathematical', 'Text', 'Arrows', 'Latin', 'Quotations', 'Symbols'] as const;\nexport type Category = typeof CATEGORIES[number];\n","\"use client\";\n\nimport React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useMemo,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport type { EditorEngine } from \"../../editor/core/EditorEngine\";\nimport { insertText } from \"../../editor/commands\";\nimport {\n SPECIAL_CHARACTERS,\n CATEGORIES,\n type Category,\n} from \"../../data/specialCharacters\";\n\ninterface SpecialCharactersButtonProps {\n engine: EditorEngine;\n}\n\nexport function SpecialCharactersButton({\n engine,\n}: SpecialCharactersButtonProps) {\n const [open, setOpen] = useState(false);\n const [category, setCategory] = useState<Category>(\"All\");\n const [search, setSearch] = useState(\"\");\n const [hovered, setHovered] = useState<{ char: string; name: string } | null>(\n null,\n );\n const [focusedIdx, setFocusedIdx] = useState(-1);\n\n const buttonRef = useRef<HTMLButtonElement>(null);\n const popupRef = useRef<HTMLDivElement>(null);\n const searchRef = useRef<HTMLInputElement>(null);\n const gridRef = useRef<HTMLDivElement>(null);\n const [popupPos, setPopupPos] = useState<{ top: number; left: number }>({ top: 0, left: 0 });\n\n const filtered = useMemo(() => {\n const q = search.toLowerCase();\n return SPECIAL_CHARACTERS.filter(\n (c) =>\n (category === \"All\" || c.category === category) &&\n (!q || c.name.toLowerCase().includes(q) || c.char.includes(q)),\n );\n }, [category, search]);\n\n const openModal = () => {\n if (buttonRef.current) {\n const rect = buttonRef.current.getBoundingClientRect();\n const popupWidth = 340;\n const left = Math.min(rect.left, window.innerWidth - popupWidth - 8);\n setPopupPos({ top: rect.bottom + 4, left: Math.max(8, left) });\n }\n setOpen(true);\n setSearch(\"\");\n setFocusedIdx(-1);\n };\n\n const closeModal = useCallback(() => {\n setOpen(false);\n setHovered(null);\n setFocusedIdx(-1);\n }, []);\n\n // Close on outside click (check both button and portal popup)\n useEffect(() => {\n if (!open) return;\n const handler = (e: MouseEvent) => {\n const target = e.target as Node;\n const insidePopup = popupRef.current?.contains(target);\n const insideButton = buttonRef.current?.contains(target);\n if (!insidePopup && !insideButton) closeModal();\n };\n document.addEventListener(\"mousedown\", handler);\n return () => document.removeEventListener(\"mousedown\", handler);\n }, [open, closeModal]);\n\n // Focus search on open\n useEffect(() => {\n if (open) {\n setTimeout(() => searchRef.current?.focus(), 0);\n }\n }, [open]);\n\n const insertChar = useCallback(\n (char: string) => {\n insertText(char)(engine);\n closeModal();\n },\n [engine, closeModal],\n );\n\n // Keyboard nav in grid\n const handleGridKeyDown = (e: React.KeyboardEvent) => {\n const cols = 8;\n const len = filtered.length;\n if (len === 0) return;\n\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n setFocusedIdx((i) => Math.min(i + 1, len - 1));\n } else if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n setFocusedIdx((i) => Math.max(i - 1, 0));\n } else if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setFocusedIdx((i) => Math.min(i + cols, len - 1));\n } else if (e.key === \"ArrowUp\") {\n e.preventDefault();\n setFocusedIdx((i) => Math.max(i - cols, 0));\n } else if (e.key === \"Enter\" && focusedIdx >= 0) {\n e.preventDefault();\n insertChar(filtered[focusedIdx].char);\n } else if (e.key === \"Escape\") {\n closeModal();\n }\n };\n\n // Sync focused cell into view\n useEffect(() => {\n if (focusedIdx < 0 || !gridRef.current) return;\n const cell = gridRef.current.children[focusedIdx] as\n | HTMLElement\n | undefined;\n cell?.focus();\n }, [focusedIdx]);\n\n return (\n <>\n <button\n ref={buttonRef}\n type=\"button\"\n title=\"Special Characters\"\n aria-label=\"Insert special character\"\n aria-haspopup=\"dialog\"\n aria-expanded={open}\n onMouseDown={(e) => {\n e.preventDefault();\n if (open) { closeModal(); } else { openModal(); }\n }}\n className={[\n \"flex items-center justify-center w-8 h-8 rounded text-sm font-medium transition-colors\",\n open\n ? \"bg-blue-100 text-blue-700 \"\n : \"text-gray-700 hover:bg-gray-100 \",\n ].join(\" \")}\n >\n <OmegaIcon />\n </button>\n\n {open && createPortal(\n <div\n ref={popupRef}\n role=\"dialog\"\n aria-label=\"Special characters\"\n aria-modal=\"true\"\n className=\"bg-white border border-gray-200 rounded-lg shadow-2xl flex flex-col\"\n style={{ position: \"fixed\", top: popupPos.top, left: popupPos.left, width: 340, maxHeight: 420, zIndex: 9999 }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") closeModal();\n }}\n >\n {/* Header */}\n <div className=\"px-3 pt-3 pb-2 border-b border-gray-100 \">\n <div className=\"flex items-center justify-between mb-2\">\n <span className=\"text-xs font-semibold text-gray-500 uppercase tracking-wide\">\n Special Characters\n </span>\n <button\n type=\"button\"\n onClick={closeModal}\n aria-label=\"Close\"\n className=\"text-gray-400 hover:text-gray-600 p-0.5 rounded\"\n >\n <CloseIcon />\n </button>\n </div>\n\n {/* Search */}\n <input\n ref={searchRef}\n type=\"search\"\n placeholder=\"Search characters…\"\n value={search}\n onChange={(e) => {\n setSearch(e.target.value);\n setFocusedIdx(-1);\n }}\n onKeyDown={(e) => {\n if (e.key === \"Escape\") closeModal();\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n setFocusedIdx(0);\n gridRef.current?.children[0]?.dispatchEvent(\n new Event(\"focus\"),\n );\n }\n }}\n className=\"w-full border border-gray-200 rounded px-2.5 py-1.5 text-sm bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500\"\n />\n\n {/* Category tabs */}\n <div className=\"flex flex-wrap gap-1 mt-2\">\n {CATEGORIES.map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onMouseDown={(e) => {\n e.preventDefault();\n setCategory(cat);\n setFocusedIdx(-1);\n }}\n className={[\n \"px-2 py-0.5 rounded text-xs font-medium transition-colors\",\n category === cat\n ? \"bg-blue-600 text-white\"\n : \"bg-gray-100 text-gray-600 hover:bg-gray-200 \",\n ].join(\" \")}\n >\n {cat}\n </button>\n ))}\n </div>\n </div>\n\n {/* Character grid */}\n <div\n ref={gridRef}\n role=\"grid\"\n aria-label=\"Character grid\"\n className=\"flex-1 overflow-y-auto p-2\"\n style={{\n display: \"grid\",\n gridTemplateColumns: \"repeat(8, 1fr)\",\n gap: 2,\n }}\n onKeyDown={handleGridKeyDown}\n >\n {filtered.length === 0 ? (\n <div\n className=\"col-span-8 text-center py-8 text-sm text-gray-400 \"\n role=\"status\"\n >\n No characters found\n </div>\n ) : (\n filtered.map((c, idx) => (\n <button\n key={c.char + c.name}\n type=\"button\"\n role=\"gridcell\"\n tabIndex={focusedIdx === idx ? 0 : -1}\n aria-label={c.name}\n title={c.name}\n onMouseDown={(e) => {\n e.preventDefault();\n insertChar(c.char);\n }}\n onMouseEnter={() =>\n setHovered({ char: c.char, name: c.name })\n }\n onMouseLeave={() => setHovered(null)}\n onFocus={() => setHovered({ char: c.char, name: c.name })}\n onBlur={() => setHovered(null)}\n className={[\n \"flex items-center justify-center rounded text-base h-8 w-full transition-colors cursor-pointer select-none\",\n focusedIdx === idx\n ? \"bg-blue-100 text-blue-700 ring-2 ring-blue-500\"\n : \"text-gray-800 hover:bg-blue-50 hover:text-blue-700 \",\n ].join(\" \")}\n >\n {c.char}\n </button>\n ))\n )}\n </div>\n\n {/* Footer preview */}\n <div className=\"px-3 py-2 border-t border-gray-100 flex items-center gap-3 min-h-[40px]\">\n {hovered ? (\n <>\n <span className=\"text-2xl leading-none text-gray-800 w-8 text-center\">\n {hovered.char}\n </span>\n <span className=\"text-xs text-gray-500 truncate\">\n {hovered.name}\n </span>\n </>\n ) : (\n <span className=\"text-xs text-gray-400 \">\n Hover or use arrow keys to preview\n </span>\n )}\n </div>\n </div>,\n document.body,\n )}\n </>\n );\n}\n\nfunction OmegaIcon() {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 32 32\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path d=\"M16.164 4.561c-6.459 0-11.721 5.618-11.721 12.576 0 2.663 0.766 5.168 2.076 7.204-1.525-0.826-3.023-1.826-4.518-3.052v5.935h10.907c-2.995-2.075-5.087-5.131-5.087-8.621 0-4.653 3.736-8.425 8.343-8.425s8.343 3.772 8.343 8.425c0 3.49-2.092 6.546-5.087 8.621h10.907v-5.935c-1.499 1.24-3.014 2.259-4.558 3.093 1.329-2.045 2.116-4.561 2.116-7.244 0-6.958-5.262-12.576-11.721-12.576h-0z\" />\n </svg>\n );\n}\n\nfunction CloseIcon() {\n return (\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n","'use client';\r\n\r\nimport React, { useState, useRef, useEffect, useCallback } from 'react';\r\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\r\nimport type { BlockNode } from '../../types';\r\nimport { useEditorState } from '../../hooks/useEditorState';\r\nimport { getActiveBlockType } from '../../editor/selection/SelectionEngine';\r\nimport { findContentBlockPath, getNodeAtPath } from '../../editor/core/DocumentModel';\r\nimport { setCodeBlock, setCodeBlockLanguage } from '../../editor/commands';\r\n\r\nconst LANGUAGES: { value: string; label: string }[] = [\r\n { value: 'plaintext', label: 'Plain text' },\r\n { value: 'c', label: 'C' },\r\n { value: 'cs', label: 'C#' },\r\n { value: 'cpp', label: 'C++' },\r\n { value: 'css', label: 'CSS' },\r\n { value: 'diff', label: 'Diff' },\r\n { value: 'go', label: 'Go' },\r\n { value: 'html', label: 'HTML' },\r\n { value: 'java', label: 'Java' },\r\n { value: 'javascript', label: 'JavaScript' },\r\n { value: 'json', label: 'JSON' },\r\n { value: 'php', label: 'PHP' },\r\n { value: 'python', label: 'Python' },\r\n { value: 'sql', label: 'SQL' },\r\n { value: 'typescript', label: 'TypeScript' },\r\n { value: 'xml', label: 'XML' },\r\n];\r\n\r\ninterface CodeBlockButtonProps {\r\n engine: EditorEngine;\r\n}\r\n\r\nexport function CodeBlockButton({ engine }: CodeBlockButtonProps) {\r\n const state = useEditorState(engine);\r\n const activeBlock = getActiveBlockType(state.doc, state.selection);\r\n const isActive = activeBlock === 'code_block';\r\n\r\n const [open, setOpen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const currentLang = (() => {\r\n if (!isActive || !state.selection) return 'plaintext';\r\n const bp = findContentBlockPath(state.doc, state.selection.anchor.path);\r\n if (!bp) return 'plaintext';\r\n const block = getNodeAtPath(state.doc, bp) as BlockNode | null;\r\n return (block?.attrs?.language as string) || 'plaintext';\r\n })();\r\n\r\n const closeDropdown = useCallback(() => setOpen(false), []);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\r\n closeDropdown();\r\n }\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open, closeDropdown]);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: KeyboardEvent) => { if (e.key === 'Escape') closeDropdown(); };\r\n document.addEventListener('keydown', handler);\r\n return () => document.removeEventListener('keydown', handler);\r\n }, [open, closeDropdown]);\r\n\r\n const handleToggle = () => {\r\n setCodeBlock(engine);\r\n setOpen(false);\r\n };\r\n\r\n const handleSelectLanguage = (lang: string) => {\r\n if (!isActive) {\r\n setCodeBlock(engine);\r\n // Language set after block creation via timeout so state updates first.\r\n setTimeout(() => setCodeBlockLanguage(lang)(engine), 0);\r\n } else {\r\n setCodeBlockLanguage(lang)(engine);\r\n }\r\n setOpen(false);\r\n };\r\n\r\n const activeLang = LANGUAGES.find((l) => l.value === currentLang);\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative flex items-center\">\r\n {/* Main toggle button */}\r\n <button\r\n type=\"button\"\r\n title=\"Code Block (Ctrl+Shift+C)\"\r\n onMouseDown={(e) => { e.preventDefault(); handleToggle(); }}\r\n className={[\r\n 'flex items-center justify-center w-8 h-8 rounded-l text-sm transition-colors',\r\n isActive\r\n ? 'bg-blue-100 text-blue-700 '\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <CodeBlockIcon />\r\n </button>\r\n\r\n {/* Chevron / language selector */}\r\n <button\r\n type=\"button\"\r\n title={isActive ? `Language: ${activeLang?.label ?? 'Plain text'}` : 'Select language'}\r\n aria-haspopup=\"listbox\"\r\n aria-expanded={open}\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n setOpen((p) => !p);\r\n }}\r\n className={[\r\n 'flex items-center justify-center w-4 h-8 rounded-r border-l border-gray-200 transition-colors',\r\n open\r\n ? 'bg-gray-100 text-gray-700 '\r\n : 'text-gray-400 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n <ChevronIcon />\r\n </button>\r\n\r\n {/* Language dropdown */}\r\n {open && (\r\n <div\r\n role=\"listbox\"\r\n aria-label=\"Code block language\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-xl py-1 w-44 max-h-72 overflow-y-auto\"\r\n >\r\n <p className=\"px-3 py-1.5 text-[10px] font-semibold uppercase tracking-widest text-gray-400 \">\r\n Language\r\n </p>\r\n {LANGUAGES.map((lang) => {\r\n const isSelected = isActive && currentLang === lang.value;\r\n return (\r\n <button\r\n key={lang.value}\r\n type=\"button\"\r\n role=\"option\"\r\n aria-selected={isSelected}\r\n onMouseDown={(e) => { e.preventDefault(); handleSelectLanguage(lang.value); }}\r\n className={[\r\n 'w-full text-left px-3 py-1.5 text-sm flex items-center gap-2 transition-colors',\r\n isSelected\r\n ? 'bg-blue-50 text-blue-700 font-medium'\r\n : 'text-gray-700 hover:bg-gray-100 ',\r\n ].join(' ')}\r\n >\r\n {isSelected && (\r\n <svg className=\"w-3 h-3 shrink-0\" viewBox=\"0 0 12 12\" fill=\"currentColor\">\r\n <polyline points=\"1 6 4.5 9.5 11 2.5\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.8\" strokeLinecap=\"round\" strokeLinejoin=\"round\" />\r\n </svg>\r\n )}\r\n <span className={isSelected ? '' : 'ml-5'}>{lang.label}</span>\r\n </button>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\nfunction CodeBlockIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <rect x=\"2\" y=\"4\" width=\"20\" height=\"16\" rx=\"2\" />\r\n <path d=\"M9 9l-3 3 3 3\" />\r\n <path d=\"M15 9l3 3-3 3\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction ChevronIcon() {\r\n return (\r\n <svg className=\"w-2.5 h-2.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\r\n <polyline points=\"6 9 12 15 18 9\" />\r\n </svg>\r\n );\r\n}\r\n","'use client';\n\nimport React from 'react';\n\ninterface SourceEditingButtonProps {\n isActive: boolean;\n onToggle: () => void;\n}\n\nexport function SourceEditingButton({ isActive, onToggle }: SourceEditingButtonProps) {\n return (\n <button\n type=\"button\"\n title=\"Source editing (HTML)\"\n aria-pressed={isActive}\n onMouseDown={(e) => { e.preventDefault(); onToggle(); }}\n className={[\n 'flex items-center justify-center w-8 h-8 rounded text-sm font-mono font-bold transition-colors',\n isActive\n ? 'bg-blue-100 text-blue-700 '\n : 'text-gray-700 hover:bg-gray-100 ',\n ].join(' ')}\n >\n <SourceIcon />\n </button>\n );\n}\n\nfunction SourceIcon() {\n return (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" strokeWidth={1.5} strokeOpacity={0.5} />\n </svg>\n );\n}\n","/**\n * HistoryManager\n *\n * Implements undo/redo by storing past EditorState snapshots.\n *\n * Architecture choice: State-snapshot model vs. Inverse-step model\n *\n * Inverse-step (ProseMirror): store the inverse of each transaction.\n * Undo = apply the inverse transaction. Efficient for large docs.\n *\n * State-snapshot (simpler): store the full EditorState at each history\n * point. Undo = restore the previous snapshot. Works great for small-to-\n * medium docs and is much easier to implement correctly.\n *\n * We use state-snapshot here. For a collaborative or very large-doc editor\n * you'd upgrade to inverse steps + rebasing.\n *\n * The HistoryManager is implemented as an EditorPlugin so it integrates\n * seamlessly with the plugin architecture.\n */\n\nimport type {\n EditorPlugin,\n EditorEngineInterface,\n EditorState,\n Transaction,\n} from '../../types';\nimport { createTransaction } from '../core/Transaction';\nimport { tr_replaceDoc, tr_setSelection } from '../core/Transaction';\n\nconst HISTORY_PLUGIN_NAME = 'history';\nconst MAX_HISTORY = 100; // max undo steps to keep\n\ninterface HistoryEntry {\n state: EditorState;\n label: string; // human-readable description for debugging\n}\n\ninterface HistoryManagerState {\n undoStack: HistoryEntry[];\n redoStack: HistoryEntry[];\n}\n\nconst managerMap = new WeakMap<EditorEngineInterface, HistoryManagerState>();\n\nfunction getManagerState(engine: EditorEngineInterface): HistoryManagerState {\n if (!managerMap.has(engine)) {\n managerMap.set(engine, { undoStack: [], redoStack: [] });\n }\n return managerMap.get(engine)!;\n}\n\nexport function createHistoryPlugin(): EditorPlugin {\n return {\n name: HISTORY_PLUGIN_NAME,\n\n init(engine: EditorEngineInterface) {\n // Seed the undo stack with the initial state so the first undo\n // can restore back to an empty document.\n const { undoStack } = getManagerState(engine);\n undoStack.push({ state: engine.getState(), label: 'initial' });\n },\n\n onTransaction(tr: Transaction, state: EditorState): Transaction {\n // Skip history-internal transactions to avoid infinite loops\n if (tr.meta.historyInternal) return tr;\n\n // Skip transactions that only update selection (no doc changes)\n const hasDocChange = tr.steps.some((s) => s.type !== 'set_selection');\n if (!hasDocChange) return tr;\n\n return tr;\n },\n\n onStateChange(state: EditorState, prevState: EditorState) {\n // This is called by the engine AFTER the transaction is applied.\n // We capture the PREVIOUS state as an undo point.\n // We skip if the doc didn't change (selection-only update).\n if (state.doc === prevState.doc) return;\n\n const engine = findEngine(this);\n if (!engine) return;\n\n const ms = getManagerState(engine);\n\n // Push the PREVIOUS state so we can undo back to it\n ms.undoStack.push({ state: prevState, label: 'change' });\n if (ms.undoStack.length > MAX_HISTORY) {\n ms.undoStack.shift(); // drop oldest\n }\n\n // Any new change clears the redo stack (standard undo semantics)\n ms.redoStack = [];\n },\n\n keyBindings: {\n 'Ctrl+z': (engine) => undo(engine),\n 'Ctrl+Z': (engine) => undo(engine),\n 'Ctrl+Shift+z': (engine) => redo(engine),\n 'Ctrl+Shift+Z': (engine) => redo(engine),\n 'Ctrl+y': (engine) => redo(engine),\n },\n };\n\n // Workaround: plugins don't naturally have a back-reference to the engine.\n // We store it via init and look it up via the WeakMap.\n function findEngine(_plugin: EditorPlugin): EditorEngineInterface | null {\n // The engine is captured via closure from the plugin registration.\n // We use the WeakMap keyed by engine, but we need to know which engine.\n // Solution: the plugin's init captures the engine reference.\n return null; // overridden below\n }\n}\n\n// ─── Stateful Plugin Factory (captures engine ref) ───────────────────────────\n\n/**\n * Create a history plugin with engine reference captured in closure.\n * Call this factory instead of createHistoryPlugin() directly.\n */\nexport function createHistoryManager(): EditorPlugin {\n let engineRef: EditorEngineInterface | null = null;\n const undoStack: HistoryEntry[] = [];\n const redoStack: HistoryEntry[] = [];\n let isDoingHistoryAction = false;\n\n return {\n name: HISTORY_PLUGIN_NAME,\n\n init(engine: EditorEngineInterface) {\n engineRef = engine;\n // Capture initial state\n undoStack.push({ state: engine.getState(), label: 'initial' });\n },\n\n onStateChange(newState: EditorState, prevState: EditorState) {\n // Skip recording during undo/redo — otherwise onStateChange would\n // push the pre-undo state back onto the stack and clear the redo stack.\n if (isDoingHistoryAction) return;\n if (newState.doc === prevState.doc) return;\n\n undoStack.push({ state: prevState, label: 'change' });\n if (undoStack.length > MAX_HISTORY) undoStack.shift();\n redoStack.length = 0;\n },\n\n keyBindings: {\n 'Ctrl+z': (_engine) => performUndo(),\n 'Ctrl+Z': (_engine) => performUndo(),\n 'Ctrl+Shift+z': (_engine) => performRedo(),\n 'Ctrl+Shift+Z': (_engine) => performRedo(),\n 'Ctrl+y': (_engine) => performRedo(),\n },\n };\n\n function performUndo(): boolean {\n if (!engineRef || undoStack.length <= 1) return false;\n\n const current = engineRef.getState();\n redoStack.push({ state: current, label: 'redo-point' });\n\n const prev = undoStack.pop()!;\n\n isDoingHistoryAction = true;\n try {\n const tr = createTransaction({ historyInternal: true });\n tr.steps.push(tr_replaceDoc(prev.state.doc));\n tr.steps.push(tr_setSelection(prev.state.selection));\n engineRef.dispatch(tr);\n } finally {\n isDoingHistoryAction = false;\n }\n return true;\n }\n\n function performRedo(): boolean {\n if (!engineRef || redoStack.length === 0) return false;\n\n const current = engineRef.getState();\n undoStack.push({ state: current, label: 'undo-point' });\n\n const next = redoStack.pop()!;\n\n isDoingHistoryAction = true;\n try {\n const tr = createTransaction({ historyInternal: true });\n tr.steps.push(tr_replaceDoc(next.state.doc));\n tr.steps.push(tr_setSelection(next.state.selection));\n engineRef.dispatch(tr);\n } finally {\n isDoingHistoryAction = false;\n }\n return true;\n }\n}\n\n// ─── Public API ───────────────────────────────────────────────────────────────\n\nexport function undo(engine: EditorEngineInterface): boolean {\n const plugin = engine.getPlugin\n ? (engine as import('../core/EditorEngine').EditorEngine).getPlugin(HISTORY_PLUGIN_NAME)\n : undefined;\n if (!plugin) return false;\n // Trigger via key binding\n if (plugin.keyBindings?.['Ctrl+z']) {\n return plugin.keyBindings['Ctrl+z'](engine);\n }\n return false;\n}\n\nexport function redo(engine: EditorEngineInterface): boolean {\n const plugin = engine.getPlugin\n ? (engine as import('../core/EditorEngine').EditorEngine).getPlugin(HISTORY_PLUGIN_NAME)\n : undefined;\n if (!plugin) return false;\n if (plugin.keyBindings?.['Ctrl+y']) {\n return plugin.keyBindings['Ctrl+y'](engine);\n }\n return false;\n}\n","import type { EditorToolbarItem } from \"../../types/public\";\n\nexport const DEFAULT_TOOLBAR: EditorToolbarItem[] = [\n \"heading\",\n \"|\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"strikethrough\",\n \"code\",\n \"link\",\n \"background-color\",\n \"text-color\",\n \"|\",\n \"font-family\",\n \"font-size\",\n \"|\",\n \"align\",\n \"|\",\n \"bullet-list\",\n \"ordered-list\",\n \"check-list\",\n \"|\",\n \"blockquote\",\n \"code-block\",\n \"horizontal-rule\",\n \"table\",\n \"|\",\n \"image\",\n \"special-chars\",\n \"find-replace\",\n \"|\",\n \"undo\",\n \"redo\",\n \"|\",\n \"source\",\n];\n\nexport const MINIMAL_TOOLBAR: EditorToolbarItem[] = [\n \"bold\",\n \"italic\",\n \"underline\",\n \"|\",\n \"bullet-list\",\n \"ordered-list\",\n \"|\",\n \"link\",\n];\n\nexport const BASIC_TOOLBAR: EditorToolbarItem[] = [\n \"undo\",\n \"redo\",\n \"|\",\n \"bold\",\n \"italic\",\n \"underline\",\n \"strikethrough\",\n \"|\",\n \"bullet-list\",\n \"ordered-list\",\n \"|\",\n \"link\",\n \"image\",\n];\n","\"use client\";\r\n\r\nimport React, { useState, useRef, useEffect } from \"react\";\r\nimport { ToolbarButton } from \"./ToolbarButton\";\r\nimport type { EditorEngine } from \"../../editor/core/EditorEngine\";\r\nimport { useEditorState } from \"../../hooks/useEditorState\";\r\nimport {\r\n toggleBold,\r\n toggleItalic,\r\n toggleUnderline,\r\n toggleStrikethrough,\r\n toggleCode,\r\n toggleBulletList,\r\n toggleOrderedList,\r\n setHeading,\r\n setParagraph,\r\n setBlockquote,\r\n insertLink,\r\n removeLink,\r\n} from \"../../editor/commands\";\r\nimport {\r\n getActiveMarks,\r\n getActiveBlockType,\r\n getActiveLinkHref,\r\n getActiveAlignment,\r\n getActiveFontSize,\r\n getActiveFontFamily,\r\n getActiveHighlightColor,\r\n getActiveTextColor,\r\n} from \"../../editor/selection/SelectionEngine\";\r\nimport { getDocumentMarkAttrValues } from \"../../editor/core/DocumentModel\";\r\nimport { AlignmentDropdown } from \"./AlignmentDropdown\";\r\nimport { FontSizeDropdown } from \"./FontSizeDropdown\";\r\nimport { FontFamilyDropdown } from \"./FontFamilyDropdown\";\r\nimport { BackgroundColorDropdown } from \"./BackgroundColorDropdown\";\r\nimport { TextColorDropdown } from \"./TextColorDropdown\";\r\nimport { HorizontalRuleButton } from \"./HorizontalRuleButton\";\r\nimport { ChecklistButton } from \"./ChecklistButton\";\r\nimport { TableButton } from \"./TableButton\";\r\nimport { ImageUploadButton } from \"./ImageUploadButton\";\r\nimport { SpecialCharactersButton } from \"./SpecialCharactersButton\";\r\nimport { CodeBlockButton } from \"./CodeBlockButton\";\r\nimport { SourceEditingButton } from \"./SourceEditingButton\";\r\nimport { undo, redo } from \"../../editor/history/HistoryManager\";\r\nimport type { EditorToolbarConfig } from \"../../types/public\";\r\nimport { DEFAULT_TOOLBAR } from \"./toolbarConfig\";\r\n\r\ninterface ToolbarProps {\r\n engine: EditorEngine;\r\n onFindReplace?: (mode: \"find\" | \"replace\") => void;\r\n /** When true, the link popup opens immediately (driven by Ctrl+K from Editor) */\r\n linkPopupOpen?: boolean;\r\n onLinkPopupClose?: () => void;\r\n isSourceMode?: boolean;\r\n onToggleSource?: () => void;\r\n toolbarConfig?: EditorToolbarConfig;\r\n}\r\n\r\nexport function Toolbar({\r\n engine,\r\n onFindReplace,\r\n linkPopupOpen,\r\n onLinkPopupClose,\r\n isSourceMode = false,\r\n onToggleSource,\r\n toolbarConfig,\r\n}: ToolbarProps) {\r\n const state = useEditorState(engine);\r\n const { doc, selection, marks } = state;\r\n\r\n const activeMarks =\r\n selection && !selection.isCollapsed\r\n ? getActiveMarks(doc, selection)\r\n : new Set(marks.map((m) => m.type));\r\n const activeBlock = getActiveBlockType(doc, selection);\r\n const activeLinkHref = getActiveLinkHref(doc, selection, marks);\r\n const activeAlignment = getActiveAlignment(doc, selection);\r\n const activeFontSize = getActiveFontSize(doc, selection, marks);\r\n const activeFontFamily = getActiveFontFamily(doc, selection, marks);\r\n const activeHighlightColor = getActiveHighlightColor(doc, selection, marks);\r\n const activeTextColor = getActiveTextColor(doc, selection, marks);\r\n const documentTextColors = getDocumentMarkAttrValues(doc, \"text_color\", \"color\");\r\n const documentHighlightColors = getDocumentMarkAttrValues(doc, \"highlight\", \"color\");\r\n\r\n const run = (command: (e: typeof engine) => boolean) => command(engine);\r\n\r\n // Normalize config to flat array\r\n const flatConfig: string[] = toolbarConfig\r\n ? Array.isArray(toolbarConfig[0])\r\n ? (toolbarConfig as string[][]).flat()\r\n : (toolbarConfig as string[])\r\n : DEFAULT_TOOLBAR;\r\n\r\n // source item is always-enabled — render outside the dimmed wrapper\r\n const hasSource = flatConfig.includes('source');\r\n // Strip trailing separators before source so hasSource block's own Divider is the only one\r\n let mainItems = flatConfig.filter((id) => id !== 'source');\r\n if (hasSource) {\r\n while (mainItems.length > 0 && mainItems[mainItems.length - 1] === '|') {\r\n mainItems = mainItems.slice(0, -1);\r\n }\r\n }\r\n\r\n const renderItem = (id: string, idx: number): React.ReactNode => {\r\n if (id === '|') return <Divider key={`sep-${idx}`} />;\r\n switch (id) {\r\n case 'heading':\r\n return <HeadingDropdown key=\"heading\" engine={engine} activeBlock={activeBlock} />;\r\n case 'bold':\r\n return <ToolbarButton key=\"bold\" label=\"B\" title=\"Bold (Ctrl+B)\" onClick={() => run(toggleBold)} isActive={activeMarks.has(\"bold\")} icon={<span className=\"font-bold text-sm\">B</span>} />;\r\n case 'italic':\r\n return <ToolbarButton key=\"italic\" label=\"I\" title=\"Italic (Ctrl+I)\" onClick={() => run(toggleItalic)} isActive={activeMarks.has(\"italic\")} icon={<span className=\"italic text-sm\">I</span>} />;\r\n case 'underline':\r\n return <ToolbarButton key=\"underline\" label=\"U\" title=\"Underline (Ctrl+U)\" onClick={() => run(toggleUnderline)} isActive={activeMarks.has(\"underline\")} icon={<span className=\"underline text-sm\">U</span>} />;\r\n case 'strikethrough':\r\n return <ToolbarButton key=\"strikethrough\" label=\"S\" title=\"Strikethrough\" onClick={() => run(toggleStrikethrough)} isActive={activeMarks.has(\"strikethrough\")} icon={<span className=\"line-through text-sm\">S</span>} />;\r\n case 'code':\r\n return <ToolbarButton key=\"code\" label=\"`\" title=\"Inline Code\" onClick={() => run(toggleCode)} isActive={activeMarks.has(\"code\")} icon={<CodeIcon />} />;\r\n case 'link':\r\n return (\r\n <LinkButton\r\n key=\"link\"\r\n engine={engine}\r\n isActive={activeMarks.has(\"link\")}\r\n activeHref={activeLinkHref}\r\n hasTextSelected={!!(selection && !selection.isCollapsed)}\r\n externalOpen={linkPopupOpen}\r\n onExternalClose={onLinkPopupClose}\r\n />\r\n );\r\n case 'highlight':\r\n case 'background-color':\r\n return <BackgroundColorDropdown key=\"background-color\" engine={engine} activeColor={activeHighlightColor} documentColors={documentHighlightColors} />;\r\n case 'text-color':\r\n return <TextColorDropdown key=\"text-color\" engine={engine} activeColor={activeTextColor} documentColors={documentTextColors} />;\r\n case 'font-family':\r\n return <FontFamilyDropdown key=\"font-family\" engine={engine} activeFontFamily={activeFontFamily} />;\r\n case 'font-size':\r\n return <FontSizeDropdown key=\"font-size\" engine={engine} activeFontSize={activeFontSize} />;\r\n case 'align':\r\n return <AlignmentDropdown key=\"align\" engine={engine} activeAlignment={activeAlignment} />;\r\n case 'bullet-list':\r\n return <ToolbarButton key=\"bullet-list\" label=\"UL\" title=\"Bullet List\" onClick={() => run(toggleBulletList)} isActive={activeBlock === \"bullet_list\"} icon={<BulletListIcon />} />;\r\n case 'ordered-list':\r\n return <ToolbarButton key=\"ordered-list\" label=\"OL\" title=\"Ordered List\" onClick={() => run(toggleOrderedList)} isActive={activeBlock === \"ordered_list\"} icon={<OrderedListIcon />} />;\r\n case 'check-list':\r\n return <ChecklistButton key=\"check-list\" engine={engine} />;\r\n case 'blockquote':\r\n return <ToolbarButton key=\"blockquote\" label=\"❝\" title=\"Blockquote\" onClick={() => run(setBlockquote)} isActive={activeBlock === \"blockquote\"} icon={<BlockquoteIcon />} />;\r\n case 'code-block':\r\n return <CodeBlockButton key=\"code-block\" engine={engine} />;\r\n case 'horizontal-rule':\r\n return <HorizontalRuleButton key=\"horizontal-rule\" engine={engine} />;\r\n case 'table':\r\n return <TableButton key=\"table\" engine={engine} />;\r\n case 'image':\r\n return <ImageUploadButton key=\"image\" engine={engine} />;\r\n case 'special-chars':\r\n return <SpecialCharactersButton key=\"special-chars\" engine={engine} />;\r\n case 'find-replace':\r\n return onFindReplace\r\n ? <ToolbarButton key=\"find-replace\" label=\"Find\" title=\"Find and Replace (Ctrl+F)\" onClick={() => onFindReplace(\"find\")} icon={<FindReplaceIcon />} />\r\n : null;\r\n case 'undo':\r\n return <ToolbarButton key=\"undo\" label=\"↩\" title=\"Undo (Ctrl+Z)\" onClick={() => undo(engine)} icon={<UndoIcon />} />;\r\n case 'redo':\r\n return <ToolbarButton key=\"redo\" label=\"↪\" title=\"Redo (Ctrl+Y)\" onClick={() => redo(engine)} icon={<RedoIcon />} />;\r\n default:\r\n return null;\r\n }\r\n };\r\n\r\n return (\r\n <div\r\n role=\"toolbar\"\r\n aria-label=\"Editor formatting toolbar\"\r\n className=\"flex flex-wrap items-center gap-px px-1.5 py-1 bg-white border-b border-gray-200 select-none\"\r\n >\r\n <div className={`flex flex-wrap items-center gap-px ${isSourceMode ? 'pointer-events-none grayscale opacity-60' : ''}`}>\r\n {mainItems.map((id, idx) => renderItem(id, idx))}\r\n </div>\r\n\r\n {hasSource && onToggleSource && (\r\n <>\r\n <Divider />\r\n <SourceEditingButton isActive={isSourceMode} onToggle={onToggleSource} />\r\n </>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Heading Dropdown ─────────────────────────────────────────────────────────\r\n\r\nfunction HeadingDropdown({\r\n engine,\r\n activeBlock,\r\n}: {\r\n engine: EditorEngine;\r\n activeBlock: string;\r\n}) {\r\n const [open, setOpen] = useState(false);\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const run = (command: (e: typeof engine) => boolean) => command(engine);\r\n\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (containerRef.current && !containerRef.current.contains(e.target as Node))\r\n setOpen(false);\r\n };\r\n document.addEventListener('mousedown', handler);\r\n return () => document.removeEventListener('mousedown', handler);\r\n }, [open]);\r\n\r\n const BLOCK_LABELS: Record<string, string> = {\r\n paragraph: \"Paragraph\",\r\n \"heading-1\": \"Heading 1\",\r\n \"heading-2\": \"Heading 2\",\r\n \"heading-3\": \"Heading 3\",\r\n \"heading-4\": \"Heading 4\",\r\n \"heading-5\": \"Heading 5\",\r\n \"heading-6\": \"Heading 6\",\r\n blockquote: \"Quote\",\r\n code_block: \"Code\",\r\n };\r\n const label = BLOCK_LABELS[activeBlock] ?? \"Paragraph\";\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => { e.preventDefault(); setOpen((v) => !v); }}\r\n className=\"flex items-center gap-1 px-2 h-8 rounded text-sm font-medium text-gray-700 hover:bg-gray-100 cursor-pointer\"\r\n >\r\n <span className=\"min-w-[72px] text-left\">{label}</span>\r\n <span className=\"text-xs\">▾</span>\r\n </button>\r\n\r\n {open && <div className=\"absolute top-full left-0 mt-0.5 w-40 bg-white border border-gray-200 rounded shadow-lg z-50\">\r\n {[\r\n {\r\n label: \"Paragraph\",\r\n cmd: setParagraph,\r\n active: activeBlock === \"paragraph\",\r\n },\r\n {\r\n label: \"Heading 1\",\r\n cmd: setHeading(1),\r\n active: activeBlock === \"heading-1\",\r\n },\r\n {\r\n label: \"Heading 2\",\r\n cmd: setHeading(2),\r\n active: activeBlock === \"heading-2\",\r\n },\r\n {\r\n label: \"Heading 3\",\r\n cmd: setHeading(3),\r\n active: activeBlock === \"heading-3\",\r\n },\r\n {\r\n label: \"Heading 4\",\r\n cmd: setHeading(4),\r\n active: activeBlock === \"heading-4\",\r\n },\r\n {\r\n label: \"Heading 5\",\r\n cmd: setHeading(5),\r\n active: activeBlock === \"heading-5\",\r\n },\r\n {\r\n label: \"Heading 6\",\r\n cmd: setHeading(6),\r\n active: activeBlock === \"heading-6\",\r\n },\r\n ].map(({ label, cmd, active }) => (\r\n <button\r\n key={label}\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n run(cmd);\r\n setOpen(false);\r\n }}\r\n className={[\r\n \"w-full text-left px-3 py-1.5 text-sm hover:bg-gray-100 \",\r\n active\r\n ? \"font-semibold text-blue-600 \"\r\n : \"text-gray-700 \",\r\n ].join(\" \")}\r\n >\r\n {label}\r\n </button>\r\n ))}\r\n </div>}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Link Button ──────────────────────────────────────────────────────────────\r\n\r\nfunction LinkButton({\r\n engine,\r\n isActive,\r\n activeHref,\r\n hasTextSelected,\r\n externalOpen,\r\n onExternalClose,\r\n}: {\r\n engine: EditorEngine;\r\n isActive: boolean;\r\n activeHref: string | null;\r\n hasTextSelected: boolean;\r\n /** Ctrl+K from Editor drives this to true */\r\n externalOpen?: boolean;\r\n onExternalClose?: () => void;\r\n}) {\r\n const [open, setOpen] = useState(false);\r\n const [editMode, setEditMode] = useState(false);\r\n const [url, setUrl] = useState(\"\");\r\n const [displayText, setDisplayText] = useState(\"\");\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n const urlInputRef = useRef<HTMLInputElement>(null);\r\n const textInputRef = useRef<HTMLInputElement>(null);\r\n\r\n const openPopup = () => {\r\n if (isActive) {\r\n setUrl(activeHref ?? \"\");\r\n setDisplayText(\"\");\r\n setEditMode(true); // editing existing link → straight to edit\r\n } else {\r\n setUrl(\"\");\r\n setDisplayText(\"\");\r\n setEditMode(true); // inserting new link → edit mode\r\n }\r\n setOpen(true);\r\n };\r\n\r\n const closePopup = () => {\r\n setOpen(false);\r\n setEditMode(false);\r\n setUrl(\"\");\r\n setDisplayText(\"\");\r\n onExternalClose?.();\r\n };\r\n\r\n // Ctrl+K external trigger — open popup from keyboard shortcut\r\n useEffect(() => {\r\n if (!externalOpen) return;\r\n const t = setTimeout(() => {\r\n setUrl(isActive ? (activeHref ?? \"\") : \"\");\r\n setDisplayText(\"\");\r\n setEditMode(true);\r\n setOpen(true);\r\n }, 0);\r\n return () => clearTimeout(t);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [externalOpen]);\r\n\r\n // Close on outside click\r\n useEffect(() => {\r\n if (!open) return;\r\n const handler = (e: MouseEvent) => {\r\n if (\r\n containerRef.current &&\r\n !containerRef.current.contains(e.target as Node)\r\n ) {\r\n closePopup();\r\n }\r\n };\r\n document.addEventListener(\"mousedown\", handler);\r\n return () => document.removeEventListener(\"mousedown\", handler);\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [open]);\r\n\r\n // Auto-focus URL field whenever edit mode opens\r\n useEffect(() => {\r\n if (open && editMode) {\r\n // Small defer so the popup is in the DOM before focus\r\n setTimeout(() => urlInputRef.current?.focus(), 0);\r\n }\r\n }, [open, editMode]);\r\n\r\n const handleToolbarClick = () => {\r\n if (open) {\r\n closePopup();\r\n return;\r\n }\r\n openPopup();\r\n };\r\n\r\n const handleApply = () => {\r\n const trimmed = url.trim();\r\n if (!trimmed) return;\r\n const href = trimmed;\r\n const text = displayText.trim() || undefined;\r\n insertLink(href, text)(engine);\r\n closePopup();\r\n };\r\n\r\n const handleRemove = () => {\r\n removeLink(engine);\r\n closePopup();\r\n };\r\n\r\n const handleStartEdit = () => {\r\n setUrl(activeHref ?? \"\");\r\n setDisplayText(\"\");\r\n setEditMode(true);\r\n };\r\n\r\n // Show \"Display text\" field only when cursor is collapsed and no text is selected\r\n // (i.e. user is inserting a brand-new link with custom anchor text)\r\n const showTextInput = !hasTextSelected && !isActive;\r\n\r\n return (\r\n <div ref={containerRef} className=\"relative\">\r\n <ToolbarButton\r\n label=\"link\"\r\n title=\"Link (Ctrl+K)\"\r\n onClick={handleToolbarClick}\r\n isActive={isActive || open}\r\n icon={<LinkIcon />}\r\n />\r\n\r\n {open && (\r\n <div\r\n role=\"dialog\"\r\n aria-label=\"Link editor\"\r\n className=\"absolute top-full left-0 mt-1 z-50 bg-white border border-gray-200 rounded-lg shadow-xl p-3 w-80\"\r\n >\r\n {/* ── Preview mode: cursor sits on an existing link ── */}\r\n {isActive && !editMode ? (\r\n <>\r\n <p className=\"text-xs font-medium text-gray-400 mb-2 uppercase tracking-wide\">\r\n Link\r\n </p>\r\n <div className=\"flex items-center gap-2 min-w-0\">\r\n <a\r\n href={activeHref ?? \"#\"}\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n className=\"flex-1 text-sm text-blue-600 hover:underline truncate\"\r\n title={activeHref ?? \"\"}\r\n >\r\n {activeHref}\r\n </a>\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleStartEdit();\r\n }}\r\n className=\"shrink-0 text-xs text-gray-500 hover:text-gray-700 px-2 py-1 rounded hover:bg-gray-100 \"\r\n aria-label=\"Edit link\"\r\n >\r\n Edit\r\n </button>\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleRemove();\r\n }}\r\n className=\"shrink-0 text-xs text-red-500 hover:text-red-700 px-2 py-1 rounded hover:bg-red-50 \"\r\n aria-label=\"Remove link\"\r\n >\r\n Remove\r\n </button>\r\n </div>\r\n </>\r\n ) : (\r\n /* ── Edit / Insert mode ── */\r\n <>\r\n <p className=\"text-xs font-medium text-gray-400 mb-3 uppercase tracking-wide\">\r\n {isActive ? \"Edit link\" : \"Insert link\"}\r\n </p>\r\n\r\n {/* Display text — only shown when inserting at collapsed cursor */}\r\n {showTextInput && (\r\n <div className=\"mb-2\">\r\n <label className=\"block text-xs text-gray-600 mb-1\">\r\n Display text\r\n </label>\r\n <input\r\n ref={textInputRef}\r\n type=\"text\"\r\n value={displayText}\r\n onChange={(e) => setDisplayText(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n urlInputRef.current?.focus();\r\n }\r\n if (e.key === \"Escape\") closePopup();\r\n }}\r\n placeholder=\"Link text\"\r\n className=\"w-full border border-gray-300 rounded px-2 py-1.5 text-sm bg-white text-gray-900 focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n />\r\n </div>\r\n )}\r\n\r\n {/* URL field */}\r\n <div className=\"mb-3\">\r\n <label className=\"block text-xs text-gray-600 mb-1\">\r\n URL\r\n </label>\r\n <input\r\n ref={urlInputRef}\r\n type=\"url\"\r\n value={url}\r\n onChange={(e) => setUrl(e.target.value)}\r\n onKeyDown={(e) => {\r\n if (e.key === \"Enter\") {\r\n e.preventDefault();\r\n handleApply();\r\n }\r\n if (e.key === \"Escape\") closePopup();\r\n }}\r\n placeholder=\"https://example.com\"\r\n className=\"w-full border border-gray-300 rounded px-2 py-1.5 text-sm bg-white text-gray-900 focus:outline-none focus:ring-2 focus:ring-blue-500\"\r\n />\r\n </div>\r\n\r\n {/* Actions */}\r\n <div className=\"flex items-center gap-2\">\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleApply();\r\n }}\r\n disabled={\r\n !url.trim() ||\r\n (showTextInput &&\r\n !displayText.trim() &&\r\n !hasTextSelected &&\r\n !isActive)\r\n }\r\n className=\"flex-1 px-3 py-1.5 bg-blue-600 text-white text-sm rounded hover:bg-blue-700 disabled:opacity-40 disabled:cursor-not-allowed\"\r\n >\r\n {isActive ? \"Update\" : \"Insert\"}\r\n </button>\r\n {isActive && (\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n handleRemove();\r\n }}\r\n className=\"px-3 py-1.5 text-sm text-red-600 border border-red-200 rounded hover:bg-red-50 \"\r\n >\r\n Remove\r\n </button>\r\n )}\r\n <button\r\n type=\"button\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n closePopup();\r\n }}\r\n className=\"px-3 py-1.5 text-sm text-gray-500 hover:text-gray-700 \"\r\n aria-label=\"Cancel\"\r\n >\r\n ✕\r\n </button>\r\n </div>\r\n </>\r\n )}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── Separator ────────────────────────────────────────────────────────────────\r\n\r\nfunction Divider() {\r\n return (\r\n <div\r\n className=\"w-px h-5 bg-gray-200 mx-0.5\"\r\n aria-hidden=\"true\"\r\n />\r\n );\r\n}\r\n\r\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\r\n\r\nfunction UndoIcon() {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M3.33333 6.66672L2.74417 7.25589L2.155 6.66672L2.74417 6.07756L3.33333 6.66672ZM7.5 16.6667C7.27899 16.6667 7.06702 16.5789 6.91074 16.4226C6.75446 16.2664 6.66667 16.0544 6.66667 15.8334C6.66667 15.6124 6.75446 15.4004 6.91074 15.2441C7.06702 15.0879 7.27899 15.0001 7.5 15.0001V16.6667ZM6.91083 11.4226L2.74417 7.25589L3.9225 6.07756L8.08917 10.2442L6.91083 11.4226ZM2.74417 6.07756L6.91083 1.91089L8.08917 3.08922L3.9225 7.25589L2.74417 6.07756ZM3.33333 5.83339H12.0833V7.50005H3.33333V5.83339ZM12.0833 16.6667H7.5V15.0001H12.0833V16.6667ZM17.5 11.2501C17.5 12.6866 16.9293 14.0644 15.9135 15.0802C14.8977 16.096 13.5199 16.6667 12.0833 16.6667V15.0001C12.5758 15.0001 13.0634 14.9031 13.5184 14.7146C13.9734 14.5261 14.3868 14.2499 14.735 13.9017C15.0832 13.5535 15.3594 13.1401 15.5479 12.6851C15.7363 12.2301 15.8333 11.7425 15.8333 11.2501H17.5ZM12.0833 5.83339C13.5199 5.83339 14.8977 6.40407 15.9135 7.41989C16.9293 8.43572 17.5 9.81347 17.5 11.2501H15.8333C15.8333 10.7576 15.7363 10.27 15.5479 9.81499C15.3594 9.36002 15.0832 8.94662 14.735 8.5984C14.3868 8.25019 13.9734 7.97396 13.5184 7.78551C13.0634 7.59705 12.5758 7.50005 12.0833 7.50005V5.83339Z\"\r\n fill=\"black\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction RedoIcon() {\r\n return (\r\n <svg\r\n width=\"20\"\r\n height=\"20\"\r\n viewBox=\"0 0 20 20\"\r\n fill=\"none\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n >\r\n <path\r\n d=\"M16.6667 6.66672L17.2558 7.25589L17.845 6.66672L17.2558 6.07756L16.6667 6.66672ZM12.5 16.6667C12.721 16.6667 12.933 16.5789 13.0893 16.4226C13.2455 16.2664 13.3333 16.0544 13.3333 15.8334C13.3333 15.6124 13.2455 15.4004 13.0893 15.2441C12.933 15.0879 12.721 15.0001 12.5 15.0001V16.6667ZM13.0892 11.4226L17.2558 7.25589L16.0775 6.07756L11.9108 10.2442L13.0892 11.4226ZM17.2558 6.07756L13.0892 1.91089L11.9108 3.08922L16.0775 7.25589L17.2558 6.07756ZM16.6667 5.83339H7.91667V7.50005H16.6667V5.83339ZM7.91667 16.6667H12.5V15.0001H7.91667V16.6667ZM2.5 11.2501C2.5 12.6866 3.07068 14.0644 4.0865 15.0802C5.10233 16.096 6.48008 16.6667 7.91667 16.6667V15.0001C7.42421 15.0001 6.93657 14.9031 6.4816 14.7146C6.02663 14.5261 5.61322 14.2499 5.26501 13.9017C4.9168 13.5535 4.64057 13.1401 4.45211 12.6851C4.26366 12.2301 4.16667 11.7425 4.16667 11.2501H2.5ZM7.91667 5.83339C6.48008 5.83339 5.10233 6.40407 4.0865 7.41989C3.07068 8.43572 2.5 9.81347 2.5 11.2501H4.16667C4.16667 10.7576 4.26366 10.27 4.45211 9.81499C4.64057 9.36002 4.9168 8.94662 5.26501 8.5984C5.61322 8.25019 6.02663 7.97396 6.4816 7.78551C6.93657 7.59705 7.42421 7.50005 7.91667 7.50005V5.83339Z\"\r\n fill=\"black\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction CodeIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <polyline\r\n points=\"16 18 22 12 16 6\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <polyline\r\n points=\"8 6 2 12 8 18\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BulletListIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\" strokeLinecap=\"round\" />\r\n <line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\" strokeLinecap=\"round\" />\r\n <line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\" strokeLinecap=\"round\" />\r\n <circle cx=\"4\" cy=\"6\" r=\"1\" fill=\"currentColor\" />\r\n <circle cx=\"4\" cy=\"12\" r=\"1\" fill=\"currentColor\" />\r\n <circle cx=\"4\" cy=\"18\" r=\"1\" fill=\"currentColor\" />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction OrderedListIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" strokeLinecap=\"round\" />\r\n <line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" strokeLinecap=\"round\" />\r\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" strokeLinecap=\"round\" />\r\n <text\r\n x=\"2\"\r\n y=\"7\"\r\n fontSize=\"7\"\r\n fill=\"currentColor\"\r\n stroke=\"none\"\r\n fontWeight=\"bold\"\r\n >\r\n 1\r\n </text>\r\n <text\r\n x=\"2\"\r\n y=\"13\"\r\n fontSize=\"7\"\r\n fill=\"currentColor\"\r\n stroke=\"none\"\r\n fontWeight=\"bold\"\r\n >\r\n 2\r\n </text>\r\n <text\r\n x=\"2\"\r\n y=\"19\"\r\n fontSize=\"7\"\r\n fill=\"currentColor\"\r\n stroke=\"none\"\r\n fontWeight=\"bold\"\r\n >\r\n 3\r\n </text>\r\n </svg>\r\n );\r\n}\r\n\r\nfunction BlockquoteIcon() {\r\n return (\r\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\r\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z\" />\r\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z\" />\r\n </svg>\r\n );\r\n}\r\n\r\n\r\nfunction LinkIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n >\r\n <path\r\n d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n <path\r\n d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\"\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n />\r\n </svg>\r\n );\r\n}\r\n\r\nfunction FindReplaceIcon() {\r\n return (\r\n <svg\r\n className=\"w-4 h-4\"\r\n viewBox=\"0 0 24 24\"\r\n fill=\"none\"\r\n stroke=\"currentColor\"\r\n strokeWidth={2}\r\n strokeLinecap=\"round\"\r\n strokeLinejoin=\"round\"\r\n >\r\n <circle cx=\"10\" cy=\"10\" r=\"6\" />\r\n <line x1=\"14.5\" y1=\"14.5\" x2=\"20\" y2=\"20\" />\r\n <path d=\"M7 10h6\" />\r\n <path d=\"M10 7v6\" />\r\n </svg>\r\n );\r\n}\r\n","/**\n * SearchEngine\n *\n * Pure functions for finding text matches in the document model\n * and applying visual highlights via the CSS Custom Highlight API.\n *\n * CSS Custom Highlight API (Chrome 105+, Firefox 117+, Safari 17.2+)\n * highlights text without modifying the DOM structure, so they survive\n * the DOMRenderer's full re-render cycle.\n */\n\nimport type { Document, EditorNode, TextNode } from '../../types';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\nexport interface SearchMatch {\n path: number[];\n startOffset: number;\n endOffset: number;\n}\n\nexport interface SearchOptions {\n caseSensitive: boolean;\n wholeWord: boolean;\n}\n\n// ─── Match Finding ────────────────────────────────────────────────────────────\n\nexport function findMatches(\n doc: Document,\n query: string,\n opts: SearchOptions,\n): SearchMatch[] {\n if (!query) return [];\n const matches: SearchMatch[] = [];\n walkNode(doc as unknown as { children?: EditorNode[] }, [], query, opts, matches);\n return matches;\n}\n\nfunction walkNode(\n node: { children?: EditorNode[]; type?: string; text?: string },\n path: number[],\n query: string,\n opts: SearchOptions,\n out: SearchMatch[],\n): void {\n if (node.type === 'text') {\n findInText((node as unknown as TextNode).text, path, query, opts, out);\n return;\n }\n const children = node.children;\n if (!children) return;\n for (let i = 0; i < children.length; i++) {\n walkNode(\n children[i] as unknown as { children?: EditorNode[]; type?: string; text?: string },\n [...path, i],\n query,\n opts,\n out,\n );\n }\n}\n\nfunction findInText(\n text: string,\n path: number[],\n query: string,\n opts: SearchOptions,\n out: SearchMatch[],\n): void {\n const haystack = opts.caseSensitive ? text : text.toLowerCase();\n const needle = opts.caseSensitive ? query : query.toLowerCase();\n\n let pos = 0;\n while (pos <= haystack.length - needle.length) {\n const idx = haystack.indexOf(needle, pos);\n if (idx === -1) break;\n\n if (!opts.wholeWord || isWholeWord(text, idx, idx + needle.length)) {\n out.push({ path: [...path], startOffset: idx, endOffset: idx + needle.length });\n }\n pos = idx + needle.length; // non-overlapping\n }\n}\n\nfunction isWholeWord(text: string, start: number, end: number): boolean {\n const w = /\\w/;\n if (start > 0 && w.test(text[start - 1])) return false;\n if (end < text.length && w.test(text[end])) return false;\n return true;\n}\n\n// ─── CSS Custom Highlight API ─────────────────────────────────────────────────\n\nconst HL_ALL = 'editor-search';\nconst HL_CURRENT = 'editor-search-current';\n\nfunction getCSSHighlights(): Map<string, unknown> | null {\n if (typeof CSS === 'undefined') return null;\n return (CSS as unknown as { highlights?: Map<string, unknown> }).highlights ?? null;\n}\n\nfunction getHighlightCtor(): (new (...ranges: Range[]) => unknown) | null {\n if (typeof window === 'undefined') return null;\n return (window as unknown as { Highlight?: new (...ranges: Range[]) => unknown }).Highlight ?? null;\n}\n\nexport function applySearchHighlights(\n container: HTMLElement,\n matches: SearchMatch[],\n currentIndex: number,\n): void {\n const cssHL = getCSSHighlights();\n const Hl = getHighlightCtor();\n if (!cssHL || !Hl) return;\n\n cssHL.delete(HL_ALL);\n cssHL.delete(HL_CURRENT);\n\n if (matches.length === 0) return;\n\n const allRanges: Range[] = [];\n const currentRanges: Range[] = [];\n\n for (let i = 0; i < matches.length; i++) {\n const range = matchToRange(container, matches[i]);\n if (!range) continue;\n (i === currentIndex ? currentRanges : allRanges).push(range);\n }\n\n if (allRanges.length) cssHL.set(HL_ALL, new Hl(...allRanges));\n if (currentRanges.length) cssHL.set(HL_CURRENT, new Hl(...currentRanges));\n}\n\nexport function clearSearchHighlights(): void {\n const cssHL = getCSSHighlights();\n if (!cssHL) return;\n cssHL.delete(HL_ALL);\n cssHL.delete(HL_CURRENT);\n}\n\n// ─── DOM Helpers ──────────────────────────────────────────────────────────────\n\nfunction matchToRange(container: HTMLElement, match: SearchMatch): Range | null {\n const el = container.querySelector(`[data-path='${JSON.stringify(match.path)}']`);\n if (!el) return null;\n\n const textNode = findLeafText(el);\n if (!textNode || match.endOffset > textNode.length) return null;\n\n try {\n const range = document.createRange();\n range.setStart(textNode, match.startOffset);\n range.setEnd(textNode, match.endOffset);\n return range;\n } catch {\n return null;\n }\n}\n\nfunction findLeafText(el: Element): Text | null {\n const walker = document.createTreeWalker(el, NodeFilter.SHOW_TEXT);\n return walker.nextNode() as Text | null;\n}\n\nexport function scrollMatchIntoView(container: HTMLElement, match: SearchMatch): void {\n const el = container.querySelector(`[data-path='${JSON.stringify(match.path)}']`);\n el?.scrollIntoView({ block: 'nearest', behavior: 'smooth' });\n}\n","/**\n * SearchCommands\n *\n * Commands for replacing text matches found by SearchEngine.\n * Processes replacements last-to-first within each text node so that\n * earlier offsets remain valid after each delete/insert pair.\n */\n\nimport type { Command, TextNode, EditorNode } from '../../types';\nimport { createTransaction, tr_setSelection } from '../core/Transaction';\nimport { getNodeAtPath } from '../core/DocumentModel';\nimport { makePosition, makeCollapsedSelection } from '../selection/SelectionEngine';\nimport type { SearchMatch } from './SearchEngine';\n\n// ─── Replace Single Match ─────────────────────────────────────────────────────\n\nexport function replaceMatch(match: SearchMatch, replacement: string): Command {\n return (engine) => {\n const state = engine.getState();\n const node = getNodeAtPath(state.doc, match.path) as EditorNode | null;\n if (!node || node.type !== 'text') return false;\n\n const textNode = node as TextNode;\n const marks = textNode.marks;\n const tr = createTransaction();\n\n // When the match spans the entire text node, deleteTextAtPath removes the\n // node entirely (newText === ''). A subsequent insert_text at the same\n // path would find nothing and silently drop the replacement. Use\n // insert_node at the parent block's index instead so the replacement lands\n // at exactly the right position regardless of sibling count.\n const wholeNode =\n match.startOffset === 0 && match.endOffset === textNode.text.length;\n\n tr.steps.push({ type: 'delete_text', path: match.path, from: match.startOffset, to: match.endOffset });\n\n if (replacement) {\n if (wholeNode) {\n tr.steps.push({\n type: 'insert_node',\n parentPath: match.path.slice(0, -1),\n index: match.path[match.path.length - 1],\n node: { type: 'text', text: replacement, marks } as TextNode,\n });\n } else {\n tr.steps.push({ type: 'insert_text', path: match.path, offset: match.startOffset, text: replacement, marks });\n }\n }\n\n tr.steps.push(tr_setSelection(\n makeCollapsedSelection(makePosition(match.path, match.startOffset + replacement.length)),\n ));\n\n engine.dispatch(tr);\n return true;\n };\n}\n\n// ─── Replace All Matches ──────────────────────────────────────────────────────\n\nexport function replaceAllMatches(matches: SearchMatch[], replacement: string): Command {\n return (engine) => {\n if (matches.length === 0) return false;\n\n const state = engine.getState();\n const tr = createTransaction();\n\n // Reverse so we process last-to-first — earlier offsets stay valid\n // even after each delete/insert modifies the text node length.\n const reversed = [...matches].reverse();\n\n for (const match of reversed) {\n const node = getNodeAtPath(state.doc, match.path) as EditorNode | null;\n if (!node || node.type !== 'text') continue;\n\n const textNode = node as TextNode;\n const marks = textNode.marks;\n const wholeNode =\n match.startOffset === 0 && match.endOffset === textNode.text.length;\n\n tr.steps.push({ type: 'delete_text', path: match.path, from: match.startOffset, to: match.endOffset });\n\n if (replacement) {\n if (wholeNode) {\n tr.steps.push({\n type: 'insert_node',\n parentPath: match.path.slice(0, -1),\n index: match.path[match.path.length - 1],\n node: { type: 'text', text: replacement, marks } as TextNode,\n });\n } else {\n tr.steps.push({ type: 'insert_text', path: match.path, offset: match.startOffset, text: replacement, marks });\n }\n }\n }\n\n engine.dispatch(tr);\n return true;\n };\n}\n","'use client';\n\nimport React, {\n useState,\n useMemo,\n useEffect,\n useRef,\n useCallback,\n} from 'react';\nimport type { EditorEngine } from '../editor/core/EditorEngine';\nimport { useEditorState } from '../hooks/useEditorState';\nimport {\n findMatches,\n applySearchHighlights,\n clearSearchHighlights,\n scrollMatchIntoView,\n} from '../editor/search/SearchEngine';\nimport { replaceMatch, replaceAllMatches } from '../editor/search/SearchCommands';\n\n// ─── Types ────────────────────────────────────────────────────────────────────\n\ninterface FindReplaceModalProps {\n engine: EditorEngine;\n editorContainer: React.RefObject<HTMLDivElement | null>;\n initialMode: 'find' | 'replace';\n onClose: () => void;\n}\n\n// ─── Component ────────────────────────────────────────────────────────────────\n\nexport function FindReplaceModal({\n engine,\n editorContainer,\n initialMode,\n onClose,\n}: FindReplaceModalProps) {\n const state = useEditorState(engine);\n\n const [query, setQuery] = useState('');\n const [replacement, setReplacement] = useState('');\n const [caseSensitive, setCaseSensitive] = useState(false);\n const [wholeWord, setWholeWord] = useState(false);\n const [showAdvanced, setShowAdvanced] = useState(false);\n const [currentIndex, setCurrentIndex] = useState(0);\n const [mode, setMode] = useState<'find' | 'replace'>(initialMode);\n\n const findInputRef = useRef<HTMLInputElement>(null);\n const replaceInputRef = useRef<HTMLInputElement>(null);\n\n // ── Compute matches whenever doc / query / options change ──────────────────\n\n const matches = useMemo(\n () => findMatches(state.doc, query, { caseSensitive, wholeWord }),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [state.doc, query, caseSensitive, wholeWord],\n );\n\n // Safe index — clamps to valid range without needing an extra state update\n const safeIndex = matches.length > 0 ? Math.min(currentIndex, matches.length - 1) : 0;\n\n // Reset index to 0 when matches drop to zero (e.g. after Replace All)\n useEffect(() => {\n // eslint-disable-next-line react-hooks/set-state-in-effect\n if (matches.length === 0) setCurrentIndex(0);\n }, [matches.length]);\n\n // ── Apply CSS Custom Highlights after each render ──────────────────────────\n // useEffect (not useLayoutEffect) so it runs AFTER Editor's useLayoutEffect\n // has already rebuilt the DOM, avoiding highlight flicker.\n\n useEffect(() => {\n const container = editorContainer.current;\n if (!container) return;\n applySearchHighlights(container, matches, safeIndex);\n return () => clearSearchHighlights();\n }, [matches, safeIndex, editorContainer]);\n\n // ── Scroll current match into view ─────────────────────────────────────────\n\n useEffect(() => {\n const container = editorContainer.current;\n if (!container || matches.length === 0) return;\n scrollMatchIntoView(container, matches[safeIndex]);\n }, [safeIndex, matches, editorContainer]);\n\n // ── Auto-focus the find input on mount ────────────────────────────────────\n\n useEffect(() => {\n findInputRef.current?.focus();\n findInputRef.current?.select();\n }, []);\n\n // ── Global keyboard shortcuts ─────────────────────────────────────────────\n\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault();\n handleClose();\n return;\n }\n // Ctrl/Cmd+F refocuses the find input\n if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\n e.preventDefault();\n setMode('find');\n findInputRef.current?.focus();\n findInputRef.current?.select();\n return;\n }\n // Ctrl/Cmd+H switches to replace mode\n if ((e.ctrlKey || e.metaKey) && e.key === 'h') {\n e.preventDefault();\n setMode('replace');\n replaceInputRef.current?.focus();\n }\n };\n window.addEventListener('keydown', handler);\n return () => window.removeEventListener('keydown', handler);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // ── Navigation ────────────────────────────────────────────────────────────\n\n const navigateNext = useCallback(() => {\n if (matches.length === 0) return;\n setCurrentIndex((i) => (i + 1) % matches.length);\n }, [matches.length]);\n\n const navigatePrev = useCallback(() => {\n if (matches.length === 0) return;\n setCurrentIndex((i) => (i - 1 + matches.length) % matches.length);\n }, [matches.length]);\n\n // ── Replace ───────────────────────────────────────────────────────────────\n\n function handleReplace() {\n if (matches.length === 0) return;\n replaceMatch(matches[safeIndex], replacement)(engine);\n // After state update, matches recompute; safeIndex naturally points to next match\n }\n\n function handleReplaceAll() {\n if (matches.length === 0) return;\n replaceAllMatches(matches, replacement)(engine);\n }\n\n // ── Close ─────────────────────────────────────────────────────────────────\n\n function handleClose() {\n clearSearchHighlights();\n onClose();\n }\n\n // ── Helpers ───────────────────────────────────────────────────────────────\n\n const hasQuery = query.length > 0;\n const noResults = hasQuery && matches.length === 0;\n const countLabel = hasQuery && matches.length > 0\n ? `${safeIndex + 1} / ${matches.length}`\n : null;\n\n return (\n <div\n role=\"dialog\"\n aria-label=\"Find and replace\"\n aria-modal=\"false\"\n className=\"absolute top-12 right-64 z-50 w-96 bg-white border border-gray-200 rounded-xl shadow-2xl\"\n onMouseDown={(e) => e.stopPropagation()}\n >\n {/* ── Header ── */}\n <div className=\"flex items-center justify-between px-4 py-3 border-b border-gray-100 \">\n <div className=\"flex items-center gap-2\">\n <SearchIcon />\n <span className=\"text-sm font-semibold text-gray-800 \">\n Find and replace\n </span>\n </div>\n <button\n type=\"button\"\n aria-label=\"Close\"\n onClick={handleClose}\n className=\"p-1 rounded text-gray-400 hover:text-gray-600 hover:bg-gray-100 transition-colors\"\n >\n <XIcon />\n </button>\n </div>\n\n <div className=\"p-4 space-y-3\">\n {/* ── Find input ── */}\n <div className=\"flex items-center gap-2\">\n <div className=\"relative flex-1\">\n <input\n ref={findInputRef}\n type=\"text\"\n value={query}\n onChange={(e) => { setQuery(e.target.value); setCurrentIndex(0); }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); e.shiftKey ? navigatePrev() : navigateNext(); }\n }}\n placeholder=\"Find in text…\"\n aria-label=\"Find\"\n className={[\n 'w-full px-3 py-2 text-sm rounded-lg border bg-white ',\n 'text-gray-900 placeholder-gray-400',\n 'focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent',\n noResults\n ? 'border-red-300 bg-red-50 '\n : 'border-gray-300 ',\n ].join(' ')}\n />\n {/* No results indicator */}\n {noResults && (\n <span className=\"absolute right-3 top-1/2 -translate-y-1/2 text-xs text-red-400 pointer-events-none\">\n Not found\n </span>\n )}\n </div>\n\n {/* Prev / Next / Count */}\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n type=\"button\"\n title=\"Previous (Shift+Enter)\"\n onClick={navigatePrev}\n disabled={matches.length === 0}\n className=\"p-1.5 rounded text-gray-500 hover:bg-gray-100 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\n >\n <ChevronUpIcon />\n </button>\n <button\n type=\"button\"\n title=\"Next (Enter)\"\n onClick={navigateNext}\n disabled={matches.length === 0}\n className=\"p-1.5 rounded text-gray-500 hover:bg-gray-100 disabled:opacity-30 disabled:cursor-not-allowed transition-colors\"\n >\n <ChevronDownIcon />\n </button>\n {countLabel && (\n <span className=\"text-xs text-gray-500 min-w-[44px] text-center tabular-nums\">\n {countLabel}\n </span>\n )}\n </div>\n </div>\n\n {/* ── Replace input ── */}\n <input\n ref={replaceInputRef}\n type=\"text\"\n value={replacement}\n onChange={(e) => setReplacement(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') { e.preventDefault(); handleReplace(); }\n }}\n placeholder=\"Replace with…\"\n aria-label=\"Replace with\"\n className=\"w-full px-3 py-2 text-sm rounded-lg border border-gray-300 bg-white text-gray-900 placeholder-gray-400 focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n\n {/* ── Advanced options ── */}\n <div>\n <button\n type=\"button\"\n onClick={() => setShowAdvanced((p) => !p)}\n className=\"flex items-center gap-1.5 text-xs text-gray-500 hover:text-gray-700 transition-colors\"\n >\n <span className={`transition-transform ${showAdvanced ? 'rotate-90' : ''}`}>▶</span>\n <span>Advanced options</span>\n </button>\n\n {showAdvanced && (\n <div className=\"mt-2.5 flex items-center gap-5\">\n <label className=\"flex items-center gap-1.5 text-sm text-gray-600 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={caseSensitive}\n onChange={(e) => { setCaseSensitive(e.target.checked); setCurrentIndex(0); }}\n className=\"w-3.5 h-3.5 accent-blue-600\"\n />\n Match case\n </label>\n <label className=\"flex items-center gap-1.5 text-sm text-gray-600 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={wholeWord}\n onChange={(e) => { setWholeWord(e.target.checked); setCurrentIndex(0); }}\n className=\"w-3.5 h-3.5 accent-blue-600\"\n />\n Whole words\n </label>\n </div>\n )}\n </div>\n </div>\n\n {/* ── Action buttons ── */}\n <div className=\"flex items-center justify-end gap-2 px-4 py-3 border-t border-gray-100 bg-gray-50 rounded-b-xl\">\n <button\n type=\"button\"\n onClick={handleReplaceAll}\n disabled={matches.length === 0}\n className=\"px-3 py-1.5 text-sm rounded-lg border border-gray-300 text-gray-700 hover:bg-gray-100 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n >\n Replace all\n </button>\n <button\n type=\"button\"\n onClick={handleReplace}\n disabled={matches.length === 0}\n className=\"px-3 py-1.5 text-sm rounded-lg border border-gray-300 text-gray-700 hover:bg-gray-100 disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n >\n Replace\n </button>\n <button\n type=\"button\"\n onClick={navigateNext}\n disabled={matches.length === 0}\n className=\"px-3 py-1.5 text-sm rounded-lg bg-blue-600 hover:bg-blue-700 text-white font-medium disabled:opacity-40 disabled:cursor-not-allowed transition-colors\"\n >\n Find\n </button>\n </div>\n </div>\n );\n}\n\n// ─── SVG Icons ────────────────────────────────────────────────────────────────\n\nfunction SearchIcon() {\n return (\n <svg className=\"w-4 h-4 text-gray-500 shrink-0\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <circle cx=\"11\" cy=\"11\" r=\"8\" />\n <line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\" />\n </svg>\n );\n}\n\nfunction XIcon() {\n return (\n <svg className=\"w-4 h-4\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction ChevronUpIcon() {\n return (\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"18 15 12 9 6 15\" />\n </svg>\n );\n}\n\nfunction ChevronDownIcon() {\n return (\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth={2.5} strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n );\n}\n","'use client';\n\n/**\n * TableContextMenu\n *\n * Right-click context menu for table operations. Rendered as a portal so it\n * floats above the editor canvas. Closes on outside click, Escape, or scroll.\n *\n * Props:\n * x, y – screen position (from contextmenu event)\n * tablePath – path to the table node\n * row, col – cell that was right-clicked\n * isMerged – true when the clicked cell has colspan/rowspan > 1\n * hasTableSelection – true when multiple cells are selected (enables Merge)\n * engine – editor engine\n * tableSelection – current cell selection (for Merge Cells)\n * onClose – called when the menu should dismiss\n */\n\nimport React, { useEffect, useRef } from 'react';\nimport type { EditorEngine } from '../editor/core/EditorEngine';\nimport {\n addRowAbove,\n addRowBelow,\n deleteRow,\n addColumnLeft,\n addColumnRight,\n deleteColumn,\n mergeCells,\n splitCell,\n deleteTable,\n} from '../editor/table/TableCommands';\n\nexport interface TableContextMenuProps {\n x: number;\n y: number;\n tablePath: number[];\n row: number;\n col: number;\n isMerged: boolean;\n tableSelection: {\n tablePath: number[];\n anchorCell: [number, number];\n focusCell: [number, number];\n } | null;\n engine: EditorEngine;\n onClose: () => void;\n}\n\nexport function TableContextMenu({\n x,\n y,\n tablePath,\n row: _row,\n col: _col,\n isMerged,\n tableSelection,\n engine,\n onClose,\n}: TableContextMenuProps) {\n const menuRef = useRef<HTMLDivElement>(null);\n\n // Close on outside click / scroll / Escape\n useEffect(() => {\n const handleDown = (e: MouseEvent) => {\n if (menuRef.current && !menuRef.current.contains(e.target as Node)) onClose();\n };\n const handleKey = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n const handleScroll = () => onClose();\n\n document.addEventListener('mousedown', handleDown);\n document.addEventListener('keydown', handleKey);\n document.addEventListener('scroll', handleScroll, true);\n return () => {\n document.removeEventListener('mousedown', handleDown);\n document.removeEventListener('keydown', handleKey);\n document.removeEventListener('scroll', handleScroll, true);\n };\n }, [onClose]);\n\n // Clamp menu position to stay within viewport\n const menuStyle: React.CSSProperties = {\n position: 'fixed',\n left: Math.min(x, window.innerWidth - 220),\n top: Math.min(y, window.innerHeight - 350),\n zIndex: 9999,\n };\n\n const run = (cmd: (e: typeof engine) => boolean) => {\n cmd(engine);\n onClose();\n };\n\n const hasMultiCellSelection =\n tableSelection !== null &&\n (tableSelection.anchorCell[0] !== tableSelection.focusCell[0] ||\n tableSelection.anchorCell[1] !== tableSelection.focusCell[1]);\n\n return (\n <div\n ref={menuRef}\n role=\"menu\"\n aria-label=\"Table options\"\n style={menuStyle}\n className=\"min-w-[200px] rounded-lg border border-gray-200 bg-white py-1 shadow-xl \"\n >\n <MenuSection label=\"Row\">\n <MenuItem onClick={() => run(addRowAbove)}>Insert row above</MenuItem>\n <MenuItem onClick={() => run(addRowBelow)}>Insert row below</MenuItem>\n <MenuItem onClick={() => run(deleteRow)} danger>Delete row</MenuItem>\n </MenuSection>\n\n <Divider />\n\n <MenuSection label=\"Column\">\n <MenuItem onClick={() => run(addColumnLeft)}>Insert column left</MenuItem>\n <MenuItem onClick={() => run(addColumnRight)}>Insert column right</MenuItem>\n <MenuItem onClick={() => run(deleteColumn)} danger>Delete column</MenuItem>\n </MenuSection>\n\n <Divider />\n\n <MenuSection label=\"Cell\">\n {hasMultiCellSelection && tableSelection && (\n <MenuItem onClick={() => run(mergeCells(tableSelection))}>\n Merge cells\n </MenuItem>\n )}\n {isMerged && (\n <MenuItem onClick={() => run(splitCell)}>Split cell</MenuItem>\n )}\n {!hasMultiCellSelection && !isMerged && (\n <MenuItem disabled>Merge cells (select multiple)</MenuItem>\n )}\n </MenuSection>\n\n <Divider />\n\n <MenuItem onClick={() => run(deleteTable)} danger>\n Delete table\n </MenuItem>\n </div>\n );\n}\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nfunction MenuSection({ label, children }: { label: string; children: React.ReactNode }) {\n return (\n <div>\n <p className=\"px-3 py-1 text-[10px] font-semibold uppercase tracking-wider text-gray-400 \">\n {label}\n </p>\n {children}\n </div>\n );\n}\n\nfunction Divider() {\n return <hr className=\"my-1 border-gray-100 \" />;\n}\n\ninterface MenuItemProps {\n onClick?: () => void;\n danger?: boolean;\n disabled?: boolean;\n children: React.ReactNode;\n}\n\nfunction MenuItem({ onClick, danger, disabled, children }: MenuItemProps) {\n return (\n <button\n type=\"button\"\n role=\"menuitem\"\n disabled={disabled}\n onClick={disabled ? undefined : onClick}\n className={[\n 'flex w-full items-center px-3 py-1.5 text-sm',\n disabled\n ? 'cursor-default text-gray-300 '\n : danger\n ? 'cursor-pointer text-red-600 hover:bg-red-50 '\n : 'cursor-pointer text-gray-700 hover:bg-gray-100 ',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n","'use client';\n\nimport React, { useLayoutEffect, useRef } from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport {\n addRowAbove,\n addRowBelow,\n deleteRow,\n addColumnLeft,\n addColumnRight,\n deleteColumn,\n mergeCells,\n splitCell,\n deleteTable,\n toggleHeaderRow,\n} from '../../editor/table/TableCommands';\nimport { getNodeAtPath } from '../../editor/core/DocumentModel';\nimport type { BlockNode } from '../../types';\n\ninterface TableToolbarProps {\n engine: EditorEngine;\n tablePath: number[];\n cellPos: { row: number; col: number };\n tableSelection: {\n tablePath: number[];\n anchorCell: [number, number];\n focusCell: [number, number];\n } | null;\n editorContainer: React.RefObject<HTMLDivElement | null>;\n}\n\nexport function TableToolbar({\n engine,\n tablePath,\n cellPos,\n tableSelection,\n editorContainer,\n}: TableToolbarProps) {\n const toolbarRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = editorContainer.current;\n const toolbar = toolbarRef.current;\n if (!container || !toolbar) return;\n const tableWrapper = container.querySelector(\n `[data-block-path=\"${JSON.stringify(tablePath)}\"]`,\n ) as HTMLElement | null;\n if (!tableWrapper) return;\n const rect = tableWrapper.getBoundingClientRect();\n const toolbarH = toolbar.offsetHeight || 36;\n const top = Math.max(4, rect.top - toolbarH - 6);\n toolbar.style.top = `${top}px`;\n toolbar.style.left = `${rect.left}px`;\n toolbar.style.visibility = 'visible';\n });\n\n const run = (cmd: (e: typeof engine) => boolean) => {\n cmd(engine);\n };\n\n const hasMultiCellSelection =\n tableSelection !== null &&\n tableSelection.tablePath.join(',') === tablePath.join(',') &&\n (tableSelection.anchorCell[0] !== tableSelection.focusCell[0] ||\n tableSelection.anchorCell[1] !== tableSelection.focusCell[1]);\n\n const state = engine.getState();\n const cellNode = getNodeAtPath(state.doc, [...tablePath, cellPos.row, cellPos.col]) as BlockNode | null;\n const isMerged =\n !!cellNode &&\n (((cellNode.attrs?.colspan as number) ?? 1) > 1 ||\n ((cellNode.attrs?.rowspan as number) ?? 1) > 1);\n\n const tableNode = getNodeAtPath(state.doc, tablePath) as BlockNode | null;\n const hasHeaderRow = !!tableNode && (tableNode.children[0] as BlockNode)?.children?.some(\n (c) => (c as BlockNode).type === 'table_header',\n );\n\n return (\n <div\n ref={toolbarRef}\n style={{ position: 'fixed', visibility: 'hidden', zIndex: 9000 }}\n onMouseDown={(e) => e.preventDefault()}\n className=\"flex items-center gap-px rounded-md border border-gray-200 bg-white px-1 py-0.5 shadow-lg \"\n >\n {/* Header row toggle */}\n <Btn\n title=\"Toggle header row\"\n active={hasHeaderRow}\n onClick={() => run(toggleHeaderRow(tablePath))}\n >\n <HeaderRowIcon />\n </Btn>\n <Sep />\n\n {/* Row ops */}\n <Btn title=\"Insert row above\" onClick={() => run(addRowAbove)}>\n <RowAboveIcon />\n </Btn>\n <Btn title=\"Insert row below\" onClick={() => run(addRowBelow)}>\n <RowBelowIcon />\n </Btn>\n <Btn title=\"Delete row\" onClick={() => run(deleteRow)} danger>\n <DeleteRowIcon />\n </Btn>\n <Sep />\n\n {/* Column ops */}\n <Btn title=\"Insert column left\" onClick={() => run(addColumnLeft)}>\n <ColLeftIcon />\n </Btn>\n <Btn title=\"Insert column right\" onClick={() => run(addColumnRight)}>\n <ColRightIcon />\n </Btn>\n <Btn title=\"Delete column\" onClick={() => run(deleteColumn)} danger>\n <DeleteColIcon />\n </Btn>\n\n {/* Merge / split */}\n {(hasMultiCellSelection || isMerged) && <Sep />}\n {hasMultiCellSelection && tableSelection && (\n <Btn title=\"Merge cells\" onClick={() => run(mergeCells(tableSelection))}>\n <MergeIcon />\n </Btn>\n )}\n {isMerged && (\n <Btn title=\"Split cell\" onClick={() => run(splitCell)}>\n <SplitIcon />\n </Btn>\n )}\n\n <Sep />\n <Btn title=\"Delete table\" onClick={() => run(deleteTable)} danger>\n <DeleteTableIcon />\n </Btn>\n </div>\n );\n}\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nfunction Btn({\n title,\n onClick,\n active,\n danger,\n children,\n}: {\n title: string;\n onClick: () => void;\n active?: boolean;\n danger?: boolean;\n children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n title={title}\n onMouseDown={(e) => { e.preventDefault(); onClick(); }}\n className={[\n 'flex h-7 w-7 items-center justify-center rounded transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\n danger\n ? 'text-red-500 hover:bg-red-50 '\n : active\n ? 'bg-blue-100 text-blue-700 '\n : 'text-gray-600 hover:bg-gray-100 ',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nfunction Sep() {\n return <div className=\"mx-0.5 h-5 w-px bg-gray-200 \" />;\n}\n\n// ─── Icons ────────────────────────────────────────────────────────────────────\n\nfunction HeaderRowIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" />\n <line x1=\"1\" y1=\"6\" x2=\"15\" y2=\"6\" />\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"5\" rx=\"1.5\" fill=\"currentColor\" opacity=\"0.18\" stroke=\"none\" />\n </svg>\n );\n}\n\nfunction RowAboveIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"7\" width=\"14\" height=\"8\" rx=\"1\" />\n <line x1=\"5\" y1=\"7\" x2=\"5\" y2=\"15\" />\n <line x1=\"10\" y1=\"7\" x2=\"10\" y2=\"15\" />\n <line x1=\"8\" y1=\"1\" x2=\"8\" y2=\"6\" />\n <polyline points=\"5 3 8 1 11 3\" />\n </svg>\n );\n}\n\nfunction RowBelowIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"8\" rx=\"1\" />\n <line x1=\"5\" y1=\"1\" x2=\"5\" y2=\"9\" />\n <line x1=\"10\" y1=\"1\" x2=\"10\" y2=\"9\" />\n <line x1=\"8\" y1=\"10\" x2=\"8\" y2=\"15\" />\n <polyline points=\"5 13 8 15 11 13\" />\n </svg>\n );\n}\n\nfunction DeleteRowIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"4\" width=\"14\" height=\"8\" rx=\"1\" />\n <line x1=\"5\" y1=\"4\" x2=\"5\" y2=\"12\" />\n <line x1=\"10\" y1=\"4\" x2=\"10\" y2=\"12\" />\n <line x1=\"6\" y1=\"8\" x2=\"10\" y2=\"8\" />\n </svg>\n );\n}\n\nfunction ColLeftIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"7\" y=\"1\" width=\"8\" height=\"14\" rx=\"1\" />\n <line x1=\"7\" y1=\"5\" x2=\"15\" y2=\"5\" />\n <line x1=\"7\" y1=\"10\" x2=\"15\" y2=\"10\" />\n <line x1=\"1\" y1=\"8\" x2=\"6\" y2=\"8\" />\n <polyline points=\"3 5 1 8 3 11\" />\n </svg>\n );\n}\n\nfunction ColRightIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"8\" height=\"14\" rx=\"1\" />\n <line x1=\"1\" y1=\"5\" x2=\"9\" y2=\"5\" />\n <line x1=\"1\" y1=\"10\" x2=\"9\" y2=\"10\" />\n <line x1=\"10\" y1=\"8\" x2=\"15\" y2=\"8\" />\n <polyline points=\"13 5 15 8 13 11\" />\n </svg>\n );\n}\n\nfunction DeleteColIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"4\" y=\"1\" width=\"8\" height=\"14\" rx=\"1\" />\n <line x1=\"4\" y1=\"5\" x2=\"12\" y2=\"5\" />\n <line x1=\"4\" y1=\"10\" x2=\"12\" y2=\"10\" />\n <line x1=\"8\" y1=\"5\" x2=\"8\" y2=\"10\" />\n </svg>\n );\n}\n\nfunction MergeIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" />\n <line x1=\"8\" y1=\"1\" x2=\"8\" y2=\"15\" />\n <line x1=\"1\" y1=\"8\" x2=\"15\" y2=\"8\" />\n <polyline points=\"5 5 8 8 11 5\" />\n <polyline points=\"5 11 8 8 11 11\" />\n </svg>\n );\n}\n\nfunction SplitIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" />\n <line x1=\"8\" y1=\"1\" x2=\"8\" y2=\"15\" />\n <line x1=\"1\" y1=\"8\" x2=\"15\" y2=\"8\" />\n <polyline points=\"5 6 8 3 11 6\" />\n <polyline points=\"5 10 8 13 11 10\" />\n </svg>\n );\n}\n\nfunction DeleteTableIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"1\" width=\"14\" height=\"14\" rx=\"1.5\" />\n <line x1=\"5\" y1=\"5\" x2=\"11\" y2=\"11\" />\n <line x1=\"11\" y1=\"5\" x2=\"5\" y2=\"11\" />\n </svg>\n );\n}\n","'use client';\n\nimport React, { useLayoutEffect, useRef, useState } from 'react';\nimport type { EditorEngine } from '../../editor/core/EditorEngine';\nimport { setImageAttr, deleteImageAtPath } from '../../editor/commands';\n\ninterface ImageToolbarProps {\n engine: EditorEngine;\n imagePath: number[];\n editorContainer: React.RefObject<HTMLDivElement | null>;\n onClose: () => void;\n}\n\nexport function ImageToolbar({ engine, imagePath, editorContainer, onClose }: ImageToolbarProps) {\n const toolbarRef = useRef<HTMLDivElement>(null);\n const [captionOpen, setCaptionOpen] = useState(false);\n const [captionInput, setCaptionInput] = useState('');\n\n const state = engine.getState();\n const imageNode = (() => {\n let node: unknown = state.doc;\n for (const idx of imagePath) {\n node = (node as { children: unknown[] }).children?.[idx];\n if (!node) return null;\n }\n return node as { attrs: Record<string, unknown> };\n })();\n\n const currentAlign = (imageNode?.attrs?.align as string) ?? 'none';\n const hasCaption = imageNode?.attrs?.caption !== undefined;\n\n useLayoutEffect(() => {\n const container = editorContainer.current;\n const toolbar = toolbarRef.current;\n if (!container || !toolbar) return;\n\n const fig = container.querySelector(\n `[data-image-path=\"${JSON.stringify(imagePath)}\"]`,\n ) as HTMLElement | null;\n if (!fig) return;\n\n const rect = fig.getBoundingClientRect();\n const toolbarH = toolbar.offsetHeight || 36;\n const top = Math.max(4, rect.top - toolbarH - 6);\n toolbar.style.top = `${top}px`;\n toolbar.style.left = `${rect.left}px`;\n toolbar.style.minWidth = `${rect.width}px`;\n toolbar.style.visibility = 'visible';\n });\n\n const run = (attrs: Record<string, unknown>) => {\n setImageAttr(imagePath, attrs)(engine);\n };\n\n const handleDelete = () => {\n deleteImageAtPath(imagePath)(engine);\n onClose();\n };\n\n const commitCaption = () => {\n run({ caption: captionInput });\n setCaptionOpen(false);\n };\n\n const removeCaption = () => {\n // Remove caption attr by setting undefined — spread will drop it\n const s = engine.getState();\n let node: unknown = s.doc;\n for (const idx of imagePath) {\n node = (node as { children: unknown[] }).children?.[idx];\n }\n if (!node) return;\n const n = node as { type: string; attrs: Record<string, unknown>; children: unknown[] };\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { caption: _caption, ...restAttrs } = n.attrs;\n const tr = { steps: [\n { type: 'delete_node' as const, path: imagePath },\n { type: 'insert_node' as const, parentPath: imagePath.slice(0, -1), index: imagePath[imagePath.length - 1], node: { ...n, attrs: restAttrs } },\n ], meta: {} };\n engine.dispatch(tr as Parameters<typeof engine.dispatch>[0]);\n setCaptionOpen(false);\n };\n\n return (\n <>\n <div\n ref={toolbarRef}\n style={{ position: 'fixed', visibility: 'hidden', zIndex: 9100 }}\n onMouseDown={(e) => e.preventDefault()}\n className=\"flex items-center gap-px rounded-md border border-gray-200 bg-white px-1 py-0.5 shadow-lg \"\n >\n {/* Alignment */}\n <Btn title=\"Align left\" active={currentAlign === 'left'} onClick={() => run({ align: 'left' })}> <AlignLeftIcon /> </Btn>\n <Btn title=\"Align center\" active={currentAlign === 'center'} onClick={() => run({ align: 'center' })}> <AlignCenterIcon /> </Btn>\n <Btn title=\"Align right\" active={currentAlign === 'right'} onClick={() => run({ align: 'right' })}> <AlignRightIcon /> </Btn>\n\n <Sep />\n\n {/* Caption */}\n <Btn\n title={hasCaption ? 'Edit caption' : 'Add caption'}\n active={hasCaption}\n onClick={() => {\n setCaptionInput((imageNode?.attrs?.caption as string) ?? '');\n setCaptionOpen((v) => !v);\n }}\n >\n <CaptionIcon />\n </Btn>\n\n <Sep />\n\n {/* Delete */}\n <Btn title=\"Delete image\" danger onClick={handleDelete}>\n <DeleteIcon />\n </Btn>\n </div>\n\n {/* Caption editor popover */}\n {captionOpen && (\n <CaptionPopover\n value={captionInput}\n hasCaption={hasCaption}\n onChange={setCaptionInput}\n onCommit={commitCaption}\n onRemove={removeCaption}\n onCancel={() => setCaptionOpen(false)}\n imagePath={imagePath}\n editorContainer={editorContainer}\n />\n )}\n </>\n );\n}\n\n// ─── Caption popover ──────────────────────────────────────────────────────────\n\nfunction CaptionPopover({\n value, hasCaption, onChange, onCommit, onRemove, onCancel, imagePath, editorContainer,\n}: {\n value: string;\n hasCaption: boolean;\n onChange: (v: string) => void;\n onCommit: () => void;\n onRemove: () => void;\n onCancel: () => void;\n imagePath: number[];\n editorContainer: React.RefObject<HTMLDivElement | null>;\n}) {\n const ref = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const container = editorContainer.current;\n const el = ref.current;\n if (!container || !el) return;\n const fig = container.querySelector(\n `[data-image-path=\"${JSON.stringify(imagePath)}\"]`,\n ) as HTMLElement | null;\n if (!fig) return;\n const rect = fig.getBoundingClientRect();\n el.style.top = `${rect.bottom + 6}px`;\n el.style.left = `${rect.left}px`;\n el.style.visibility = 'visible';\n });\n\n return (\n <div\n ref={ref}\n style={{ position: 'fixed', visibility: 'hidden', zIndex: 9200 }}\n onMouseDown={(e) => e.stopPropagation()}\n className=\"w-64 rounded-lg border border-gray-200 bg-white p-3 shadow-xl \"\n >\n <p className=\"text-[10px] font-semibold uppercase tracking-widest text-gray-400 mb-1.5\">\n Image caption\n </p>\n <input\n autoFocus\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n onKeyDown={(e) => { if (e.key === 'Enter') onCommit(); if (e.key === 'Escape') onCancel(); }}\n placeholder=\"Enter caption…\"\n className=\"w-full px-2.5 py-1.5 text-xs rounded border outline-none\n border-gray-300 \n bg-white text-gray-900 \n focus:ring-2 focus:ring-blue-500 focus:border-transparent\"\n />\n <div className=\"flex justify-between mt-2\">\n <div>\n {hasCaption && (\n <button\n type=\"button\"\n onClick={onRemove}\n className=\"text-xs text-red-500 hover:text-red-600\"\n >\n Remove\n </button>\n )}\n </div>\n <div className=\"flex gap-2\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"text-xs text-gray-500 hover:text-gray-700 \"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n onClick={onCommit}\n className=\"px-2.5 py-1 text-xs bg-blue-600 text-white rounded hover:bg-blue-700\"\n >\n Save\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// ─── Sub-components ───────────────────────────────────────────────────────────\n\nfunction Btn({\n title, onClick, active, danger, children,\n}: {\n title: string; onClick: () => void; active?: boolean; danger?: boolean; children: React.ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n title={title}\n onMouseDown={(e) => { e.preventDefault(); onClick(); }}\n className={[\n 'flex h-7 w-7 items-center justify-center rounded transition-colors',\n 'focus:outline-none focus-visible:ring-2 focus-visible:ring-blue-500',\n danger\n ? 'text-red-500 hover:bg-red-50 '\n : active\n ? 'bg-blue-100 text-blue-700 '\n : 'text-gray-600 hover:bg-gray-100 ',\n ].join(' ')}\n >\n {children}\n </button>\n );\n}\n\nfunction Sep() {\n return <div className=\"mx-0.5 h-5 w-px bg-gray-200 \" />;\n}\n\nfunction AlignLeftIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\"/><line x1=\"2\" y1=\"8\" x2=\"10\" y2=\"8\"/><line x1=\"2\" y1=\"12\" x2=\"12\" y2=\"12\"/>\n </svg>\n );\n}\n\nfunction AlignCenterIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\"/><line x1=\"4\" y1=\"8\" x2=\"12\" y2=\"8\"/><line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\"/>\n </svg>\n );\n}\n\nfunction AlignRightIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\">\n <line x1=\"2\" y1=\"4\" x2=\"14\" y2=\"4\"/><line x1=\"6\" y1=\"8\" x2=\"14\" y2=\"8\"/><line x1=\"4\" y1=\"12\" x2=\"14\" y2=\"12\"/>\n </svg>\n );\n}\n\nfunction CaptionIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"1\" y=\"2\" width=\"14\" height=\"9\" rx=\"1.5\"/>\n <line x1=\"4\" y1=\"14\" x2=\"12\" y2=\"14\"/>\n </svg>\n );\n}\n\nfunction DeleteIcon() {\n return (\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"1.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"2 4 4 4 14 4\"/><path d=\"M5 4V3a1 1 0 0 1 1-1h4a1 1 0 0 1 1 1v1\"/><path d=\"M6 7v5m4-5v5\"/><rect x=\"3\" y=\"4\" width=\"10\" height=\"10\" rx=\"1\"/>\n </svg>\n );\n}\n","/**\n * JSONSerializer\n *\n * Converts the document model to/from a JSON representation.\n * The JSON format IS the model — this serializer is essentially\n * a thin validation + round-trip layer.\n *\n * Use case: persist editor content to a database, load it back.\n */\n\nimport type { Document, Serializer } from '../../types';\nimport { createEmptyDocument } from '../core/DocumentModel';\n\nexport const jsonSerializer: Serializer<string> = {\n serialize(doc: Document): string {\n return JSON.stringify(doc, null, 2);\n },\n\n deserialize(json: string): Document {\n try {\n const parsed = JSON.parse(json);\n if (parsed?.type !== 'doc' || !Array.isArray(parsed?.children)) {\n console.warn('[JSONSerializer] Invalid document JSON, returning empty doc');\n return createEmptyDocument();\n }\n return parsed as Document;\n } catch {\n console.warn('[JSONSerializer] Failed to parse JSON');\n return createEmptyDocument();\n }\n },\n};\n","'use client';\r\n\r\nimport React, {\r\n useRef,\r\n useEffect,\r\n useLayoutEffect,\r\n useCallback,\r\n useState,\r\n} from 'react';\r\n\r\nimport type { EditorEngine } from '../editor/core/EditorEngine';\r\nimport type { EditorState } from '../types';\r\n\r\nimport { useEditorState } from '../hooks/useEditorState';\r\n\r\nimport { renderDocument } from '../editor/rendering/DOMRenderer';\r\n\r\nimport {\r\n captureSelection,\r\n restoreSelection,\r\n isSelectionInContainer,\r\n makeCollapsedSelection,\r\n} from '../editor/selection/SelectionEngine';\r\n\r\nimport { attachClipboardHandlers } from '../editor/plugins/PastePlugin';\r\n\r\nimport {\r\n createTransaction,\r\n tr_setSelection,\r\n tr_replaceDoc,\r\n} from '../editor/core/Transaction';\r\n\r\nimport {\r\n handleEnter,\r\n handleBackspace,\r\n handleDelete,\r\n insertText,\r\n toggleCheckItemAt,\r\n indentListItem,\r\n outdentListItem,\r\n} from '../editor/commands';\r\nimport { findContentBlockPath } from '../editor/core/DocumentModel';\r\n\r\nimport { Toolbar } from './toolbar/Toolbar';\r\nimport { FindReplaceModal } from './FindReplaceModal';\r\nimport { TableContextMenu } from './TableContextMenu';\r\nimport { TableToolbar } from './toolbar/TableToolbar';\r\nimport { ImageToolbar } from './toolbar/ImageToolbar';\r\nimport { getNodeAtPath } from '../editor/core/DocumentModel';\r\nimport { findCellPosition } from '../editor/table/TableModel';\r\nimport { setColumnWidth } from '../editor/table/TableCommands';\r\nimport type { BlockNode } from '../types';\r\n\r\nimport { htmlSerializer } from '../editor/serialization/HTMLSerializer';\r\nimport { jsonSerializer } from '../editor/serialization/JSONSerializer';\r\n\r\nimport { insertImage, deleteImageAtPath, setImageAttr } from '../editor/commands';\r\n\r\nexport interface EditorCoreProps {\r\n engine: EditorEngine;\r\n placeholder?: string;\r\n className?: string;\r\n readOnly?: boolean;\r\n onHTMLChange?: (html: string) => void;\r\n onJSONChange?: (json: string) => void;\r\n /** Called when Ctrl/Cmd+K is pressed — parent opens the link popup */\r\n onOpenLinkPopup?: () => void;\r\n /** Custom upload handler. Receives a File, returns the final URL. If omitted, blob URLs are used. */\r\n onUploadImage?: (file: File) => Promise<string>;\r\n /** Called when the editor receives focus */\r\n onFocus?: () => void;\r\n /** Called when the editor loses focus */\r\n onBlur?: () => void;\r\n /** Hide toolbar without enabling readOnly (toolbar=false prop on public Editor) */\r\n hideToolbar?: boolean;\r\n /** Ordered list of toolbar items to render */\r\n toolbarConfig?: import('../types/public').EditorToolbarConfig;\r\n}\r\n\r\nexport function EditorCore({\r\n engine,\r\n placeholder = 'Start writing...',\r\n className = '',\r\n readOnly = false,\r\n onHTMLChange,\r\n onJSONChange,\r\n onOpenLinkPopup,\r\n onUploadImage: _onUploadImage,\r\n onFocus: onFocusProp,\r\n onBlur: onBlurProp,\r\n hideToolbar = false,\r\n toolbarConfig,\r\n}: EditorCoreProps) {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n const isRenderingRef = useRef(false);\r\n // True when selection change came from user gesture (click/drag/keyboard).\r\n // The selection-only useLayoutEffect must NOT call restoreSelection in that case —\r\n // DOM already correct, writing back fights the browser mid-gesture → stuck highlight.\r\n const skipRestoreSelectionRef = useRef(false);\r\n\r\n // ── Caret scroll helper ──────────────────────────────────────────────────────\r\n // After DOM rebuild + restoreSelection, browser loses native scroll-to-caret.\r\n // Replicates that behavior: find caret rect, scroll nearest scrollable ancestor.\r\n const scrollCaretIntoView = useCallback(() => {\r\n const sel = window.getSelection();\r\n if (!sel || sel.rangeCount === 0) return;\r\n\r\n const range = sel.getRangeAt(0).cloneRange();\r\n range.collapse(true);\r\n const caretRect = range.getBoundingClientRect();\r\n\r\n let rect = caretRect;\r\n if (!rect || (rect.top === 0 && rect.bottom === 0 && rect.left === 0)) {\r\n const node = range.startContainer;\r\n const el = node.nodeType === Node.ELEMENT_NODE\r\n ? (node as Element)\r\n : node.parentElement;\r\n if (el) rect = el.getBoundingClientRect();\r\n }\r\n\r\n if (!rect || rect.bottom === 0) return;\r\n\r\n let scrollEl: Element | null = containerRef.current?.parentElement ?? null;\r\n while (scrollEl) {\r\n const style = window.getComputedStyle(scrollEl);\r\n const overflow = style.overflow + style.overflowY;\r\n if (/auto|scroll/.test(overflow)) break;\r\n scrollEl = scrollEl.parentElement;\r\n }\r\n\r\n const PADDING = 24;\r\n\r\n if (scrollEl) {\r\n const containerRect = scrollEl.getBoundingClientRect();\r\n if (rect.bottom > containerRect.bottom - PADDING) {\r\n scrollEl.scrollBy({ top: rect.bottom - containerRect.bottom + PADDING, behavior: 'smooth' });\r\n } else if (rect.top < containerRect.top + PADDING) {\r\n scrollEl.scrollBy({ top: rect.top - containerRect.top - PADDING, behavior: 'smooth' });\r\n }\r\n } else {\r\n if (rect.bottom > window.innerHeight - PADDING) {\r\n window.scrollBy({ top: rect.bottom - window.innerHeight + PADDING, behavior: 'smooth' });\r\n } else if (rect.top < PADDING) {\r\n window.scrollBy({ top: rect.top - PADDING, behavior: 'smooth' });\r\n }\r\n }\r\n }, []);\r\n const isComposingRef = useRef(false);\r\n\r\n const stateRef = useRef<EditorState>(engine.getState());\r\n\r\n const [selectedImagePath, setSelectedImagePath] = useState<number[] | null>(null);\r\n const [imageDragging, setImageDragging] = useState(false);\r\n const [findReplaceOpen, setFindReplaceOpen] = useState(false);\r\n const [findReplaceMode, setFindReplaceMode] = useState<'find' | 'replace'>('find');\r\n const [linkPopupOpen, setLinkPopupOpen] = useState(false);\r\n const [isSourceMode, setIsSourceMode] = useState(false);\r\n const [sourceHTML, setSourceHTML] = useState('');\r\n const [editorHeight, setEditorHeight] = useState<number | null>(null);\r\n const editorRootRef = useRef<HTMLDivElement>(null);\r\n const resizeDragRef = useRef<{ startY: number; startHeight: number } | null>(null);\r\n const [linkTooltip, setLinkTooltip] = useState<{\r\n href: string; x: number; y: number;\r\n } | null>(null);\r\n const linkTooltipTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n // ── Source editing toggle ────────────────────────────────────────────────────\r\n const handleToggleSource = useCallback(() => {\r\n if (!isSourceMode) {\r\n // Visual → Source: serialize current doc to formatted HTML\r\n const html = htmlSerializer.serialize(engine.getState().doc);\r\n setSourceHTML(prettyPrintHTML(html));\r\n setIsSourceMode(true);\r\n } else {\r\n // Source → Visual: parse HTML, dispatch replace_doc\r\n const newDoc = htmlSerializer.deserialize(sourceHTML);\r\n const tr = createTransaction();\r\n tr.steps.push(tr_replaceDoc(newDoc));\r\n engine.dispatch(tr);\r\n setIsSourceMode(false);\r\n }\r\n }, [isSourceMode, sourceHTML, engine]);\r\n\r\n // ── Editor resize drag ───────────────────────────────────────────────────────\r\n useEffect(() => {\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = resizeDragRef.current;\r\n if (!drag) return;\r\n const newHeight = Math.max(120, drag.startHeight + (e.clientY - drag.startY));\r\n setEditorHeight(newHeight);\r\n };\r\n const onMouseUp = () => { resizeDragRef.current = null; };\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, []);\r\n\r\n // ── Table state ─────────────────────────────────────────────────────────────\r\n const [tableContextMenu, setTableContextMenu] = useState<{\r\n x: number; y: number;\r\n tablePath: number[]; row: number; col: number; isMerged: boolean;\r\n } | null>(null);\r\n\r\n const [tableSelection, setTableSelection] = useState<{\r\n tablePath: number[];\r\n anchorCell: [number, number];\r\n focusCell: [number, number];\r\n } | null>(null);\r\n\r\n // Tracks an active cell-range drag (mousedown on a td → mousemove across cells)\r\n const cellDragRef = useRef<{\r\n tablePath: number[]; startRow: number; startCol: number;\r\n } | null>(null);\r\n\r\n // Tracks an active column resize drag\r\n const colResizeRef = useRef<{\r\n tablePath: number[]; colIndex: number;\r\n startX: number; startWidth: number;\r\n } | null>(null);\r\n\r\n const state = useEditorState(engine);\r\n\r\n // Detect cursor inside a table for the floating TableToolbar\r\n const inTableCellPos = state.selection\r\n ? findCellPosition(state.doc, state.selection.anchor.path)\r\n : null;\r\n\r\n /*\r\n * Keep latest state in ref\r\n */\r\n useLayoutEffect(() => {\r\n stateRef.current = state;\r\n }, [state]);\r\n\r\n /*\r\n * INITIAL RENDER + DOM SYNC\r\n *\r\n * IMPORTANT:\r\n * - useLayoutEffect instead of useEffect\r\n * - no requestAnimationFrame\r\n * - restore selection synchronously\r\n * - depend only on state.doc\r\n */\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n\r\n if (!container) return;\r\n\r\n isRenderingRef.current = true;\r\n\r\n renderDocument(state.doc, container);\r\n\r\n // Focus the editor before restoring selection so the cursor is visible.\r\n // This is needed when focus was in a toolbar popover (e.g. link input).\r\n if (!container.contains(document.activeElement)) {\r\n container.focus({ preventScroll: true });\r\n }\r\n\r\n if (state.selection) {\r\n restoreSelection(container, state.selection);\r\n scrollCaretIntoView();\r\n }\r\n\r\n isRenderingRef.current = false;\r\n\r\n if (onHTMLChange) {\r\n onHTMLChange(htmlSerializer.serialize(state.doc));\r\n }\r\n\r\n if (onJSONChange) {\r\n onJSONChange(jsonSerializer.serialize(state.doc));\r\n }\r\n }, [state.doc]);\r\n\r\n /*\r\n * Selection-only sync — runs when selection changes but doc does NOT change.\r\n * (e.g. Tab cell navigation, Shift+Tab, toolbar cursor moves, find/replace jumps)\r\n * The doc-change layout effect above already calls restoreSelection after\r\n * renderDocument; this covers the case where only state.selection changed.\r\n */\r\n useLayoutEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || !state.selection) return;\r\n // User-initiated change: DOM already has correct selection; skip roundtrip.\r\n if (skipRestoreSelectionRef.current) {\r\n skipRestoreSelectionRef.current = false;\r\n return;\r\n }\r\n // Programmatic change (Tab, find/replace, command cursor move) → write to DOM.\r\n isRenderingRef.current = true;\r\n restoreSelection(container, state.selection);\r\n scrollCaretIntoView();\r\n isRenderingRef.current = false;\r\n }, [state.selection]);\r\n\r\n /*\r\n * Paste handler\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n\r\n if (!container || readOnly) return;\r\n\r\n return attachClipboardHandlers(container, engine);\r\n }, [engine, readOnly]);\r\n\r\n /*\r\n * Table cell-selection highlight — apply/remove CSS class on selected cells\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n // Clear previous highlights\r\n container.querySelectorAll('.editor-cell-selected').forEach((el) => {\r\n el.classList.remove('editor-cell-selected');\r\n });\r\n if (!tableSelection) return;\r\n const { tablePath, anchorCell, focusCell } = tableSelection;\r\n const minRow = Math.min(anchorCell[0], focusCell[0]);\r\n const maxRow = Math.max(anchorCell[0], focusCell[0]);\r\n const minCol = Math.min(anchorCell[1], focusCell[1]);\r\n const maxCol = Math.max(anchorCell[1], focusCell[1]);\r\n for (let r = minRow; r <= maxRow; r++) {\r\n for (let c = minCol; c <= maxCol; c++) {\r\n const cellPath = [...tablePath, r, c];\r\n const td = container.querySelector(\r\n `[data-block-path=\"${JSON.stringify(cellPath)}\"]`,\r\n ) as HTMLElement | null;\r\n if (td) td.classList.add('editor-cell-selected');\r\n }\r\n }\r\n }, [tableSelection, state.doc]);\r\n\r\n /*\r\n * Active cell highlight — outline the cell the cursor is currently inside.\r\n * Also clears tableSelection (multi-cell drag) when cursor moves to a different\r\n * single cell so editor-cell-selected and editor-cell-active never coexist.\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n container.querySelectorAll('.editor-cell-active').forEach((el) => {\r\n el.classList.remove('editor-cell-active');\r\n });\r\n\r\n if (!inTableCellPos) {\r\n setTableSelection(null);\r\n return;\r\n }\r\n\r\n if (tableSelection) {\r\n const { anchorCell, focusCell, tablePath } = tableSelection;\r\n const sameTable = JSON.stringify(tablePath) === JSON.stringify(inTableCellPos.tablePath);\r\n const singleCell = anchorCell[0] === focusCell[0] && anchorCell[1] === focusCell[1];\r\n if (!sameTable || singleCell) {\r\n setTableSelection(null);\r\n }\r\n }\r\n\r\n const cellPath = [...inTableCellPos.tablePath, inTableCellPos.row, inTableCellPos.col];\r\n const td = container.querySelector(\r\n `[data-block-path=\"${JSON.stringify(cellPath)}\"]`,\r\n ) as HTMLElement | null;\r\n if (td) td.classList.add('editor-cell-active');\r\n }, [inTableCellPos, state.doc]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n /*\r\n * Selection Sync\r\n */\r\n useEffect(() => {\r\n const onSelectionChange = () => {\r\n if (isRenderingRef.current) return;\r\n\r\n const container = containerRef.current;\r\n\r\n if (!container) return;\r\n\r\n if (!isSelectionInContainer(container)) return;\r\n\r\n const captured = captureSelection(container);\r\n\r\n if (!captured) return;\r\n\r\n const currentSelection = engine.getState().selection;\r\n\r\n if (\r\n currentSelection &&\r\n JSON.stringify(currentSelection.anchor) ===\r\n JSON.stringify(captured.anchor) &&\r\n JSON.stringify(currentSelection.focus) ===\r\n JSON.stringify(captured.focus)\r\n ) {\r\n return;\r\n }\r\n\r\n skipRestoreSelectionRef.current = true;\r\n const tr = createTransaction();\r\n tr.steps.push(tr_setSelection(captured));\r\n engine.dispatch(tr);\r\n };\r\n\r\n document.addEventListener(\r\n 'selectionchange',\r\n onSelectionChange,\r\n );\r\n\r\n return () => {\r\n document.removeEventListener(\r\n 'selectionchange',\r\n onSelectionChange,\r\n );\r\n };\r\n }, [engine]);\r\n\r\n /*\r\n * Focus handling\r\n */\r\n const handleFocus = useCallback(() => {\r\n const currentState = engine.getState();\r\n\r\n if (!currentState.selection) {\r\n const tr = createTransaction();\r\n tr.steps.push(\r\n tr_setSelection(\r\n makeCollapsedSelection({ path: [0], offset: 0 }),\r\n ),\r\n );\r\n engine.dispatch(tr);\r\n }\r\n\r\n onFocusProp?.();\r\n }, [engine, onFocusProp]);\r\n\r\n const handleBlur = useCallback(() => {\r\n onBlurProp?.();\r\n }, [onBlurProp]);\r\n\r\n /*\r\n * Keyboard handling\r\n */\r\n const handleKeyDown = useCallback(\r\n (e: React.KeyboardEvent<HTMLDivElement>) => {\r\n if (readOnly) return;\r\n\r\n // Find / Replace shortcuts — handled before the plugin system\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'f') {\r\n e.preventDefault();\r\n setFindReplaceMode('find');\r\n setFindReplaceOpen(true);\r\n return;\r\n }\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'h') {\r\n e.preventDefault();\r\n setFindReplaceMode('replace');\r\n setFindReplaceOpen(true);\r\n return;\r\n }\r\n if ((e.ctrlKey || e.metaKey) && e.key === 'k') {\r\n e.preventDefault();\r\n setLinkPopupOpen(true);\r\n onOpenLinkPopup?.();\r\n return;\r\n }\r\n\r\n // Ctrl+A — select all editor content\r\n if ((e.ctrlKey || e.metaKey) && (e.key === 'a' || e.key === 'A')) {\r\n e.preventDefault();\r\n const container = containerRef.current;\r\n if (container) {\r\n const spans = container.querySelectorAll<HTMLElement>('[data-path]');\r\n const first = spans[0];\r\n const last = spans[spans.length - 1];\r\n if (first && last) {\r\n const sel = window.getSelection();\r\n const range = document.createRange();\r\n range.setStart(leafTextNode(first, 'first') ?? first, 0);\r\n const lastLeaf = leafTextNode(last, 'last');\r\n range.setEnd(lastLeaf ?? last, lastLeaf?.textContent?.length ?? 0);\r\n sel?.removeAllRanges();\r\n sel?.addRange(range);\r\n }\r\n }\r\n return;\r\n }\r\n\r\n // Delete/Backspace on a selected image\r\n if (selectedImagePath && (e.key === 'Delete' || e.key === 'Backspace')) {\r\n e.preventDefault();\r\n deleteImageAtPath(selectedImagePath)(engine);\r\n setSelectedImagePath(null);\r\n return;\r\n }\r\n // Any key clears image selection so typing resumes normally\r\n if (selectedImagePath) setSelectedImagePath(null);\r\n\r\n // Tab inside code_block → insert 2 spaces; inside list → indent/outdent;\r\n // inside table cell → cell navigation (handled by TablePlugin, but\r\n // preventDefault here so browser never gets a chance to move focus out).\r\n if (e.key === 'Tab') {\r\n const { doc, selection: sel } = engine.getState();\r\n if (sel) {\r\n const bp = findContentBlockPath(doc, sel.anchor.path);\r\n const block = bp ? (getNodeAtPath(doc, bp) as BlockNode | null) : null;\r\n if (block?.type === 'code_block') {\r\n e.preventDefault();\r\n insertText(' ')(engine);\r\n return;\r\n }\r\n if (block?.type === 'list_item') {\r\n e.preventDefault();\r\n if (e.shiftKey) {\r\n outdentListItem(engine);\r\n } else {\r\n indentListItem(engine);\r\n }\r\n return;\r\n }\r\n // Prevent browser default (focus jump / tab-char insertion) for table cells.\r\n if (findCellPosition(doc, sel.anchor.path)) {\r\n e.preventDefault();\r\n // TablePlugin's Tab / Shift+Tab binding handles the actual navigation.\r\n }\r\n }\r\n }\r\n\r\n const handled = engine.handleKeyDown(\r\n e.nativeEvent,\r\n );\r\n\r\n if (handled) return;\r\n\r\n if (e.key === 'Enter' && !e.shiftKey) {\r\n e.preventDefault();\r\n\r\n handleEnter(engine);\r\n\r\n return;\r\n }\r\n\r\n if (e.key === 'Backspace') {\r\n e.preventDefault();\r\n handleBackspace(engine);\r\n return;\r\n }\r\n\r\n if (e.key === 'Delete') {\r\n e.preventDefault();\r\n handleDelete(engine);\r\n return;\r\n }\r\n\r\n if (e.key === 'Enter' && e.shiftKey) {\r\n e.preventDefault();\r\n insertText('\\n')(engine);\r\n return;\r\n }\r\n },\r\n [engine, readOnly, onOpenLinkPopup, selectedImagePath],\r\n );\r\n\r\n /*\r\n * Native beforeinput handler.\r\n *\r\n * IMPORTANT: We attach this via addEventListener instead of React's\r\n * `onBeforeInput` because React polyfills `onBeforeInput` on top of `onInput`,\r\n * which fires AFTER the browser has mutated the DOM. preventDefault() on the\r\n * synthetic event does nothing. The native `beforeinput` event is the only\r\n * place we can intercept input before the DOM drifts from the model.\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || readOnly) return;\r\n\r\n const onBeforeInput = (e: InputEvent) => {\r\n if (e.isComposing || isComposingRef.current) return;\r\n\r\n switch (e.inputType) {\r\n case 'insertText':\r\n case 'insertReplacementText': {\r\n if (!e.data) return;\r\n e.preventDefault();\r\n insertText(e.data)(engine);\r\n return;\r\n }\r\n case 'insertParagraph': {\r\n e.preventDefault();\r\n handleEnter(engine);\r\n return;\r\n }\r\n case 'insertLineBreak': {\r\n e.preventDefault();\r\n insertText('\\n')(engine);\r\n return;\r\n }\r\n case 'deleteContentBackward':\r\n case 'deleteWordBackward':\r\n case 'deleteSoftLineBackward': {\r\n e.preventDefault();\r\n handleBackspace(engine);\r\n return;\r\n }\r\n case 'insertFromPaste':\r\n case 'insertFromDrop':\r\n // PastePlugin owns these.\r\n return;\r\n default:\r\n // Block any input type we don't model so the DOM can't drift.\r\n e.preventDefault();\r\n }\r\n };\r\n\r\n container.addEventListener('beforeinput', onBeforeInput);\r\n return () => container.removeEventListener('beforeinput', onBeforeInput);\r\n }, [engine, readOnly]);\r\n\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || readOnly) return;\r\n\r\n const onCompositionStart = () => {\r\n isComposingRef.current = true;\r\n };\r\n const onCompositionEnd = (e: CompositionEvent) => {\r\n isComposingRef.current = false;\r\n if (e.data) insertText(e.data)(engine);\r\n };\r\n\r\n container.addEventListener('compositionstart', onCompositionStart);\r\n container.addEventListener('compositionend', onCompositionEnd);\r\n return () => {\r\n container.removeEventListener('compositionstart', onCompositionStart);\r\n container.removeEventListener('compositionend', onCompositionEnd);\r\n };\r\n }, [engine, readOnly]);\r\n\r\n /*\r\n * Link tooltip — show on hover, open on Ctrl+Click\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n\r\n const onMouseOver = (e: MouseEvent) => {\r\n const anchor = (e.target as HTMLElement).closest<HTMLAnchorElement>('a.editor-link');\r\n if (!anchor) return;\r\n const href = anchor.getAttribute('href') ?? '';\r\n if (!href) return;\r\n if (linkTooltipTimerRef.current) clearTimeout(linkTooltipTimerRef.current);\r\n linkTooltipTimerRef.current = setTimeout(() => {\r\n const rect = anchor.getBoundingClientRect();\r\n const containerRect = container.getBoundingClientRect();\r\n setLinkTooltip({\r\n href,\r\n x: rect.left - containerRect.left,\r\n y: rect.bottom - containerRect.top + 6,\r\n });\r\n }, 200);\r\n };\r\n\r\n const onMouseOut = (e: MouseEvent) => {\r\n const anchor = (e.target as HTMLElement).closest('a.editor-link');\r\n if (!anchor) return;\r\n if (linkTooltipTimerRef.current) clearTimeout(linkTooltipTimerRef.current);\r\n setLinkTooltip(null);\r\n };\r\n\r\n const onClick = (e: MouseEvent) => {\r\n // Ctrl/Cmd + click on a link → open in new tab\r\n if (!(e.ctrlKey || e.metaKey)) return;\r\n const anchor = (e.target as HTMLElement).closest<HTMLAnchorElement>('a.editor-link');\r\n if (!anchor) return;\r\n e.preventDefault();\r\n const href = anchor.getAttribute('href');\r\n if (href) window.open(href, '_blank', 'noopener,noreferrer');\r\n };\r\n\r\n container.addEventListener('mouseover', onMouseOver);\r\n container.addEventListener('mouseout', onMouseOut);\r\n container.addEventListener('click', onClick);\r\n return () => {\r\n container.removeEventListener('mouseover', onMouseOver);\r\n container.removeEventListener('mouseout', onMouseOut);\r\n container.removeEventListener('click', onClick);\r\n if (linkTooltipTimerRef.current) clearTimeout(linkTooltipTimerRef.current);\r\n };\r\n }, []);\r\n\r\n /*\r\n * Column resize — document-level mouse tracking while drag is active\r\n */\r\n useEffect(() => {\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = colResizeRef.current;\r\n if (!drag) return;\r\n const delta = e.clientX - drag.startX;\r\n const newWidth = Math.max(40, drag.startWidth + delta);\r\n // Apply width visually to the col element without dispatching (perf)\r\n const container = containerRef.current;\r\n if (container) {\r\n const colEl = container.querySelector(\r\n `col[data-col-index=\"${drag.colIndex}\"]`,\r\n ) as HTMLElement | null;\r\n if (colEl) colEl.style.width = `${newWidth}px`;\r\n }\r\n };\r\n\r\n const onMouseUp = (e: MouseEvent) => {\r\n const drag = colResizeRef.current;\r\n if (!drag) return;\r\n const delta = e.clientX - drag.startX;\r\n const newWidth = Math.max(40, drag.startWidth + delta);\r\n colResizeRef.current = null;\r\n setColumnWidth(drag.tablePath, drag.colIndex, newWidth)(engine);\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, [engine]);\r\n\r\n /*\r\n * Cell selection drag — track which cells are highlighted as mouse moves\r\n */\r\n useEffect(() => {\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = cellDragRef.current;\r\n if (!drag) return;\r\n const td = (e.target as HTMLElement).closest('[data-cell-row]') as HTMLElement | null;\r\n if (!td) return;\r\n const row = parseInt(td.dataset.cellRow ?? '0');\r\n const col = parseInt(td.dataset.cellCol ?? '0');\r\n const tdTablePath = td.dataset.cellTablePath\r\n ? (JSON.parse(td.dataset.cellTablePath) as number[])\r\n : null;\r\n if (!tdTablePath || JSON.stringify(tdTablePath) !== JSON.stringify(drag.tablePath)) return;\r\n setTableSelection({\r\n tablePath: drag.tablePath,\r\n anchorCell: [drag.startRow, drag.startCol],\r\n focusCell: [row, col],\r\n });\r\n };\r\n\r\n const onMouseUp = () => {\r\n cellDragRef.current = null;\r\n };\r\n\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, []);\r\n\r\n /*\r\n * Context menu — right-click inside a table cell\r\n */\r\n const handleContextMenu = useCallback(\r\n (e: React.MouseEvent<HTMLDivElement>) => {\r\n const td = (e.target as HTMLElement).closest('[data-cell-row]') as HTMLElement | null;\r\n if (!td) return;\r\n e.preventDefault();\r\n const row = parseInt(td.dataset.cellRow ?? '0');\r\n const col = parseInt(td.dataset.cellCol ?? '0');\r\n const tablePath = td.dataset.cellTablePath\r\n ? (JSON.parse(td.dataset.cellTablePath) as number[])\r\n : null;\r\n if (!tablePath) return;\r\n\r\n const cellNode = getNodeAtPath(\r\n engine.getState().doc,\r\n [...tablePath, row, col],\r\n ) as BlockNode | null;\r\n const isMerged =\r\n !!cellNode &&\r\n (((cellNode.attrs?.colspan as number) ?? 1) > 1 ||\r\n ((cellNode.attrs?.rowspan as number) ?? 1) > 1);\r\n\r\n setTableContextMenu({ x: e.clientX, y: e.clientY, tablePath, row, col, isMerged });\r\n },\r\n [engine],\r\n );\r\n\r\n /*\r\n * Checkbox mousedown — toggle check_list_item without moving cursor to the input\r\n */\r\n const handleMouseDown = useCallback(\r\n (e: React.MouseEvent<HTMLDivElement>) => {\r\n if (readOnly) return;\r\n const target = e.target as HTMLElement;\r\n\r\n // Image resize handle\r\n if (target.dataset.resizeImagePath) {\r\n e.preventDefault();\r\n const imagePath = JSON.parse(target.dataset.resizeImagePath) as number[];\r\n const corner = target.dataset.resizeImagePos ?? 'se';\r\n const container = containerRef.current;\r\n let startWidth = 300;\r\n if (container) {\r\n const fig = container.querySelector(`[data-image-path=\"${JSON.stringify(imagePath)}\"]`);\r\n const img = fig?.querySelector('img') as HTMLImageElement | null;\r\n if (img) startWidth = img.getBoundingClientRect().width || 300;\r\n }\r\n imageResizeRef.current = {\r\n imagePath, corner, startX: e.clientX, startY: e.clientY,\r\n startWidth, startHeight: 0,\r\n };\r\n return;\r\n }\r\n\r\n // Image click / drag start — select image and begin potential drag\r\n const fig = target.closest('[data-image-path]') as HTMLElement | null;\r\n if (fig?.dataset.imagePath) {\r\n e.preventDefault();\r\n const path = JSON.parse(fig.dataset.imagePath) as number[];\r\n setSelectedImagePath(path);\r\n const imgEl = fig.querySelector('img') as HTMLImageElement | null;\r\n const figRect = (fig as HTMLElement).getBoundingClientRect();\r\n imageDragRef.current = {\r\n imagePath: path,\r\n startX: e.clientX, startY: e.clientY,\r\n active: false,\r\n ghostW: Math.min(figRect.width || 300, 320),\r\n ghostH: Math.min(figRect.height || 200, 200),\r\n ghostSrc: imgEl?.src || '',\r\n offsetX: e.clientX - figRect.left,\r\n offsetY: e.clientY - figRect.top,\r\n };\r\n return;\r\n }\r\n // Clear image selection when clicking elsewhere\r\n setSelectedImagePath(null);\r\n\r\n // Column resize handle\r\n if ((target as HTMLElement).dataset.resizeTable) {\r\n e.preventDefault();\r\n const tablePath = JSON.parse((target as HTMLElement).dataset.resizeTable!) as number[];\r\n const colIndex = parseInt((target as HTMLElement).dataset.resizeCol ?? '0');\r\n // Read current col width from DOM\r\n const container = containerRef.current;\r\n let startWidth = 120;\r\n if (container) {\r\n const colEl = container.querySelector(\r\n `col[data-col-index=\"${colIndex}\"]`,\r\n ) as HTMLElement | null;\r\n if (colEl) startWidth = colEl.getBoundingClientRect().width || 120;\r\n }\r\n colResizeRef.current = { tablePath, colIndex, startX: e.clientX, startWidth };\r\n return;\r\n }\r\n\r\n // Cell selection drag start — clear selection if clicking outside any table\r\n const td = (target as HTMLElement).closest('[data-cell-row]') as HTMLElement | null;\r\n if (!td) setTableSelection(null);\r\n if (td && !readOnly) {\r\n const row = parseInt(td.dataset.cellRow ?? '0');\r\n const col = parseInt(td.dataset.cellCol ?? '0');\r\n const tdTablePath = td.dataset.cellTablePath\r\n ? (JSON.parse(td.dataset.cellTablePath) as number[])\r\n : null;\r\n if (tdTablePath) {\r\n cellDragRef.current = { tablePath: tdTablePath, startRow: row, startCol: col };\r\n setTableSelection({\r\n tablePath: tdTablePath,\r\n anchorCell: [row, col],\r\n focusCell: [row, col],\r\n });\r\n }\r\n }\r\n\r\n // Checkbox toggle — target is the custom wrapper span or its SVG child\r\n const checkTarget = target.dataset.checkPath\r\n ? target\r\n : (target.closest('[data-check-path]') as HTMLElement | null);\r\n if (checkTarget?.dataset.checkPath) {\r\n e.preventDefault();\r\n toggleCheckItemAt(JSON.parse(checkTarget.dataset.checkPath))(engine);\r\n }\r\n },\r\n [engine, readOnly],\r\n );\r\n\r\n /*\r\n * Click handling\r\n */\r\n const handleClick = useCallback(() => {\r\n const container = containerRef.current;\r\n\r\n if (!container) return;\r\n\r\n const selection = captureSelection(container);\r\n\r\n if (!selection) return;\r\n\r\n skipRestoreSelectionRef.current = true;\r\n const tr = createTransaction();\r\n tr.steps.push(tr_setSelection(selection));\r\n engine.dispatch(tr);\r\n }, [engine]);\r\n\r\n /*\r\n * Image resize drag — document-level tracking\r\n */\r\n const imageResizeRef = useRef<{\r\n imagePath: number[]; corner: string;\r\n startX: number; startY: number; startWidth: number; startHeight: number;\r\n } | null>(null);\r\n\r\n /*\r\n * Image free-position drag — document-level tracking\r\n */\r\n const imageDragRef = useRef<{\r\n imagePath: number[];\r\n startX: number; startY: number;\r\n active: boolean;\r\n ghostW: number; ghostH: number; ghostSrc: string;\r\n offsetX: number; offsetY: number;\r\n } | null>(null);\r\n\r\n useEffect(() => {\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = imageResizeRef.current;\r\n if (!drag) return;\r\n const deltaX = e.clientX - drag.startX;\r\n const isRight = drag.corner === 'ne' || drag.corner === 'se';\r\n const newWidth = Math.max(60, drag.startWidth + (isRight ? deltaX : -deltaX));\r\n // Update DOM visually without dispatching\r\n const container = containerRef.current;\r\n if (container) {\r\n const fig = container.querySelector(\r\n `[data-image-path=\"${JSON.stringify(drag.imagePath)}\"]`,\r\n ) as HTMLElement | null;\r\n const img = fig?.querySelector('img') as HTMLImageElement | null;\r\n if (img) img.style.width = `${newWidth}px`;\r\n }\r\n };\r\n const onMouseUp = (e: MouseEvent) => {\r\n const drag = imageResizeRef.current;\r\n if (!drag) return;\r\n const deltaX = e.clientX - drag.startX;\r\n const isRight = drag.corner === 'ne' || drag.corner === 'se';\r\n const newWidth = Math.max(60, drag.startWidth + (isRight ? deltaX : -deltaX));\r\n imageResizeRef.current = null;\r\n setImageAttr(drag.imagePath, { width: newWidth })(engine);\r\n };\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, [engine]);\r\n\r\n /*\r\n * Image free-position drag — document-level mouse tracking\r\n */\r\n useEffect(() => {\r\n const DRAG_THRESHOLD = 4;\r\n const onMouseMove = (e: MouseEvent) => {\r\n const drag = imageDragRef.current;\r\n if (!drag) return;\r\n const dx = e.clientX - drag.startX;\r\n const dy = e.clientY - drag.startY;\r\n if (!drag.active && Math.sqrt(dx * dx + dy * dy) < DRAG_THRESHOLD) return;\r\n if (!drag.active) {\r\n drag.active = true;\r\n setImageDragging(true);\r\n document.body.style.userSelect = 'none';\r\n }\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const cr = container.getBoundingClientRect();\r\n const fig = container.querySelector(\r\n `[data-image-path=\"${JSON.stringify(drag.imagePath)}\"]`,\r\n ) as HTMLElement | null;\r\n const figW = fig?.offsetWidth || drag.ghostW;\r\n const figH = fig?.offsetHeight || drag.ghostH;\r\n const rawX = e.clientX - cr.left - drag.offsetX + container.scrollLeft;\r\n const rawY = e.clientY - cr.top - drag.offsetY + container.scrollTop;\r\n const x = Math.max(0, Math.min(rawX, container.clientWidth - figW));\r\n const y = Math.max(0, Math.min(rawY, container.offsetHeight - figH));\r\n // Update DOM directly (no dispatch — avoids re-render lag)\r\n if (fig) {\r\n fig.style.position = 'absolute';\r\n fig.style.left = `${x}px`;\r\n fig.style.top = `${y}px`;\r\n fig.style.margin = '0';\r\n fig.style.zIndex = '10';\r\n }\r\n };\r\n const onMouseUp = (e: MouseEvent) => {\r\n const drag = imageDragRef.current;\r\n if (!drag) return;\r\n imageDragRef.current = null;\r\n document.body.style.userSelect = '';\r\n setImageDragging(false);\r\n if (!drag.active) return;\r\n const container = containerRef.current;\r\n if (!container) return;\r\n const cr = container.getBoundingClientRect();\r\n const fig = container.querySelector(\r\n `[data-image-path=\"${JSON.stringify(drag.imagePath)}\"]`,\r\n ) as HTMLElement | null;\r\n const figW = fig?.offsetWidth || drag.ghostW;\r\n const figH = fig?.offsetHeight || drag.ghostH;\r\n const rawX = e.clientX - cr.left - drag.offsetX + container.scrollLeft;\r\n const rawY = e.clientY - cr.top - drag.offsetY + container.scrollTop;\r\n const x = Math.max(0, Math.min(rawX, container.clientWidth - figW));\r\n const y = Math.max(0, Math.min(rawY, container.offsetHeight - figH));\r\n setImageAttr(drag.imagePath, { x: Math.round(x), y: Math.round(y) })(engine);\r\n };\r\n document.addEventListener('mousemove', onMouseMove);\r\n document.addEventListener('mouseup', onMouseUp);\r\n return () => {\r\n document.removeEventListener('mousemove', onMouseMove);\r\n document.removeEventListener('mouseup', onMouseUp);\r\n };\r\n }, [engine]);\r\n\r\n /*\r\n * Apply / remove selected-image highlight in DOM\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container) return;\r\n container.querySelectorAll('[data-image-path]').forEach((el) => {\r\n el.removeAttribute('data-selected');\r\n });\r\n if (selectedImagePath) {\r\n const fig = container.querySelector(\r\n `[data-image-path=\"${JSON.stringify(selectedImagePath)}\"]`,\r\n );\r\n if (fig) fig.setAttribute('data-selected', 'true');\r\n }\r\n }, [selectedImagePath, state.doc]);\r\n\r\n /*\r\n * Drag & drop image files onto the editor canvas\r\n */\r\n useEffect(() => {\r\n const container = containerRef.current;\r\n if (!container || readOnly) return;\r\n const onDragOver = (e: DragEvent) => {\r\n if (e.dataTransfer?.types.includes('Files')) e.preventDefault();\r\n };\r\n const onDrop = (e: DragEvent) => {\r\n e.preventDefault();\r\n const file = e.dataTransfer?.files[0];\r\n if (!file || !file.type.startsWith('image/')) return;\r\n const blobUrl = URL.createObjectURL(file);\r\n insertImage(blobUrl, file.name.replace(/\\.[^.]+$/, ''))(engine);\r\n };\r\n container.addEventListener('dragover', onDragOver);\r\n container.addEventListener('drop', onDrop);\r\n return () => {\r\n container.removeEventListener('dragover', onDragOver);\r\n container.removeEventListener('drop', onDrop);\r\n };\r\n }, [engine, readOnly]);\r\n\r\n /*\r\n * Empty state\r\n */\r\n const isVisualEmpty =\r\n state.doc.children.length === 1 &&\r\n state.doc.children[0].type === 'paragraph' &&\r\n state.doc.children[0].children.length === 0;\r\n\r\n return (\r\n <div\r\n ref={editorRootRef}\r\n className={`editor-root relative flex flex-col ${className}`}\r\n style={editorHeight ? { minHeight: editorHeight } : undefined}\r\n >\r\n {!readOnly && !hideToolbar && (\r\n <Toolbar\r\n engine={engine}\r\n onFindReplace={(mode) => {\r\n setFindReplaceMode(mode);\r\n setFindReplaceOpen(true);\r\n }}\r\n linkPopupOpen={linkPopupOpen}\r\n onLinkPopupClose={() => setLinkPopupOpen(false)}\r\n isSourceMode={isSourceMode}\r\n onToggleSource={handleToggleSource}\r\n toolbarConfig={toolbarConfig}\r\n />\r\n )}\r\n\r\n <div className=\"relative\">\r\n {/* Source editing textarea */}\r\n {isSourceMode ? (\r\n <textarea\r\n aria-label=\"HTML source editor\"\r\n value={sourceHTML}\r\n onChange={(e) => {\r\n setSourceHTML(e.target.value);\r\n const t = e.target;\r\n t.style.height = 'auto';\r\n t.style.height = t.scrollHeight + 'px';\r\n }}\r\n ref={(el) => {\r\n if (el) { el.style.height = 'auto'; el.style.height = el.scrollHeight + 'px'; }\r\n }}\r\n spellCheck={false}\r\n className=\"w-full block px-6 py-4 font-mono text-sm leading-relaxed bg-gray-950 text-green-300 outline-none resize-none border-0 overflow-hidden\"\r\n />\r\n ) : (\r\n <>\r\n {isVisualEmpty && (\r\n <div\r\n className=\"\r\n absolute\r\n top-6\r\n left-6\r\n pointer-events-none\r\n select-none\r\n text-base\r\n text-gray-400\r\n \r\n \"\r\n aria-hidden=\"true\"\r\n >\r\n {placeholder}\r\n </div>\r\n )}\r\n\r\n <div\r\n ref={containerRef}\r\n contentEditable={!readOnly}\r\n suppressContentEditableWarning\r\n role=\"textbox\"\r\n aria-multiline=\"true\"\r\n aria-label=\"Rich text editor\"\r\n spellCheck\r\n onMouseDown={handleMouseDown}\r\n onContextMenu={handleContextMenu}\r\n onFocus={handleFocus}\r\n onBlur={handleBlur}\r\n onClick={handleClick}\r\n onKeyDown={handleKeyDown}\r\n className={[\r\n 'editor-canvas',\r\n 'min-h-[300px]',\r\n 'px-6',\r\n 'py-4',\r\n 'outline-none',\r\n 'text-base',\r\n 'leading-relaxed',\r\n 'text-gray-900',\r\n '',\r\n readOnly\r\n ? 'cursor-default'\r\n : 'cursor-text',\r\n ].join(' ')}\r\n />\r\n\r\n {/* Link hover tooltip */}\r\n {linkTooltip && (\r\n <div\r\n role=\"tooltip\"\r\n style={{ left: linkTooltip.x, top: linkTooltip.y }}\r\n className=\"absolute z-50 pointer-events-none flex items-center gap-1.5 bg-gray-900 text-white text-xs px-2.5 py-1.5 rounded shadow-lg max-w-xs\"\r\n >\r\n <svg width=\"11\" height=\"11\" viewBox=\"0 0 16 16\" fill=\"none\" className=\"shrink-0 opacity-70\" aria-hidden=\"true\">\r\n <path d=\"M6.5 3.5H4A2.5 2.5 0 0 0 4 8.5h2\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\r\n <path d=\"M9.5 3.5H12A2.5 2.5 0 0 1 12 8.5h-2\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\r\n <path d=\"M5.5 6h5\" stroke=\"currentColor\" strokeWidth=\"1.6\" strokeLinecap=\"round\"/>\r\n </svg>\r\n <span className=\"truncate\">{linkTooltip.href}</span>\r\n <span className=\"shrink-0 opacity-50 ml-1\">Ctrl+click to open</span>\r\n </div>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n\r\n {inTableCellPos && !readOnly && (\r\n <TableToolbar\r\n engine={engine}\r\n tablePath={inTableCellPos.tablePath}\r\n cellPos={{ row: inTableCellPos.row, col: inTableCellPos.col }}\r\n tableSelection={tableSelection}\r\n editorContainer={containerRef}\r\n />\r\n )}\r\n\r\n {tableContextMenu && (\r\n <TableContextMenu\r\n x={tableContextMenu.x}\r\n y={tableContextMenu.y}\r\n tablePath={tableContextMenu.tablePath}\r\n row={tableContextMenu.row}\r\n col={tableContextMenu.col}\r\n isMerged={tableContextMenu.isMerged}\r\n tableSelection={tableSelection}\r\n engine={engine}\r\n onClose={() => setTableContextMenu(null)}\r\n />\r\n )}\r\n\r\n {findReplaceOpen && (\r\n <FindReplaceModal\r\n engine={engine}\r\n editorContainer={containerRef}\r\n initialMode={findReplaceMode}\r\n onClose={() => setFindReplaceOpen(false)}\r\n />\r\n )}\r\n\r\n {selectedImagePath && !readOnly && (\r\n <ImageToolbar\r\n engine={engine}\r\n imagePath={selectedImagePath}\r\n editorContainer={containerRef}\r\n onClose={() => setSelectedImagePath(null)}\r\n />\r\n )}\r\n\r\n {/* Resize grip */}\r\n {!readOnly && (\r\n <div\r\n title=\"Drag to resize\"\r\n onMouseDown={(e) => {\r\n e.preventDefault();\r\n const rootEl = editorRootRef.current;\r\n if (!rootEl) return;\r\n resizeDragRef.current = {\r\n startY: e.clientY,\r\n startHeight: rootEl.getBoundingClientRect().height,\r\n };\r\n }}\r\n className=\"absolute bottom-0 right-0 w-4 h-4 cursor-s-resize flex items-end justify-end pr-0.5 pb-0.5 select-none\"\r\n aria-hidden=\"true\"\r\n >\r\n <svg width=\"8\" height=\"8\" viewBox=\"0 0 8 8\" fill=\"none\">\r\n <path d=\"M7 1L1 7M7 4L4 7M7 7L7 7\" stroke=\"#9ca3af\" strokeWidth=\"1.2\" strokeLinecap=\"round\"/>\r\n </svg>\r\n </div>\r\n )}\r\n </div>\r\n );\r\n}\r\n\r\n// ─── HTML pretty-printer ──────────────────────────────────────────────────────\r\n\r\nconst BLOCK_TAGS = 'p|h[1-6]|ul|ol|li|blockquote|pre|figure|table|thead|tbody|tr|th|td';\r\nconst _OPEN_ONLY_RE = new RegExp(`^<(${BLOCK_TAGS})(?:\\\\s[^>]*)?>$`, 'i');\r\nconst _CLOSE_ONLY_RE = new RegExp(`^<\\\\/(${BLOCK_TAGS})>$`, 'i');\r\n\r\nconst _HR_RE = /^<hr(\\s[^>]*)?\\/?>$/i;\r\n\r\nfunction leafTextNode(el: HTMLElement, end: 'first' | 'last'): Text | null {\r\n let node: Node = el;\r\n while (node.hasChildNodes()) {\r\n node = end === 'first' ? node.firstChild! : node.lastChild!;\r\n }\r\n return node.nodeType === Node.TEXT_NODE ? (node as Text) : null;\r\n}\r\n\r\nfunction prettyPrintHTML(html: string): string {\r\n // Insert newlines at block open/close boundaries, then indent line-by-line.\r\n const blockOpen = new RegExp(`(<(?:${BLOCK_TAGS})(?:\\\\s[^>]*)?>)`, 'gi');\r\n const blockClose = new RegExp(`(<\\\\/(?:${BLOCK_TAGS})>)`, 'gi');\r\n\r\n const spread = html\r\n .replace(blockOpen, '\\n$1')\r\n .replace(blockClose, '$1\\n')\r\n .replace(/<hr(\\s[^>]*)?\\/?>(\\s*)/gi, '\\n<hr />\\n');\r\n\r\n let depth = 0;\r\n const result: string[] = [];\r\n\r\n for (const raw of spread.split('\\n')) {\r\n const line = raw.trim();\r\n if (!line) continue;\r\n\r\n if (_HR_RE.test(line)) {\r\n result.push(' '.repeat(depth) + line);\r\n continue;\r\n }\r\n if (_CLOSE_ONLY_RE.test(line)) {\r\n depth = Math.max(0, depth - 1);\r\n result.push(' '.repeat(depth) + line);\r\n continue;\r\n }\r\n if (_OPEN_ONLY_RE.test(line)) {\r\n result.push(' '.repeat(depth) + line);\r\n depth++;\r\n continue;\r\n }\r\n // Mixed: starts with a block open tag but also has content / close tag on same line.\r\n // Don't change depth — it's self-contained (e.g. <p>text</p>, <li>text</li>).\r\n result.push(' '.repeat(depth) + line);\r\n }\r\n\r\n return result.join('\\n');\r\n}","/**\n * TablePlugin\n *\n * EditorPlugin that handles keyboard navigation inside table cells.\n *\n * Tab → move cursor to next cell (adds row if on last cell)\n * Shift+Tab → move cursor to previous cell (no-op on first cell)\n * ArrowRight → move to next cell when at end of current cell\n * ArrowLeft → move to previous cell when at start of current cell\n * ArrowDown → move to cell below when on bottom line\n * ArrowUp → move to cell above when on top line\n *\n * Enter inside a cell is handled by the default handleEnter command because\n * findContentBlockPath correctly resolves to the paragraph inside the cell\n * (table/table_row/table_cell are all in isContainerBlock so they're skipped).\n *\n * Backspace at start of first paragraph in a cell is a safe no-op because\n * joinBlocks checks idx===0 and returns the doc unchanged.\n */\n\nimport type { EditorPlugin } from '../../types';\nimport type { BlockNode } from '../../types';\nimport { createTransaction, tr_setSelection } from '../core/Transaction';\nimport { getNodeAtPath } from '../core/DocumentModel';\nimport { makeCollapsedSelection } from '../selection/SelectionEngine';\nimport {\n findCellPosition,\n getTableDimensions,\n getCellFirstPosition,\n getCellLastPosition,\n insertTableRowAfter,\n} from './TableModel';\n\n// ─── DOM boundary helpers ──────────────────────────────────────────────────────\n\n/**\n * Return the DOM element for a cell given its data-block-path JSON string.\n * Works because DOMRenderer sets data-block-path on every block element.\n */\nfunction getCellDOMElement(cellPathJson: string): Element | null {\n return document.querySelector(`[data-block-path='${cellPathJson}']`);\n}\n\n/**\n * True when the browser caret is at the very start of the given DOM container.\n * Uses Selection API — no model knowledge needed.\n */\nfunction isCaretAtContainerStart(container: Element): boolean {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0 || !sel.isCollapsed) return false;\n const range = sel.getRangeAt(0);\n if (range.startOffset !== 0) return false;\n let node: Node | null = range.startContainer;\n while (node && node !== container) {\n if (node.previousSibling) return false;\n node = node.parentNode;\n }\n return node === container;\n}\n\n/**\n * True when the browser caret is at the very end of the given DOM container.\n */\nfunction isCaretAtContainerEnd(container: Element): boolean {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0 || !sel.isCollapsed) return false;\n const range = sel.getRangeAt(0);\n const endNode = range.endContainer;\n const endOffset = range.endOffset;\n const len = endNode.nodeType === Node.TEXT_NODE\n ? (endNode.textContent?.length ?? 0)\n : (endNode as Element).childNodes.length;\n if (endOffset !== len) return false;\n let node: Node | null = endNode;\n while (node && node !== container) {\n if (node.nextSibling) return false;\n node = node.parentNode;\n }\n return node === container;\n}\n\n/**\n * Check vertical boundary using bounding rects.\n * For ArrowUp: caret is on the top line if its rect top ≈ container top.\n * For ArrowDown: caret is on the bottom line if its rect bottom ≈ container bottom.\n */\nfunction isCaretOnEdgeLine(container: Element, direction: 'up' | 'down'): boolean {\n const sel = window.getSelection();\n if (!sel || sel.rangeCount === 0 || !sel.isCollapsed) return false;\n const caretRange = sel.getRangeAt(0).cloneRange();\n caretRange.collapse(true);\n const caretRects = caretRange.getClientRects();\n if (!caretRects.length) return true; // empty cell — treat as boundary\n const caretRect = caretRects[0];\n const containerRect = container.getBoundingClientRect();\n const lineHeight = parseFloat(getComputedStyle(container).lineHeight) || 20;\n if (direction === 'up') {\n return caretRect.top < containerRect.top + lineHeight;\n } else {\n return caretRect.bottom > containerRect.bottom - lineHeight;\n }\n}\n\nexport const TablePlugin: EditorPlugin = {\n name: 'table',\n\n keyBindings: {\n Tab: (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { rows, cols } = getTableDimensions(table);\n\n // Find next non-covered cell\n let nextRow = row;\n let nextCol = col + 1;\n while (nextRow < rows) {\n if (nextCol >= cols) { nextCol = 0; nextRow++; continue; }\n const c = getNodeAtPath(state.doc, [...tablePath, nextRow, nextCol]) as BlockNode;\n if (!c?.attrs?.covered) break;\n nextCol++;\n }\n\n if (nextRow >= rows) {\n // Last cell — append a new row and move cursor there\n const newTable = insertTableRowAfter(table, rows - 1);\n const newChildren = [...state.doc.children];\n newChildren[tablePath[0]] = newTable;\n const tempDoc = { type: 'doc' as const, children: newChildren };\n\n const tr = createTransaction();\n tr.steps.push({ type: 'delete_node', path: tablePath });\n tr.steps.push({\n type: 'insert_node',\n parentPath: tablePath.length > 1 ? tablePath.slice(0, -1) : [],\n index: tablePath[tablePath.length - 1],\n node: newTable,\n });\n const pos = getCellFirstPosition(tempDoc, tablePath, rows, 0);\n if (pos) tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n }\n\n const pos = getCellFirstPosition(state.doc, tablePath, nextRow, nextCol);\n if (!pos) return false;\n\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'ArrowRight': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n const { tablePath, row, col } = cellPos;\n const cellPath = [...tablePath, row, col];\n const cellEl = getCellDOMElement(JSON.stringify(cellPath));\n if (!cellEl || !isCaretAtContainerEnd(cellEl)) return false;\n\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { rows, cols } = getTableDimensions(table);\n let nextRow = row; let nextCol = col + 1;\n while (nextRow < rows) {\n if (nextCol >= cols) { nextCol = 0; nextRow++; continue; }\n const c = getNodeAtPath(state.doc, [...tablePath, nextRow, nextCol]) as BlockNode;\n if (!c?.attrs?.covered) break;\n nextCol++;\n }\n if (nextRow >= rows) return true; // last cell — swallow\n const pos = getCellFirstPosition(state.doc, tablePath, nextRow, nextCol);\n if (!pos) return false;\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'ArrowLeft': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n const { tablePath, row, col } = cellPos;\n const cellPath = [...tablePath, row, col];\n const cellEl = getCellDOMElement(JSON.stringify(cellPath));\n if (!cellEl || !isCaretAtContainerStart(cellEl)) return false;\n\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { cols } = getTableDimensions(table);\n let prevRow = row; let prevCol = col - 1;\n while (prevRow >= 0) {\n if (prevCol < 0) { prevCol = cols - 1; prevRow--; continue; }\n const c = getNodeAtPath(state.doc, [...tablePath, prevRow, prevCol]) as BlockNode;\n if (!c?.attrs?.covered) break;\n prevCol--;\n }\n if (prevRow < 0) return true; // first cell — swallow\n const pos = getCellLastPosition(state.doc, tablePath, prevRow, prevCol);\n if (!pos) return false;\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'ArrowDown': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n const { tablePath, row, col } = cellPos;\n const cellPath = [...tablePath, row, col];\n const cellEl = getCellDOMElement(JSON.stringify(cellPath));\n if (!cellEl || !isCaretOnEdgeLine(cellEl, 'down')) return false;\n\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { rows, cols } = getTableDimensions(table);\n let nextRow = row + 1;\n while (nextRow < rows) {\n const c = getNodeAtPath(state.doc, [...tablePath, nextRow, col]) as BlockNode;\n if (c && !c.attrs?.covered) break;\n nextRow++;\n }\n if (nextRow >= rows) return false; // exit below table\n const pos = getCellFirstPosition(state.doc, tablePath, nextRow, col < cols ? col : 0);\n if (!pos) return false;\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'ArrowUp': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n const { tablePath, row, col } = cellPos;\n const cellPath = [...tablePath, row, col];\n const cellEl = getCellDOMElement(JSON.stringify(cellPath));\n if (!cellEl || !isCaretOnEdgeLine(cellEl, 'up')) return false;\n\n let prevRow = row - 1;\n while (prevRow >= 0) {\n const c = getNodeAtPath(state.doc, [...tablePath, prevRow, col]) as BlockNode;\n if (c && !c.attrs?.covered) break;\n prevRow--;\n }\n if (prevRow < 0) return false; // exit above table\n const { cols } = getTableDimensions(getNodeAtPath(state.doc, tablePath) as BlockNode);\n const pos = getCellLastPosition(state.doc, tablePath, prevRow, col < cols ? col : 0);\n if (!pos) return false;\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n\n 'Shift+Tab': (engine) => {\n const state = engine.getState();\n const sel = state.selection;\n if (!sel) return false;\n\n const cellPos = findCellPosition(state.doc, sel.anchor.path);\n if (!cellPos) return false;\n\n const { tablePath, row, col } = cellPos;\n const table = getNodeAtPath(state.doc, tablePath) as BlockNode;\n const { cols } = getTableDimensions(table);\n\n // Find prev non-covered cell\n let prevRow = row;\n let prevCol = col - 1;\n while (prevRow >= 0) {\n if (prevCol < 0) { prevCol = cols - 1; prevRow--; continue; }\n const c = getNodeAtPath(state.doc, [...tablePath, prevRow, prevCol]) as BlockNode;\n if (!c?.attrs?.covered) break;\n prevCol--;\n }\n\n if (prevRow < 0) return true; // first cell — swallow Tab, do nothing\n\n const pos = getCellLastPosition(state.doc, tablePath, prevRow, prevCol);\n if (!pos) return false;\n\n const tr = createTransaction();\n tr.steps.push(tr_setSelection(makeCollapsedSelection(pos)));\n engine.dispatch(tr);\n return true;\n },\n },\n};\n","/**\n * useEditorEngine\n *\n * Creates and manages an EditorEngine instance for the lifetime of the\n * component that mounts the editor. Registers built-in plugins.\n *\n * Usage:\n * const engine = useEditorEngine();\n * // Pass engine to <EditorCanvas engine={engine} />\n */\n\n'use client';\n\nimport { useMemo } from 'react';\nimport { createEditorEngine } from '../editor/core/EditorEngine';\nimport { createHistoryManager } from '../editor/history/HistoryManager';\nimport { defaultKeyboardPlugin } from '../editor/commands';\nimport { TablePlugin } from '../editor/table/TablePlugin';\nimport type { EditorState } from '../types';\n\nexport function useEditorEngine(initialState?: Partial<EditorState>) {\n const engine = useMemo(() => {\n const e = createEditorEngine(initialState);\n e.registerPlugin(createHistoryManager());\n e.registerPlugin(defaultKeyboardPlugin);\n e.registerPlugin(TablePlugin);\n return e;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return engine;\n}\n","/**\n * MarkdownSerializer\n *\n * Converts the document model to Markdown.\n * Deserialization is intentionally basic — use an HTML-first paste flow for\n * rich Markdown imports (convert MD→HTML, then HTML→model).\n */\n\nimport type { Document, BlockNode, TextNode, EditorNode, Mark, Serializer } from '../../types';\nimport { isTextNode, createParagraph } from '../core/DocumentModel';\nimport { htmlSerializer } from './HTMLSerializer';\n\nexport const markdownSerializer: Serializer<string> = {\n serialize(doc: Document): string {\n return doc.children.map((block) => serializeMDBlock(block, 0)).join('\\n\\n');\n },\n\n deserialize(markdown: string): Document {\n // Simple MD→HTML→model pipeline\n const html = markdownToHTML(markdown);\n return htmlSerializer.deserialize(html);\n },\n};\n\nfunction serializeMDBlock(node: BlockNode, depth: number): string {\n switch (node.type) {\n case 'paragraph':\n return serializeMDInline(node.children);\n\n case 'heading': {\n const level = (node.attrs?.level as number) ?? 1;\n const prefix = '#'.repeat(level);\n return `${prefix} ${serializeMDInline(node.children)}`;\n }\n\n case 'blockquote':\n return serializeMDInline(node.children)\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n');\n\n case 'bullet_list':\n return node.children\n .map((child) => {\n const text = serializeMDBlock(child as BlockNode, depth + 1);\n return `${' '.repeat(depth)}- ${text}`;\n })\n .join('\\n');\n\n case 'ordered_list':\n return node.children\n .map((child, i) => {\n const text = serializeMDBlock(child as BlockNode, depth + 1);\n return `${' '.repeat(depth)}${i + 1}. ${text}`;\n })\n .join('\\n');\n\n case 'list_item':\n return serializeMDInline(node.children);\n\n case 'code_block': {\n const lang = (node.attrs?.language as string) ?? '';\n const text = node.children\n .filter((c) => isTextNode(c))\n .map((c) => (c as TextNode).text)\n .join('');\n return `\\`\\`\\`${lang}\\n${text}\\n\\`\\`\\``;\n }\n\n case 'image':\n return ``;\n\n case 'horizontal_rule':\n return '---';\n\n default:\n return serializeMDInline(node.children);\n }\n}\n\nfunction serializeMDInline(children: EditorNode[] | undefined): string {\n if (!children) return '';\n return children\n .map((child) => {\n if (!child) return '';\n if (!isTextNode(child)) return serializeMDBlock(child as BlockNode, 0);\n return serializeMDText(child as TextNode);\n })\n .join('');\n}\n\nfunction serializeMDText(node: TextNode): string {\n let text = node.text;\n\n for (const mark of node.marks) {\n text = wrapWithMDMark(text, mark);\n }\n\n return text;\n}\n\nfunction wrapWithMDMark(text: string, mark: Mark): string {\n switch (mark.type) {\n case 'bold': return `**${text}**`;\n case 'italic': return `*${text}*`;\n case 'underline': return `<u>${text}</u>`; // MD has no underline\n case 'strikethrough': return `~~${text}~~`;\n case 'code': return `\\`${text}\\``;\n case 'link': return `[${text}](${mark.attrs?.href ?? '#'})`;\n case 'highlight': return `==${text}==`; // extended MD\n default: return text;\n }\n}\n\n// ─── Basic Markdown → HTML ────────────────────────────────────────────────────\n\nfunction markdownToHTML(md: string): string {\n const lines = md.split('\\n');\n const result: string[] = [];\n let inCodeBlock = false;\n let codeContent: string[] = [];\n let codeLang = '';\n\n for (const line of lines) {\n // Code fences\n if (line.startsWith('```')) {\n if (!inCodeBlock) {\n inCodeBlock = true;\n codeLang = line.slice(3).trim();\n codeContent = [];\n } else {\n const langAttr = codeLang ? ` class=\"language-${codeLang}\"` : '';\n result.push(`<pre><code${langAttr}>${escapeHTML(codeContent.join('\\n'))}</code></pre>`);\n inCodeBlock = false;\n codeContent = [];\n }\n continue;\n }\n\n if (inCodeBlock) {\n codeContent.push(line);\n continue;\n }\n\n // Headings\n const headingMatch = line.match(/^(#{1,6})\\s+(.*)/);\n if (headingMatch) {\n const level = headingMatch[1].length;\n result.push(`<h${level}>${inlineMarkdownToHTML(headingMatch[2])}</h${level}>`);\n continue;\n }\n\n // Horizontal rule\n if (/^(-{3,}|\\*{3,}|_{3,})$/.test(line.trim())) {\n result.push('<hr />');\n continue;\n }\n\n // Blockquote\n if (line.startsWith('> ')) {\n result.push(`<blockquote>${inlineMarkdownToHTML(line.slice(2))}</blockquote>`);\n continue;\n }\n\n // Unordered list\n const ulMatch = line.match(/^[-*+]\\s+(.*)/);\n if (ulMatch) {\n result.push(`<ul><li>${inlineMarkdownToHTML(ulMatch[1])}</li></ul>`);\n continue;\n }\n\n // Ordered list\n const olMatch = line.match(/^\\d+\\.\\s+(.*)/);\n if (olMatch) {\n result.push(`<ol><li>${inlineMarkdownToHTML(olMatch[1])}</li></ol>`);\n continue;\n }\n\n // Empty line\n if (!line.trim()) {\n continue;\n }\n\n // Regular paragraph\n result.push(`<p>${inlineMarkdownToHTML(line)}</p>`);\n }\n\n return result.join('');\n}\n\nfunction inlineMarkdownToHTML(text: string): string {\n return text\n .replace(/\\*\\*(.+?)\\*\\*/g, '<strong>$1</strong>')\n .replace(/\\*(.+?)\\*/g, '<em>$1</em>')\n .replace(/~~(.+?)~~/g, '<s>$1</s>')\n .replace(/`(.+?)`/g, '<code>$1</code>')\n .replace(/\\[(.+?)\\]\\((.+?)\\)/g, '<a href=\"$2\">$1</a>')\n .replace(/==(.+?)==/g, '<mark>$1</mark>');\n}\n\nfunction escapeHTML(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n","import type { EditorEngineInterface } from '../../types';\nimport {\n toggleBold, toggleItalic, toggleUnderline, toggleStrikethrough, toggleCode,\n toggleMark,\n setParagraph, setBlockquote, setCodeBlock,\n setHeading,\n toggleBulletList, toggleOrderedList, toggleCheckList,\n insertLink,\n setTextColor, setHighlightColor, setFontFamily, setFontSize,\n setAlignment,\n insertImage,\n insertText,\n insertHorizontalRule,\n} from './index';\nimport { insertTable } from '../table/TableCommands';\nimport { undo, redo } from '../history/HistoryManager';\nimport { createTransaction, tr_replaceDoc } from '../core/Transaction';\nimport { createEmptyDocument } from '../core/DocumentModel';\n\ntype CommandFn = (engine: EditorEngineInterface, ...args: unknown[]) => boolean;\n\nconst REGISTRY: Record<string, CommandFn> = {\n bold: (e) => toggleBold(e),\n italic: (e) => toggleItalic(e),\n underline: (e) => toggleUnderline(e),\n strikethrough: (e) => toggleStrikethrough(e),\n code: (e) => toggleCode(e),\n blockquote: (e) => setBlockquote(e),\n 'code-block': (e) => setCodeBlock(e),\n paragraph: (e) => setParagraph(e),\n 'bullet-list': (e) => toggleBulletList(e),\n 'ordered-list':(e) => toggleOrderedList(e),\n 'check-list': (e) => toggleCheckList(e),\n undo: (e) => { undo(e as Parameters<typeof undo>[0]); return true; },\n redo: (e) => { redo(e as Parameters<typeof redo>[0]); return true; },\n clear: (e) => {\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(createEmptyDocument()));\n e.dispatch(tr);\n return true;\n },\n 'insert-horizontal-rule': (e) => insertHorizontalRule(e),\n\n // Parameterized — args[0] is the value\n 'heading': (e, level) => setHeading(level as 1|2|3|4|5|6)(e),\n 'set-text-color': (e, color) => setTextColor(color as string | null)(e),\n 'set-highlight': (e, color) => setHighlightColor(color as string | null)(e),\n 'set-font-family': (e, family) => setFontFamily(family as string | null)(e),\n 'set-font-size': (e, size) => setFontSize(size as string | null)(e),\n 'set-alignment': (e, align) => setAlignment(align as 'left'|'center'|'right'|'justify')(e),\n 'insert-text': (e, text) => insertText(text as string)(e),\n 'insert-link': (e, href, text) => insertLink(href as string, text as string | undefined)(e),\n 'insert-image': (e, src, alt) => insertImage(src as string, alt as string | undefined)(e),\n 'insert-table': (e, rows, cols) => insertTable(rows as number, cols as number)(e),\n 'toggle-mark': (e, type, attrs) => toggleMark(type as Parameters<typeof toggleMark>[0], attrs as Record<string, unknown> | undefined)(e),\n};\n\nexport function execCommand(\n engine: EditorEngineInterface,\n command: string,\n ...args: unknown[]\n): boolean {\n const fn = REGISTRY[command];\n if (!fn) return false;\n try {\n return fn(engine, ...args);\n } catch {\n return false;\n }\n}\n\nexport function registerCommand(name: string, fn: CommandFn): void {\n REGISTRY[name] = fn;\n}\n","'use client';\n\nimport React, { useEffect, useRef, useImperativeHandle, forwardRef } from 'react';\nimport { EditorCore } from './EditorCore';\nimport { useEditorEngine } from '../hooks/useEditorEngine';\nimport { htmlSerializer } from '../editor/serialization/HTMLSerializer';\nimport { markdownSerializer } from '../editor/serialization/MarkdownSerializer';\nimport { createTransaction, tr_replaceDoc } from '../editor/core/Transaction';\nimport { execCommand, registerCommand } from '../editor/commands/CommandRegistry';\nimport { undo, redo } from '../editor/history/HistoryManager';\nimport type { EditorProps, EditorAPI } from '../types/public';\n\n/**\n * Self-contained rich text editor.\n *\n * Manages its own EditorEngine — consumers do not need to create one.\n * Supports controlled mode (value + onChange), uncontrolled mode (defaultValue),\n * toolbar configuration, theme, plugins, and an imperative API via onReady / ref.\n */\nexport const Editor = forwardRef<EditorAPI, EditorProps>(function Editor(\n {\n value,\n onChange,\n defaultValue,\n toolbar,\n theme: _theme,\n placeholder = 'Start writing...',\n className = '',\n style,\n minHeight,\n maxHeight,\n readOnly = false,\n plugins,\n onFocus,\n onBlur,\n onReady,\n onUploadImage,\n },\n ref,\n) {\n const engine = useEditorEngine();\n\n // Register extra plugins once\n const pluginsRegisteredRef = useRef(false);\n if (!pluginsRegisteredRef.current && plugins?.length) {\n pluginsRegisteredRef.current = true;\n for (const plugin of plugins) {\n engine.registerPlugin(plugin);\n }\n }\n\n // Load defaultValue once on mount\n const defaultLoadedRef = useRef(false);\n useEffect(() => {\n if (defaultLoadedRef.current) return;\n defaultLoadedRef.current = true;\n if (defaultValue) {\n const doc = htmlSerializer.deserialize(defaultValue);\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(doc));\n engine.dispatch(tr);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Controlled mode — sync external value into engine when it changes\n const lastExternalValueRef = useRef<string | undefined>(undefined);\n useEffect(() => {\n if (value === undefined) return;\n if (value === lastExternalValueRef.current) return;\n lastExternalValueRef.current = value;\n const doc = htmlSerializer.deserialize(value);\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(doc));\n engine.dispatch(tr);\n }, [value, engine]);\n\n // Expose imperative API via ref and onReady\n const api: EditorAPI = {\n getHTML: () => htmlSerializer.serialize(engine.getState().doc),\n setHTML: (html: string) => {\n const doc = htmlSerializer.deserialize(html);\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(doc));\n engine.dispatch(tr);\n },\n getJSON: () => engine.getState().doc,\n getMarkdown: () => markdownSerializer.serialize(engine.getState().doc),\n focus: () => {\n // EditorCore's contentEditable div — find it in DOM\n const el = document.querySelector('[role=\"textbox\"]') as HTMLElement | null;\n el?.focus();\n },\n blur: () => {\n const el = document.querySelector('[role=\"textbox\"]') as HTMLElement | null;\n el?.blur();\n },\n clear: () => {\n const doc = htmlSerializer.deserialize('');\n const tr = createTransaction();\n tr.steps.push(tr_replaceDoc(doc));\n engine.dispatch(tr);\n },\n undo: () => undo(engine),\n redo: () => redo(engine),\n execCommand: (command: string, ...args: unknown[]) =>\n execCommand(engine, command, ...args),\n registerCommand: (name: string, fn: (eng: import('../types').EditorEngineInterface, ...args: unknown[]) => boolean) =>\n registerCommand(name, fn),\n getEngine: () => engine,\n };\n\n useImperativeHandle(ref, () => api);\n\n useEffect(() => {\n onReady?.(api);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Build container style\n const containerStyle: React.CSSProperties = { ...style };\n if (minHeight !== undefined) {\n containerStyle.minHeight = typeof minHeight === 'number' ? `${minHeight}px` : minHeight;\n }\n if (maxHeight !== undefined) {\n containerStyle.maxHeight = typeof maxHeight === 'number' ? `${maxHeight}px` : maxHeight;\n containerStyle.overflow = 'auto';\n }\n\n const hideToolbar = toolbar === false;\n const toolbarConfig = toolbar === false || toolbar === undefined\n ? undefined\n : (Array.isArray(toolbar) ? toolbar as import('../types/public').EditorToolbarConfig : undefined);\n\n return (\n <div style={containerStyle}>\n <EditorCore\n engine={engine}\n placeholder={placeholder}\n className={className}\n readOnly={readOnly}\n onHTMLChange={(html) => {\n lastExternalValueRef.current = html;\n onChange?.(html);\n }}\n onFocus={onFocus}\n onBlur={onBlur}\n hideToolbar={hideToolbar}\n toolbarConfig={toolbarConfig}\n onUploadImage={onUploadImage}\n />\n </div>\n );\n});\n\nEditor.displayName = 'Editor';\n"]}
|