react-next-editor-js 0.1.0 → 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/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/react/EditorContext.ts","../src/react/ErrorBoundary.tsx","../src/react/toolbar/icons.tsx","../src/react/toolbar/ToolbarButton.tsx","../src/react/toolbar/ColorButton.tsx","../src/react/toolbar/Toolbar.tsx","../src/react/StatusBar.tsx","../src/react/Editor.tsx"],"names":["jsx","jsxs","importDocx","useRef","useState","useEffect","EditorInner","useMemo","useCallback","PMNode","paginated","engine","Editor"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { EditorContextValue } from './types';\n\n/** Context providing the live view/state/commands to the toolbar and children. */\nexport const EditorContext = createContext<EditorContextValue | null>(null);\n\n/** Access the editor context; throws if used outside an <Editor>. */\nexport function useEditorContext(): EditorContextValue {\n const ctx = useContext(EditorContext);\n if (!ctx) {\n throw new Error('useEditorContext must be used within a react-next-editor <Editor>.');\n }\n return ctx;\n}\n","'use client';\n\nimport { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n onError?: (error: Error) => void;\n fallbackMessage?: string;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\n/**\n * Wraps the editor so a failure in one feature/instance cannot bring down the\n * host app (F-11.2). Degrades to a recoverable state with a clear message and a\n * retry button; reports the error via `onError` for monitoring (F-11.8).\n */\nexport class EditorErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n // eslint-disable-next-line no-console\n console.error('[react-next-editor] Editor error contained by boundary:', error, info);\n this.props.onError?.(error);\n }\n\n private readonly handleReset = () => {\n this.setState({ error: null });\n };\n\n render(): ReactNode {\n if (this.state.error) {\n return (\n <div className=\"rne-root\">\n <div className=\"rne-error\" role=\"alert\">\n <strong>{this.props.fallbackMessage ?? 'The editor encountered a problem.'}</strong>\n <p>Your latest saved content is preserved locally. You can try to recover the editor.</p>\n <button type=\"button\" onClick={this.handleReset}>\n Reload editor\n </button>\n </div>\n </div>\n );\n }\n return this.props.children;\n }\n}\n","'use client';\n\nimport type { JSX } from 'react';\n\n/**\n * Compact 24×24 inline SVG icons for toolbar controls. Inline so the package has\n * no icon-font dependency and icons inherit `currentColor` for theming.\n */\nconst PATHS: Record<string, JSX.Element> = {\n undo: <path d=\"M12 5V1L7 6l5 5V7a6 6 0 1 1-6 6H4a8 8 0 1 0 8-8z\" />,\n redo: <path d=\"M12 5V1l5 5-5 5V7a6 6 0 1 0 6 6h2a8 8 0 1 1-8-8z\" />,\n bold: (\n <path d=\"M7 5h6a3.5 3.5 0 0 1 1.5 6.66A3.5 3.5 0 0 1 13 19H7V5zm3 2v3h3a1.5 1.5 0 0 0 0-3h-3zm0 5v4h3a2 2 0 0 0 0-4h-3z\" />\n ),\n italic: <path d=\"M10 4h7v2h-2.3l-3 12H14v2H7v-2h2.3l3-12H10V4z\" />,\n underline: <path d=\"M6 4v7a6 6 0 0 0 12 0V4h-2.5v7a3.5 3.5 0 0 1-7 0V4H6zm-1 16h14v2H5v-2z\" />,\n strikethrough: (\n <path d=\"M3 11h18v2H3v-2zm9-7c2.5 0 4 1.3 4.3 3h-2.4c-.2-.7-.8-1.2-1.9-1.2-1.2 0-2 .6-2 1.5 0 .5.3.9 1 1.2H9.2C8.5 9 8 8.2 8 7.2 8 5.3 9.7 4 12 4zm2 11.5c0 1.9-1.6 3.5-4.2 3.5-2.6 0-4.3-1.4-4.5-3.4h2.4c.2.9 1 1.5 2.2 1.5 1.3 0 2.1-.6 2.1-1.6 0-.2 0-.4-.1-.5H14z\" />\n ),\n superscript: (\n <path d=\"M4 7l4 5-4 5h2.5L9 13.5 11.5 17H14l-4-5 4-5h-2.5L9 10.5 6.5 7H4zm16-1c0-.8-.6-1.5-1.7-1.5-.9 0-1.6.5-1.8 1.3h1c.1-.3.4-.5.8-.5.4 0 .7.2.7.6 0 .6-1 1-2.3 2.1V9h3.6v-.9h-1.9c1-.8 1.6-1.3 1.6-2.2z\" />\n ),\n subscript: (\n <path d=\"M4 4l4 5-4 5h2.5L9 10.5 11.5 14H14l-4-5 4-5h-2.5L9 7.5 6.5 4H4zm16 13c0-.8-.6-1.5-1.7-1.5-.9 0-1.6.5-1.8 1.3h1c.1-.3.4-.5.8-.5.4 0 .7.2.7.6 0 .6-1 1-2.3 2.1V20h3.6v-.9h-1.9c1-.8 1.6-1.3 1.6-2.1z\" />\n ),\n code: <path d=\"M9 7l-5 5 5 5 1.4-1.4L6.8 12l3.6-3.6L9 7zm6 0l-1.4 1.4L17.2 12l-3.6 3.6L15 17l5-5-5-5z\" />,\n textColor: <path d=\"M5 18h14v2H5v-2zM9.6 4h2.8l4.1 11h-2.3l-1-3H8.8l-1 3H5.5L9.6 4zm-.2 6.1h3.2L11 5.6 9.4 10.1z\" />,\n highlight: <path d=\"M4 18h16v3H4v-3zM15.6 3.4l3 3-7.8 7.8-3.6.6.6-3.6 7.8-7.8zM6 13l3 3H6v-3z\" />,\n clearFormatting: (\n <path d=\"M6 5v2h5l-2.8 9h2.5l2.8-9H19V5H6zM4.7 17.3 17.3 4.7l1.4 1.4L6.1 18.7l-1.4-1.4z\" />\n ),\n alignLeft: <path d=\"M3 4h18v2H3V4zm0 5h12v2H3V9zm0 5h18v2H3v-2zm0 5h12v2H3v-2z\" />,\n alignCenter: <path d=\"M3 4h18v2H3V4zm3 5h12v2H6V9zm-3 5h18v2H3v-2zm3 5h12v2H6v-2z\" />,\n alignRight: <path d=\"M3 4h18v2H3V4zm6 5h12v2H9V9zm-6 5h18v2H3v-2zm6 5h12v2H9v-2z\" />,\n alignJustify: <path d=\"M3 4h18v2H3V4zm0 5h18v2H3V9zm0 5h18v2H3v-2zm0 5h18v2H3v-2z\" />,\n bulletList: (\n <path d=\"M4 5.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm4 .5h13v2H8V6zm-4 4.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm4 .5h13v2H8v-2zm-4 4.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm4 .5h13v2H8v-2z\" />\n ),\n orderedList: (\n <path d=\"M3 6h1V3H2v1h1v2zm5 0h13v2H8V6zm0 5h13v2H8v-2zm0 5h13v2H8v-2zM2 12.8h2v.5H3v.5h1v.5H2v.7h3v-3H2v.8zm1 4.2H2v.8h1.8v.4L2 19v.9h3V17H4l-1 .5V17z\" />\n ),\n taskList: (\n <path d=\"M3 5h6v6H3V5zm2 2v2h2V7H5zm6-1h10v2H11V6zm0 5h10v2H11v-2zm0 5h10v2H11v-2zM3 15.4l1.4-1.4 1.1 1.1 2.6-2.6L9.5 14l-4 4L3 15.4z\" />\n ),\n indent: <path d=\"M3 4h18v2H3V4zm8 5h10v2H11V9zm0 5h10v2H11v-2zm-8 5h18v2H3v-2zm0-9 4 3-4 3V10z\" />,\n outdent: <path d=\"M3 4h18v2H3V4zm8 5h10v2H11V9zm0 5h10v2H11v-2zm-8 5h18v2H3v-2zM7 10v6l-4-3 4-3z\" />,\n blockquote: (\n <path d=\"M7 7c-2 0-3.5 1.6-3.5 3.6 0 1.8 1.3 3 2.9 3 .2 0 .4 0 .6-.1-.4 1-1.4 1.8-2.5 2.1l.6 1.4C7.7 16.9 9.5 14.8 9.5 12 9.5 9.2 8.4 7 7 7zm9 0c-2 0-3.5 1.6-3.5 3.6 0 1.8 1.3 3 2.9 3 .2 0 .4 0 .6-.1-.4 1-1.4 1.8-2.5 2.1l.6 1.4c2.1-.6 3.9-2.7 3.9-5.5C18.5 9.2 17.4 7 16 7z\" />\n ),\n horizontalRule: <path d=\"M3 11h18v2H3v-2z\" />,\n link: (\n <path d=\"M10.6 13.4a1 1 0 0 0 1.4 0l3-3a3 3 0 0 0-4.3-4.3l-1.5 1.5 1.4 1.4 1.5-1.5a1 1 0 0 1 1.5 1.5l-3 3a1 1 0 0 0 0 1.4zm2.8-2.8a1 1 0 0 0-1.4 0l-3 3A3 3 0 0 0 13.3 18l1.5-1.5-1.4-1.4-1.5 1.5a1 1 0 0 1-1.5-1.5l3-3a1 1 0 0 0 0-1.4z\" />\n ),\n image: (\n <path d=\"M4 4h16a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zm1 2v9l4-4 3 3 3-3 3 3V6H5zm3 1.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3z\" />\n ),\n table: (\n <path d=\"M3 4h18v16H3V4zm2 2v3h5V6H5zm7 0v3h7V6h-7zm-7 5v3h5v-3H5zm7 0v3h7v-3h-7zm-7 5v2h5v-2H5zm7 0v2h7v-2h-7z\" />\n ),\n pageBreak: (\n <path d=\"M6 3h8l4 4v4h-2V8h-3V5H6v6H4V3h2zm-2 13h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v5H4v-5z\" />\n ),\n importDocx: (\n <path d=\"M5 3h9l5 5v6h-2V9h-4V5H7v14h5v2H5V3zm8 11 4 4 4-4h-3v-4h-2v4h-3z\" />\n ),\n};\n\nexport function ToolbarIcon({ name }: { name: string }): JSX.Element {\n const path = PATHS[name];\n if (!path) {\n return <span aria-hidden=\"true\">{name.slice(0, 2)}</span>;\n }\n return (\n <svg className=\"rne-btn-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n {path}\n </svg>\n );\n}\n","'use client';\n\nimport type { EditorCommand } from '../../core/commands/helpers';\nimport { useEditorContext } from '../EditorContext';\nimport { ToolbarIcon } from './icons';\n\ninterface ToolbarButtonProps {\n iconName: string;\n label: string;\n command: EditorCommand;\n}\n\n/** A single command button reflecting active/enabled state (F-10.6, NF-4). */\nexport function ToolbarButton({ iconName, label, command }: ToolbarButtonProps) {\n const { state, run } = useEditorContext();\n const active = state ? (command.isActive?.(state) ?? false) : false;\n const enabled = state ? (command.isEnabled ? command.isEnabled(state) : true) : false;\n\n return (\n <button\n type=\"button\"\n className={`rne-btn${active ? ' rne-btn--active' : ''}`}\n title={label}\n aria-label={label}\n aria-pressed={command.isActive ? active : undefined}\n disabled={!enabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => run(command.run)}\n >\n <ToolbarIcon name={iconName} />\n </button>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { Command } from 'prosemirror-state';\nimport { useEditorContext } from '../EditorContext';\nimport { ToolbarIcon } from './icons';\n\ninterface ColorButtonProps {\n iconName: 'textColor' | 'highlight';\n label: string;\n /** Build a command that applies the chosen color. */\n apply: (color: string) => Command;\n /** Build a command that clears the color, if supported. */\n clear?: () => Command;\n /** The currently-active color, for the swatch. */\n activeColor?: string | null;\n}\n\n/** A color picker button with a palette popover (text color / highlight). */\nexport function ColorButton({ iconName, label, apply, clear, activeColor }: ColorButtonProps) {\n const { run, colorPalette } = useEditorContext();\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onDown);\n return () => document.removeEventListener('mousedown', onDown);\n }, [open]);\n\n return (\n <div className=\"rne-color-btn\" ref={containerRef}>\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"rne-btn\"\n title={label}\n aria-label={label}\n aria-haspopup=\"true\"\n aria-expanded={open}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n >\n <span style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <ToolbarIcon name={iconName} />\n <span className=\"rne-color-swatch\" style={{ background: activeColor ?? '#000' }} />\n </span>\n </button>\n {open && (\n <div\n className=\"rne-color-popover\"\n role=\"menu\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setOpen(false);\n buttonRef.current?.focus();\n }\n }}\n >\n {colorPalette.map((color) => (\n <button\n key={color}\n type=\"button\"\n className=\"rne-color-cell\"\n style={{ background: color }}\n title={color}\n aria-label={color}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n run(apply(color));\n setOpen(false);\n }}\n />\n ))}\n {clear && (\n <button\n type=\"button\"\n className=\"rne-color-cell\"\n style={{ background: '#fff', gridColumn: 'span 8', height: 22 }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n run(clear());\n setOpen(false);\n }}\n >\n ✕\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { type ChangeEvent, Fragment, type KeyboardEvent, useCallback, useMemo, useRef } from 'react';\nimport type { EditorState } from 'prosemirror-state';\nimport type { FeatureFlags, ToolbarConfig, ToolbarItemId } from '../../config/types';\nimport { DEFAULT_TOOLBAR_GROUPS } from '../../config/defaults';\nimport { useEditorContext } from '../EditorContext';\nimport { ToolbarButton } from './ToolbarButton';\nimport { ColorButton } from './ColorButton';\nimport { ToolbarIcon } from './icons';\n\nconst FEATURE_OF: Partial<Record<ToolbarItemId, keyof FeatureFlags>> = {\n bold: 'bold',\n italic: 'italic',\n underline: 'underline',\n strikethrough: 'strikethrough',\n superscript: 'superscript',\n subscript: 'subscript',\n code: 'code',\n paragraphStyle: 'headings',\n fontFamily: 'fontFamily',\n fontSize: 'fontSize',\n textColor: 'textColor',\n highlight: 'highlight',\n clearFormatting: 'clearFormatting',\n alignLeft: 'alignment',\n alignCenter: 'alignment',\n alignRight: 'alignment',\n alignJustify: 'alignment',\n bulletList: 'bulletList',\n orderedList: 'orderedList',\n taskList: 'taskList',\n indent: 'indentation',\n outdent: 'indentation',\n blockquote: 'blockquote',\n horizontalRule: 'horizontalRule',\n link: 'link',\n image: 'image',\n table: 'table',\n pageBreak: 'pageBreak',\n importDocx: 'docxImport',\n undo: 'history',\n redo: 'history',\n};\n\n/** Item ids backed directly by a registry command (rendered as icon buttons). */\nconst COMMAND_ITEMS = new Set<ToolbarItemId>([\n 'undo',\n 'redo',\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'superscript',\n 'subscript',\n 'code',\n 'clearFormatting',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'alignJustify',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'indent',\n 'outdent',\n 'blockquote',\n 'horizontalRule',\n 'pageBreak',\n]);\n\nfunction activeBlockValue(state: EditorState | null): string {\n if (!state) return 'p';\n const node = state.selection.$head.parent;\n if (node.type.name === 'heading') return `h${node.attrs.level as number}`;\n return 'p';\n}\n\ninterface ToolbarProps {\n config?: ToolbarConfig;\n}\n\n/** Data-driven, keyboard-accessible toolbar (F-1–F-3, F-10.6, NF-4). */\nexport function Toolbar({ config }: ToolbarProps) {\n const ctx = useEditorContext();\n const { state, commands, strings, features, run, fontFamilies, fontSizes, importDocx } = ctx;\n\n const groups = config?.groups ?? DEFAULT_TOOLBAR_GROUPS;\n const sticky = config?.sticky ?? true;\n const toolbarRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const onImportFile = useCallback(\n async (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = ''; // allow re-importing the same file\n if (!file) return;\n try {\n await importDocx(file);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[react-next-editor] DOCX import failed:', err);\n }\n },\n [importDocx],\n );\n\n // Arrow-key navigation between toolbar buttons (WCAG toolbar pattern). Tab\n // order is preserved; arrows move focus among enabled buttons. Selects keep\n // their native arrow behaviour (and remain reachable via Tab), so they are not\n // part of the arrow ring.\n const onToolbarKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return;\n const active = document.activeElement as HTMLElement | null;\n if (active?.tagName === 'SELECT') return;\n const root = toolbarRef.current;\n if (!root) return;\n const items = Array.from(root.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (items.length === 0) return;\n const idx = active ? items.indexOf(active) : -1;\n if (idx === -1) return;\n e.preventDefault();\n let next = idx;\n if (e.key === 'ArrowRight') next = (idx + 1) % items.length;\n else if (e.key === 'ArrowLeft') next = (idx - 1 + items.length) % items.length;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = items.length - 1;\n items[next]?.focus();\n }, []);\n\n const renderedGroups = useMemo(() => {\n return groups\n .map((group) => group.filter((id) => isItemAvailable(id, features, commands)))\n .filter((group) => group.length > 0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [groups, features, commands]);\n\n const labelFor = (id: ToolbarItemId): string =>\n (strings as unknown as Record<string, string>)[id] ?? id;\n\n function renderItem(id: ToolbarItemId) {\n if (COMMAND_ITEMS.has(id)) {\n const command = commands.registry[id];\n if (!command) return null;\n return <ToolbarButton key={id} iconName={id} label={labelFor(id)} command={command} />;\n }\n\n switch (id) {\n case 'paragraphStyle':\n return (\n <select\n key={id}\n className=\"rne-select\"\n aria-label={strings.paragraphStyle}\n value={activeBlockValue(state)}\n onMouseDown={(e) => e.stopPropagation()}\n onChange={(e) => {\n const v = e.target.value;\n if (v === 'p') run(commands.blocks.setParagraph());\n else run(commands.blocks.setHeading(Number(v.slice(1))));\n }}\n >\n <option value=\"p\">{strings.paragraph}</option>\n {[1, 2, 3, 4, 5, 6].map((lvl) => (\n <option key={lvl} value={`h${lvl}`}>{`${strings.heading} ${lvl}`}</option>\n ))}\n </select>\n );\n case 'fontFamily':\n return (\n <select\n key={id}\n className=\"rne-select\"\n aria-label={strings.fontFamily}\n value={state ? (commands.marks.getActiveFontFamily(state) ?? '') : ''}\n onChange={(e) => {\n const v = e.target.value;\n run(v ? commands.marks.setFontFamily(v) : commands.marks.clearFontFamily());\n }}\n >\n <option value=\"\">{strings.fontFamily}</option>\n {fontFamilies.map((f) => (\n <option key={f} value={f} style={{ fontFamily: f }}>\n {f}\n </option>\n ))}\n </select>\n );\n case 'fontSize':\n return (\n <select\n key={id}\n className=\"rne-select\"\n style={{ maxWidth: 70 }}\n aria-label={strings.fontSize}\n value={state ? (commands.marks.getActiveFontSize(state) ?? '') : ''}\n onChange={(e) => {\n const v = e.target.value;\n run(v ? commands.marks.setFontSize(Number(v)) : commands.marks.clearFontSize());\n }}\n >\n <option value=\"\">{strings.fontSize}</option>\n {fontSizes.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n );\n case 'textColor':\n return (\n <ColorButton\n key={id}\n iconName=\"textColor\"\n label={strings.textColor}\n apply={(c) => commands.marks.setTextColor(c)}\n clear={() => commands.marks.clearTextColor()}\n activeColor={state ? commands.marks.getActiveTextColor(state) : null}\n />\n );\n case 'highlight':\n return (\n <ColorButton\n key={id}\n iconName=\"highlight\"\n label={strings.highlight}\n apply={(c) => commands.marks.setHighlight(c)}\n clear={() => commands.marks.clearHighlight()}\n />\n );\n case 'link':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.link}\n aria-label={strings.link}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (!state) return;\n const prev = commands.links.getActiveLink(state);\n const url = window.prompt(strings.linkPrompt, prev?.href ?? 'https://');\n if (url === null) return;\n if (url.trim() === '') run(commands.links.removeLink);\n else run(commands.links.setLink({ href: url.trim() }));\n }}\n >\n <ToolbarIcon name=\"link\" />\n </button>\n );\n case 'image':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.image}\n aria-label={strings.image}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n const url = window.prompt(strings.imagePrompt, 'https://');\n if (!url || !url.trim()) return;\n // Prompt for alt text so inserted images are accessible (NF-4).\n const alt = window.prompt(strings.imageAltPrompt, '');\n run(commands.insert.image({ src: url.trim(), alt: alt?.trim() || null }));\n }}\n >\n <ToolbarIcon name=\"image\" />\n </button>\n );\n case 'table':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.insertTable}\n aria-label={strings.insertTable}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => run(commands.insert.table(3, 3, true))}\n >\n <ToolbarIcon name=\"table\" />\n </button>\n );\n case 'importDocx':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.importDocx}\n aria-label={strings.importDocx}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => fileInputRef.current?.click()}\n >\n <ToolbarIcon name=\"importDocx\" />\n </button>\n );\n default:\n return null;\n }\n }\n\n return (\n <div\n ref={toolbarRef}\n className={`rne-toolbar${sticky ? ' rne-toolbar--sticky' : ''}`}\n role=\"toolbar\"\n aria-label=\"Formatting\"\n onKeyDown={onToolbarKeyDown}\n >\n {renderedGroups.map((group, gi) => (\n <Fragment key={gi}>\n {gi > 0 && <span className=\"rne-toolbar-separator\" aria-hidden=\"true\" />}\n <div className=\"rne-toolbar-group\">{group.map(renderItem)}</div>\n </Fragment>\n ))}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n onChange={onImportFile}\n />\n </div>\n );\n}\n\nfunction isItemAvailable(\n id: ToolbarItemId,\n features: FeatureFlags,\n commands: ReturnType<typeof useEditorContext>['commands'],\n): boolean {\n if (id === 'separator') return false;\n const feature = FEATURE_OF[id];\n if (feature && !features[feature]) return false;\n if (COMMAND_ITEMS.has(id) && !commands.registry[id]) return false;\n return true;\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport type { SaveStatus } from '../config/types';\nimport { countDocument, type DocumentStats } from '../core/utils';\nimport { useEditorContext } from './EditorContext';\n\nconst STATUS_LABEL: Record<SaveStatus, string> = {\n idle: '',\n savingLocal: 'Saving…',\n savedLocal: 'Saved locally',\n syncing: 'Syncing…',\n synced: 'Synced',\n syncFailed: 'Sync failed',\n offline: 'Offline',\n};\n\ninterface StatusBarProps {\n saveStatus: SaveStatus;\n hasPersistence: boolean;\n}\n\n/**\n * Word/character count (F-4.5) and visible save/sync status (F-9.4, NF-10).\n *\n * The count is an O(n) document walk, so it is recomputed only when the document\n * actually changes (not on selection changes) and is debounced — keeping typing\n * responsive on large documents (NF-1).\n */\nexport function StatusBar({ saveStatus, hasPersistence }: StatusBarProps) {\n const { state, strings } = useEditorContext();\n const doc = state?.doc;\n const [stats, setStats] = useState<DocumentStats | null>(null);\n\n useEffect(() => {\n if (!doc) {\n setStats(null);\n return;\n }\n // `doc` identity is stable across selection-only transactions, so this fires\n // only on real edits. Debounce to avoid walking a large doc on every keystroke.\n const id = setTimeout(() => setStats(countDocument(doc)), 300);\n return () => clearTimeout(id);\n }, [doc]);\n\n return (\n <div className=\"rne-statusbar\">\n <span>\n {stats\n ? `${stats.words} ${strings.words} · ${stats.characters} ${strings.characters}`\n : ''}\n </span>\n {hasPersistence && saveStatus !== 'idle' && (\n <span className=\"rne-status-badge\">\n <span className={`rne-status-dot rne-status-dot--${saveStatus}`} />\n {STATUS_LABEL[saveStatus]}\n </span>\n )}\n </div>\n );\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { EditorView } from 'prosemirror-view';\nimport { type Command, EditorState, TextSelection } from 'prosemirror-state';\nimport { Node as PMNode, type Schema } from 'prosemirror-model';\n\nimport type { DocumentJSON, EditorStrings, FeatureFlags, PageConfig, SaveStatus } from '../config/types';\nimport {\n DEFAULT_COLOR_PALETTE,\n DEFAULT_FEATURES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_FONT_SIZES,\n DEFAULT_PAGE,\n DEFAULT_STRINGS,\n resolvePageDimensions,\n themeToCssVars,\n} from '../config/defaults';\nimport { buildSchema } from '../core/schema/schema';\nimport { buildPlugins } from '../core/plugins/index';\nimport type { PaginationGeometry } from '../core/pagination/plugin';\nimport { createCommands, type CommandSet } from '../core/commands/index';\nimport { createDoc, createEditorState } from '../core/state/createEditorState';\nimport { preloadSanitizer } from '../security/sanitize';\nimport { documentToText } from '../export/text';\nimport { documentToHtml } from '../export/html';\nimport { exportDocument } from '../export/index';\nimport { DocumentPersistence } from '../persistence/autosave';\nimport { IndexedDBStore, requestPersistentStorage } from '../persistence/indexeddb';\nimport { ConnectivityMonitor } from '../sync/connectivity';\nimport { SyncEngine } from '../sync/engine';\nimport { EditorContext } from './EditorContext';\nimport { EditorErrorBoundary } from './ErrorBoundary';\nimport { Toolbar } from './toolbar/Toolbar';\nimport { StatusBar } from './StatusBar';\nimport type { EditorContextValue, EditorProps, EditorRef } from './types';\n\ninterface ResolvedConfig {\n features: FeatureFlags;\n page: PageConfig;\n strings: EditorStrings;\n fontFamilies: string[];\n fontSizes: number[];\n colorPalette: string[];\n editable: boolean;\n placeholder: string | undefined;\n}\n\nfunction resolveConfig(props: EditorProps): ResolvedConfig {\n return {\n features: { ...DEFAULT_FEATURES, ...props.features },\n page: {\n ...DEFAULT_PAGE,\n ...props.page,\n margins: { ...DEFAULT_PAGE.margins, ...props.page?.margins },\n },\n strings: { ...DEFAULT_STRINGS, ...props.strings },\n fontFamilies: props.fontFamilies ?? DEFAULT_FONT_FAMILIES,\n fontSizes: props.fontSizes ?? DEFAULT_FONT_SIZES,\n colorPalette: props.colorPalette ?? DEFAULT_COLOR_PALETTE,\n editable: !(props.readOnly || props.mode === 'readonly'),\n placeholder: props.placeholder,\n };\n}\n\n/** CSS pixels per millimetre at 96 DPI (the CSS reference). */\nconst PX_PER_MM = 96 / 25.4;\n/** Visual gap (px) drawn on the canvas between consecutive page sheets. */\nconst PAGE_GAP_PX = 24;\n\n/** Convert a page configuration (mm) into concrete pixel geometry, or null. */\nfunction computePaginationGeometry(page: PageConfig): PaginationGeometry | null {\n if (page.pagination !== 'visual') return null;\n const { width, height } = resolvePageDimensions(page);\n const m = page.margins;\n const pageWidthPx = width * PX_PER_MM;\n const pageHeightPx = height * PX_PER_MM;\n const marginTopPx = m.top * PX_PER_MM;\n const marginBottomPx = m.bottom * PX_PER_MM;\n const marginLeftPx = m.left * PX_PER_MM;\n const contentWidthPx = Math.max(1, (width - m.left - m.right) * PX_PER_MM);\n const contentHeightPx = pageHeightPx - marginTopPx - marginBottomPx;\n if (contentHeightPx <= 0) return null;\n return {\n pageWidthPx,\n pageHeightPx,\n marginTopPx,\n marginBottomPx,\n marginLeftPx,\n contentWidthPx,\n contentHeightPx,\n interPageOffsetPx: marginBottomPx + PAGE_GAP_PX + marginTopPx,\n };\n}\n\nconst EditorInner = forwardRef<EditorRef, EditorProps>(function EditorInner(props, ref) {\n const mountRef = useRef<HTMLDivElement | null>(null);\n const viewRef = useRef<EditorView | null>(null);\n const persistenceRef = useRef<DocumentPersistence | null>(null);\n const pageBgRef = useRef<HTMLDivElement | null>(null);\n const remeasureRef = useRef<(() => void) | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n\n const config = useMemo(() => resolveConfig(props), [props]);\n const cfgRef = useRef(config);\n cfgRef.current = config;\n\n // Build the editing engine (schema + commands) once per feature set + placeholder.\n const featureKey = useMemo(() => JSON.stringify(config.features), [config.features]);\n const engine = useMemo(() => {\n const schema: Schema = buildSchema(config.features);\n const commands: CommandSet = createCommands(schema);\n return { schema, commands };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [featureKey]);\n\n const [editorState, setEditorState] = useState<EditorState | null>(null);\n const [saveStatus, setSaveStatus] = useState<SaveStatus>('idle');\n const [ready, setReady] = useState(false);\n\n // ---- Imperative handle (F-10.15, F-10.16) ----\n const getJSON = useCallback((): DocumentJSON => {\n const view = viewRef.current;\n return (view ? view.state.doc.toJSON() : createDoc(engine.schema, null).toJSON()) as DocumentJSON;\n }, [engine.schema]);\n\n const setContent = useCallback(\n (content: DocumentJSON | string | null) => {\n const view = viewRef.current;\n if (!view) return;\n const doc = createDoc(view.state.schema, content);\n const state = EditorState.create({ doc, plugins: view.state.plugins });\n view.updateState(state);\n setEditorState(state);\n },\n [],\n );\n\n const importDocxIntoEditor = useCallback(\n async (file: ArrayBuffer | Uint8Array | Blob): Promise<{ warnings: string[] }> => {\n const view = viewRef.current;\n if (!view) return { warnings: [] };\n const { importDocx } = await import('../import/docx');\n const result = await importDocx(file, view.state.schema);\n // Replace the whole document via a dispatched transaction so the change is\n // undoable and flows through onChange/autosave like any other edit.\n const node = PMNode.fromJSON(view.state.schema, result.doc);\n const v = viewRef.current;\n if (v) {\n const tr = v.state.tr.replaceWith(0, v.state.doc.content.size, node.content);\n v.dispatch(tr.scrollIntoView());\n }\n return { warnings: result.warnings };\n },\n [],\n );\n\n const handle = useMemo<EditorRef>(\n () => ({\n getJSON,\n getText: (options) => documentToText(getJSON(), options),\n getHTML: () => documentToHtml(getJSON()),\n setContent,\n importDocx: importDocxIntoEditor,\n focus: () => viewRef.current?.focus(),\n isDirty: () => persistenceRef.current?.isDirty() ?? false,\n save: async () => {\n await persistenceRef.current?.saveNow(getJSON());\n },\n clearLocalData: async () => {\n await persistenceRef.current?.clearLocal();\n },\n exportAs: (format, filename) =>\n exportDocument(getJSON(), format, {\n filename: filename ?? propsRef.current.documentId,\n page: cfgRef.current.page,\n title: filename ?? propsRef.current.documentId,\n }),\n getView: () => viewRef.current,\n getState: () => viewRef.current?.state ?? null,\n getSchema: () => viewRef.current?.state.schema ?? null,\n }),\n [getJSON, setContent, importDocxIntoEditor],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n\n // ---- Create the ProseMirror view once (golden rule: PM owns the DOM) ----\n useEffect(() => {\n const mount = mountRef.current;\n if (!mount) return;\n\n void preloadSanitizer();\n\n const paginated = cfgRef.current.page.pagination === 'visual';\n const plugins = buildPlugins(engine.schema, {\n placeholder: cfgRef.current.placeholder,\n history: cfgRef.current.features.history,\n extraPlugins: propsRef.current.extensions?.plugins,\n pagination: paginated\n ? {\n getGeometry: () => computePaginationGeometry(cfgRef.current.page),\n getBackgroundLayer: () => pageBgRef.current,\n header: cfgRef.current.page.header,\n footer: cfgRef.current.page.footer,\n register: (fn) => {\n remeasureRef.current = fn;\n },\n }\n : undefined,\n });\n\n const initialContent =\n propsRef.current.value ?? propsRef.current.initialContent ?? null;\n const state = createEditorState({ schema: engine.schema, plugins, content: initialContent });\n\n const view = new EditorView(mount, {\n state,\n editable: () => !(propsRef.current.readOnly || propsRef.current.mode === 'readonly'),\n attributes: {\n class: 'rne-prosemirror',\n role: 'textbox',\n 'aria-multiline': 'true',\n 'aria-label': propsRef.current.ariaLabel ?? 'Document editor',\n dir: propsRef.current.dir ?? 'ltr',\n },\n dispatchTransaction(tr) {\n const v = viewRef.current;\n if (!v) return;\n const newState = v.state.apply(tr);\n v.updateState(newState);\n setEditorState(newState);\n\n const p = propsRef.current;\n if (tr.docChanged) {\n const json = newState.doc.toJSON() as DocumentJSON;\n p.onChange?.(json, handle);\n persistenceRef.current?.scheduleSave(json);\n }\n if (tr.selectionSet) {\n p.onSelectionChange?.(newState);\n }\n },\n });\n\n viewRef.current = view;\n setEditorState(view.state);\n setReady(true);\n propsRef.current.onReady?.(handle);\n\n return () => {\n view.destroy();\n viewRef.current = null;\n setReady(false);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [engine]);\n\n // ---- Keep editability in sync without recreating the view ----\n useEffect(() => {\n viewRef.current?.setProps({\n editable: () => config.editable,\n });\n // Re-render to update toolbar disabled state.\n setEditorState((s) => s);\n }, [config.editable]);\n\n // ---- Local persistence, crash recovery (F-9.2, F-11.9), and sync (F-9.6–F-9.9, F-9.14) ----\n useEffect(() => {\n const documentId = props.documentId;\n const persistenceEnabled = props.persistence?.enabled ?? !!documentId;\n if (!documentId || !persistenceEnabled || !ready) return;\n\n const store = props.persistence?.store ?? new IndexedDBStore();\n const sync = props.sync;\n const auto = sync?.auto ?? true;\n\n let engine: SyncEngine | null = null;\n let monitor: ConnectivityMonitor | null = null;\n\n // Shared status handler: surfaces both local-save and sync transitions, and\n // triggers an upload after each successful local save when online (F-9.6).\n const handleStatus = (status: SaveStatus, detail?: { error?: string }) => {\n setSaveStatus(status);\n propsRef.current.onSaveStatusChange?.(status, detail);\n if (status === 'savedLocal' && engine && auto && (monitor?.isOnline() ?? true)) {\n void engine.flush();\n }\n };\n\n const persistence = new DocumentPersistence({\n documentId,\n store,\n debounceMs: props.persistence?.debounceMs,\n metadata: props.metadata,\n onStatus: handleStatus,\n });\n persistenceRef.current = persistence;\n\n if (sync?.remote) {\n engine = new SyncEngine({\n store,\n remote: sync.remote,\n maxAttempts: sync.maxAttempts,\n onStatus: handleStatus,\n onConflict: sync.onConflict,\n });\n const remotePing = sync.remote.ping?.bind(sync.remote);\n monitor = new ConnectivityMonitor({\n ping: remotePing,\n intervalMs: sync.pingIntervalMs,\n onChange: (online) => {\n if (online) {\n if (auto && engine) void engine.flush();\n } else {\n handleStatus('offline');\n }\n },\n });\n monitor.start();\n if (auto) void engine.flush(); // attempt to drain any queue from a prior session\n }\n\n if (props.persistence?.requestPersistent !== false) {\n void requestPersistentStorage();\n }\n\n let cancelled = false;\n void (async () => {\n const record = await persistence.load();\n if (cancelled || !record) return;\n // Only restore from local storage when no explicit controlled value is set.\n if (propsRef.current.value == null) {\n setContent(record.doc);\n }\n })();\n\n return () => {\n cancelled = true;\n monitor?.stop();\n engine?.cancel();\n void persistence.destroy();\n persistenceRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.documentId, ready, props.sync?.remote]);\n\n // ---- Controlled value sync (F-10.20) ----\n useEffect(() => {\n const view = viewRef.current;\n if (!view || props.value == null) return;\n const current = JSON.stringify(view.state.doc.toJSON());\n const next = JSON.stringify(props.value);\n if (current === next) return;\n const doc = createDoc(view.state.schema, props.value);\n const selectionPos = Math.min(view.state.selection.from, doc.content.size);\n const state = EditorState.create({ doc, plugins: view.state.plugins });\n const withSel = state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, Math.max(0, selectionPos))),\n );\n view.updateState(withSel);\n setEditorState(withSel);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.value]);\n\n // ---- Context for toolbar/children ----\n const runCommand = useCallback((command: Command): boolean => {\n const view = viewRef.current;\n if (!view) return false;\n const result = command(view.state, view.dispatch, view);\n view.focus();\n return result;\n }, []);\n\n const contextValue = useMemo<EditorContextValue>(\n () => ({\n view: viewRef.current,\n state: editorState,\n schema: engine.schema,\n commands: engine.commands,\n strings: config.strings,\n features: config.features,\n fontFamilies: config.fontFamilies,\n fontSizes: config.fontSizes,\n colorPalette: config.colorPalette,\n editable: config.editable,\n run: runCommand,\n importDocx: importDocxIntoEditor,\n }),\n [editorState, engine, config, runCommand, importDocxIntoEditor],\n );\n\n // ---- Layout / page surface ----\n const { width } = resolvePageDimensions(config.page);\n const showChrome = config.page.showPageChrome;\n const paginated = config.page.pagination === 'visual';\n\n // Stable signature of the page geometry; force a re-measure when it changes.\n const pageGeometryKey = useMemo(\n () =>\n JSON.stringify({\n p: config.page.pagination,\n s: config.page.size,\n o: config.page.orientation,\n w: config.page.widthMm,\n h: config.page.heightMm,\n m: config.page.margins,\n hdr: config.page.header,\n ftr: config.page.footer,\n }),\n [config.page],\n );\n useEffect(() => {\n if (paginated) remeasureRef.current?.();\n }, [pageGeometryKey, paginated]);\n\n const geometry = useMemo(\n () => computePaginationGeometry(config.page),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pageGeometryKey],\n );\n\n const rootStyle = useMemo(() => {\n const base: Record<string, string> = {\n ...themeToCssVars(props.theme),\n '--rne-page-width': `${width}mm`,\n '--rne-page-padding': `${config.page.margins.top}mm ${config.page.margins.right}mm ${config.page.margins.bottom}mm ${config.page.margins.left}mm`,\n };\n if (geometry) {\n base['--rne-page-w'] = `${geometry.pageWidthPx}px`;\n base['--rne-page-h'] = `${geometry.pageHeightPx}px`;\n base['--rne-content-w'] = `${geometry.contentWidthPx}px`;\n base['--rne-mt'] = `${geometry.marginTopPx}px`;\n base['--rne-ml'] = `${geometry.marginLeftPx}px`;\n }\n return { ...base, ...(props.style as Record<string, string> | undefined) };\n }, [props.theme, props.style, width, config.page.margins, geometry]);\n\n const toolbarEnabled = props.toolbar !== false && (props.toolbar?.enabled ?? true) && config.editable;\n const statusBarEnabled = props.statusBar ?? true;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n className={`rne-root${props.className ? ` ${props.className}` : ''}`}\n style={rootStyle as React.CSSProperties}\n data-ready={ready}\n dir={props.dir ?? 'ltr'}\n >\n {toolbarEnabled && <Toolbar config={props.toolbar || undefined} />}\n {props.children}\n <div\n className={`rne-canvas${showChrome ? '' : ' rne-canvas--plain'}${paginated ? ' rne-canvas--paged' : ''}`}\n >\n {paginated ? (\n <div className=\"rne-paged\">\n <div ref={pageBgRef} className=\"rne-page-bg\" aria-hidden=\"true\" />\n <div ref={mountRef} className=\"rne-mount rne-mount--paged\" />\n </div>\n ) : (\n <div className=\"rne-page\">\n <div ref={mountRef} className=\"rne-mount\" />\n </div>\n )}\n </div>\n {statusBarEnabled && <StatusBar saveStatus={saveStatus} hasPersistence={!!props.documentId} />}\n </div>\n </EditorContext.Provider>\n );\n});\n\n/**\n * The embeddable rich document editor (F-10.17). Client-only — load via\n * `next/dynamic(() => import('react-next-editor').then(m => m.Editor), { ssr: false })`.\n * Wrapped in an error boundary so a failure never takes down the host (F-11.2).\n */\nexport const Editor = forwardRef<EditorRef, EditorProps>(function Editor(props, ref) {\n return (\n <EditorErrorBoundary onError={props.onError}>\n <EditorInner {...props} ref={ref} />\n </EditorErrorBoundary>\n );\n});\n"]}
1
+ {"version":3,"sources":["../src/react/EditorContext.ts","../src/react/ErrorBoundary.tsx","../src/react/toolbar/icons.tsx","../src/react/toolbar/ToolbarButton.tsx","../src/react/toolbar/ColorButton.tsx","../src/react/toolbar/Toolbar.tsx","../src/react/StatusBar.tsx","../src/react/Editor.tsx","../src/react/DocumentView.tsx"],"names":["jsx","jsxs","importDocx","useRef","useState","useEffect","EditorInner","useMemo","useCallback","PMNode","paginated","engine","Editor"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { EditorContextValue } from './types';\n\n/** Context providing the live view/state/commands to the toolbar and children. */\nexport const EditorContext = createContext<EditorContextValue | null>(null);\n\n/** Access the editor context; throws if used outside an <Editor>. */\nexport function useEditorContext(): EditorContextValue {\n const ctx = useContext(EditorContext);\n if (!ctx) {\n throw new Error('useEditorContext must be used within a react-next-editor <Editor>.');\n }\n return ctx;\n}\n","'use client';\n\nimport { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n onError?: (error: Error) => void;\n fallbackMessage?: string;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\n/**\n * Wraps the editor so a failure in one feature/instance cannot bring down the\n * host app (F-11.2). Degrades to a recoverable state with a clear message and a\n * retry button; reports the error via `onError` for monitoring (F-11.8).\n */\nexport class EditorErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n // eslint-disable-next-line no-console\n console.error('[react-next-editor] Editor error contained by boundary:', error, info);\n this.props.onError?.(error);\n }\n\n private readonly handleReset = () => {\n this.setState({ error: null });\n };\n\n render(): ReactNode {\n if (this.state.error) {\n return (\n <div className=\"rne-root\">\n <div className=\"rne-error\" role=\"alert\">\n <strong>{this.props.fallbackMessage ?? 'The editor encountered a problem.'}</strong>\n <p>Your latest saved content is preserved locally. You can try to recover the editor.</p>\n <button type=\"button\" onClick={this.handleReset}>\n Reload editor\n </button>\n </div>\n </div>\n );\n }\n return this.props.children;\n }\n}\n","'use client';\n\nimport type { JSX } from 'react';\n\n/**\n * Compact 24×24 inline SVG icons for toolbar controls. Inline so the package has\n * no icon-font dependency and icons inherit `currentColor` for theming.\n */\nconst PATHS: Record<string, JSX.Element> = {\n undo: <path d=\"M12 5V1L7 6l5 5V7a6 6 0 1 1-6 6H4a8 8 0 1 0 8-8z\" />,\n redo: <path d=\"M12 5V1l5 5-5 5V7a6 6 0 1 0 6 6h2a8 8 0 1 1-8-8z\" />,\n bold: (\n <path d=\"M7 5h6a3.5 3.5 0 0 1 1.5 6.66A3.5 3.5 0 0 1 13 19H7V5zm3 2v3h3a1.5 1.5 0 0 0 0-3h-3zm0 5v4h3a2 2 0 0 0 0-4h-3z\" />\n ),\n italic: <path d=\"M10 4h7v2h-2.3l-3 12H14v2H7v-2h2.3l3-12H10V4z\" />,\n underline: <path d=\"M6 4v7a6 6 0 0 0 12 0V4h-2.5v7a3.5 3.5 0 0 1-7 0V4H6zm-1 16h14v2H5v-2z\" />,\n strikethrough: (\n <path d=\"M3 11h18v2H3v-2zm9-7c2.5 0 4 1.3 4.3 3h-2.4c-.2-.7-.8-1.2-1.9-1.2-1.2 0-2 .6-2 1.5 0 .5.3.9 1 1.2H9.2C8.5 9 8 8.2 8 7.2 8 5.3 9.7 4 12 4zm2 11.5c0 1.9-1.6 3.5-4.2 3.5-2.6 0-4.3-1.4-4.5-3.4h2.4c.2.9 1 1.5 2.2 1.5 1.3 0 2.1-.6 2.1-1.6 0-.2 0-.4-.1-.5H14z\" />\n ),\n superscript: (\n <path d=\"M4 7l4 5-4 5h2.5L9 13.5 11.5 17H14l-4-5 4-5h-2.5L9 10.5 6.5 7H4zm16-1c0-.8-.6-1.5-1.7-1.5-.9 0-1.6.5-1.8 1.3h1c.1-.3.4-.5.8-.5.4 0 .7.2.7.6 0 .6-1 1-2.3 2.1V9h3.6v-.9h-1.9c1-.8 1.6-1.3 1.6-2.2z\" />\n ),\n subscript: (\n <path d=\"M4 4l4 5-4 5h2.5L9 10.5 11.5 14H14l-4-5 4-5h-2.5L9 7.5 6.5 4H4zm16 13c0-.8-.6-1.5-1.7-1.5-.9 0-1.6.5-1.8 1.3h1c.1-.3.4-.5.8-.5.4 0 .7.2.7.6 0 .6-1 1-2.3 2.1V20h3.6v-.9h-1.9c1-.8 1.6-1.3 1.6-2.1z\" />\n ),\n code: <path d=\"M9 7l-5 5 5 5 1.4-1.4L6.8 12l3.6-3.6L9 7zm6 0l-1.4 1.4L17.2 12l-3.6 3.6L15 17l5-5-5-5z\" />,\n textColor: <path d=\"M5 18h14v2H5v-2zM9.6 4h2.8l4.1 11h-2.3l-1-3H8.8l-1 3H5.5L9.6 4zm-.2 6.1h3.2L11 5.6 9.4 10.1z\" />,\n highlight: <path d=\"M4 18h16v3H4v-3zM15.6 3.4l3 3-7.8 7.8-3.6.6.6-3.6 7.8-7.8zM6 13l3 3H6v-3z\" />,\n clearFormatting: (\n <path d=\"M6 5v2h5l-2.8 9h2.5l2.8-9H19V5H6zM4.7 17.3 17.3 4.7l1.4 1.4L6.1 18.7l-1.4-1.4z\" />\n ),\n alignLeft: <path d=\"M3 4h18v2H3V4zm0 5h12v2H3V9zm0 5h18v2H3v-2zm0 5h12v2H3v-2z\" />,\n alignCenter: <path d=\"M3 4h18v2H3V4zm3 5h12v2H6V9zm-3 5h18v2H3v-2zm3 5h12v2H6v-2z\" />,\n alignRight: <path d=\"M3 4h18v2H3V4zm6 5h12v2H9V9zm-6 5h18v2H3v-2zm6 5h12v2H9v-2z\" />,\n alignJustify: <path d=\"M3 4h18v2H3V4zm0 5h18v2H3V9zm0 5h18v2H3v-2zm0 5h18v2H3v-2z\" />,\n bulletList: (\n <path d=\"M4 5.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm4 .5h13v2H8V6zm-4 4.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm4 .5h13v2H8v-2zm-4 4.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm4 .5h13v2H8v-2z\" />\n ),\n orderedList: (\n <path d=\"M3 6h1V3H2v1h1v2zm5 0h13v2H8V6zm0 5h13v2H8v-2zm0 5h13v2H8v-2zM2 12.8h2v.5H3v.5h1v.5H2v.7h3v-3H2v.8zm1 4.2H2v.8h1.8v.4L2 19v.9h3V17H4l-1 .5V17z\" />\n ),\n taskList: (\n <path d=\"M3 5h6v6H3V5zm2 2v2h2V7H5zm6-1h10v2H11V6zm0 5h10v2H11v-2zm0 5h10v2H11v-2zM3 15.4l1.4-1.4 1.1 1.1 2.6-2.6L9.5 14l-4 4L3 15.4z\" />\n ),\n indent: <path d=\"M3 4h18v2H3V4zm8 5h10v2H11V9zm0 5h10v2H11v-2zm-8 5h18v2H3v-2zm0-9 4 3-4 3V10z\" />,\n outdent: <path d=\"M3 4h18v2H3V4zm8 5h10v2H11V9zm0 5h10v2H11v-2zm-8 5h18v2H3v-2zM7 10v6l-4-3 4-3z\" />,\n blockquote: (\n <path d=\"M7 7c-2 0-3.5 1.6-3.5 3.6 0 1.8 1.3 3 2.9 3 .2 0 .4 0 .6-.1-.4 1-1.4 1.8-2.5 2.1l.6 1.4C7.7 16.9 9.5 14.8 9.5 12 9.5 9.2 8.4 7 7 7zm9 0c-2 0-3.5 1.6-3.5 3.6 0 1.8 1.3 3 2.9 3 .2 0 .4 0 .6-.1-.4 1-1.4 1.8-2.5 2.1l.6 1.4c2.1-.6 3.9-2.7 3.9-5.5C18.5 9.2 17.4 7 16 7z\" />\n ),\n horizontalRule: <path d=\"M3 11h18v2H3v-2z\" />,\n link: (\n <path d=\"M10.6 13.4a1 1 0 0 0 1.4 0l3-3a3 3 0 0 0-4.3-4.3l-1.5 1.5 1.4 1.4 1.5-1.5a1 1 0 0 1 1.5 1.5l-3 3a1 1 0 0 0 0 1.4zm2.8-2.8a1 1 0 0 0-1.4 0l-3 3A3 3 0 0 0 13.3 18l1.5-1.5-1.4-1.4-1.5 1.5a1 1 0 0 1-1.5-1.5l3-3a1 1 0 0 0 0-1.4z\" />\n ),\n image: (\n <path d=\"M4 4h16a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zm1 2v9l4-4 3 3 3-3 3 3V6H5zm3 1.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3z\" />\n ),\n table: (\n <path d=\"M3 4h18v16H3V4zm2 2v3h5V6H5zm7 0v3h7V6h-7zm-7 5v3h5v-3H5zm7 0v3h7v-3h-7zm-7 5v2h5v-2H5zm7 0v2h7v-2h-7z\" />\n ),\n pageBreak: (\n <path d=\"M6 3h8l4 4v4h-2V8h-3V5H6v6H4V3h2zm-2 13h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v5H4v-5z\" />\n ),\n importDocx: (\n <path d=\"M5 3h9l5 5v6h-2V9h-4V5H7v14h5v2H5V3zm8 11 4 4 4-4h-3v-4h-2v4h-3z\" />\n ),\n};\n\nexport function ToolbarIcon({ name }: { name: string }): JSX.Element {\n const path = PATHS[name];\n if (!path) {\n return <span aria-hidden=\"true\">{name.slice(0, 2)}</span>;\n }\n return (\n <svg className=\"rne-btn-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n {path}\n </svg>\n );\n}\n","'use client';\n\nimport type { EditorCommand } from '../../core/commands/helpers';\nimport { useEditorContext } from '../EditorContext';\nimport { ToolbarIcon } from './icons';\n\ninterface ToolbarButtonProps {\n iconName: string;\n label: string;\n command: EditorCommand;\n}\n\n/** A single command button reflecting active/enabled state (F-10.6, NF-4). */\nexport function ToolbarButton({ iconName, label, command }: ToolbarButtonProps) {\n const { state, run } = useEditorContext();\n const active = state ? (command.isActive?.(state) ?? false) : false;\n const enabled = state ? (command.isEnabled ? command.isEnabled(state) : true) : false;\n\n return (\n <button\n type=\"button\"\n className={`rne-btn${active ? ' rne-btn--active' : ''}`}\n title={label}\n aria-label={label}\n aria-pressed={command.isActive ? active : undefined}\n disabled={!enabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => run(command.run)}\n >\n <ToolbarIcon name={iconName} />\n </button>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { Command } from 'prosemirror-state';\nimport { useEditorContext } from '../EditorContext';\nimport { ToolbarIcon } from './icons';\n\ninterface ColorButtonProps {\n iconName: 'textColor' | 'highlight';\n label: string;\n /** Build a command that applies the chosen color. */\n apply: (color: string) => Command;\n /** Build a command that clears the color, if supported. */\n clear?: () => Command;\n /** The currently-active color, for the swatch. */\n activeColor?: string | null;\n}\n\n/** A color picker button with a palette popover (text color / highlight). */\nexport function ColorButton({ iconName, label, apply, clear, activeColor }: ColorButtonProps) {\n const { run, colorPalette } = useEditorContext();\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onDown);\n return () => document.removeEventListener('mousedown', onDown);\n }, [open]);\n\n return (\n <div className=\"rne-color-btn\" ref={containerRef}>\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"rne-btn\"\n title={label}\n aria-label={label}\n aria-haspopup=\"true\"\n aria-expanded={open}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n >\n <span style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <ToolbarIcon name={iconName} />\n <span className=\"rne-color-swatch\" style={{ background: activeColor ?? '#000' }} />\n </span>\n </button>\n {open && (\n <div\n className=\"rne-color-popover\"\n role=\"menu\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setOpen(false);\n buttonRef.current?.focus();\n }\n }}\n >\n {colorPalette.map((color) => (\n <button\n key={color}\n type=\"button\"\n className=\"rne-color-cell\"\n style={{ background: color }}\n title={color}\n aria-label={color}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n run(apply(color));\n setOpen(false);\n }}\n />\n ))}\n {clear && (\n <button\n type=\"button\"\n className=\"rne-color-cell\"\n style={{ background: '#fff', gridColumn: 'span 8', height: 22 }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n run(clear());\n setOpen(false);\n }}\n >\n ✕\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { type ChangeEvent, Fragment, type KeyboardEvent, useCallback, useMemo, useRef } from 'react';\nimport type { EditorState } from 'prosemirror-state';\nimport type { FeatureFlags, ToolbarConfig, ToolbarItemId } from '../../config/types';\nimport { DEFAULT_TOOLBAR_GROUPS } from '../../config/defaults';\nimport { useEditorContext } from '../EditorContext';\nimport { ToolbarButton } from './ToolbarButton';\nimport { ColorButton } from './ColorButton';\nimport { ToolbarIcon } from './icons';\n\nconst FEATURE_OF: Partial<Record<ToolbarItemId, keyof FeatureFlags>> = {\n bold: 'bold',\n italic: 'italic',\n underline: 'underline',\n strikethrough: 'strikethrough',\n superscript: 'superscript',\n subscript: 'subscript',\n code: 'code',\n paragraphStyle: 'headings',\n fontFamily: 'fontFamily',\n fontSize: 'fontSize',\n textColor: 'textColor',\n highlight: 'highlight',\n clearFormatting: 'clearFormatting',\n alignLeft: 'alignment',\n alignCenter: 'alignment',\n alignRight: 'alignment',\n alignJustify: 'alignment',\n bulletList: 'bulletList',\n orderedList: 'orderedList',\n taskList: 'taskList',\n indent: 'indentation',\n outdent: 'indentation',\n blockquote: 'blockquote',\n horizontalRule: 'horizontalRule',\n link: 'link',\n image: 'image',\n table: 'table',\n pageBreak: 'pageBreak',\n importDocx: 'docxImport',\n undo: 'history',\n redo: 'history',\n};\n\n/** Item ids backed directly by a registry command (rendered as icon buttons). */\nconst COMMAND_ITEMS = new Set<ToolbarItemId>([\n 'undo',\n 'redo',\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'superscript',\n 'subscript',\n 'code',\n 'clearFormatting',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'alignJustify',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'indent',\n 'outdent',\n 'blockquote',\n 'horizontalRule',\n 'pageBreak',\n]);\n\nfunction activeBlockValue(state: EditorState | null): string {\n if (!state) return 'p';\n const node = state.selection.$head.parent;\n if (node.type.name === 'heading') return `h${node.attrs.level as number}`;\n return 'p';\n}\n\ninterface ToolbarProps {\n config?: ToolbarConfig;\n}\n\n/** Data-driven, keyboard-accessible toolbar (F-1–F-3, F-10.6, NF-4). */\nexport function Toolbar({ config }: ToolbarProps) {\n const ctx = useEditorContext();\n const { state, commands, strings, features, run, fontFamilies, fontSizes, importDocx } = ctx;\n\n const groups = config?.groups ?? DEFAULT_TOOLBAR_GROUPS;\n const sticky = config?.sticky ?? true;\n const toolbarRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const onImportFile = useCallback(\n async (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = ''; // allow re-importing the same file\n if (!file) return;\n try {\n await importDocx(file);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[react-next-editor] DOCX import failed:', err);\n }\n },\n [importDocx],\n );\n\n // Arrow-key navigation between toolbar buttons (WCAG toolbar pattern). Tab\n // order is preserved; arrows move focus among enabled buttons. Selects keep\n // their native arrow behaviour (and remain reachable via Tab), so they are not\n // part of the arrow ring.\n const onToolbarKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return;\n const active = document.activeElement as HTMLElement | null;\n if (active?.tagName === 'SELECT') return;\n const root = toolbarRef.current;\n if (!root) return;\n const items = Array.from(root.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (items.length === 0) return;\n const idx = active ? items.indexOf(active) : -1;\n if (idx === -1) return;\n e.preventDefault();\n let next = idx;\n if (e.key === 'ArrowRight') next = (idx + 1) % items.length;\n else if (e.key === 'ArrowLeft') next = (idx - 1 + items.length) % items.length;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = items.length - 1;\n items[next]?.focus();\n }, []);\n\n const renderedGroups = useMemo(() => {\n return groups\n .map((group) => group.filter((id) => isItemAvailable(id, features, commands)))\n .filter((group) => group.length > 0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [groups, features, commands]);\n\n const labelFor = (id: ToolbarItemId): string =>\n (strings as unknown as Record<string, string>)[id] ?? id;\n\n function renderItem(id: ToolbarItemId) {\n if (COMMAND_ITEMS.has(id)) {\n const command = commands.registry[id];\n if (!command) return null;\n return <ToolbarButton key={id} iconName={id} label={labelFor(id)} command={command} />;\n }\n\n switch (id) {\n case 'paragraphStyle':\n return (\n <select\n key={id}\n className=\"rne-select\"\n aria-label={strings.paragraphStyle}\n value={activeBlockValue(state)}\n onMouseDown={(e) => e.stopPropagation()}\n onChange={(e) => {\n const v = e.target.value;\n if (v === 'p') run(commands.blocks.setParagraph());\n else run(commands.blocks.setHeading(Number(v.slice(1))));\n }}\n >\n <option value=\"p\">{strings.paragraph}</option>\n {[1, 2, 3, 4, 5, 6].map((lvl) => (\n <option key={lvl} value={`h${lvl}`}>{`${strings.heading} ${lvl}`}</option>\n ))}\n </select>\n );\n case 'fontFamily':\n return (\n <select\n key={id}\n className=\"rne-select\"\n aria-label={strings.fontFamily}\n value={state ? (commands.marks.getActiveFontFamily(state) ?? '') : ''}\n onChange={(e) => {\n const v = e.target.value;\n run(v ? commands.marks.setFontFamily(v) : commands.marks.clearFontFamily());\n }}\n >\n <option value=\"\">{strings.fontFamily}</option>\n {fontFamilies.map((f) => (\n <option key={f} value={f} style={{ fontFamily: f }}>\n {f}\n </option>\n ))}\n </select>\n );\n case 'fontSize':\n return (\n <select\n key={id}\n className=\"rne-select\"\n style={{ maxWidth: 70 }}\n aria-label={strings.fontSize}\n value={state ? (commands.marks.getActiveFontSize(state) ?? '') : ''}\n onChange={(e) => {\n const v = e.target.value;\n run(v ? commands.marks.setFontSize(Number(v)) : commands.marks.clearFontSize());\n }}\n >\n <option value=\"\">{strings.fontSize}</option>\n {fontSizes.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n );\n case 'textColor':\n return (\n <ColorButton\n key={id}\n iconName=\"textColor\"\n label={strings.textColor}\n apply={(c) => commands.marks.setTextColor(c)}\n clear={() => commands.marks.clearTextColor()}\n activeColor={state ? commands.marks.getActiveTextColor(state) : null}\n />\n );\n case 'highlight':\n return (\n <ColorButton\n key={id}\n iconName=\"highlight\"\n label={strings.highlight}\n apply={(c) => commands.marks.setHighlight(c)}\n clear={() => commands.marks.clearHighlight()}\n />\n );\n case 'link':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.link}\n aria-label={strings.link}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (!state) return;\n const prev = commands.links.getActiveLink(state);\n const url = window.prompt(strings.linkPrompt, prev?.href ?? 'https://');\n if (url === null) return;\n if (url.trim() === '') run(commands.links.removeLink);\n else run(commands.links.setLink({ href: url.trim() }));\n }}\n >\n <ToolbarIcon name=\"link\" />\n </button>\n );\n case 'image':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.image}\n aria-label={strings.image}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n const url = window.prompt(strings.imagePrompt, 'https://');\n if (!url || !url.trim()) return;\n // Prompt for alt text so inserted images are accessible (NF-4).\n const alt = window.prompt(strings.imageAltPrompt, '');\n run(commands.insert.image({ src: url.trim(), alt: alt?.trim() || null }));\n }}\n >\n <ToolbarIcon name=\"image\" />\n </button>\n );\n case 'table':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.insertTable}\n aria-label={strings.insertTable}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => run(commands.insert.table(3, 3, true))}\n >\n <ToolbarIcon name=\"table\" />\n </button>\n );\n case 'importDocx':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.importDocx}\n aria-label={strings.importDocx}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => fileInputRef.current?.click()}\n >\n <ToolbarIcon name=\"importDocx\" />\n </button>\n );\n default:\n return null;\n }\n }\n\n return (\n <div\n ref={toolbarRef}\n className={`rne-toolbar${sticky ? ' rne-toolbar--sticky' : ''}`}\n role=\"toolbar\"\n aria-label=\"Formatting\"\n onKeyDown={onToolbarKeyDown}\n >\n {renderedGroups.map((group, gi) => (\n <Fragment key={gi}>\n {gi > 0 && <span className=\"rne-toolbar-separator\" aria-hidden=\"true\" />}\n <div className=\"rne-toolbar-group\">{group.map(renderItem)}</div>\n </Fragment>\n ))}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n onChange={onImportFile}\n />\n </div>\n );\n}\n\nfunction isItemAvailable(\n id: ToolbarItemId,\n features: FeatureFlags,\n commands: ReturnType<typeof useEditorContext>['commands'],\n): boolean {\n if (id === 'separator') return false;\n const feature = FEATURE_OF[id];\n if (feature && !features[feature]) return false;\n if (COMMAND_ITEMS.has(id) && !commands.registry[id]) return false;\n return true;\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport type { SaveStatus } from '../config/types';\nimport { countDocument, type DocumentStats } from '../core/utils';\nimport { useEditorContext } from './EditorContext';\n\nconst STATUS_LABEL: Record<SaveStatus, string> = {\n idle: '',\n savingLocal: 'Saving…',\n savedLocal: 'Saved locally',\n syncing: 'Syncing…',\n synced: 'Synced',\n syncFailed: 'Sync failed',\n offline: 'Offline',\n};\n\ninterface StatusBarProps {\n saveStatus: SaveStatus;\n hasPersistence: boolean;\n}\n\n/**\n * Word/character count (F-4.5) and visible save/sync status (F-9.4, NF-10).\n *\n * The count is an O(n) document walk, so it is recomputed only when the document\n * actually changes (not on selection changes) and is debounced — keeping typing\n * responsive on large documents (NF-1).\n */\nexport function StatusBar({ saveStatus, hasPersistence }: StatusBarProps) {\n const { state, strings } = useEditorContext();\n const doc = state?.doc;\n const [stats, setStats] = useState<DocumentStats | null>(null);\n\n useEffect(() => {\n if (!doc) {\n setStats(null);\n return;\n }\n // `doc` identity is stable across selection-only transactions, so this fires\n // only on real edits. Debounce to avoid walking a large doc on every keystroke.\n const id = setTimeout(() => setStats(countDocument(doc)), 300);\n return () => clearTimeout(id);\n }, [doc]);\n\n return (\n <div className=\"rne-statusbar\">\n <span>\n {stats\n ? `${stats.words} ${strings.words} · ${stats.characters} ${strings.characters}`\n : ''}\n </span>\n {hasPersistence && saveStatus !== 'idle' && (\n <span className=\"rne-status-badge\">\n <span className={`rne-status-dot rne-status-dot--${saveStatus}`} />\n {STATUS_LABEL[saveStatus]}\n </span>\n )}\n </div>\n );\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { EditorView } from 'prosemirror-view';\nimport { type Command, EditorState, TextSelection } from 'prosemirror-state';\nimport { Node as PMNode, type Schema } from 'prosemirror-model';\n\nimport type { DocumentJSON, EditorStrings, FeatureFlags, PageConfig, SaveStatus } from '../config/types';\nimport {\n DEFAULT_COLOR_PALETTE,\n DEFAULT_FEATURES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_FONT_SIZES,\n DEFAULT_PAGE,\n DEFAULT_STRINGS,\n resolvePageDimensions,\n themeToCssVars,\n} from '../config/defaults';\nimport { buildSchema } from '../core/schema/schema';\nimport { buildPlugins } from '../core/plugins/index';\nimport type { PaginationGeometry } from '../core/pagination/plugin';\nimport { createCommands, type CommandSet } from '../core/commands/index';\nimport { createDoc, createEditorState } from '../core/state/createEditorState';\nimport { preloadSanitizer } from '../security/sanitize';\nimport { documentToText } from '../export/text';\nimport { documentToHtml } from '../export/html';\nimport { exportDocument } from '../export/index';\nimport { DocumentPersistence } from '../persistence/autosave';\nimport { IndexedDBStore, requestPersistentStorage } from '../persistence/indexeddb';\nimport { ConnectivityMonitor } from '../sync/connectivity';\nimport { SyncEngine } from '../sync/engine';\nimport { EditorContext } from './EditorContext';\nimport { EditorErrorBoundary } from './ErrorBoundary';\nimport { Toolbar } from './toolbar/Toolbar';\nimport { StatusBar } from './StatusBar';\nimport type { EditorContextValue, EditorProps, EditorRef } from './types';\n\ninterface ResolvedConfig {\n features: FeatureFlags;\n page: PageConfig;\n strings: EditorStrings;\n fontFamilies: string[];\n fontSizes: number[];\n colorPalette: string[];\n editable: boolean;\n placeholder: string | undefined;\n}\n\nfunction resolveConfig(props: EditorProps): ResolvedConfig {\n return {\n features: { ...DEFAULT_FEATURES, ...props.features },\n page: {\n ...DEFAULT_PAGE,\n ...props.page,\n margins: { ...DEFAULT_PAGE.margins, ...props.page?.margins },\n },\n strings: { ...DEFAULT_STRINGS, ...props.strings },\n fontFamilies: props.fontFamilies ?? DEFAULT_FONT_FAMILIES,\n fontSizes: props.fontSizes ?? DEFAULT_FONT_SIZES,\n colorPalette: props.colorPalette ?? DEFAULT_COLOR_PALETTE,\n editable: !(props.readOnly || props.mode === 'readonly'),\n placeholder: props.placeholder,\n };\n}\n\n/** CSS pixels per millimetre at 96 DPI (the CSS reference). */\nconst PX_PER_MM = 96 / 25.4;\n/** Visual gap (px) drawn on the canvas between consecutive page sheets. */\nconst PAGE_GAP_PX = 24;\n\n/** Convert a page configuration (mm) into concrete pixel geometry, or null. */\nfunction computePaginationGeometry(page: PageConfig): PaginationGeometry | null {\n if (page.pagination !== 'visual') return null;\n const { width, height } = resolvePageDimensions(page);\n const m = page.margins;\n const pageWidthPx = width * PX_PER_MM;\n const pageHeightPx = height * PX_PER_MM;\n const marginTopPx = m.top * PX_PER_MM;\n const marginBottomPx = m.bottom * PX_PER_MM;\n const marginLeftPx = m.left * PX_PER_MM;\n const contentWidthPx = Math.max(1, (width - m.left - m.right) * PX_PER_MM);\n const contentHeightPx = pageHeightPx - marginTopPx - marginBottomPx;\n if (contentHeightPx <= 0) return null;\n return {\n pageWidthPx,\n pageHeightPx,\n marginTopPx,\n marginBottomPx,\n marginLeftPx,\n contentWidthPx,\n contentHeightPx,\n interPageOffsetPx: marginBottomPx + PAGE_GAP_PX + marginTopPx,\n };\n}\n\nconst EditorInner = forwardRef<EditorRef, EditorProps>(function EditorInner(props, ref) {\n const mountRef = useRef<HTMLDivElement | null>(null);\n const viewRef = useRef<EditorView | null>(null);\n const persistenceRef = useRef<DocumentPersistence | null>(null);\n const pageBgRef = useRef<HTMLDivElement | null>(null);\n const remeasureRef = useRef<(() => void) | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n\n const config = useMemo(() => resolveConfig(props), [props]);\n const cfgRef = useRef(config);\n cfgRef.current = config;\n\n // Build the editing engine (schema + commands) once per feature set + placeholder.\n const featureKey = useMemo(() => JSON.stringify(config.features), [config.features]);\n const engine = useMemo(() => {\n const schema: Schema = buildSchema(config.features);\n const commands: CommandSet = createCommands(schema);\n return { schema, commands };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [featureKey]);\n\n const [editorState, setEditorState] = useState<EditorState | null>(null);\n const [saveStatus, setSaveStatus] = useState<SaveStatus>('idle');\n const [ready, setReady] = useState(false);\n\n // ---- Imperative handle (F-10.15, F-10.16) ----\n const getJSON = useCallback((): DocumentJSON => {\n const view = viewRef.current;\n return (view ? view.state.doc.toJSON() : createDoc(engine.schema, null).toJSON()) as DocumentJSON;\n }, [engine.schema]);\n\n const setContent = useCallback(\n (content: DocumentJSON | string | null) => {\n const view = viewRef.current;\n if (!view) return;\n const doc = createDoc(view.state.schema, content);\n const state = EditorState.create({ doc, plugins: view.state.plugins });\n view.updateState(state);\n setEditorState(state);\n },\n [],\n );\n\n const importDocxIntoEditor = useCallback(\n async (file: ArrayBuffer | Uint8Array | Blob): Promise<{ warnings: string[] }> => {\n const view = viewRef.current;\n if (!view) return { warnings: [] };\n const { importDocx } = await import('../import/docx');\n const result = await importDocx(file, view.state.schema);\n // Replace the whole document via a dispatched transaction so the change is\n // undoable and flows through onChange/autosave like any other edit.\n const node = PMNode.fromJSON(view.state.schema, result.doc);\n const v = viewRef.current;\n if (v) {\n const tr = v.state.tr.replaceWith(0, v.state.doc.content.size, node.content);\n v.dispatch(tr.scrollIntoView());\n }\n return { warnings: result.warnings };\n },\n [],\n );\n\n const handle = useMemo<EditorRef>(\n () => ({\n getJSON,\n getText: (options) => documentToText(getJSON(), options),\n getHTML: () => documentToHtml(getJSON()),\n setContent,\n importDocx: importDocxIntoEditor,\n focus: () => viewRef.current?.focus(),\n isDirty: () => persistenceRef.current?.isDirty() ?? false,\n save: async () => {\n await persistenceRef.current?.saveNow(getJSON());\n },\n clearLocalData: async () => {\n await persistenceRef.current?.clearLocal();\n },\n exportAs: (format, filename) =>\n exportDocument(getJSON(), format, {\n filename: filename ?? propsRef.current.documentId,\n page: cfgRef.current.page,\n title: filename ?? propsRef.current.documentId,\n }),\n getView: () => viewRef.current,\n getState: () => viewRef.current?.state ?? null,\n getSchema: () => viewRef.current?.state.schema ?? null,\n }),\n [getJSON, setContent, importDocxIntoEditor],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n\n // ---- Create the ProseMirror view once (golden rule: PM owns the DOM) ----\n useEffect(() => {\n const mount = mountRef.current;\n if (!mount) return;\n\n void preloadSanitizer();\n\n const paginated = cfgRef.current.page.pagination === 'visual';\n const plugins = buildPlugins(engine.schema, {\n placeholder: cfgRef.current.placeholder,\n history: cfgRef.current.features.history,\n extraPlugins: propsRef.current.extensions?.plugins,\n pagination: paginated\n ? {\n getGeometry: () => computePaginationGeometry(cfgRef.current.page),\n getBackgroundLayer: () => pageBgRef.current,\n header: cfgRef.current.page.header,\n footer: cfgRef.current.page.footer,\n register: (fn) => {\n remeasureRef.current = fn;\n },\n }\n : undefined,\n });\n\n const initialContent =\n propsRef.current.value ?? propsRef.current.initialContent ?? null;\n const state = createEditorState({ schema: engine.schema, plugins, content: initialContent });\n\n const view = new EditorView(mount, {\n state,\n editable: () => !(propsRef.current.readOnly || propsRef.current.mode === 'readonly'),\n attributes: {\n class: 'rne-prosemirror',\n role: 'textbox',\n 'aria-multiline': 'true',\n 'aria-label': propsRef.current.ariaLabel ?? 'Document editor',\n dir: propsRef.current.dir ?? 'ltr',\n },\n dispatchTransaction(tr) {\n const v = viewRef.current;\n if (!v) return;\n const newState = v.state.apply(tr);\n v.updateState(newState);\n setEditorState(newState);\n\n const p = propsRef.current;\n if (tr.docChanged) {\n const json = newState.doc.toJSON() as DocumentJSON;\n p.onChange?.(json, handle);\n persistenceRef.current?.scheduleSave(json);\n }\n if (tr.selectionSet) {\n p.onSelectionChange?.(newState);\n }\n },\n });\n\n viewRef.current = view;\n setEditorState(view.state);\n setReady(true);\n propsRef.current.onReady?.(handle);\n\n return () => {\n view.destroy();\n viewRef.current = null;\n setReady(false);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [engine]);\n\n // ---- Keep editability in sync without recreating the view ----\n useEffect(() => {\n viewRef.current?.setProps({\n editable: () => config.editable,\n });\n // Re-render to update toolbar disabled state.\n setEditorState((s) => s);\n }, [config.editable]);\n\n // ---- Local persistence, crash recovery (F-9.2, F-11.9), and sync (F-9.6–F-9.9, F-9.14) ----\n useEffect(() => {\n const documentId = props.documentId;\n const persistenceEnabled = props.persistence?.enabled ?? !!documentId;\n if (!documentId || !persistenceEnabled || !ready) return;\n\n const store = props.persistence?.store ?? new IndexedDBStore();\n const sync = props.sync;\n const auto = sync?.auto ?? true;\n\n let engine: SyncEngine | null = null;\n let monitor: ConnectivityMonitor | null = null;\n\n // Shared status handler: surfaces both local-save and sync transitions, and\n // triggers an upload after each successful local save when online (F-9.6).\n const handleStatus = (status: SaveStatus, detail?: { error?: string }) => {\n setSaveStatus(status);\n propsRef.current.onSaveStatusChange?.(status, detail);\n if (status === 'savedLocal' && engine && auto && (monitor?.isOnline() ?? true)) {\n void engine.flush();\n }\n };\n\n const persistence = new DocumentPersistence({\n documentId,\n store,\n debounceMs: props.persistence?.debounceMs,\n metadata: props.metadata,\n onStatus: handleStatus,\n });\n persistenceRef.current = persistence;\n\n if (sync?.remote) {\n engine = new SyncEngine({\n store,\n remote: sync.remote,\n maxAttempts: sync.maxAttempts,\n onStatus: handleStatus,\n onConflict: sync.onConflict,\n });\n const remotePing = sync.remote.ping?.bind(sync.remote);\n monitor = new ConnectivityMonitor({\n ping: remotePing,\n intervalMs: sync.pingIntervalMs,\n onChange: (online) => {\n if (online) {\n if (auto && engine) void engine.flush();\n } else {\n handleStatus('offline');\n }\n },\n });\n monitor.start();\n if (auto) void engine.flush(); // attempt to drain any queue from a prior session\n }\n\n if (props.persistence?.requestPersistent !== false) {\n void requestPersistentStorage();\n }\n\n let cancelled = false;\n void (async () => {\n const record = await persistence.load();\n if (cancelled || !record) return;\n // Only restore from local storage when no explicit controlled value is set.\n if (propsRef.current.value == null) {\n setContent(record.doc);\n }\n })();\n\n return () => {\n cancelled = true;\n monitor?.stop();\n engine?.cancel();\n void persistence.destroy();\n persistenceRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.documentId, ready, props.sync?.remote]);\n\n // ---- Controlled value sync (F-10.20) ----\n useEffect(() => {\n const view = viewRef.current;\n if (!view || props.value == null) return;\n const current = JSON.stringify(view.state.doc.toJSON());\n const next = JSON.stringify(props.value);\n if (current === next) return;\n const doc = createDoc(view.state.schema, props.value);\n const selectionPos = Math.min(view.state.selection.from, doc.content.size);\n const state = EditorState.create({ doc, plugins: view.state.plugins });\n const withSel = state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, Math.max(0, selectionPos))),\n );\n view.updateState(withSel);\n setEditorState(withSel);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.value]);\n\n // ---- Context for toolbar/children ----\n const runCommand = useCallback((command: Command): boolean => {\n const view = viewRef.current;\n if (!view) return false;\n const result = command(view.state, view.dispatch, view);\n view.focus();\n return result;\n }, []);\n\n const contextValue = useMemo<EditorContextValue>(\n () => ({\n view: viewRef.current,\n state: editorState,\n schema: engine.schema,\n commands: engine.commands,\n strings: config.strings,\n features: config.features,\n fontFamilies: config.fontFamilies,\n fontSizes: config.fontSizes,\n colorPalette: config.colorPalette,\n editable: config.editable,\n run: runCommand,\n importDocx: importDocxIntoEditor,\n }),\n [editorState, engine, config, runCommand, importDocxIntoEditor],\n );\n\n // ---- Layout / page surface ----\n const { width } = resolvePageDimensions(config.page);\n const showChrome = config.page.showPageChrome;\n const paginated = config.page.pagination === 'visual';\n\n // Stable signature of the page geometry; force a re-measure when it changes.\n const pageGeometryKey = useMemo(\n () =>\n JSON.stringify({\n p: config.page.pagination,\n s: config.page.size,\n o: config.page.orientation,\n w: config.page.widthMm,\n h: config.page.heightMm,\n m: config.page.margins,\n hdr: config.page.header,\n ftr: config.page.footer,\n }),\n [config.page],\n );\n useEffect(() => {\n if (paginated) remeasureRef.current?.();\n }, [pageGeometryKey, paginated]);\n\n const geometry = useMemo(\n () => computePaginationGeometry(config.page),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pageGeometryKey],\n );\n\n const rootStyle = useMemo(() => {\n const base: Record<string, string> = {\n ...themeToCssVars(props.theme),\n '--rne-page-width': `${width}mm`,\n '--rne-page-padding': `${config.page.margins.top}mm ${config.page.margins.right}mm ${config.page.margins.bottom}mm ${config.page.margins.left}mm`,\n };\n if (geometry) {\n base['--rne-page-w'] = `${geometry.pageWidthPx}px`;\n base['--rne-page-h'] = `${geometry.pageHeightPx}px`;\n base['--rne-content-w'] = `${geometry.contentWidthPx}px`;\n base['--rne-mt'] = `${geometry.marginTopPx}px`;\n base['--rne-ml'] = `${geometry.marginLeftPx}px`;\n }\n return { ...base, ...(props.style as Record<string, string> | undefined) };\n }, [props.theme, props.style, width, config.page.margins, geometry]);\n\n const toolbarEnabled = props.toolbar !== false && (props.toolbar?.enabled ?? true) && config.editable;\n const statusBarEnabled = props.statusBar ?? true;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n className={`rne-root${props.className ? ` ${props.className}` : ''}`}\n style={rootStyle as React.CSSProperties}\n data-ready={ready}\n dir={props.dir ?? 'ltr'}\n >\n {toolbarEnabled && <Toolbar config={props.toolbar || undefined} />}\n {props.children}\n <div\n className={`rne-canvas${showChrome ? '' : ' rne-canvas--plain'}${paginated ? ' rne-canvas--paged' : ''}`}\n >\n {paginated ? (\n <div className=\"rne-paged\">\n <div ref={pageBgRef} className=\"rne-page-bg\" aria-hidden=\"true\" />\n <div ref={mountRef} className=\"rne-mount rne-mount--paged\" />\n </div>\n ) : (\n <div className=\"rne-page\">\n <div ref={mountRef} className=\"rne-mount\" />\n </div>\n )}\n </div>\n {statusBarEnabled && <StatusBar saveStatus={saveStatus} hasPersistence={!!props.documentId} />}\n </div>\n </EditorContext.Provider>\n );\n});\n\n/**\n * The embeddable rich document editor (F-10.17). Client-only — load via\n * `next/dynamic(() => import('react-next-editor').then(m => m.Editor), { ssr: false })`.\n * Wrapped in an error boundary so a failure never takes down the host (F-11.2).\n */\nexport const Editor = forwardRef<EditorRef, EditorProps>(function Editor(props, ref) {\n return (\n <EditorErrorBoundary onError={props.onError}>\n <EditorInner {...props} ref={ref} />\n </EditorErrorBoundary>\n );\n});\n","'use client';\n\nimport { useEffect, useMemo, useState, type CSSProperties, type ReactElement } from 'react';\nimport type { DocumentJSON } from '../config/types';\nimport { documentToHtml } from '../export/html';\nimport { preloadSanitizer, sanitizeHtmlSync } from '../security/sanitize';\n\nexport interface DocumentViewProps {\n /** The document to render: ProseMirror JSON, a JSON string, or null/undefined. */\n value: DocumentJSON | string | null | undefined;\n /** Extra class appended to the root element. */\n className?: string;\n style?: CSSProperties;\n}\n\n/** Parse/normalize the input to a document node, or null if it is not one. */\nfunction toDoc(value: DocumentViewProps['value']): DocumentJSON | null {\n if (!value) return null;\n if (typeof value === 'string') {\n try {\n const parsed = JSON.parse(value) as DocumentJSON;\n return parsed?.type === 'doc' ? parsed : null;\n } catch {\n return null;\n }\n }\n return value.type === 'doc' ? value : null;\n}\n\n/**\n * Lightweight, read-only document renderer. Unlike {@link Editor}, it does NOT\n * mount a ProseMirror `EditorView` — it serializes the document to HTML with the\n * shared {@link documentToHtml} serializer and renders it directly. Ideal for\n * cards, lists, previews, and any place that only needs to *display* content\n * cheaply (no editing, no toolbar, minimal cost per instance).\n *\n * Security: `documentToHtml` already emits only whitelisted, escaped HTML with\n * sanitized URLs/CSS, so output is safe even for attacker-controlled JSON. Once\n * the DOM sanitizer has loaded, a DOMPurify pass is applied as defense-in-depth.\n *\n * Styling: wrap your app once with the package stylesheet\n * (`import 'react-next-editor-js/styles.css'`) so `.rne-document-view` content is\n * themed consistently with the editor.\n */\nexport function DocumentView({ value, className, style }: DocumentViewProps): ReactElement {\n // Preload the DOM sanitizer so the defense-in-depth pass becomes active.\n const [sanitizerReady, setSanitizerReady] = useState(false);\n useEffect(() => {\n let alive = true;\n void preloadSanitizer().then(() => {\n if (alive) setSanitizerReady(true);\n });\n return () => {\n alive = false;\n };\n }, []);\n\n const html = useMemo(() => {\n const doc = toDoc(value);\n if (!doc) return '';\n const raw = documentToHtml(doc);\n // `raw` is already safe; apply DOMPurify once available for defense-in-depth.\n return sanitizerReady ? sanitizeHtmlSync(raw) : raw;\n }, [value, sanitizerReady]);\n\n return (\n <div\n className={`rne-root rne-document-view${className ? ` ${className}` : ''}`}\n style={style}\n // eslint-disable-next-line react/no-danger -- html is produced by the package's\n // own sanitizing serializer (and DOMPurify-hardened once loaded).\n dangerouslySetInnerHTML={{ __html: html }}\n />\n );\n}\n"]}
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkNJCEHQV3_cjs = require('../chunk-NJCEHQV3.cjs');
3
+ var chunkOESUMEV7_cjs = require('../chunk-OESUMEV7.cjs');
4
4
  var chunkTI44I654_cjs = require('../chunk-TI44I654.cjs');
5
5
  require('../chunk-TXPLBAH5.cjs');
6
6
  require('../chunk-5F6SPYCN.cjs');
@@ -140,7 +140,7 @@ var ExportService = class {
140
140
  const title = request.options?.title ?? request.options?.filename;
141
141
  switch (format) {
142
142
  case "docx": {
143
- const buffer = await chunkNJCEHQV3_cjs.documentToDocxBuffer(doc, {
143
+ const buffer = await chunkOESUMEV7_cjs.documentToDocxBuffer(doc, {
144
144
  page,
145
145
  title,
146
146
  nodeConverters: this.options.nodeConverters
@@ -149,7 +149,7 @@ var ExportService = class {
149
149
  }
150
150
  case "txt":
151
151
  return {
152
- bytes: encodeText(chunkNJCEHQV3_cjs.documentToText(doc, request.options?.text)),
152
+ bytes: encodeText(chunkOESUMEV7_cjs.documentToText(doc, request.options?.text)),
153
153
  contentType: CONTENT_TYPES.txt
154
154
  };
155
155
  case "html":
@@ -1,4 +1,4 @@
1
- import { documentToText, documentToDocxBuffer } from '../chunk-QROUNVQK.js';
1
+ import { documentToText, documentToDocxBuffer } from '../chunk-65YACENL.js';
2
2
  import { buildPrintDocument } from '../chunk-7VYJDBH7.js';
3
3
  import '../chunk-T6FR37IC.js';
4
4
  import '../chunk-6NTSXJX4.js';
package/dist/styles.css CHANGED
@@ -283,6 +283,43 @@
283
283
  padding: 0;
284
284
  }
285
285
 
286
+ /* ---- Lightweight read-only renderer (DocumentView) ---------------------------
287
+ Styles the HTML emitted by documentToHtml so a non-editor display matches the
288
+ editor's typography without mounting an EditorView. */
289
+ .rne-document-view {
290
+ color: var(--rne-text-color, #1a1a1a);
291
+ font-family: var(--rne-font-family, system-ui, -apple-system, 'Segoe UI', Roboto, sans-serif);
292
+ font-size: var(--rne-font-size, 11pt);
293
+ line-height: 1.6;
294
+ word-wrap: break-word;
295
+ overflow-wrap: break-word;
296
+ }
297
+ .rne-document-view > :first-child {
298
+ margin-top: 0;
299
+ }
300
+ .rne-document-view > :last-child {
301
+ margin-bottom: 0;
302
+ }
303
+ .rne-document-view p {
304
+ margin: 0 0 0.6em;
305
+ }
306
+ .rne-document-view img {
307
+ max-width: 100%;
308
+ height: auto;
309
+ }
310
+ .rne-document-view table {
311
+ border-collapse: collapse;
312
+ max-width: 100%;
313
+ }
314
+ .rne-document-view td,
315
+ .rne-document-view th {
316
+ border: 1px solid var(--rne-border-color, #d8dadf);
317
+ padding: 4px 8px;
318
+ }
319
+ .rne-document-view a {
320
+ color: var(--rne-accent, #2563eb);
321
+ }
322
+
286
323
  /* ---- ProseMirror base (inlined so consumers import only this stylesheet) ---- */
287
324
  .rne-root .ProseMirror {
288
325
  position: relative;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-next-editor-js",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "A comprehensive, performant, secure, configurable and pluggable Word-style rich document editor for React/Next.js, built directly on ProseMirror, with DOCX/PDF/text export and offline-first persistence.",
5
5
  "license": "MIT",
6
6
  "author": "stellarx57",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/export/text.ts","../src/export/docx.ts"],"names":["sanitizeUrl","DEFAULT_PAGE","resolvePageDimensions"],"mappings":"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","file":"chunk-NJCEHQV3.cjs","sourcesContent":["import type { DocumentJSON } from '../config/types';\n\n/**\n * Options governing plain-text conversion (F-6.20). Defaults follow the\n * documented structure rules: blocks separated by blank lines, list items on\n * their own lines, table cells tab-delimited, images replaced by alt text,\n * links rendered as their text.\n */\nexport interface TextConversionOptions {\n /** Append the URL after link text as \" (url)\". Default false. */\n includeLinkUrls?: boolean;\n /** Replacement for images: 'alt' uses alt text, 'omit' drops them. Default 'alt'. */\n images?: 'alt' | 'omit';\n /** Newline sequence. Default '\\n'. */\n newline?: string;\n}\n\ninterface ResolvedOptions {\n includeLinkUrls: boolean;\n images: 'alt' | 'omit';\n newline: string;\n}\n\n/**\n * Convert a ProseMirror document (JSON) to plain text (F-6.18). Pure and\n * isomorphic: identical output in the browser and on the server (F-6.19).\n */\nexport function documentToText(doc: DocumentJSON, options: TextConversionOptions = {}): string {\n const opts: ResolvedOptions = {\n includeLinkUrls: options.includeLinkUrls ?? false,\n images: options.images ?? 'alt',\n newline: options.newline ?? '\\n',\n };\n const blocks = (doc.content ?? []).map((node) => serializeBlock(node, opts, 0));\n return blocks\n .filter((b) => b !== null)\n .join(opts.newline + opts.newline)\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\n}\n\nfunction serializeBlock(node: DocumentJSON, opts: ResolvedOptions, depth: number): string | null {\n switch (node.type) {\n case 'paragraph':\n case 'heading':\n return serializeInline(node.content ?? [], opts);\n case 'blockquote':\n return (node.content ?? [])\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .map((line) => `> ${line}`)\n .join(opts.newline);\n case 'bullet_list':\n case 'ordered_list':\n return serializeList(node, opts, depth);\n case 'horizontal_rule':\n return '---';\n case 'page_break':\n return '\\f';\n case 'table':\n return serializeTable(node, opts);\n default:\n // Unknown block: best-effort recurse so custom nodes still contribute text.\n if (node.content) {\n return node.content\n .map((child) => serializeBlock(child, opts, depth))\n .filter((b) => b !== null)\n .join(opts.newline);\n }\n return node.text ?? null;\n }\n}\n\nfunction serializeList(node: DocumentJSON, opts: ResolvedOptions, depth: number): string {\n const ordered = node.type === 'ordered_list';\n const start = ordered ? Number(node.attrs?.order ?? 1) : 0;\n const indent = ' '.repeat(depth);\n const lines: string[] = [];\n let index = start;\n\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const checked = item.attrs?.checked;\n let marker: string;\n if (checked === true) marker = '[x]';\n else if (checked === false) marker = '[ ]';\n else if (ordered) marker = `${index}.`;\n else marker = '-';\n\n const children = item.content ?? [];\n const firstBlock = children[0];\n const firstText = firstBlock ? (serializeBlock(firstBlock, opts, depth) ?? '') : '';\n lines.push(`${indent}${marker} ${firstText}`.trimEnd());\n\n for (let i = 1; i < children.length; i++) {\n const child = children[i]!;\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n lines.push(serializeList(child, opts, depth + 1));\n } else {\n const text = serializeBlock(child, opts, depth + 1);\n if (text) lines.push(`${indent} ${text}`);\n }\n }\n if (ordered) index++;\n }\n return lines.join(opts.newline);\n}\n\nfunction serializeTable(node: DocumentJSON, opts: ResolvedOptions): string {\n const rows: string[] = [];\n for (const row of node.content ?? []) {\n if (row.type !== 'table_row') continue;\n const cells = (row.content ?? []).map((cell) =>\n (cell.content ?? [])\n .map((block) => serializeBlock(block, opts, 0))\n .filter((b) => b !== null)\n .join(' ')\n .replace(/\\t/g, ' '),\n );\n rows.push(cells.join('\\t'));\n }\n return rows.join(opts.newline);\n}\n\nfunction serializeInline(content: DocumentJSON[], opts: ResolvedOptions): string {\n let out = '';\n for (const node of content) {\n if (node.type === 'text') {\n let text = node.text ?? '';\n if (opts.includeLinkUrls && node.marks) {\n const link = node.marks.find((m) => m.type === 'link');\n if (link?.attrs?.href) text = `${text} (${String(link.attrs.href)})`;\n }\n out += text;\n } else if (node.type === 'hard_break') {\n out += opts.newline;\n } else if (node.type === 'image') {\n if (opts.images === 'alt') {\n const alt = node.attrs?.alt;\n if (alt) out += String(alt);\n }\n } else if (node.content) {\n out += serializeInline(node.content, opts);\n }\n }\n return out;\n}\n","import type * as DocxNamespace from 'docx';\nimport type { DocumentJSON, PageConfig } from '../config/types';\nimport { DEFAULT_PAGE, resolvePageDimensions } from '../config/defaults';\nimport { sanitizeUrl } from '../security/sanitize';\n\n/**\n * Isomorphic DOCX serializer (§8.3). Walks the document JSON and emits OOXML via\n * the `docx` library, which runs in both the browser (Blob) and Node\n * (Buffer/Stream). A per-node mapping is used so custom nodes can register their\n * own conversion (F-6.16, F-10.14). The `docx` module is imported lazily so it\n * stays out of the initial bundle (NF-2) and remains optional.\n */\n\n/** A converter for a custom node type, returning docx block elements. */\nexport type DocxNodeConverter = (\n node: DocumentJSON,\n ctx: DocxContext,\n) => unknown[];\n\nexport interface DocxExportOptions {\n page?: PageConfig;\n title?: string;\n /** Custom node converters keyed by node type name (extension mapping). */\n nodeConverters?: Record<string, DocxNodeConverter>;\n}\n\nexport interface DocxContext {\n serializeBlocks: (nodes: DocumentJSON[]) => unknown[];\n docx: DocxModule;\n}\n\ntype DocxModule = typeof DocxNamespace;\n\nlet docxModulePromise: Promise<DocxModule> | null = null;\nasync function loadDocx(): Promise<DocxModule> {\n if (!docxModulePromise) docxModulePromise = import('docx');\n return docxModulePromise;\n}\n\nconst HALF_POINT = 2; // docx font sizes are in half-points\nconst INDENT_TWIP_PER_LEVEL = 720; // 0.5 inch\n\nfunction toHex(value: unknown): string | null {\n const v = String(value ?? '').trim();\n const m = /^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/.exec(v);\n if (!m) return null;\n const hex = m[1]!;\n return hex.length === 3\n ? hex\n .split('')\n .map((c) => c + c)\n .join('')\n : hex;\n}\n\ninterface MarkJSON {\n type: string;\n attrs?: Record<string, unknown>;\n}\n\nclass DocxSerializer {\n private docx!: DocxModule;\n private numberingConfigs: unknown[] = [];\n private refCounter = 0;\n private converters: Record<string, DocxNodeConverter>;\n\n constructor(converters: Record<string, DocxNodeConverter> = {}) {\n this.converters = converters;\n }\n\n private allocListRef(ordered: boolean): string {\n const d = this.docx;\n const reference = `rne-list-${this.refCounter++}`;\n const levels = Array.from({ length: 9 }, (_, level) => {\n if (ordered) {\n const formats = [\n d.LevelFormat.DECIMAL,\n d.LevelFormat.LOWER_LETTER,\n d.LevelFormat.LOWER_ROMAN,\n ];\n return {\n level,\n format: formats[level % 3]!,\n text: `%${level + 1}.`,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n }\n const bullets = ['•', '◦', '▪'];\n return {\n level,\n format: d.LevelFormat.BULLET,\n text: bullets[level % 3]!,\n alignment: d.AlignmentType.START,\n style: { paragraph: { indent: { left: (level + 1) * 720, hanging: 360 } } },\n };\n });\n this.numberingConfigs.push({ reference, levels });\n return reference;\n }\n\n /** Build run options from a text node's marks. */\n private runOptions(marks: MarkJSON[]): Record<string, unknown> {\n const d = this.docx;\n const o: Record<string, unknown> = {};\n for (const mark of marks) {\n switch (mark.type) {\n case 'strong':\n o.bold = true;\n break;\n case 'em':\n o.italics = true;\n break;\n case 'underline':\n o.underline = {};\n break;\n case 'strikethrough':\n o.strike = true;\n break;\n case 'superscript':\n o.superScript = true;\n break;\n case 'subscript':\n o.subScript = true;\n break;\n case 'code':\n o.font = 'Courier New';\n break;\n case 'fontFamily':\n o.font = String(mark.attrs?.family ?? '');\n break;\n case 'fontSize': {\n const size = Number(mark.attrs?.size);\n if (Number.isFinite(size) && size > 0) o.size = Math.round(size * HALF_POINT);\n break;\n }\n case 'textColor': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.color = hex;\n break;\n }\n case 'highlight': {\n const hex = toHex(mark.attrs?.color);\n if (hex) o.shading = { type: d.ShadingType.CLEAR, fill: hex };\n break;\n }\n default:\n break;\n }\n }\n return o;\n }\n\n /** Serialize inline content into docx runs / hyperlinks. */\n private inlineChildren(content: DocumentJSON[] | undefined): unknown[] {\n const d = this.docx;\n if (!content) return [];\n const out: unknown[] = [];\n for (const node of content) {\n if (node.type === 'text') {\n const marks = (node.marks ?? []) as MarkJSON[];\n const link = marks.find((m) => m.type === 'link');\n const runOpts = this.runOptions(marks.filter((m) => m.type !== 'link'));\n const run = new d.TextRun({ text: node.text ?? '', ...runOpts });\n if (link?.attrs?.href) {\n const href = sanitizeUrl(String(link.attrs.href));\n if (href) {\n out.push(new d.ExternalHyperlink({ children: [run], link: href }));\n continue;\n }\n }\n out.push(run);\n } else if (node.type === 'hard_break') {\n out.push(new d.TextRun({ break: 1 }));\n } else if (node.type === 'image') {\n const img = this.imageRun(node);\n if (img) {\n out.push(img);\n } else {\n // Remote images can't be embedded synchronously; preserve the alt text\n // (or a placeholder) so information is not silently lost (F-6.17).\n const alt = node.attrs?.alt ? String(node.attrs.alt) : '[image]';\n out.push(new d.TextRun({ text: alt, italics: true }));\n }\n }\n }\n return out;\n }\n\n private imageRun(node: DocumentJSON): unknown | null {\n const d = this.docx;\n const src = String(node.attrs?.src ?? '');\n const match = /^data:image\\/(png|jpe?g|gif|bmp);base64,([A-Za-z0-9+/=]+)$/.exec(src);\n if (!match) return null; // remote images can't be fetched synchronously; skipped\n const raw = match[1]!;\n const type = raw === 'jpeg' ? 'jpg' : raw;\n const data = base64ToUint8(match[2]!);\n const width = Number(node.attrs?.width) || 300;\n const height = Math.round(width * 0.75);\n try {\n return new d.ImageRun({\n data,\n type: type as 'png' | 'jpg' | 'gif' | 'bmp',\n transformation: { width, height },\n });\n } catch {\n return null;\n }\n }\n\n private alignment(attrs: Record<string, unknown> | undefined): unknown {\n const d = this.docx;\n switch (attrs?.align) {\n case 'center':\n return d.AlignmentType.CENTER;\n case 'right':\n return d.AlignmentType.RIGHT;\n case 'justify':\n return d.AlignmentType.JUSTIFIED;\n case 'left':\n return d.AlignmentType.LEFT;\n default:\n return undefined;\n }\n }\n\n private paragraphProps(node: DocumentJSON): Record<string, unknown> {\n const props: Record<string, unknown> = {};\n const align = this.alignment(node.attrs);\n if (align !== undefined) props.alignment = align;\n const indent = Number(node.attrs?.indent ?? 0);\n if (indent > 0) props.indent = { left: indent * INDENT_TWIP_PER_LEVEL };\n const lineHeight = Number(node.attrs?.lineHeight);\n if (Number.isFinite(lineHeight) && lineHeight > 0) {\n props.spacing = { line: Math.round(lineHeight * 240), lineRule: 'auto' };\n }\n return props;\n }\n\n private headingLevel(level: number): unknown {\n const d = this.docx;\n const map = [\n d.HeadingLevel.HEADING_1,\n d.HeadingLevel.HEADING_2,\n d.HeadingLevel.HEADING_3,\n d.HeadingLevel.HEADING_4,\n d.HeadingLevel.HEADING_5,\n d.HeadingLevel.HEADING_6,\n ];\n return map[Math.min(5, Math.max(0, level - 1))];\n }\n\n serializeBlocks(nodes: DocumentJSON[]): unknown[] {\n const out: unknown[] = [];\n for (const node of nodes) out.push(...this.serializeBlock(node));\n return out;\n }\n\n private serializeBlock(node: DocumentJSON): unknown[] {\n const d = this.docx;\n const custom = this.converters[node.type];\n if (custom) {\n return custom(node, { serializeBlocks: (n) => this.serializeBlocks(n), docx: this.docx });\n }\n switch (node.type) {\n case 'paragraph':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'heading':\n return [\n new d.Paragraph({\n ...this.paragraphProps(node),\n heading: this.headingLevel(Number(node.attrs?.level ?? 1)) as never,\n children: this.inlineChildren(node.content) as never,\n }),\n ];\n case 'blockquote':\n return (node.content ?? []).flatMap((child) => {\n const blocks = this.serializeBlock(child);\n return blocks;\n });\n case 'horizontal_rule':\n return [\n new d.Paragraph({\n border: { bottom: { style: d.BorderStyle.SINGLE, size: 6, space: 1, color: '999999' } },\n children: [],\n }),\n ];\n case 'page_break':\n return [new d.Paragraph({ children: [new d.PageBreak()] })];\n case 'bullet_list':\n case 'ordered_list':\n return this.serializeList(node, node.type === 'ordered_list', 0);\n case 'table':\n return [this.serializeTable(node)];\n default:\n if (node.content) return this.serializeBlocks(node.content);\n return [];\n }\n }\n\n private serializeList(node: DocumentJSON, ordered: boolean, level: number): unknown[] {\n const d = this.docx;\n const reference = this.allocListRef(ordered);\n const out: unknown[] = [];\n for (const item of node.content ?? []) {\n if (item.type !== 'list_item') continue;\n const children = item.content ?? [];\n const checked = item.attrs?.checked;\n const prefix =\n checked === true ? '☑ ' : checked === false ? '☐ ' : '';\n\n children.forEach((child, idx) => {\n if (child.type === 'bullet_list' || child.type === 'ordered_list') {\n out.push(...this.serializeList(child, child.type === 'ordered_list', level + 1));\n } else if (idx === 0) {\n const runs = this.inlineChildren(child.content);\n const first = prefix ? [new d.TextRun({ text: prefix }), ...runs] : runs;\n out.push(\n new d.Paragraph({\n numbering: { reference, level },\n children: first as never,\n }),\n );\n } else {\n out.push(\n new d.Paragraph({\n indent: { left: (level + 1) * INDENT_TWIP_PER_LEVEL },\n children: this.inlineChildren(child.content) as never,\n }),\n );\n }\n });\n }\n return out;\n }\n\n private serializeTable(node: DocumentJSON): unknown {\n const d = this.docx;\n const rows = (node.content ?? [])\n .filter((row) => row.type === 'table_row')\n .map((row) => {\n const cells = (row.content ?? []).map((cell) => {\n const fill = toHex(cell.attrs?.background);\n return new d.TableCell({\n children: this.serializeBlocks(cell.content ?? []) as never,\n columnSpan: Number(cell.attrs?.colspan ?? 1) || 1,\n rowSpan: Number(cell.attrs?.rowspan ?? 1) || 1,\n ...(fill ? { shading: { type: d.ShadingType.CLEAR, fill } } : {}),\n });\n });\n return new d.TableRow({ children: cells });\n });\n return new d.Table({\n rows,\n width: { size: 100, type: d.WidthType.PERCENTAGE },\n });\n }\n\n async build(doc: DocumentJSON, options: DocxExportOptions): Promise<unknown> {\n this.docx = await loadDocx();\n const d = this.docx;\n const page = options.page ?? DEFAULT_PAGE;\n const { width, height } = resolvePageDimensions(page);\n const children = this.serializeBlocks(doc.content ?? []);\n const mmToTwip = (mm: number) => Math.round((mm / 25.4) * 1440);\n\n return new d.Document({\n numbering: { config: this.numberingConfigs as never },\n sections: [\n {\n properties: {\n page: {\n size: { width: mmToTwip(width), height: mmToTwip(height) },\n margin: {\n top: mmToTwip(page.margins.top),\n right: mmToTwip(page.margins.right),\n bottom: mmToTwip(page.margins.bottom),\n left: mmToTwip(page.margins.left),\n },\n },\n },\n children: children as never,\n },\n ],\n });\n }\n}\n\nfunction base64ToUint8(b64: string): Uint8Array {\n if (typeof atob === 'function') {\n const binary = atob(b64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n }\n // Node fallback.\n return new Uint8Array(Buffer.from(b64, 'base64'));\n}\n\n/** Serialize a document to a DOCX Blob for client-side download (F-6.1, F-6.6). */\nexport async function documentToDocxBlob(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Blob> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBlob(document as never);\n}\n\n/** Serialize a document to a DOCX Buffer for server-side storage (F-6.10). */\nexport async function documentToDocxBuffer(\n doc: DocumentJSON,\n options: DocxExportOptions = {},\n): Promise<Buffer> {\n const serializer = new DocxSerializer(options.nodeConverters);\n const document = await serializer.build(doc, options);\n const { Packer } = await loadDocx();\n return Packer.toBuffer(document as never);\n}\n"]}