trance-richtext-editor 0.2.0
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/LICENSE +21 -0
- package/README.md +191 -0
- package/dist/index.cjs +2215 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.css +854 -0
- package/dist/index.css.map +1 -0
- package/dist/index.d.cts +214 -0
- package/dist/index.d.ts +214 -0
- package/dist/index.js +2199 -0
- package/dist/index.js.map +1 -0
- package/dist/renderer.cjs +47 -0
- package/dist/renderer.cjs.map +1 -0
- package/dist/renderer.css +300 -0
- package/dist/renderer.css.map +1 -0
- package/dist/renderer.d.cts +38 -0
- package/dist/renderer.d.ts +38 -0
- package/dist/renderer.js +41 -0
- package/dist/renderer.js.map +1 -0
- package/dist/styles.css +1153 -0
- package/package.json +104 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/editor/context/ImageBackgroundContext.tsx","../src/editor/nodes/ImageNode.tsx","../src/editor/nodes/HorizontalRuleNode.tsx","../src/editor/nodes/index.ts","../src/styles/lexical-theme.ts","../src/editor/toolbar/ToolbarButton.tsx","../src/editor/toolbar/icons/index.tsx","../src/editor/toolbar/BlockTypeDropdown.tsx","../src/editor/toolbar/TableSizePicker.tsx","../src/editor/plugins/ImagesPlugin.tsx","../src/editor/plugins/HorizontalRulePlugin.tsx","../src/editor/utils/importDocument.ts","../src/editor/toolbar/Toolbar.tsx","../src/editor/plugins/HtmlSerializationPlugin.tsx","../src/editor/plugins/MaxLengthPlugin.tsx","../src/editor/TranceEditor.tsx","../src/serialization/index.ts"],"names":["DecoratorNode","jsxs","jsx","AlignLeftIcon","AlignCenterIcon","AlignRightIcon","useState","useRef","useCallback","useEffect","useLayoutEffect","_","useLexicalComposerContext","createCommand","$getSelection","$isRangeSelection","$insertNodes","COMMAND_PRIORITY_EDITOR","parent","ListNode","$getRoot","$generateHtmlFromNodes","$generateNodesFromDOM","TranceEditor"],"mappings":"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","file":"index.js","sourcesContent":["import { createContext, useContext, RefObject } from \"react\";\n\nexport const ImageBackgroundContext = createContext<RefObject<HTMLDivElement | null> | null>(\n null,\n);\n\nexport function useImageBackgroundLayer() {\n return useContext(ImageBackgroundContext);\n}\n","import {\n DecoratorNode,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n Spread,\n} from \"lexical\";\nimport { ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { useLexicalNodeSelection } from \"@lexical/react/useLexicalNodeSelection\";\nimport { $getNodeByKey, CLICK_COMMAND, COMMAND_PRIORITY_LOW } from \"lexical\";\nimport { useImageBackgroundLayer } from \"../context/ImageBackgroundContext\";\n\nexport type ImageAlignment = \"left\" | \"center\" | \"right\";\nexport type ImageMode = \"inline\" | \"background\";\n\nexport interface ImagePayload {\n src: string;\n altText: string;\n width?: number;\n height?: number;\n caption?: string;\n alignment?: ImageAlignment;\n mode?: ImageMode;\n key?: NodeKey;\n}\n\nexport type SerializedImageNode = Spread<\n {\n src: string;\n altText: string;\n width?: number;\n height?: number;\n caption?: string;\n alignment?: ImageAlignment;\n mode?: ImageMode;\n },\n SerializedLexicalNode\n>;\n\nfunction $convertImageElement(domNode: Node): DOMConversionOutput | null {\n const element = domNode as HTMLElement;\n if (element.tagName === \"IMG\") {\n const img = element as HTMLImageElement;\n const node = $createImageNode({\n src: img.src,\n altText: img.alt || \"\",\n width: img.width || undefined,\n height: img.height || undefined,\n });\n return { node };\n }\n // Handle <figure> wrapping\n if (element.tagName === \"FIGURE\") {\n const img = element.querySelector(\"img\");\n const figcaption = element.querySelector(\"figcaption\");\n if (img) {\n const node = $createImageNode({\n src: img.src,\n altText: img.alt || \"\",\n width: img.width || undefined,\n height: img.height || undefined,\n caption: figcaption?.textContent || undefined,\n alignment: (element.dataset.align as ImageAlignment) || undefined,\n mode:\n (element.dataset.mode as ImageMode) ||\n (element.classList.contains(\"trance-image-background\")\n ? \"background\"\n : undefined),\n });\n return { node };\n }\n }\n return null;\n}\n\nexport class ImageNode extends DecoratorNode<ReactNode> {\n __src: string;\n __altText: string;\n __width: number | undefined;\n __height: number | undefined;\n __caption: string | undefined;\n __alignment: ImageAlignment;\n __mode: ImageMode;\n\n static getType(): string {\n return \"image\";\n }\n\n static clone(node: ImageNode): ImageNode {\n return new ImageNode(\n node.__src,\n node.__altText,\n node.__width,\n node.__height,\n node.__caption,\n node.__alignment,\n node.__mode,\n node.__key,\n );\n }\n\n static importJSON(serializedNode: SerializedImageNode): ImageNode {\n return $createImageNode({\n src: serializedNode.src,\n altText: serializedNode.altText,\n width: serializedNode.width,\n height: serializedNode.height,\n caption: serializedNode.caption,\n alignment: serializedNode.alignment,\n mode: serializedNode.mode,\n });\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n img: () => ({\n conversion: $convertImageElement,\n priority: 0,\n }),\n figure: () => ({\n conversion: $convertImageElement,\n priority: 0,\n }),\n };\n }\n\n constructor(\n src: string,\n altText: string,\n width?: number,\n height?: number,\n caption?: string,\n alignment: ImageAlignment = \"center\",\n mode: ImageMode = \"inline\",\n key?: NodeKey,\n ) {\n super(key);\n this.__src = src;\n this.__altText = altText;\n this.__width = width;\n this.__height = height;\n this.__caption = caption;\n this.__alignment = alignment;\n this.__mode = mode;\n }\n\n exportJSON(): SerializedImageNode {\n return {\n type: \"image\",\n version: 1,\n src: this.__src,\n altText: this.__altText,\n width: this.__width,\n height: this.__height,\n caption: this.__caption,\n alignment: this.__alignment,\n mode: this.__mode,\n };\n }\n\n exportDOM(): DOMExportOutput {\n const figure = document.createElement(\"figure\");\n figure.style.margin = \"0\";\n figure.dataset.align = this.__alignment;\n figure.dataset.mode = this.__mode;\n this.applyAlignmentStyles(figure);\n if (this.__mode === \"background\") {\n figure.classList.add(\"trance-image-background\");\n }\n\n const img = document.createElement(\"img\");\n img.setAttribute(\"src\", this.__src);\n img.setAttribute(\"alt\", this.__altText);\n if (this.__width) {\n img.setAttribute(\"width\", String(this.__width));\n }\n if (this.__height) {\n img.setAttribute(\"height\", String(this.__height));\n }\n img.style.maxWidth = \"100%\";\n img.style.height = \"auto\";\n img.style.borderRadius = \"8px\";\n img.style.display = \"block\";\n figure.appendChild(img);\n\n if (this.__caption && this.__mode !== \"background\") {\n const figcaption = document.createElement(\"figcaption\");\n figcaption.textContent = this.__caption;\n figcaption.style.textAlign = \"center\";\n figcaption.style.fontSize = \"0.875rem\";\n figcaption.style.color = \"#6b7280\";\n figcaption.style.marginTop = \"4px\";\n figcaption.style.fontStyle = \"italic\";\n figure.appendChild(figcaption);\n }\n\n if (this.__mode === \"background\") {\n figure.classList.add(\"trance-image-background\");\n return { element: figure };\n }\n\n return { element: figure };\n }\n\n private applyAlignmentStyles(element: HTMLElement): void {\n element.style.display = \"block\";\n element.style.width = \"fit-content\";\n element.style.maxWidth = \"100%\";\n\n switch (this.__alignment) {\n case \"left\":\n element.style.margin = \"0 auto 0 0\";\n break;\n case \"right\":\n element.style.margin = \"0 0 0 auto\";\n break;\n case \"center\":\n default:\n element.style.margin = \"0 auto\";\n break;\n }\n }\n\n createDOM(): HTMLElement {\n const div = document.createElement(\"div\");\n div.className = `trance-image-wrapper align-${this.__alignment} mode-${this.__mode}`;\n return div;\n }\n\n updateDOM(prevNode: ImageNode, dom: HTMLElement): boolean {\n if (\n prevNode.__alignment !== this.__alignment ||\n prevNode.__mode !== this.__mode\n ) {\n dom.className = `trance-image-wrapper align-${this.__alignment} mode-${this.__mode}`;\n }\n return false;\n }\n\n getSrc(): string {\n return this.__src;\n }\n\n getAltText(): string {\n return this.__altText;\n }\n\n setWidthAndHeight(\n width: number | undefined,\n height: number | undefined,\n ): void {\n const writable = this.getWritable();\n writable.__width = width;\n writable.__height = height;\n }\n\n getAlignment(): ImageAlignment {\n return this.__alignment;\n }\n\n setAlignment(alignment: ImageAlignment): void {\n const writable = this.getWritable();\n writable.__alignment = alignment;\n }\n\n getMode(): ImageMode {\n return this.__mode;\n }\n\n setMode(mode: ImageMode): void {\n const writable = this.getWritable();\n writable.__mode = mode;\n }\n\n decorate(): ReactNode {\n return (\n <ImageComponent\n nodeKey={this.__key}\n src={this.__src}\n altText={this.__altText}\n width={this.__width}\n height={this.__height}\n caption={this.__caption}\n alignment={this.__alignment}\n mode={this.__mode}\n />\n );\n }\n\n isInline(): boolean {\n return false;\n }\n}\n\nfunction ImageComponent({\n nodeKey,\n src,\n altText,\n width,\n height,\n caption,\n alignment,\n mode,\n}: {\n nodeKey: NodeKey;\n src: string;\n altText: string;\n width?: number;\n height?: number;\n caption?: string;\n alignment: ImageAlignment;\n mode: ImageMode;\n}) {\n return (\n <ImageComponentInner\n nodeKey={nodeKey}\n src={src}\n altText={altText}\n width={width}\n height={height}\n caption={caption}\n alignment={alignment}\n mode={mode}\n />\n );\n}\n\nfunction ImageComponentInner({\n nodeKey,\n src,\n altText,\n width,\n height,\n caption,\n alignment,\n mode,\n}: {\n nodeKey: NodeKey;\n src: string;\n altText: string;\n width?: number;\n height?: number;\n caption?: string;\n alignment: ImageAlignment;\n mode: ImageMode;\n}) {\n const [editor] = useLexicalComposerContext();\n const [isSelected, setSelected, clearSelection] =\n useLexicalNodeSelection(nodeKey);\n const imageRef = useRef<HTMLImageElement>(null);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [isResizing, setIsResizing] = useState(false);\n const [currentWidth, setCurrentWidth] = useState(width);\n const backgroundLayer = useImageBackgroundLayer();\n const isBackground = mode === \"background\";\n\n useEffect(() => {\n setCurrentWidth(width);\n }, [width]);\n\n const handleClick = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setSelected(true);\n },\n [setSelected],\n );\n\n // Register click command to clear selection when clicking outside image\n useEffect(() => {\n return editor.registerCommand<MouseEvent>(\n CLICK_COMMAND,\n (payload) => {\n const clickedElement = payload.target as Node;\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(clickedElement)\n ) {\n clearSelection();\n return false;\n }\n return false;\n },\n COMMAND_PRIORITY_LOW,\n );\n }, [editor, clearSelection]);\n\n const startResize = useCallback(\n (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n setIsResizing(true);\n setSelected(true);\n\n const image = imageRef.current;\n if (!image) return;\n\n const startX = event.clientX;\n const startWidth = image.offsetWidth;\n const aspectRatio = image.naturalWidth / image.naturalHeight;\n\n const handleMouseMove = (moveEvent: MouseEvent) => {\n const deltaX = moveEvent.clientX - startX;\n const newWidth = Math.max(80, startWidth + deltaX);\n const newHeight = aspectRatio > 0 ? newWidth / aspectRatio : undefined;\n\n setCurrentWidth(newWidth);\n\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setWidthAndHeight(newWidth, newHeight);\n }\n });\n };\n\n const handleMouseUp = () => {\n setIsResizing(false);\n document.removeEventListener(\"mousemove\", handleMouseMove);\n document.removeEventListener(\"mouseup\", handleMouseUp);\n };\n\n document.addEventListener(\"mousemove\", handleMouseMove);\n document.addEventListener(\"mouseup\", handleMouseUp);\n },\n [editor, nodeKey, setSelected],\n );\n\n const setAlignment = useCallback(\n (newAlignment: ImageAlignment) => {\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setAlignment(newAlignment);\n }\n });\n },\n [editor, nodeKey],\n );\n\n const setMode = useCallback(\n (newMode: ImageMode) => {\n editor.update(() => {\n const node = $getNodeByKey(nodeKey);\n if ($isImageNode(node)) {\n node.setMode(newMode);\n }\n });\n },\n [editor, nodeKey],\n );\n\n const innerClassName = [\"trance-image-inner\", isSelected ? \"selected\" : \"\"]\n .filter(Boolean)\n .join(\" \");\n\n return (\n <div\n ref={wrapperRef}\n className={innerClassName}\n onClick={handleClick}\n data-alignment={alignment}\n >\n {(isSelected || isResizing) && (\n <div\n className=\"trance-image-toolbar\"\n onMouseDown={(e) => e.preventDefault()}\n >\n <button\n type=\"button\"\n className={alignment === \"left\" ? \"active\" : \"\"}\n onClick={() => setAlignment(\"left\")}\n aria-label=\"Align left\"\n title=\"Align left\"\n >\n <AlignLeftIcon />\n </button>\n <button\n type=\"button\"\n className={alignment === \"center\" ? \"active\" : \"\"}\n onClick={() => setAlignment(\"center\")}\n aria-label=\"Align center\"\n title=\"Align center\"\n >\n <AlignCenterIcon />\n </button>\n <button\n type=\"button\"\n className={alignment === \"right\" ? \"active\" : \"\"}\n onClick={() => setAlignment(\"right\")}\n aria-label=\"Align right\"\n title=\"Align right\"\n >\n <AlignRightIcon />\n </button>\n <div className=\"trance-image-toolbar-divider\" />\n <button\n type=\"button\"\n className={isBackground ? \"active\" : \"\"}\n onClick={() => setMode(isBackground ? \"inline\" : \"background\")}\n aria-label=\"Toggle background image\"\n title=\"Toggle background image\"\n >\n BG\n </button>\n </div>\n )}\n\n {isBackground ? (\n <div className=\"trance-image-background-placeholder\">\n <span>Background Image</span>\n </div>\n ) : (\n <figure style={{ margin: 0 }}>\n <img\n ref={imageRef}\n src={src}\n alt={altText}\n width={currentWidth}\n height={height}\n draggable={false}\n style={{\n maxWidth: \"100%\",\n height: \"auto\",\n borderRadius: \"8px\",\n display: \"block\",\n cursor: isSelected ? \"default\" : \"pointer\",\n userSelect: \"none\",\n }}\n />\n {caption && (\n <figcaption className=\"trance-image-caption\">{caption}</figcaption>\n )}\n </figure>\n )}\n {isBackground &&\n backgroundLayer?.current &&\n createPortal(\n <img\n src={src}\n alt={altText}\n className=\"trance-image-background-img\"\n draggable={false}\n />,\n backgroundLayer.current,\n )}\n\n {(isSelected || isResizing) && !isBackground && (\n <div\n className=\"trance-image-resize-handle\"\n onMouseDown={startResize}\n aria-label=\"Resize image\"\n title=\"Resize image\"\n />\n )}\n </div>\n );\n}\n\nfunction AlignLeftIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction AlignCenterIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"6\" y1=\"12\" x2=\"18\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n );\n}\n\nfunction AlignRightIcon() {\n return (\n <svg\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"11\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"6\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n );\n}\n\nexport function $createImageNode(payload: ImagePayload): ImageNode {\n return new ImageNode(\n payload.src,\n payload.altText,\n payload.width,\n payload.height,\n payload.caption,\n payload.alignment || \"center\",\n payload.mode || \"inline\",\n payload.key,\n );\n}\n\nexport function $isImageNode(\n node: LexicalNode | null | undefined,\n): node is ImageNode {\n return node instanceof ImageNode;\n}\n","import {\n DecoratorNode,\n DOMConversionMap,\n DOMConversionOutput,\n DOMExportOutput,\n LexicalNode,\n NodeKey,\n SerializedLexicalNode,\n} from 'lexical';\nimport { ReactNode } from 'react';\n\nexport type SerializedHorizontalRuleNode = SerializedLexicalNode;\n\nfunction $convertHorizontalRuleElement(): DOMConversionOutput {\n return { node: $createHorizontalRuleNode() };\n}\n\nexport class HorizontalRuleNode extends DecoratorNode<ReactNode> {\n static getType(): string {\n return 'horizontalrule';\n }\n\n static clone(node: HorizontalRuleNode): HorizontalRuleNode {\n return new HorizontalRuleNode(node.__key);\n }\n\n static importJSON(): HorizontalRuleNode {\n return $createHorizontalRuleNode();\n }\n\n static importDOM(): DOMConversionMap | null {\n return {\n hr: () => ({\n conversion: $convertHorizontalRuleElement,\n priority: 0,\n }),\n };\n }\n\n constructor(key?: NodeKey) {\n super(key);\n }\n\n exportJSON(): SerializedHorizontalRuleNode {\n return {\n type: 'horizontalrule',\n version: 1,\n };\n }\n\n exportDOM(): DOMExportOutput {\n const hr = document.createElement('hr');\n hr.style.border = 'none';\n hr.style.height = '2px';\n hr.style.background =\n 'linear-gradient(90deg, transparent, #d1d5db, transparent)';\n hr.style.margin = '24px 0';\n return { element: hr };\n }\n\n createDOM(): HTMLElement {\n const hr = document.createElement('hr');\n hr.className = 'trance-hr';\n return hr;\n }\n\n updateDOM(): false {\n return false;\n }\n\n getTextContent(): string {\n return '\\n';\n }\n\n isInline(): boolean {\n return false;\n }\n\n decorate(): ReactNode {\n return null;\n }\n}\n\nexport function $createHorizontalRuleNode(): HorizontalRuleNode {\n return new HorizontalRuleNode();\n}\n\nexport function $isHorizontalRuleNode(\n node: LexicalNode | null | undefined\n): node is HorizontalRuleNode {\n return node instanceof HorizontalRuleNode;\n}\n","import type { Klass, LexicalNode } from 'lexical';\nimport { HeadingNode, QuoteNode } from '@lexical/rich-text';\nimport { ListNode, ListItemNode } from '@lexical/list';\nimport { LinkNode, AutoLinkNode } from '@lexical/link';\nimport { CodeNode, CodeHighlightNode } from '@lexical/code';\nimport { TableNode, TableCellNode, TableRowNode } from '@lexical/table';\nimport { ImageNode } from './ImageNode';\nimport { HorizontalRuleNode } from './HorizontalRuleNode';\n\n/**\n * All Lexical nodes registered by trance-richtext-editor.\n * Pass this to LexicalComposer's `nodes` config.\n */\nexport const TRANCE_NODES: Array<Klass<LexicalNode>> = [\n HeadingNode,\n QuoteNode,\n ListNode,\n ListItemNode,\n LinkNode,\n AutoLinkNode,\n CodeNode,\n CodeHighlightNode,\n TableNode,\n TableCellNode,\n TableRowNode,\n ImageNode,\n HorizontalRuleNode,\n];\n\nexport { ImageNode, $createImageNode, $isImageNode } from './ImageNode';\nexport type { ImagePayload, SerializedImageNode } from './ImageNode';\nexport {\n HorizontalRuleNode,\n $createHorizontalRuleNode,\n $isHorizontalRuleNode,\n} from './HorizontalRuleNode';\n","import type { EditorThemeClasses } from 'lexical';\n\n/**\n * Lexical EditorTheme configuration for trance-richtext-editor.\n * Maps Lexical node types to CSS class names used in editor.css.\n */\nexport const tranceLexicalTheme: EditorThemeClasses = {\n paragraph: 'trance-paragraph',\n heading: {\n h1: 'trance-h1',\n h2: 'trance-h2',\n h3: 'trance-h3',\n h4: 'trance-h4',\n h5: 'trance-h5',\n h6: 'trance-h6',\n },\n text: {\n bold: 'trance-bold',\n italic: 'trance-italic',\n underline: 'trance-underline',\n strikethrough: 'trance-strikethrough',\n underlineStrikethrough: 'trance-underline trance-strikethrough',\n code: 'trance-inline-code',\n highlight: 'trance-highlight',\n subscript: 'trance-subscript',\n superscript: 'trance-superscript',\n },\n list: {\n ul: 'trance-ul',\n ol: 'trance-ol',\n listitem: 'trance-li',\n listitemChecked: 'trance-li-checked',\n listitemUnchecked: 'trance-li-unchecked',\n nested: {\n listitem: 'trance-li-nested',\n },\n },\n link: 'trance-link',\n quote: 'trance-quote',\n code: 'trance-code-block',\n codeHighlight: {\n atrule: 'trance-token-atrule',\n attr: 'trance-token-attr',\n boolean: 'trance-token-boolean',\n builtin: 'trance-token-builtin',\n cdata: 'trance-token-cdata',\n char: 'trance-token-char',\n class: 'trance-token-class',\n 'class-name': 'trance-token-class-name',\n comment: 'trance-token-comment',\n constant: 'trance-token-constant',\n deleted: 'trance-token-deleted',\n doctype: 'trance-token-doctype',\n entity: 'trance-token-entity',\n function: 'trance-token-function',\n important: 'trance-token-important',\n inserted: 'trance-token-inserted',\n keyword: 'trance-token-keyword',\n namespace: 'trance-token-namespace',\n number: 'trance-token-number',\n operator: 'trance-token-operator',\n prolog: 'trance-token-prolog',\n property: 'trance-token-property',\n punctuation: 'trance-token-punctuation',\n regex: 'trance-token-regex',\n selector: 'trance-token-selector',\n string: 'trance-token-string',\n symbol: 'trance-token-symbol',\n tag: 'trance-token-tag',\n url: 'trance-token-url',\n variable: 'trance-token-variable',\n },\n table: 'trance-table',\n tableCell: 'trance-table-cell',\n tableCellHeader: 'trance-table-cell-header',\n tableRow: 'trance-table-row',\n tableRowStriped: 'trance-table-row-striped',\n horizontalRule: 'trance-hr',\n image: 'trance-image-wrapper',\n indent: 'trance-indent',\n ltr: 'trance-text-left',\n rtl: 'trance-text-right',\n};\n","import React, { type ReactNode, type MouseEventHandler } from 'react';\n\ninterface ToolbarButtonProps {\n icon: ReactNode;\n label: string;\n active?: boolean;\n disabled?: boolean;\n onClick: MouseEventHandler<HTMLButtonElement>;\n shortcut?: string;\n}\n\n/**\n * A single toolbar button with icon, tooltip, and active/disabled states.\n */\nexport function ToolbarButton({\n icon,\n label,\n active = false,\n disabled = false,\n onClick,\n shortcut,\n}: ToolbarButtonProps) {\n return (\n <button\n type=\"button\"\n className={`trance-toolbar-btn${active ? ' active' : ''}`}\n disabled={disabled}\n onClick={onClick}\n aria-label={label}\n title={shortcut ? `${label} (${shortcut})` : label}\n >\n {icon}\n <span className=\"trance-tooltip\">\n {label}\n {shortcut && <span style={{ opacity: 0.7, marginLeft: 4 }}>{shortcut}</span>}\n </span>\n </button>\n );\n}\n\n/**\n * A visual separator between toolbar button groups.\n */\nexport function ToolbarSeparator() {\n return <div className=\"trance-toolbar-separator\" aria-hidden=\"true\" />;\n}\n","import React from \"react\";\n\n/* All icons are 16x16 inline SVGs — no external dependency needed. */\n\nexport const BoldIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n <path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\" />\n </svg>\n);\n\nexport const ItalicIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\" />\n <line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\" />\n <line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\" />\n </svg>\n);\n\nexport const UnderlineIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M6 3v7a6 6 0 0 0 6 6 6 6 0 0 0 6-6V3\" />\n <line x1=\"4\" y1=\"21\" x2=\"20\" y2=\"21\" />\n </svg>\n);\n\nexport const StrikethroughIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M16 4H9a3 3 0 0 0-3 3c0 2 1.5 3 3 3\" />\n <path d=\"M12 12h3c2 0 3 1 3 3a3 3 0 0 1-3 3H8\" />\n <line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\" />\n </svg>\n);\n\nexport const CodeIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n);\n\nexport const LinkIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n);\n\nexport const ImageIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\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=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"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\nexport const TableIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\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=\"3\" width=\"18\" height=\"18\" rx=\"2\" ry=\"2\" />\n <line x1=\"3\" y1=\"9\" x2=\"21\" y2=\"9\" />\n <line x1=\"3\" y1=\"15\" x2=\"21\" y2=\"15\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"21\" />\n </svg>\n);\n\nexport const HorizontalRuleIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"5\" y1=\"12\" x2=\"19\" y2=\"12\" />\n </svg>\n);\n\nexport const ListBulletIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"9\" y1=\"6\" x2=\"20\" y2=\"6\" />\n <line x1=\"9\" y1=\"12\" x2=\"20\" y2=\"12\" />\n <line x1=\"9\" y1=\"18\" x2=\"20\" y2=\"18\" />\n <circle cx=\"4\" cy=\"6\" r=\"2\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"4\" cy=\"12\" r=\"2\" fill=\"currentColor\" stroke=\"none\" />\n <circle cx=\"4\" cy=\"18\" r=\"2\" fill=\"currentColor\" stroke=\"none\" />\n </svg>\n);\n\nexport const ListNumberedIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <path d=\"M4 6h1V4H3v2h1v4H3v2h3V6H4z\" fill=\"currentColor\" stroke=\"none\" />\n <path\n d=\"M3 12v6h4v-2H5v-1h2v-2H5v-1h2v-2H3z\"\n fill=\"currentColor\"\n stroke=\"none\"\n />\n </svg>\n);\n\nexport const ListCheckIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"9 11 12 14 22 4\" />\n <path d=\"M21 12v7a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h11\" />\n </svg>\n);\n\nexport const AlignLeftIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"12\" x2=\"13\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"18\" y2=\"18\" />\n </svg>\n);\n\nexport const AlignCenterIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"6\" y1=\"12\" x2=\"18\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n);\n\nexport const AlignRightIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"11\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"6\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n);\n\nexport const AlignJustifyIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"3\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"3\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"21\" y2=\"18\" />\n </svg>\n);\n\nexport const UndoIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 7v6h6\" />\n <path d=\"M21 17a9 9 0 0 0-9-9 9 9 0 0 0-6 2.3L3 13\" />\n </svg>\n);\n\nexport const RedoIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 7v6h-6\" />\n <path d=\"M3 17a9 9 0 0 1 9-9 9 9 0 0 1 6 2.3L21 13\" />\n </svg>\n);\n\nexport const HeadingIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M6 12h12\" />\n <path d=\"M6 4v16\" />\n <path d=\"M18 4v16\" />\n </svg>\n);\n\nexport const QuoteIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-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.031V21c0 1 0 1 1 1z\" />\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\" />\n </svg>\n);\n\nexport const CodeBlockIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n);\n\nexport const SuperscriptIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M5 7l6 8.5L5 24h3l4.5-6.3L17 24h3l-6-8.5L20 7h-3l-4.5 6.3L8 7H5z\"\n transform=\"scale(0.7) translate(2, 4)\"\n />\n <text x=\"16\" y=\"10\" fontSize=\"10\" fontWeight=\"bold\" fontFamily=\"sans-serif\">\n 2\n </text>\n </svg>\n);\n\nexport const SubscriptIcon = () => (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"currentColor\">\n <path\n d=\"M5 3l6 8.5L5 20h3l4.5-6.3L17 20h3l-6-8.5L20 3h-3l-4.5 6.3L8 3H5z\"\n transform=\"scale(0.7) translate(2, 0)\"\n />\n <text x=\"16\" y=\"22\" fontSize=\"10\" fontWeight=\"bold\" fontFamily=\"sans-serif\">\n 2\n </text>\n </svg>\n);\n\nexport const HighlightIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M12 20h9\" />\n <path d=\"M16.5 3.5a2.121 2.121 0 0 1 3 3L7 19l-4 1 1-4L16.5 3.5z\" />\n </svg>\n);\n\nexport const ImportIcon = () => (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"12\" />\n <polyline points=\"9 15 12 18 15 15\" />\n </svg>\n);\n\nexport const ChevronDownIcon = () => (\n <svg\n width=\"12\"\n height=\"12\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"chevron\"\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n);\n","import React, {\n useState,\n useRef,\n useEffect,\n useCallback,\n useLayoutEffect,\n} from \"react\";\nimport {\n ChevronDownIcon,\n HeadingIcon,\n QuoteIcon,\n CodeBlockIcon,\n} from \"./icons\";\n\ninterface BlockTypeDropdownProps {\n currentBlockType: string;\n onSelect: (blockType: string) => void;\n}\n\nconst BLOCK_TYPES = [\n { value: \"paragraph\", label: \"Paragraph\", icon: null },\n { value: \"h1\", label: \"Heading 1\", icon: <HeadingIcon /> },\n { value: \"h2\", label: \"Heading 2\", icon: <HeadingIcon /> },\n { value: \"h3\", label: \"Heading 3\", icon: <HeadingIcon /> },\n { value: \"h4\", label: \"Heading 4\", icon: <HeadingIcon /> },\n { value: \"h5\", label: \"Heading 5\", icon: <HeadingIcon /> },\n { value: \"h6\", label: \"Heading 6\", icon: <HeadingIcon /> },\n { value: \"quote\", label: \"Blockquote\", icon: <QuoteIcon /> },\n { value: \"code\", label: \"Code Block\", icon: <CodeBlockIcon /> },\n];\n\ninterface MenuPosition {\n top: number;\n left: number;\n}\n\n/**\n * Dropdown for selecting the block type (paragraph, headings, blockquote, code block).\n */\nexport function BlockTypeDropdown({\n currentBlockType,\n onSelect,\n}: BlockTypeDropdownProps) {\n const [isOpen, setIsOpen] = useState(false);\n const [menuPosition, setMenuPosition] = useState<MenuPosition>({\n top: 0,\n left: 0,\n });\n const dropdownRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n\n const currentLabel =\n BLOCK_TYPES.find((bt) => bt.value === currentBlockType)?.label ||\n \"Paragraph\";\n\n const updateMenuPosition = useCallback(() => {\n if (!triggerRef.current) return;\n const rect = triggerRef.current.getBoundingClientRect();\n setMenuPosition({\n top: rect.bottom + 4,\n left: rect.left,\n });\n }, []);\n\n const handleSelect = useCallback(\n (value: string) => {\n onSelect(value);\n setIsOpen(false);\n },\n [onSelect],\n );\n\n useLayoutEffect(() => {\n if (isOpen) {\n updateMenuPosition();\n }\n }, [isOpen, updateMenuPosition]);\n\n useEffect(() => {\n if (!isOpen) return;\n\n const handleClickOutside = (event: MouseEvent) => {\n if (\n dropdownRef.current &&\n !dropdownRef.current.contains(event.target as Node)\n ) {\n setIsOpen(false);\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n setIsOpen(false);\n }\n };\n\n const handleResizeOrScroll = () => {\n updateMenuPosition();\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleKeyDown);\n window.addEventListener(\"resize\", handleResizeOrScroll);\n window.addEventListener(\"scroll\", handleResizeOrScroll, true);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleKeyDown);\n window.removeEventListener(\"resize\", handleResizeOrScroll);\n window.removeEventListener(\"scroll\", handleResizeOrScroll, true);\n };\n }, [isOpen, updateMenuPosition]);\n\n return (\n <div className=\"trance-block-dropdown-wrapper\" ref={dropdownRef}>\n <button\n ref={triggerRef}\n type=\"button\"\n className=\"trance-block-dropdown-trigger\"\n onClick={() => setIsOpen(!isOpen)}\n aria-expanded={isOpen}\n aria-haspopup=\"listbox\"\n aria-label=\"Select block type\"\n >\n {currentLabel}\n <ChevronDownIcon />\n </button>\n\n {isOpen && (\n <div\n className=\"trance-block-dropdown-menu\"\n role=\"listbox\"\n style={{\n top: menuPosition.top,\n left: menuPosition.left,\n }}\n >\n {BLOCK_TYPES.map(({ value, label, icon }) => (\n <button\n key={value}\n type=\"button\"\n role=\"option\"\n className={`trance-block-dropdown-item${\n value === currentBlockType ? \" active\" : \"\"\n }`}\n aria-selected={value === currentBlockType}\n onClick={() => handleSelect(value)}\n >\n {icon}\n {label}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n}\n","import React, {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n} from \"react\";\n\ninterface TableSizePickerProps {\n triggerRef: React.RefObject<HTMLElement | null>;\n onSelect: (rows: number, columns: number) => void;\n onCancel: () => void;\n}\n\nconst MAX_ROWS = 10;\nconst MAX_COLS = 10;\n\n/**\n * Grid-based table size selector.\n * Hover to preview dimensions, click to insert.\n */\nexport function TableSizePicker({\n triggerRef,\n onSelect,\n onCancel,\n}: TableSizePickerProps) {\n const [hovered, setHovered] = useState({ rows: 1, cols: 1 });\n const [position, setPosition] = useState({ top: 0, left: 0 });\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useLayoutEffect(() => {\n const triggerRect = triggerRef.current?.getBoundingClientRect();\n const pickerRect = wrapperRef.current?.getBoundingClientRect();\n\n if (triggerRect) {\n const pickerWidth = pickerRect?.width ?? 180;\n const left = Math.min(\n triggerRect.left,\n window.innerWidth - pickerWidth - 8,\n );\n setPosition({\n top: triggerRect.bottom + 4,\n left: Math.max(8, left),\n });\n }\n }, [triggerRef]);\n\n // Close on click outside or escape\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (\n wrapperRef.current &&\n !wrapperRef.current.contains(event.target as Node)\n ) {\n onCancel();\n }\n };\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") {\n onCancel();\n }\n };\n\n document.addEventListener(\"mousedown\", handleClickOutside);\n document.addEventListener(\"keydown\", handleKeyDown);\n\n return () => {\n document.removeEventListener(\"mousedown\", handleClickOutside);\n document.removeEventListener(\"keydown\", handleKeyDown);\n };\n }, [onCancel]);\n\n const handleCellHover = useCallback((row: number, col: number) => {\n setHovered({ rows: row + 1, cols: col + 1 });\n }, []);\n\n const handleCellClick = useCallback(\n (row: number, col: number) => {\n onSelect(row + 1, col + 1);\n },\n [onSelect],\n );\n\n return (\n <div\n ref={wrapperRef}\n className=\"trance-table-size-picker\"\n role=\"dialog\"\n aria-label=\"Select table size\"\n style={{\n top: position.top,\n left: position.left,\n }}\n >\n <div className=\"trance-table-size-picker-label\">\n {hovered.rows} × {hovered.cols} Table\n </div>\n <div className=\"trance-table-size-picker-grid\">\n {Array.from({ length: MAX_ROWS }, (_, row) => (\n <div key={row} className=\"trance-table-size-picker-row\">\n {Array.from({ length: MAX_COLS }, (_, col) => {\n const isActive = row < hovered.rows && col < hovered.cols;\n return (\n <button\n key={`${row}-${col}`}\n type=\"button\"\n className={\n isActive\n ? \"trance-table-size-picker-cell active\"\n : \"trance-table-size-picker-cell\"\n }\n onMouseEnter={() => handleCellHover(row, col)}\n onClick={() => handleCellClick(row, col)}\n aria-label={`Insert ${row + 1} by ${col + 1} table`}\n />\n );\n })}\n </div>\n ))}\n </div>\n </div>\n );\n}\n","import { useEffect } from 'react';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $getRoot, $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand } from 'lexical';\nimport { $createImageNode, ImagePayload } from '../nodes/ImageNode';\nimport { $insertNodes } from 'lexical';\n\nexport const INSERT_IMAGE_COMMAND: LexicalCommand<ImagePayload> =\n createCommand('INSERT_IMAGE_COMMAND');\n\ninterface ImagesPluginProps {\n onImageUpload?: (file: File) => Promise<{ url: string; alt?: string }>;\n}\n\n/**\n * Plugin for inserting images into the editor.\n * Supports drag-and-drop and programmatic insertion via INSERT_IMAGE_COMMAND.\n */\nexport function ImagesPlugin({ onImageUpload }: ImagesPluginProps): null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return editor.registerCommand<ImagePayload>(\n INSERT_IMAGE_COMMAND,\n (payload) => {\n const imageNode = $createImageNode(payload);\n $insertNodes([imageNode]);\n return true;\n },\n COMMAND_PRIORITY_EDITOR\n );\n }, [editor]);\n\n useEffect(() => {\n const rootElement = editor.getRootElement();\n if (!rootElement) return;\n\n const handleDrop = async (event: DragEvent) => {\n const files = event.dataTransfer?.files;\n if (!files || files.length === 0) return;\n\n const file = files[0];\n if (!file.type.startsWith('image/')) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n try {\n let url: string;\n let alt: string = file.name;\n\n if (onImageUpload) {\n const result = await onImageUpload(file);\n url = result.url;\n alt = result.alt || file.name;\n } else {\n // Fallback: convert to base64\n url = await fileToBase64(file);\n }\n\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, {\n src: url,\n altText: alt,\n });\n } catch (error) {\n console.error('Image upload failed:', error);\n }\n };\n\n const handleDragOver = (event: DragEvent) => {\n const files = event.dataTransfer?.types;\n if (files?.includes('Files')) {\n event.preventDefault();\n }\n };\n\n rootElement.addEventListener('drop', handleDrop);\n rootElement.addEventListener('dragover', handleDragOver);\n\n return () => {\n rootElement.removeEventListener('drop', handleDrop);\n rootElement.removeEventListener('dragover', handleDragOver);\n };\n }, [editor, onImageUpload]);\n\n return null;\n}\n\nfunction fileToBase64(file: File): Promise<string> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n}\n","import { useEffect } from 'react';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $getSelection, $isRangeSelection, COMMAND_PRIORITY_EDITOR, createCommand, LexicalCommand } from 'lexical';\nimport { $createHorizontalRuleNode } from '../nodes/HorizontalRuleNode';\nimport { $insertNodes } from 'lexical';\n\nexport const INSERT_HORIZONTAL_RULE_COMMAND: LexicalCommand<void> =\n createCommand('INSERT_HORIZONTAL_RULE_COMMAND');\n\n/**\n * Plugin for inserting horizontal rules.\n */\nexport function HorizontalRulePlugin(): null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return editor.registerCommand(\n INSERT_HORIZONTAL_RULE_COMMAND,\n () => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n const hrNode = $createHorizontalRuleNode();\n $insertNodes([hrNode]);\n }\n return true;\n },\n COMMAND_PRIORITY_EDITOR\n );\n }, [editor]);\n\n return null;\n}\n","import { $generateNodesFromDOM } from \"@lexical/html\";\nimport { $insertNodes, LexicalEditor } from \"lexical\";\n\nexport interface ImportDocumentResult {\n type: \"docx\";\n title?: string;\n}\n\nfunction getFileExtension(filename: string): string {\n const lastDot = filename.lastIndexOf(\".\");\n return lastDot === -1 ? \"\" : filename.slice(lastDot + 1).toLowerCase();\n}\n\nfunction fileToArrayBuffer(file: File): Promise<ArrayBuffer> {\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as ArrayBuffer);\n reader.onerror = reject;\n reader.readAsArrayBuffer(file);\n });\n}\n\nasync function importDocx(editor: LexicalEditor, file: File): Promise<void> {\n // Dynamic import keeps mammoth out of the initial bundle and avoids SSR issues.\n const mammoth = await import(\"mammoth\");\n const arrayBuffer = await fileToArrayBuffer(file);\n const result = await mammoth.convertToHtml({ arrayBuffer });\n\n editor.update(() => {\n const parser = new DOMParser();\n const dom = parser.parseFromString(result.value, \"text/html\");\n const nodes = $generateNodesFromDOM(editor, dom);\n $insertNodes(nodes);\n });\n}\n\nexport async function importDocument(\n editor: LexicalEditor,\n file: File,\n): Promise<ImportDocumentResult> {\n const extension = getFileExtension(file.name);\n\n if (extension === \"docx\") {\n await importDocx(editor, file);\n return { type: \"docx\", title: file.name };\n }\n\n throw new Error(\n `Unsupported file type: ${extension}. Only .docx is supported.`,\n );\n}\n","import React, { useCallback, useEffect, useRef, useState } from \"react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport {\n $getSelection,\n $isRangeSelection,\n $isRootOrShadowRoot,\n CAN_REDO_COMMAND,\n CAN_UNDO_COMMAND,\n COMMAND_PRIORITY_CRITICAL,\n FORMAT_ELEMENT_COMMAND,\n FORMAT_TEXT_COMMAND,\n REDO_COMMAND,\n SELECTION_CHANGE_COMMAND,\n UNDO_COMMAND,\n} from \"lexical\";\nimport {\n $isHeadingNode,\n $createHeadingNode,\n HeadingTagType,\n} from \"@lexical/rich-text\";\nimport {\n $isListNode,\n INSERT_ORDERED_LIST_COMMAND,\n INSERT_UNORDERED_LIST_COMMAND,\n INSERT_CHECK_LIST_COMMAND,\n ListNode,\n} from \"@lexical/list\";\nimport { $isCodeNode } from \"@lexical/code\";\nimport { $isLinkNode, TOGGLE_LINK_COMMAND } from \"@lexical/link\";\nimport { $findMatchingParent, $getNearestNodeOfType } from \"@lexical/utils\";\nimport { $setBlocksType } from \"@lexical/selection\";\nimport { $createQuoteNode, $isQuoteNode } from \"@lexical/rich-text\";\nimport { $createCodeNode } from \"@lexical/code\";\nimport { $createParagraphNode } from \"lexical\";\nimport { INSERT_TABLE_COMMAND } from \"@lexical/table\";\n\nimport { ToolbarButton, ToolbarSeparator } from \"./ToolbarButton\";\nimport { BlockTypeDropdown } from \"./BlockTypeDropdown\";\nimport { TableSizePicker } from \"./TableSizePicker\";\nimport {\n BoldIcon,\n ItalicIcon,\n UnderlineIcon,\n StrikethroughIcon,\n CodeIcon,\n LinkIcon,\n ImageIcon,\n TableIcon,\n HorizontalRuleIcon,\n ListBulletIcon,\n ListNumberedIcon,\n ListCheckIcon,\n AlignLeftIcon,\n AlignCenterIcon,\n AlignRightIcon,\n AlignJustifyIcon,\n UndoIcon,\n RedoIcon,\n HighlightIcon,\n SuperscriptIcon,\n SubscriptIcon,\n ImportIcon,\n} from \"./icons\";\nimport { INSERT_IMAGE_COMMAND } from \"../plugins/ImagesPlugin\";\nimport { INSERT_HORIZONTAL_RULE_COMMAND } from \"../plugins/HorizontalRulePlugin\";\nimport { importDocument } from \"../utils/importDocument\";\n\nexport interface ToolbarFeatures {\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strikethrough?: boolean;\n code?: boolean;\n link?: boolean;\n orderedList?: boolean;\n unorderedList?: boolean;\n checkList?: boolean;\n blockquote?: boolean;\n codeBlock?: boolean;\n image?: boolean;\n table?: boolean;\n horizontalRule?: boolean;\n heading?: boolean;\n textAlign?: boolean;\n superscript?: boolean;\n subscript?: boolean;\n highlight?: boolean;\n import?: boolean;\n}\n\ninterface ToolbarProps {\n features: ToolbarFeatures;\n onImageUpload?: (file: File) => Promise<{ url: string; alt?: string }>;\n}\n\n/**\n * Main editor toolbar with formatting controls, block type selector,\n * insert actions, alignment, and undo/redo.\n */\nexport function Toolbar({ features, onImageUpload }: ToolbarProps) {\n const [editor] = useLexicalComposerContext();\n const [activeEditor, setActiveEditor] = useState(editor);\n\n // Text format states\n const [isBold, setIsBold] = useState(false);\n const [isItalic, setIsItalic] = useState(false);\n const [isUnderline, setIsUnderline] = useState(false);\n const [isStrikethrough, setIsStrikethrough] = useState(false);\n const [isCode, setIsCode] = useState(false);\n const [isSuperscript, setIsSuperscript] = useState(false);\n const [isSubscript, setIsSubscript] = useState(false);\n const [isHighlight, setIsHighlight] = useState(false);\n const [isLink, setIsLink] = useState(false);\n\n // Block type\n const [blockType, setBlockType] = useState(\"paragraph\");\n\n // History\n const [canUndo, setCanUndo] = useState(false);\n const [canRedo, setCanRedo] = useState(false);\n const [showTablePicker, setShowTablePicker] = useState(false);\n const tableButtonRef = useRef<HTMLDivElement>(null);\n\n const $updateToolbar = useCallback(() => {\n const selection = $getSelection();\n if ($isRangeSelection(selection)) {\n setIsBold(selection.hasFormat(\"bold\"));\n setIsItalic(selection.hasFormat(\"italic\"));\n setIsUnderline(selection.hasFormat(\"underline\"));\n setIsStrikethrough(selection.hasFormat(\"strikethrough\"));\n setIsCode(selection.hasFormat(\"code\"));\n setIsSuperscript(selection.hasFormat(\"superscript\"));\n setIsSubscript(selection.hasFormat(\"subscript\"));\n setIsHighlight(selection.hasFormat(\"highlight\"));\n\n // Check block type\n const anchorNode = selection.anchor.getNode();\n let element =\n anchorNode.getKey() === \"root\"\n ? anchorNode\n : $findMatchingParent(anchorNode, (e) => {\n const parent = e.getParent();\n return parent !== null && $isRootOrShadowRoot(parent);\n });\n\n if (element === null) {\n element = anchorNode.getTopLevelElementOrThrow();\n }\n\n const elementDOM = activeEditor.getElementByKey(element.getKey());\n\n if ($isListNode(element)) {\n const parentList = $getNearestNodeOfType<ListNode>(\n anchorNode,\n ListNode,\n );\n const type = parentList\n ? parentList.getListType()\n : element.getListType();\n if (type === \"bullet\") setBlockType(\"bullet\");\n else if (type === \"number\") setBlockType(\"number\");\n else if (type === \"check\") setBlockType(\"check\");\n } else {\n const type = $isHeadingNode(element)\n ? element.getTag()\n : $isCodeNode(element)\n ? \"code\"\n : $isQuoteNode(element)\n ? \"quote\"\n : \"paragraph\";\n setBlockType(type);\n }\n\n // Check link\n const node = selection.anchor.getNode();\n const parent = node.getParent();\n setIsLink($isLinkNode(parent) || $isLinkNode(node));\n }\n }, [activeEditor]);\n\n useEffect(() => {\n return editor.registerCommand(\n SELECTION_CHANGE_COMMAND,\n () => {\n $updateToolbar();\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n );\n }, [editor, $updateToolbar]);\n\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n editorState.read(() => {\n $updateToolbar();\n });\n });\n }, [editor, $updateToolbar]);\n\n useEffect(() => {\n return editor.registerCommand(\n CAN_UNDO_COMMAND,\n (payload) => {\n setCanUndo(payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n );\n }, [editor]);\n\n useEffect(() => {\n return editor.registerCommand(\n CAN_REDO_COMMAND,\n (payload) => {\n setCanRedo(payload);\n return false;\n },\n COMMAND_PRIORITY_CRITICAL,\n );\n }, [editor]);\n\n // Block type change handler\n const handleBlockTypeChange = useCallback(\n (type: string) => {\n editor.update(() => {\n const selection = $getSelection();\n if (!$isRangeSelection(selection)) return;\n\n if (type === \"paragraph\") {\n $setBlocksType(selection, () => $createParagraphNode());\n } else if (type.match(/^h[1-6]$/)) {\n $setBlocksType(selection, () =>\n $createHeadingNode(type as HeadingTagType),\n );\n } else if (type === \"quote\") {\n $setBlocksType(selection, () => $createQuoteNode());\n } else if (type === \"code\") {\n $setBlocksType(selection, () => $createCodeNode());\n }\n });\n },\n [editor],\n );\n\n const handleImageInsert = useCallback(async () => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \"image/*\";\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n\n try {\n let url: string;\n let alt: string = file.name;\n\n if (onImageUpload) {\n const result = await onImageUpload(file);\n url = result.url;\n alt = result.alt || file.name;\n } else {\n url = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n }\n\n editor.dispatchCommand(INSERT_IMAGE_COMMAND, {\n src: url,\n altText: alt,\n });\n } catch (err) {\n console.error(\"Image insert failed:\", err);\n }\n };\n input.click();\n }, [editor, onImageUpload]);\n\n const normalizeUrl = useCallback((url: string): string => {\n const trimmed = url.trim();\n if (!trimmed) return \"\";\n if (/^(https?:|mailto:|tel:|#)/i.test(trimmed)) {\n return trimmed;\n }\n if (trimmed.includes(\"@\") && !trimmed.includes(\"/\")) {\n return `mailto:${trimmed}`;\n }\n return `https://${trimmed}`;\n }, []);\n\n const handleLinkToggle = useCallback(() => {\n if (isLink) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, null);\n } else {\n const url = prompt(\"Enter URL:\");\n if (url) {\n editor.dispatchCommand(TOGGLE_LINK_COMMAND, normalizeUrl(url));\n }\n }\n }, [editor, isLink, normalizeUrl]);\n\n const handleTableInsert = useCallback(\n (rows: number, columns: number) => {\n editor.dispatchCommand(INSERT_TABLE_COMMAND, {\n rows: String(rows),\n columns: String(columns),\n includeHeaders: true,\n });\n setShowTablePicker(false);\n },\n [editor],\n );\n\n const handleImport = useCallback(async () => {\n const input = document.createElement(\"input\");\n input.type = \"file\";\n input.accept = \".docx\";\n input.onchange = async () => {\n const file = input.files?.[0];\n if (!file) return;\n\n try {\n await importDocument(editor, file);\n } catch (error) {\n console.error(\"Document import failed:\", error);\n alert(\"Failed to import document. Please try a .docx file.\");\n }\n };\n input.click();\n }, [editor]);\n\n return (\n <div className=\"trance-toolbar\" role=\"toolbar\" aria-label=\"Text formatting\">\n {/* Undo / Redo */}\n <ToolbarButton\n icon={<UndoIcon />}\n label=\"Undo\"\n shortcut=\"⌘Z\"\n disabled={!canUndo}\n onClick={() => editor.dispatchCommand(UNDO_COMMAND, undefined)}\n />\n <ToolbarButton\n icon={<RedoIcon />}\n label=\"Redo\"\n shortcut=\"⌘⇧Z\"\n disabled={!canRedo}\n onClick={() => editor.dispatchCommand(REDO_COMMAND, undefined)}\n />\n\n <ToolbarSeparator />\n\n {/* Block Type */}\n {features.heading !== false && (\n <BlockTypeDropdown\n currentBlockType={blockType}\n onSelect={handleBlockTypeChange}\n />\n )}\n\n <ToolbarSeparator />\n\n {/* Text Formatting */}\n {features.bold !== false && (\n <ToolbarButton\n icon={<BoldIcon />}\n label=\"Bold\"\n shortcut=\"⌘B\"\n active={isBold}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"bold\")}\n />\n )}\n {features.italic !== false && (\n <ToolbarButton\n icon={<ItalicIcon />}\n label=\"Italic\"\n shortcut=\"⌘I\"\n active={isItalic}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"italic\")}\n />\n )}\n {features.underline !== false && (\n <ToolbarButton\n icon={<UnderlineIcon />}\n label=\"Underline\"\n shortcut=\"⌘U\"\n active={isUnderline}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"underline\")\n }\n />\n )}\n {features.strikethrough !== false && (\n <ToolbarButton\n icon={<StrikethroughIcon />}\n label=\"Strikethrough\"\n active={isStrikethrough}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"strikethrough\")\n }\n />\n )}\n {features.code !== false && (\n <ToolbarButton\n icon={<CodeIcon />}\n label=\"Inline Code\"\n active={isCode}\n onClick={() => editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"code\")}\n />\n )}\n {features.highlight !== false && (\n <ToolbarButton\n icon={<HighlightIcon />}\n label=\"Highlight\"\n active={isHighlight}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"highlight\")\n }\n />\n )}\n {features.superscript !== false && (\n <ToolbarButton\n icon={<SuperscriptIcon />}\n label=\"Superscript\"\n active={isSuperscript}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"superscript\")\n }\n />\n )}\n {features.subscript !== false && (\n <ToolbarButton\n icon={<SubscriptIcon />}\n label=\"Subscript\"\n active={isSubscript}\n onClick={() =>\n editor.dispatchCommand(FORMAT_TEXT_COMMAND, \"subscript\")\n }\n />\n )}\n\n <ToolbarSeparator />\n\n {/* Lists */}\n {features.unorderedList !== false && (\n <ToolbarButton\n icon={<ListBulletIcon />}\n label=\"Bullet List\"\n active={blockType === \"bullet\"}\n onClick={() =>\n editor.dispatchCommand(INSERT_UNORDERED_LIST_COMMAND, undefined)\n }\n />\n )}\n {features.orderedList !== false && (\n <ToolbarButton\n icon={<ListNumberedIcon />}\n label=\"Numbered List\"\n active={blockType === \"number\"}\n onClick={() =>\n editor.dispatchCommand(INSERT_ORDERED_LIST_COMMAND, undefined)\n }\n />\n )}\n {features.checkList !== false && (\n <ToolbarButton\n icon={<ListCheckIcon />}\n label=\"Check List\"\n active={blockType === \"check\"}\n onClick={() =>\n editor.dispatchCommand(INSERT_CHECK_LIST_COMMAND, undefined)\n }\n />\n )}\n\n <ToolbarSeparator />\n\n {/* Insert Actions */}\n {features.link !== false && (\n <ToolbarButton\n icon={<LinkIcon />}\n label=\"Link\"\n shortcut=\"⌘K\"\n active={isLink}\n onClick={handleLinkToggle}\n />\n )}\n {features.image !== false && (\n <ToolbarButton\n icon={<ImageIcon />}\n label=\"Insert Image\"\n onClick={handleImageInsert}\n />\n )}\n {features.table !== false && (\n <div ref={tableButtonRef} className=\"trance-table-dropdown-wrapper\">\n <ToolbarButton\n icon={<TableIcon />}\n label=\"Insert Table\"\n onClick={() => setShowTablePicker(!showTablePicker)}\n active={showTablePicker}\n />\n {showTablePicker && (\n <TableSizePicker\n triggerRef={tableButtonRef}\n onSelect={handleTableInsert}\n onCancel={() => setShowTablePicker(false)}\n />\n )}\n </div>\n )}\n {features.horizontalRule !== false && (\n <ToolbarButton\n icon={<HorizontalRuleIcon />}\n label=\"Horizontal Rule\"\n onClick={() =>\n editor.dispatchCommand(INSERT_HORIZONTAL_RULE_COMMAND, undefined)\n }\n />\n )}\n {features.import !== false && (\n <ToolbarButton\n icon={<ImportIcon />}\n label=\"Import Document\"\n onClick={handleImport}\n />\n )}\n\n <ToolbarSeparator />\n\n {/* Alignment */}\n {features.textAlign !== false && (\n <>\n <ToolbarButton\n icon={<AlignLeftIcon />}\n label=\"Align Left\"\n onClick={() =>\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"left\")\n }\n />\n <ToolbarButton\n icon={<AlignCenterIcon />}\n label=\"Align Center\"\n onClick={() =>\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"center\")\n }\n />\n <ToolbarButton\n icon={<AlignRightIcon />}\n label=\"Align Right\"\n onClick={() =>\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"right\")\n }\n />\n <ToolbarButton\n icon={<AlignJustifyIcon />}\n label=\"Justify\"\n onClick={() =>\n editor.dispatchCommand(FORMAT_ELEMENT_COMMAND, \"justify\")\n }\n />\n </>\n )}\n </div>\n );\n}\n","import { useCallback, useEffect, useRef } from 'react';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $generateHtmlFromNodes } from '@lexical/html';\nimport type { EditorState, SerializedEditorState } from 'lexical';\n\ninterface HtmlSerializationPluginProps {\n onChange?: (data: { html: string; json: SerializedEditorState }) => void;\n debounceMs?: number;\n}\n\n/**\n * Plugin that watches editor state changes and fires onChange\n * with both HTML string and serialized JSON.\n */\nexport function HtmlSerializationPlugin({\n onChange,\n debounceMs = 300,\n}: HtmlSerializationPluginProps): null {\n const [editor] = useLexicalComposerContext();\n const timerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n const handleChange = useCallback(\n (editorState: EditorState) => {\n if (!onChange) return;\n\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n\n timerRef.current = setTimeout(() => {\n editorState.read(() => {\n const html = $generateHtmlFromNodes(editor, null);\n const json = editorState.toJSON();\n onChange({ html, json });\n });\n }, debounceMs);\n },\n [editor, onChange, debounceMs]\n );\n\n useEffect(() => {\n return editor.registerUpdateListener(({ editorState }) => {\n handleChange(editorState);\n });\n }, [editor, handleChange]);\n\n useEffect(() => {\n return () => {\n if (timerRef.current) {\n clearTimeout(timerRef.current);\n }\n };\n }, []);\n\n return null;\n}\n","import { useEffect } from 'react';\nimport { useLexicalComposerContext } from '@lexical/react/LexicalComposerContext';\nimport { $getRoot, $createParagraphNode, $getSelection, $isRangeSelection, TextNode, RootNode } from 'lexical';\n\ninterface MaxLengthPluginProps {\n maxLength: number;\n}\n\n/**\n * Plugin that enforces a character limit on the editor content.\n */\nexport function MaxLengthPlugin({ maxLength }: MaxLengthPluginProps): null {\n const [editor] = useLexicalComposerContext();\n\n useEffect(() => {\n return editor.registerNodeTransform(RootNode, (rootNode: RootNode) => {\n const text = rootNode.getTextContent();\n if (text.length <= maxLength) return;\n\n // Trim the excess content\n editor.update(() => {\n const trimmedText = text.slice(0, maxLength);\n const root = $getRoot();\n const allTextContent = root.getTextContent();\n \n if (allTextContent.length > maxLength) {\n // Simple approach: prevent the update by reverting\n // In practice, we prevent typing beyond the limit\n }\n });\n });\n }, [editor, maxLength]);\n\n useEffect(() => {\n // Register text node transform to prevent exceeding max length\n return editor.registerNodeTransform(TextNode, (textNode) => {\n const root = $getRoot();\n const totalLength = root.getTextContent().length;\n \n if (totalLength > maxLength) {\n const excess = totalLength - maxLength;\n const currentText = textNode.getTextContent();\n if (currentText.length > excess) {\n textNode.setTextContent(currentText.slice(0, currentText.length - excess));\n }\n }\n });\n }, [editor, maxLength]);\n\n return null;\n}\n","import React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n} from \"react\";\nimport { useLexicalComposerContext } from \"@lexical/react/LexicalComposerContext\";\nimport { LexicalComposer } from \"@lexical/react/LexicalComposer\";\nimport { RichTextPlugin } from \"@lexical/react/LexicalRichTextPlugin\";\nimport { ContentEditable } from \"@lexical/react/LexicalContentEditable\";\nimport { HistoryPlugin } from \"@lexical/react/LexicalHistoryPlugin\";\nimport { AutoFocusPlugin } from \"@lexical/react/LexicalAutoFocusPlugin\";\nimport { ListPlugin } from \"@lexical/react/LexicalListPlugin\";\nimport { LinkPlugin } from \"@lexical/react/LexicalLinkPlugin\";\nimport { CheckListPlugin } from \"@lexical/react/LexicalCheckListPlugin\";\nimport { TabIndentationPlugin } from \"@lexical/react/LexicalTabIndentationPlugin\";\nimport { TablePlugin } from \"@lexical/react/LexicalTablePlugin\";\nimport { LexicalErrorBoundary } from \"@lexical/react/LexicalErrorBoundary\";\nimport { MarkdownShortcutPlugin } from \"@lexical/react/LexicalMarkdownShortcutPlugin\";\nimport { TRANSFORMERS } from \"@lexical/markdown\";\nimport { $generateHtmlFromNodes, $generateNodesFromDOM } from \"@lexical/html\";\nimport {\n $getRoot,\n $insertNodes,\n LexicalEditor,\n SerializedEditorState,\n} from \"lexical\";\n\nimport { TRANCE_NODES } from \"./nodes\";\nimport { tranceLexicalTheme } from \"../styles/lexical-theme\";\nimport { Toolbar, ToolbarFeatures } from \"./toolbar/Toolbar\";\nimport { HtmlSerializationPlugin } from \"./plugins/HtmlSerializationPlugin\";\nimport { ImagesPlugin } from \"./plugins/ImagesPlugin\";\nimport { HorizontalRulePlugin } from \"./plugins/HorizontalRulePlugin\";\nimport { MaxLengthPlugin } from \"./plugins/MaxLengthPlugin\";\nimport { ImageBackgroundContext } from \"./context/ImageBackgroundContext\";\n\n// Import styles\nimport \"../styles/variables.css\";\nimport \"../styles/editor.css\";\nimport \"../styles/toolbar.css\";\n\nexport interface TranceEditorProps {\n /** Initialize from an HTML string */\n initialHtml?: string;\n /** Initialize from serialized Lexical JSON */\n initialJson?: SerializedEditorState;\n /** Placeholder text shown when editor is empty */\n placeholder?: string;\n /** Called when editor content changes (debounced) */\n onChange?: (data: { html: string; json: SerializedEditorState }) => void;\n /** Called when editor loses focus */\n onBlur?: () => void;\n /** Called when editor gains focus */\n onFocus?: () => void;\n /** Feature flags — all enabled by default */\n features?: ToolbarFeatures;\n /** Image upload handler. If not provided, images are base64 encoded. */\n onImageUpload?: (file: File) => Promise<{ url: string; alt?: string }>;\n /** Theme mode */\n theme?: \"light\" | \"dark\" | \"auto\";\n /** Additional CSS class for the editor wrapper */\n className?: string;\n /** Whether the editor is editable */\n editable?: boolean;\n /** Auto-focus editor on mount */\n autoFocus?: boolean;\n /** Maximum character length */\n maxLength?: number;\n /** Debounce ms for onChange */\n debounceMs?: number;\n}\n\nexport interface TranceEditorRef {\n /** Get the current editor content as HTML */\n getHtml: () => string;\n /** Get the current editor state as JSON */\n getJson: () => SerializedEditorState;\n /** Set editor content from HTML string */\n setHtml: (html: string) => void;\n /** Set editor content from JSON */\n setJson: (json: SerializedEditorState) => void;\n /** Focus the editor */\n focus: () => void;\n /** Clear all editor content */\n clear: () => void;\n /** Get the underlying Lexical editor instance (escape hatch) */\n getLexicalEditor: () => LexicalEditor;\n}\n\n/**\n * Inner editor component that has access to LexicalComposer context.\n */\nfunction EditorInner({\n placeholder,\n onChange,\n onBlur,\n onFocus,\n features,\n onImageUpload,\n autoFocus,\n maxLength,\n debounceMs,\n editorRef,\n}: TranceEditorProps & { editorRef?: React.Ref<TranceEditorRef> }) {\n const [editor] = useLexicalComposerContext();\n const resolvedFeatures: ToolbarFeatures = {\n bold: true,\n italic: true,\n underline: true,\n strikethrough: true,\n code: true,\n link: true,\n orderedList: true,\n unorderedList: true,\n checkList: true,\n blockquote: true,\n codeBlock: true,\n image: true,\n table: true,\n horizontalRule: true,\n heading: true,\n textAlign: true,\n superscript: true,\n subscript: true,\n highlight: true,\n import: true,\n ...features,\n };\n\n const backgroundLayerRef = useRef<HTMLDivElement>(null);\n\n useImperativeHandle(\n editorRef,\n () => ({\n getHtml: () => {\n let html = \"\";\n editor.read(() => {\n html = $generateHtmlFromNodes(editor, null);\n });\n return html;\n },\n getJson: () => {\n return editor.getEditorState().toJSON();\n },\n setHtml: (html: string) => {\n editor.update(() => {\n const parser = new DOMParser();\n const dom = parser.parseFromString(html, \"text/html\");\n const nodes = $generateNodesFromDOM(editor, dom);\n const root = $getRoot();\n root.clear();\n root.append(...nodes);\n });\n },\n setJson: (json: SerializedEditorState) => {\n const editorState = editor.parseEditorState(json);\n editor.setEditorState(editorState);\n },\n focus: () => {\n editor.focus();\n },\n clear: () => {\n editor.update(() => {\n const root = $getRoot();\n root.clear();\n });\n },\n getLexicalEditor: () => editor,\n }),\n [editor],\n );\n\n return (\n <ImageBackgroundContext.Provider value={backgroundLayerRef}>\n <div\n ref={backgroundLayerRef}\n className=\"trance-editor-background-layer\"\n aria-hidden=\"true\"\n />\n <Toolbar features={resolvedFeatures} onImageUpload={onImageUpload} />\n <div className=\"trance-editor-content\">\n <RichTextPlugin\n contentEditable={\n <ContentEditable\n className=\"trance-content-editable\"\n aria-placeholder={placeholder || \"Start writing...\"}\n placeholder={\n <div className=\"trance-editor-placeholder\">\n {placeholder || \"Start writing...\"}\n </div>\n }\n onBlur={onBlur}\n onFocus={onFocus}\n />\n }\n ErrorBoundary={LexicalErrorBoundary}\n />\n </div>\n\n {/* Core plugins */}\n <HistoryPlugin />\n {autoFocus && <AutoFocusPlugin />}\n <ListPlugin />\n <LinkPlugin />\n <CheckListPlugin />\n <TabIndentationPlugin />\n <TablePlugin />\n <MarkdownShortcutPlugin transformers={TRANSFORMERS} />\n\n {/* Custom plugins */}\n <HtmlSerializationPlugin onChange={onChange} debounceMs={debounceMs} />\n <ImagesPlugin onImageUpload={onImageUpload} />\n <HorizontalRulePlugin />\n {maxLength !== undefined && <MaxLengthPlugin maxLength={maxLength} />}\n </ImageBackgroundContext.Provider>\n );\n}\n\n/**\n * TranceEditor — A plug-and-play rich text editor for React.\n *\n * @example\n * ```tsx\n * import { TranceEditor } from 'trance-richtext-editor';\n * import 'trance-richtext-editor/styles.css';\n *\n * function App() {\n * return (\n * <TranceEditor\n * placeholder=\"Write something amazing...\"\n * onChange={({ html }) => console.log(html)}\n * />\n * );\n * }\n * ```\n */\nexport const TranceEditor = forwardRef<TranceEditorRef, TranceEditorProps>(\n function TranceEditor(props, ref) {\n const {\n initialHtml,\n initialJson,\n theme = \"light\",\n className = \"\",\n editable = true,\n ...rest\n } = props;\n\n const initialConfig = {\n namespace: \"TranceEditor\",\n theme: tranceLexicalTheme,\n nodes: TRANCE_NODES,\n editable,\n onError: (error: Error) => {\n console.error(\"[TranceEditor]\", error);\n },\n editorState: initialJson\n ? JSON.stringify(initialJson)\n : initialHtml\n ? (editor: LexicalEditor) => {\n editor.update(() => {\n const parser = new DOMParser();\n const dom = parser.parseFromString(initialHtml, \"text/html\");\n const nodes = $generateNodesFromDOM(editor, dom);\n const root = $getRoot();\n root.select();\n $insertNodes(nodes);\n });\n }\n : undefined,\n };\n\n return (\n <div\n className={`trance-editor-wrapper ${className}`.trim()}\n data-trance-theme={theme}\n >\n <LexicalComposer initialConfig={initialConfig}>\n <EditorInner {...rest} editorRef={ref} />\n </LexicalComposer>\n </div>\n );\n },\n);\n","import { $generateHtmlFromNodes, $generateNodesFromDOM } from '@lexical/html';\nimport {\n $getRoot,\n $insertNodes,\n createEditor,\n LexicalEditor,\n SerializedEditorState,\n} from 'lexical';\nimport { TRANCE_NODES } from '../editor/nodes';\nimport { tranceLexicalTheme } from '../styles/lexical-theme';\n\n/**\n * Serialize the current editor state to an HTML string.\n * Must be called within an editor.read() or editor.update() context,\n * or pass the editor and it will call read() for you.\n */\nexport function serializeToHtml(editor: LexicalEditor): string {\n let html = '';\n editor.read(() => {\n html = $generateHtmlFromNodes(editor, null);\n });\n return html;\n}\n\n/**\n * Replace editor content from an HTML string.\n */\nexport function deserializeFromHtml(\n editor: LexicalEditor,\n html: string\n): void {\n editor.update(() => {\n const parser = new DOMParser();\n const dom = parser.parseFromString(html, 'text/html');\n const nodes = $generateNodesFromDOM(editor, dom);\n const root = $getRoot();\n root.clear();\n $insertNodes(nodes);\n });\n}\n\n/**\n * Get the editor state as serialized JSON.\n */\nexport function serializeToJson(\n editor: LexicalEditor\n): SerializedEditorState {\n return editor.getEditorState().toJSON();\n}\n\n/**\n * Replace editor state from JSON.\n */\nexport function deserializeFromJson(\n editor: LexicalEditor,\n json: SerializedEditorState\n): void {\n const editorState = editor.parseEditorState(json);\n editor.setEditorState(editorState);\n}\n\n/**\n * Convert serialized Lexical JSON to HTML string (server-side / headless).\n * Does NOT require a browser DOM — uses a headless Lexical editor.\n *\n * @example\n * ```ts\n * import { convertJsonToHtml } from 'trance-richtext-editor';\n * const html = convertJsonToHtml(savedJson);\n * ```\n */\nexport function convertJsonToHtml(\n json: SerializedEditorState\n): string {\n const editor = createEditor({\n namespace: 'TranceHeadless',\n nodes: TRANCE_NODES,\n theme: tranceLexicalTheme,\n onError: (error) => {\n throw error;\n },\n });\n\n const editorState = editor.parseEditorState(json);\n let html = '';\n\n editorState.read(() => {\n html = $generateHtmlFromNodes(editor, null);\n });\n\n return html;\n}\n\n/**\n * Convert HTML string to serialized Lexical JSON (server-side / headless).\n *\n * @example\n * ```ts\n * import { convertHtmlToJson } from 'trance-richtext-editor';\n * const json = convertHtmlToJson('<p>Hello world</p>');\n * ```\n */\nexport function convertHtmlToJson(\n html: string\n): SerializedEditorState {\n const editor = createEditor({\n namespace: 'TranceHeadless',\n nodes: TRANCE_NODES,\n theme: tranceLexicalTheme,\n onError: (error) => {\n throw error;\n },\n });\n\n editor.update(\n () => {\n const parser = new DOMParser();\n const dom = parser.parseFromString(html, 'text/html');\n const nodes = $generateNodesFromDOM(editor, dom);\n const root = $getRoot();\n root.clear();\n $insertNodes(nodes);\n },\n { discrete: true }\n );\n\n return editor.getEditorState().toJSON();\n}\n"]}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var react = require('react');
|
|
4
|
+
var DOMPurify = require('dompurify');
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var DOMPurify__default = /*#__PURE__*/_interopDefault(DOMPurify);
|
|
10
|
+
|
|
11
|
+
// src/renderer/TranceRenderer.tsx
|
|
12
|
+
function TranceRenderer({
|
|
13
|
+
html,
|
|
14
|
+
className = "",
|
|
15
|
+
theme = "light",
|
|
16
|
+
pageSize
|
|
17
|
+
}) {
|
|
18
|
+
const sanitizedHtml = react.useMemo(() => {
|
|
19
|
+
if (typeof window === "undefined") {
|
|
20
|
+
return html;
|
|
21
|
+
}
|
|
22
|
+
return DOMPurify__default.default.sanitize(html, {
|
|
23
|
+
ADD_TAGS: ["figure", "figcaption", "iframe"],
|
|
24
|
+
ADD_ATTR: ["target", "rel", "loading"],
|
|
25
|
+
ALLOW_DATA_ATTR: false
|
|
26
|
+
});
|
|
27
|
+
}, [html]);
|
|
28
|
+
const pageSizeClass = pageSize ? ` trance-renderer-page-${pageSize.toLowerCase()}` : "";
|
|
29
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
30
|
+
"div",
|
|
31
|
+
{
|
|
32
|
+
className: `trance-renderer${pageSizeClass} ${className}`.trim(),
|
|
33
|
+
"data-trance-theme": theme,
|
|
34
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
35
|
+
"div",
|
|
36
|
+
{
|
|
37
|
+
className: "trance-renderer-content",
|
|
38
|
+
dangerouslySetInnerHTML: { __html: sanitizedHtml }
|
|
39
|
+
}
|
|
40
|
+
)
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
exports.TranceRenderer = TranceRenderer;
|
|
46
|
+
//# sourceMappingURL=renderer.cjs.map
|
|
47
|
+
//# sourceMappingURL=renderer.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/renderer/TranceRenderer.tsx"],"names":["useMemo","DOMPurify","jsx"],"mappings":";;;;;;;;;;;AAsDO,SAAS,cAAA,CAAe;AAAA,EAC7B,IAAA;AAAA,EACA,SAAA,GAAY,EAAA;AAAA,EACZ,KAAA,GAAQ,OAAA;AAAA,EACR;AACF,CAAA,EAAwB;AACtB,EAAA,MAAM,aAAA,GAAgBA,cAAQ,MAAM;AAClC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACjC,MAAA,OAAO,IAAA;AAAA,IACT;AACA,IAAA,OAAOC,0BAAA,CAAU,SAAS,IAAA,EAAM;AAAA,MAC9B,QAAA,EAAU,CAAC,QAAA,EAAU,YAAA,EAAc,QAAQ,CAAA;AAAA,MAC3C,QAAA,EAAU,CAAC,QAAA,EAAU,KAAA,EAAO,SAAS,CAAA;AAAA,MACrC,eAAA,EAAiB;AAAA,KAClB,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AAET,EAAA,MAAM,gBAAgB,QAAA,GAClB,CAAA,sBAAA,EAAyB,QAAA,CAAS,WAAA,EAAa,CAAA,CAAA,GAC/C,EAAA;AAEJ,EAAA,uBACEC,cAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,WAAW,CAAA,eAAA,EAAkB,aAAa,CAAA,CAAA,EAAI,SAAS,GAAG,IAAA,EAAK;AAAA,MAC/D,mBAAA,EAAmB,KAAA;AAAA,MAEnB,QAAA,kBAAAA,cAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACC,SAAA,EAAU,yBAAA;AAAA,UACV,uBAAA,EAAyB,EAAE,MAAA,EAAQ,aAAA;AAAc;AAAA;AACnD;AAAA,GACF;AAEJ","file":"renderer.cjs","sourcesContent":["import React, { useMemo } from \"react\";\nimport DOMPurify from \"dompurify\";\nimport \"./TranceRenderer.css\";\n\n/** Standard page sizes for the renderer */\nexport type PageSize =\n | \"A3\"\n | \"A4\"\n | \"A5\"\n | \"Letter\"\n | \"Legal\"\n | \"Tabloid\";\n\nconst PAGE_SIZE_WIDTHS: Record<PageSize, string> = {\n A3: \"297mm\",\n A4: \"210mm\",\n A5: \"148mm\",\n Letter: \"215.9mm\",\n Legal: \"215.9mm\",\n Tabloid: \"279.4mm\",\n};\n\nexport interface TranceRendererProps {\n /** HTML string output from TranceEditor */\n html: string;\n /** Additional CSS class */\n className?: string;\n /** Theme mode */\n theme?: \"light\" | \"dark\" | \"auto\";\n /**\n * Constrain content to a standard page size.\n * The renderer centers itself and adds a subtle paper-like background.\n * When omitted, the renderer fills its parent width.\n */\n pageSize?: PageSize;\n}\n\n/**\n * TranceRenderer — Beautifully renders HTML output from TranceEditor.\n *\n * - XSS-safe via DOMPurify sanitization\n * - Beautiful typography and styling out of the box\n * - Supports light/dark themes via CSS custom properties\n * - SSR-safe for Next.js/Remix\n *\n * @example\n * ```tsx\n * import { TranceRenderer } from 'trance-richtext-editor/renderer';\n *\n * function BlogPost({ content }: { content: string }) {\n * return <TranceRenderer html={content} theme=\"dark\" />;\n * }\n * ```\n */\nexport function TranceRenderer({\n html,\n className = \"\",\n theme = \"light\",\n pageSize,\n}: TranceRendererProps) {\n const sanitizedHtml = useMemo(() => {\n if (typeof window === \"undefined\") {\n return html;\n }\n return DOMPurify.sanitize(html, {\n ADD_TAGS: [\"figure\", \"figcaption\", \"iframe\"],\n ADD_ATTR: [\"target\", \"rel\", \"loading\"],\n ALLOW_DATA_ATTR: false,\n });\n }, [html]);\n\n const pageSizeClass = pageSize\n ? ` trance-renderer-page-${pageSize.toLowerCase()}`\n : \"\";\n\n return (\n <div\n className={`trance-renderer${pageSizeClass} ${className}`.trim()}\n data-trance-theme={theme}\n >\n <div\n className=\"trance-renderer-content\"\n dangerouslySetInnerHTML={{ __html: sanitizedHtml }}\n />\n </div>\n );\n}\n"]}
|