react-next-editor-js 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -769,6 +769,7 @@ var EditorInner = react.forwardRef(function EditorInner2(props, ref) {
|
|
|
769
769
|
react.useEffect(() => {
|
|
770
770
|
const view = viewRef.current;
|
|
771
771
|
if (!view || props.value == null) return;
|
|
772
|
+
if (view.hasFocus()) return;
|
|
772
773
|
const current = JSON.stringify(view.state.doc.toJSON());
|
|
773
774
|
const next = JSON.stringify(props.value);
|
|
774
775
|
if (current === next) return;
|
package/dist/index.cjs.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","../src/react/DocumentView.tsx"],"names":["createContext","useContext","Component","jsx","useState","useRef","useEffect","jsxs","importDocx","DEFAULT_TOOLBAR_GROUPS","useCallback","useMemo","Fragment","countDocument","DEFAULT_FEATURES","DEFAULT_PAGE","DEFAULT_STRINGS","DEFAULT_FONT_FAMILIES","DEFAULT_FONT_SIZES","DEFAULT_COLOR_PALETTE","resolvePageDimensions","forwardRef","EditorInner","buildSchema","createCommands","createDoc","EditorState","PMNode","documentToText","documentToHtml","exportDocument","useImperativeHandle","preloadSanitizer","paginated","buildPlugins","createEditorState","EditorView","IndexedDBStore","engine","DocumentPersistence","SyncEngine","ConnectivityMonitor","requestPersistentStorage","TextSelection","themeToCssVars","Editor","sanitizeHtmlSync"],"mappings":"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","file":"index.cjs","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
|
+
{"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":["createContext","useContext","Component","jsx","useState","useRef","useEffect","jsxs","importDocx","DEFAULT_TOOLBAR_GROUPS","useCallback","useMemo","Fragment","countDocument","DEFAULT_FEATURES","DEFAULT_PAGE","DEFAULT_STRINGS","DEFAULT_FONT_FAMILIES","DEFAULT_FONT_SIZES","DEFAULT_COLOR_PALETTE","resolvePageDimensions","forwardRef","EditorInner","buildSchema","createCommands","createDoc","EditorState","PMNode","documentToText","documentToHtml","exportDocument","useImperativeHandle","preloadSanitizer","paginated","buildPlugins","createEditorState","EditorView","IndexedDBStore","engine","DocumentPersistence","SyncEngine","ConnectivityMonitor","requestPersistentStorage","TextSelection","themeToCssVars","Editor","sanitizeHtmlSync"],"mappings":"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","file":"index.cjs","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 // While the user is typing, the editor's own state is authoritative: an\n // incoming `value` is almost always the echo of the change we just emitted\n // through `onChange`. Reconciling it here would (a) cost two full-document\n // serializations per keystroke and (b) risk reverting in-flight edits. Defer\n // until the editor is not focused, when an external value change is real.\n if (view.hasFocus()) 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"]}
|
package/dist/index.js
CHANGED
|
@@ -774,6 +774,7 @@ var EditorInner = forwardRef(function EditorInner2(props, ref) {
|
|
|
774
774
|
useEffect(() => {
|
|
775
775
|
const view = viewRef.current;
|
|
776
776
|
if (!view || props.value == null) return;
|
|
777
|
+
if (view.hasFocus()) return;
|
|
777
778
|
const current = JSON.stringify(view.state.doc.toJSON());
|
|
778
779
|
const next = JSON.stringify(props.value);
|
|
779
780
|
if (current === next) return;
|
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","../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
|
+
{"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 // While the user is typing, the editor's own state is authoritative: an\n // incoming `value` is almost always the echo of the change we just emitted\n // through `onChange`. Reconciling it here would (a) cost two full-document\n // serializations per keystroke and (b) risk reverting in-flight edits. Defer\n // until the editor is not focused, when an external value change is real.\n if (view.hasFocus()) 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"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-next-editor-js",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
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",
|