react-next-editor-js 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +877 -0
  3. package/dist/chunk-3QWXTDLY.cjs +486 -0
  4. package/dist/chunk-3QWXTDLY.cjs.map +1 -0
  5. package/dist/chunk-5F6SPYCN.cjs +180 -0
  6. package/dist/chunk-5F6SPYCN.cjs.map +1 -0
  7. package/dist/chunk-6NTSXJX4.js +174 -0
  8. package/dist/chunk-6NTSXJX4.js.map +1 -0
  9. package/dist/chunk-7VYJDBH7.js +261 -0
  10. package/dist/chunk-7VYJDBH7.js.map +1 -0
  11. package/dist/chunk-DBSFCCBG.cjs +1712 -0
  12. package/dist/chunk-DBSFCCBG.cjs.map +1 -0
  13. package/dist/chunk-EFE6RHDL.cjs +4 -0
  14. package/dist/chunk-EFE6RHDL.cjs.map +1 -0
  15. package/dist/chunk-G6YRIEK4.js +3 -0
  16. package/dist/chunk-G6YRIEK4.js.map +1 -0
  17. package/dist/chunk-GFNFJ3FL.cjs +119 -0
  18. package/dist/chunk-GFNFJ3FL.cjs.map +1 -0
  19. package/dist/chunk-IG2YLUFW.js +114 -0
  20. package/dist/chunk-IG2YLUFW.js.map +1 -0
  21. package/dist/chunk-JQXTWLHL.js +176 -0
  22. package/dist/chunk-JQXTWLHL.js.map +1 -0
  23. package/dist/chunk-NJCEHQV3.cjs +454 -0
  24. package/dist/chunk-NJCEHQV3.cjs.map +1 -0
  25. package/dist/chunk-O4GTLC3T.js +478 -0
  26. package/dist/chunk-O4GTLC3T.js.map +1 -0
  27. package/dist/chunk-ODHABIIC.cjs +82 -0
  28. package/dist/chunk-ODHABIIC.cjs.map +1 -0
  29. package/dist/chunk-PZ5AY32C.js +9 -0
  30. package/dist/chunk-PZ5AY32C.js.map +1 -0
  31. package/dist/chunk-Q7SFCCGT.cjs +11 -0
  32. package/dist/chunk-Q7SFCCGT.cjs.map +1 -0
  33. package/dist/chunk-QIUIYBCZ.js +80 -0
  34. package/dist/chunk-QIUIYBCZ.js.map +1 -0
  35. package/dist/chunk-QROUNVQK.js +450 -0
  36. package/dist/chunk-QROUNVQK.js.map +1 -0
  37. package/dist/chunk-T6FR37IC.js +41 -0
  38. package/dist/chunk-T6FR37IC.js.map +1 -0
  39. package/dist/chunk-TI44I654.cjs +265 -0
  40. package/dist/chunk-TI44I654.cjs.map +1 -0
  41. package/dist/chunk-TXPLBAH5.cjs +47 -0
  42. package/dist/chunk-TXPLBAH5.cjs.map +1 -0
  43. package/dist/chunk-U3O54IYI.cjs +187 -0
  44. package/dist/chunk-U3O54IYI.cjs.map +1 -0
  45. package/dist/chunk-VLC7SZMT.js +1669 -0
  46. package/dist/chunk-VLC7SZMT.js.map +1 -0
  47. package/dist/core/index.cjs +232 -0
  48. package/dist/core/index.cjs.map +1 -0
  49. package/dist/core/index.d.cts +122 -0
  50. package/dist/core/index.d.ts +122 -0
  51. package/dist/core/index.js +7 -0
  52. package/dist/core/index.js.map +1 -0
  53. package/dist/defaults-EQD5QKCU.js +4 -0
  54. package/dist/defaults-EQD5QKCU.js.map +1 -0
  55. package/dist/defaults-MLYXD2BG.cjs +49 -0
  56. package/dist/defaults-MLYXD2BG.cjs.map +1 -0
  57. package/dist/docx-BUrf4PFj.d.ts +49 -0
  58. package/dist/docx-DLfSdvXm.d.cts +49 -0
  59. package/dist/docx-LDETXV3L.js +5 -0
  60. package/dist/docx-LDETXV3L.js.map +1 -0
  61. package/dist/docx-N2LKIOK3.cjs +14 -0
  62. package/dist/docx-N2LKIOK3.cjs.map +1 -0
  63. package/dist/export/index.cjs +54 -0
  64. package/dist/export/index.cjs.map +1 -0
  65. package/dist/export/index.d.cts +60 -0
  66. package/dist/export/index.d.ts +60 -0
  67. package/dist/export/index.js +9 -0
  68. package/dist/export/index.js.map +1 -0
  69. package/dist/html-5BXJPQU3.js +7 -0
  70. package/dist/html-5BXJPQU3.js.map +1 -0
  71. package/dist/html-KU2KHLRF.cjs +24 -0
  72. package/dist/html-KU2KHLRF.cjs.map +1 -0
  73. package/dist/import/index.cjs +15 -0
  74. package/dist/import/index.cjs.map +1 -0
  75. package/dist/import/index.d.cts +37 -0
  76. package/dist/import/index.d.ts +37 -0
  77. package/dist/import/index.js +6 -0
  78. package/dist/import/index.js.map +1 -0
  79. package/dist/index.cjs +1035 -0
  80. package/dist/index.cjs.map +1 -0
  81. package/dist/index.d.cts +248 -0
  82. package/dist/index.d.ts +248 -0
  83. package/dist/index.js +885 -0
  84. package/dist/index.js.map +1 -0
  85. package/dist/persistence/index.cjs +37 -0
  86. package/dist/persistence/index.cjs.map +1 -0
  87. package/dist/persistence/index.d.cts +279 -0
  88. package/dist/persistence/index.d.ts +279 -0
  89. package/dist/persistence/index.js +4 -0
  90. package/dist/persistence/index.js.map +1 -0
  91. package/dist/sanitize-7IZ-SW1f.d.ts +361 -0
  92. package/dist/sanitize-CvmgqbsA.d.cts +361 -0
  93. package/dist/server/index.cjs +400 -0
  94. package/dist/server/index.cjs.map +1 -0
  95. package/dist/server/index.d.cts +229 -0
  96. package/dist/server/index.d.ts +229 -0
  97. package/dist/server/index.js +390 -0
  98. package/dist/server/index.js.map +1 -0
  99. package/dist/styles.css +680 -0
  100. package/dist/types-B4z0Quvv.d.cts +193 -0
  101. package/dist/types-B4z0Quvv.d.ts +193 -0
  102. package/package.json +183 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/react/EditorContext.ts","../src/react/ErrorBoundary.tsx","../src/react/toolbar/icons.tsx","../src/react/toolbar/ToolbarButton.tsx","../src/react/toolbar/ColorButton.tsx","../src/react/toolbar/Toolbar.tsx","../src/react/StatusBar.tsx","../src/react/Editor.tsx"],"names":["jsx","jsxs","importDocx","useRef","useState","useEffect","EditorInner","useMemo","useCallback","PMNode","paginated","engine","Editor"],"mappings":"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","file":"index.js","sourcesContent":["'use client';\n\nimport { createContext, useContext } from 'react';\nimport type { EditorContextValue } from './types';\n\n/** Context providing the live view/state/commands to the toolbar and children. */\nexport const EditorContext = createContext<EditorContextValue | null>(null);\n\n/** Access the editor context; throws if used outside an <Editor>. */\nexport function useEditorContext(): EditorContextValue {\n const ctx = useContext(EditorContext);\n if (!ctx) {\n throw new Error('useEditorContext must be used within a react-next-editor <Editor>.');\n }\n return ctx;\n}\n","'use client';\n\nimport { Component, type ErrorInfo, type ReactNode } from 'react';\n\ninterface ErrorBoundaryProps {\n children: ReactNode;\n onError?: (error: Error) => void;\n fallbackMessage?: string;\n}\n\ninterface ErrorBoundaryState {\n error: Error | null;\n}\n\n/**\n * Wraps the editor so a failure in one feature/instance cannot bring down the\n * host app (F-11.2). Degrades to a recoverable state with a clear message and a\n * retry button; reports the error via `onError` for monitoring (F-11.8).\n */\nexport class EditorErrorBoundary extends Component<ErrorBoundaryProps, ErrorBoundaryState> {\n constructor(props: ErrorBoundaryProps) {\n super(props);\n this.state = { error: null };\n }\n\n static getDerivedStateFromError(error: Error): ErrorBoundaryState {\n return { error };\n }\n\n componentDidCatch(error: Error, info: ErrorInfo): void {\n // eslint-disable-next-line no-console\n console.error('[react-next-editor] Editor error contained by boundary:', error, info);\n this.props.onError?.(error);\n }\n\n private readonly handleReset = () => {\n this.setState({ error: null });\n };\n\n render(): ReactNode {\n if (this.state.error) {\n return (\n <div className=\"rne-root\">\n <div className=\"rne-error\" role=\"alert\">\n <strong>{this.props.fallbackMessage ?? 'The editor encountered a problem.'}</strong>\n <p>Your latest saved content is preserved locally. You can try to recover the editor.</p>\n <button type=\"button\" onClick={this.handleReset}>\n Reload editor\n </button>\n </div>\n </div>\n );\n }\n return this.props.children;\n }\n}\n","'use client';\n\nimport type { JSX } from 'react';\n\n/**\n * Compact 24×24 inline SVG icons for toolbar controls. Inline so the package has\n * no icon-font dependency and icons inherit `currentColor` for theming.\n */\nconst PATHS: Record<string, JSX.Element> = {\n undo: <path d=\"M12 5V1L7 6l5 5V7a6 6 0 1 1-6 6H4a8 8 0 1 0 8-8z\" />,\n redo: <path d=\"M12 5V1l5 5-5 5V7a6 6 0 1 0 6 6h2a8 8 0 1 1-8-8z\" />,\n bold: (\n <path d=\"M7 5h6a3.5 3.5 0 0 1 1.5 6.66A3.5 3.5 0 0 1 13 19H7V5zm3 2v3h3a1.5 1.5 0 0 0 0-3h-3zm0 5v4h3a2 2 0 0 0 0-4h-3z\" />\n ),\n italic: <path d=\"M10 4h7v2h-2.3l-3 12H14v2H7v-2h2.3l3-12H10V4z\" />,\n underline: <path d=\"M6 4v7a6 6 0 0 0 12 0V4h-2.5v7a3.5 3.5 0 0 1-7 0V4H6zm-1 16h14v2H5v-2z\" />,\n strikethrough: (\n <path d=\"M3 11h18v2H3v-2zm9-7c2.5 0 4 1.3 4.3 3h-2.4c-.2-.7-.8-1.2-1.9-1.2-1.2 0-2 .6-2 1.5 0 .5.3.9 1 1.2H9.2C8.5 9 8 8.2 8 7.2 8 5.3 9.7 4 12 4zm2 11.5c0 1.9-1.6 3.5-4.2 3.5-2.6 0-4.3-1.4-4.5-3.4h2.4c.2.9 1 1.5 2.2 1.5 1.3 0 2.1-.6 2.1-1.6 0-.2 0-.4-.1-.5H14z\" />\n ),\n superscript: (\n <path d=\"M4 7l4 5-4 5h2.5L9 13.5 11.5 17H14l-4-5 4-5h-2.5L9 10.5 6.5 7H4zm16-1c0-.8-.6-1.5-1.7-1.5-.9 0-1.6.5-1.8 1.3h1c.1-.3.4-.5.8-.5.4 0 .7.2.7.6 0 .6-1 1-2.3 2.1V9h3.6v-.9h-1.9c1-.8 1.6-1.3 1.6-2.2z\" />\n ),\n subscript: (\n <path d=\"M4 4l4 5-4 5h2.5L9 10.5 11.5 14H14l-4-5 4-5h-2.5L9 7.5 6.5 4H4zm16 13c0-.8-.6-1.5-1.7-1.5-.9 0-1.6.5-1.8 1.3h1c.1-.3.4-.5.8-.5.4 0 .7.2.7.6 0 .6-1 1-2.3 2.1V20h3.6v-.9h-1.9c1-.8 1.6-1.3 1.6-2.1z\" />\n ),\n code: <path d=\"M9 7l-5 5 5 5 1.4-1.4L6.8 12l3.6-3.6L9 7zm6 0l-1.4 1.4L17.2 12l-3.6 3.6L15 17l5-5-5-5z\" />,\n textColor: <path d=\"M5 18h14v2H5v-2zM9.6 4h2.8l4.1 11h-2.3l-1-3H8.8l-1 3H5.5L9.6 4zm-.2 6.1h3.2L11 5.6 9.4 10.1z\" />,\n highlight: <path d=\"M4 18h16v3H4v-3zM15.6 3.4l3 3-7.8 7.8-3.6.6.6-3.6 7.8-7.8zM6 13l3 3H6v-3z\" />,\n clearFormatting: (\n <path d=\"M6 5v2h5l-2.8 9h2.5l2.8-9H19V5H6zM4.7 17.3 17.3 4.7l1.4 1.4L6.1 18.7l-1.4-1.4z\" />\n ),\n alignLeft: <path d=\"M3 4h18v2H3V4zm0 5h12v2H3V9zm0 5h18v2H3v-2zm0 5h12v2H3v-2z\" />,\n alignCenter: <path d=\"M3 4h18v2H3V4zm3 5h12v2H6V9zm-3 5h18v2H3v-2zm3 5h12v2H6v-2z\" />,\n alignRight: <path d=\"M3 4h18v2H3V4zm6 5h12v2H9V9zm-6 5h18v2H3v-2zm6 5h12v2H9v-2z\" />,\n alignJustify: <path d=\"M3 4h18v2H3V4zm0 5h18v2H3V9zm0 5h18v2H3v-2zm0 5h18v2H3v-2z\" />,\n bulletList: (\n <path d=\"M4 5.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm4 .5h13v2H8V6zm-4 4.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm4 .5h13v2H8v-2zm-4 4.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3zm4 .5h13v2H8v-2z\" />\n ),\n orderedList: (\n <path d=\"M3 6h1V3H2v1h1v2zm5 0h13v2H8V6zm0 5h13v2H8v-2zm0 5h13v2H8v-2zM2 12.8h2v.5H3v.5h1v.5H2v.7h3v-3H2v.8zm1 4.2H2v.8h1.8v.4L2 19v.9h3V17H4l-1 .5V17z\" />\n ),\n taskList: (\n <path d=\"M3 5h6v6H3V5zm2 2v2h2V7H5zm6-1h10v2H11V6zm0 5h10v2H11v-2zm0 5h10v2H11v-2zM3 15.4l1.4-1.4 1.1 1.1 2.6-2.6L9.5 14l-4 4L3 15.4z\" />\n ),\n indent: <path d=\"M3 4h18v2H3V4zm8 5h10v2H11V9zm0 5h10v2H11v-2zm-8 5h18v2H3v-2zm0-9 4 3-4 3V10z\" />,\n outdent: <path d=\"M3 4h18v2H3V4zm8 5h10v2H11V9zm0 5h10v2H11v-2zm-8 5h18v2H3v-2zM7 10v6l-4-3 4-3z\" />,\n blockquote: (\n <path d=\"M7 7c-2 0-3.5 1.6-3.5 3.6 0 1.8 1.3 3 2.9 3 .2 0 .4 0 .6-.1-.4 1-1.4 1.8-2.5 2.1l.6 1.4C7.7 16.9 9.5 14.8 9.5 12 9.5 9.2 8.4 7 7 7zm9 0c-2 0-3.5 1.6-3.5 3.6 0 1.8 1.3 3 2.9 3 .2 0 .4 0 .6-.1-.4 1-1.4 1.8-2.5 2.1l.6 1.4c2.1-.6 3.9-2.7 3.9-5.5C18.5 9.2 17.4 7 16 7z\" />\n ),\n horizontalRule: <path d=\"M3 11h18v2H3v-2z\" />,\n link: (\n <path d=\"M10.6 13.4a1 1 0 0 0 1.4 0l3-3a3 3 0 0 0-4.3-4.3l-1.5 1.5 1.4 1.4 1.5-1.5a1 1 0 0 1 1.5 1.5l-3 3a1 1 0 0 0 0 1.4zm2.8-2.8a1 1 0 0 0-1.4 0l-3 3A3 3 0 0 0 13.3 18l1.5-1.5-1.4-1.4-1.5 1.5a1 1 0 0 1-1.5-1.5l3-3a1 1 0 0 0 0-1.4z\" />\n ),\n image: (\n <path d=\"M4 4h16a1 1 0 0 1 1 1v14a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1V5a1 1 0 0 1 1-1zm1 2v9l4-4 3 3 3-3 3 3V6H5zm3 1.5a1.5 1.5 0 1 1 0 3 1.5 1.5 0 0 1 0-3z\" />\n ),\n table: (\n <path d=\"M3 4h18v16H3V4zm2 2v3h5V6H5zm7 0v3h7V6h-7zm-7 5v3h5v-3H5zm7 0v3h7v-3h-7zm-7 5v2h5v-2H5zm7 0v2h7v-2h-7z\" />\n ),\n pageBreak: (\n <path d=\"M6 3h8l4 4v4h-2V8h-3V5H6v6H4V3h2zm-2 13h2v2h2v-2h2v2h2v-2h2v2h2v-2h2v5H4v-5z\" />\n ),\n importDocx: (\n <path d=\"M5 3h9l5 5v6h-2V9h-4V5H7v14h5v2H5V3zm8 11 4 4 4-4h-3v-4h-2v4h-3z\" />\n ),\n};\n\nexport function ToolbarIcon({ name }: { name: string }): JSX.Element {\n const path = PATHS[name];\n if (!path) {\n return <span aria-hidden=\"true\">{name.slice(0, 2)}</span>;\n }\n return (\n <svg className=\"rne-btn-icon\" viewBox=\"0 0 24 24\" aria-hidden=\"true\" focusable=\"false\">\n {path}\n </svg>\n );\n}\n","'use client';\n\nimport type { EditorCommand } from '../../core/commands/helpers';\nimport { useEditorContext } from '../EditorContext';\nimport { ToolbarIcon } from './icons';\n\ninterface ToolbarButtonProps {\n iconName: string;\n label: string;\n command: EditorCommand;\n}\n\n/** A single command button reflecting active/enabled state (F-10.6, NF-4). */\nexport function ToolbarButton({ iconName, label, command }: ToolbarButtonProps) {\n const { state, run } = useEditorContext();\n const active = state ? (command.isActive?.(state) ?? false) : false;\n const enabled = state ? (command.isEnabled ? command.isEnabled(state) : true) : false;\n\n return (\n <button\n type=\"button\"\n className={`rne-btn${active ? ' rne-btn--active' : ''}`}\n title={label}\n aria-label={label}\n aria-pressed={command.isActive ? active : undefined}\n disabled={!enabled}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => run(command.run)}\n >\n <ToolbarIcon name={iconName} />\n </button>\n );\n}\n","'use client';\n\nimport { useEffect, useRef, useState } from 'react';\nimport type { Command } from 'prosemirror-state';\nimport { useEditorContext } from '../EditorContext';\nimport { ToolbarIcon } from './icons';\n\ninterface ColorButtonProps {\n iconName: 'textColor' | 'highlight';\n label: string;\n /** Build a command that applies the chosen color. */\n apply: (color: string) => Command;\n /** Build a command that clears the color, if supported. */\n clear?: () => Command;\n /** The currently-active color, for the swatch. */\n activeColor?: string | null;\n}\n\n/** A color picker button with a palette popover (text color / highlight). */\nexport function ColorButton({ iconName, label, apply, clear, activeColor }: ColorButtonProps) {\n const { run, colorPalette } = useEditorContext();\n const [open, setOpen] = useState(false);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const buttonRef = useRef<HTMLButtonElement | null>(null);\n\n useEffect(() => {\n if (!open) return;\n const onDown = (e: MouseEvent) => {\n if (containerRef.current && !containerRef.current.contains(e.target as Node)) {\n setOpen(false);\n }\n };\n document.addEventListener('mousedown', onDown);\n return () => document.removeEventListener('mousedown', onDown);\n }, [open]);\n\n return (\n <div className=\"rne-color-btn\" ref={containerRef}>\n <button\n ref={buttonRef}\n type=\"button\"\n className=\"rne-btn\"\n title={label}\n aria-label={label}\n aria-haspopup=\"true\"\n aria-expanded={open}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => setOpen((v) => !v)}\n >\n <span style={{ display: 'flex', flexDirection: 'column', alignItems: 'center' }}>\n <ToolbarIcon name={iconName} />\n <span className=\"rne-color-swatch\" style={{ background: activeColor ?? '#000' }} />\n </span>\n </button>\n {open && (\n <div\n className=\"rne-color-popover\"\n role=\"menu\"\n onKeyDown={(e) => {\n if (e.key === 'Escape') {\n setOpen(false);\n buttonRef.current?.focus();\n }\n }}\n >\n {colorPalette.map((color) => (\n <button\n key={color}\n type=\"button\"\n className=\"rne-color-cell\"\n style={{ background: color }}\n title={color}\n aria-label={color}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n run(apply(color));\n setOpen(false);\n }}\n />\n ))}\n {clear && (\n <button\n type=\"button\"\n className=\"rne-color-cell\"\n style={{ background: '#fff', gridColumn: 'span 8', height: 22 }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n run(clear());\n setOpen(false);\n }}\n >\n ✕\n </button>\n )}\n </div>\n )}\n </div>\n );\n}\n","'use client';\n\nimport { type ChangeEvent, Fragment, type KeyboardEvent, useCallback, useMemo, useRef } from 'react';\nimport type { EditorState } from 'prosemirror-state';\nimport type { FeatureFlags, ToolbarConfig, ToolbarItemId } from '../../config/types';\nimport { DEFAULT_TOOLBAR_GROUPS } from '../../config/defaults';\nimport { useEditorContext } from '../EditorContext';\nimport { ToolbarButton } from './ToolbarButton';\nimport { ColorButton } from './ColorButton';\nimport { ToolbarIcon } from './icons';\n\nconst FEATURE_OF: Partial<Record<ToolbarItemId, keyof FeatureFlags>> = {\n bold: 'bold',\n italic: 'italic',\n underline: 'underline',\n strikethrough: 'strikethrough',\n superscript: 'superscript',\n subscript: 'subscript',\n code: 'code',\n paragraphStyle: 'headings',\n fontFamily: 'fontFamily',\n fontSize: 'fontSize',\n textColor: 'textColor',\n highlight: 'highlight',\n clearFormatting: 'clearFormatting',\n alignLeft: 'alignment',\n alignCenter: 'alignment',\n alignRight: 'alignment',\n alignJustify: 'alignment',\n bulletList: 'bulletList',\n orderedList: 'orderedList',\n taskList: 'taskList',\n indent: 'indentation',\n outdent: 'indentation',\n blockquote: 'blockquote',\n horizontalRule: 'horizontalRule',\n link: 'link',\n image: 'image',\n table: 'table',\n pageBreak: 'pageBreak',\n importDocx: 'docxImport',\n undo: 'history',\n redo: 'history',\n};\n\n/** Item ids backed directly by a registry command (rendered as icon buttons). */\nconst COMMAND_ITEMS = new Set<ToolbarItemId>([\n 'undo',\n 'redo',\n 'bold',\n 'italic',\n 'underline',\n 'strikethrough',\n 'superscript',\n 'subscript',\n 'code',\n 'clearFormatting',\n 'alignLeft',\n 'alignCenter',\n 'alignRight',\n 'alignJustify',\n 'bulletList',\n 'orderedList',\n 'taskList',\n 'indent',\n 'outdent',\n 'blockquote',\n 'horizontalRule',\n 'pageBreak',\n]);\n\nfunction activeBlockValue(state: EditorState | null): string {\n if (!state) return 'p';\n const node = state.selection.$head.parent;\n if (node.type.name === 'heading') return `h${node.attrs.level as number}`;\n return 'p';\n}\n\ninterface ToolbarProps {\n config?: ToolbarConfig;\n}\n\n/** Data-driven, keyboard-accessible toolbar (F-1–F-3, F-10.6, NF-4). */\nexport function Toolbar({ config }: ToolbarProps) {\n const ctx = useEditorContext();\n const { state, commands, strings, features, run, fontFamilies, fontSizes, importDocx } = ctx;\n\n const groups = config?.groups ?? DEFAULT_TOOLBAR_GROUPS;\n const sticky = config?.sticky ?? true;\n const toolbarRef = useRef<HTMLDivElement>(null);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const onImportFile = useCallback(\n async (e: ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n e.target.value = ''; // allow re-importing the same file\n if (!file) return;\n try {\n await importDocx(file);\n } catch (err) {\n // eslint-disable-next-line no-console\n console.error('[react-next-editor] DOCX import failed:', err);\n }\n },\n [importDocx],\n );\n\n // Arrow-key navigation between toolbar buttons (WCAG toolbar pattern). Tab\n // order is preserved; arrows move focus among enabled buttons. Selects keep\n // their native arrow behaviour (and remain reachable via Tab), so they are not\n // part of the arrow ring.\n const onToolbarKeyDown = useCallback((e: KeyboardEvent<HTMLDivElement>) => {\n if (!['ArrowLeft', 'ArrowRight', 'Home', 'End'].includes(e.key)) return;\n const active = document.activeElement as HTMLElement | null;\n if (active?.tagName === 'SELECT') return;\n const root = toolbarRef.current;\n if (!root) return;\n const items = Array.from(root.querySelectorAll<HTMLElement>('button:not([disabled])'));\n if (items.length === 0) return;\n const idx = active ? items.indexOf(active) : -1;\n if (idx === -1) return;\n e.preventDefault();\n let next = idx;\n if (e.key === 'ArrowRight') next = (idx + 1) % items.length;\n else if (e.key === 'ArrowLeft') next = (idx - 1 + items.length) % items.length;\n else if (e.key === 'Home') next = 0;\n else if (e.key === 'End') next = items.length - 1;\n items[next]?.focus();\n }, []);\n\n const renderedGroups = useMemo(() => {\n return groups\n .map((group) => group.filter((id) => isItemAvailable(id, features, commands)))\n .filter((group) => group.length > 0);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [groups, features, commands]);\n\n const labelFor = (id: ToolbarItemId): string =>\n (strings as unknown as Record<string, string>)[id] ?? id;\n\n function renderItem(id: ToolbarItemId) {\n if (COMMAND_ITEMS.has(id)) {\n const command = commands.registry[id];\n if (!command) return null;\n return <ToolbarButton key={id} iconName={id} label={labelFor(id)} command={command} />;\n }\n\n switch (id) {\n case 'paragraphStyle':\n return (\n <select\n key={id}\n className=\"rne-select\"\n aria-label={strings.paragraphStyle}\n value={activeBlockValue(state)}\n onMouseDown={(e) => e.stopPropagation()}\n onChange={(e) => {\n const v = e.target.value;\n if (v === 'p') run(commands.blocks.setParagraph());\n else run(commands.blocks.setHeading(Number(v.slice(1))));\n }}\n >\n <option value=\"p\">{strings.paragraph}</option>\n {[1, 2, 3, 4, 5, 6].map((lvl) => (\n <option key={lvl} value={`h${lvl}`}>{`${strings.heading} ${lvl}`}</option>\n ))}\n </select>\n );\n case 'fontFamily':\n return (\n <select\n key={id}\n className=\"rne-select\"\n aria-label={strings.fontFamily}\n value={state ? (commands.marks.getActiveFontFamily(state) ?? '') : ''}\n onChange={(e) => {\n const v = e.target.value;\n run(v ? commands.marks.setFontFamily(v) : commands.marks.clearFontFamily());\n }}\n >\n <option value=\"\">{strings.fontFamily}</option>\n {fontFamilies.map((f) => (\n <option key={f} value={f} style={{ fontFamily: f }}>\n {f}\n </option>\n ))}\n </select>\n );\n case 'fontSize':\n return (\n <select\n key={id}\n className=\"rne-select\"\n style={{ maxWidth: 70 }}\n aria-label={strings.fontSize}\n value={state ? (commands.marks.getActiveFontSize(state) ?? '') : ''}\n onChange={(e) => {\n const v = e.target.value;\n run(v ? commands.marks.setFontSize(Number(v)) : commands.marks.clearFontSize());\n }}\n >\n <option value=\"\">{strings.fontSize}</option>\n {fontSizes.map((s) => (\n <option key={s} value={s}>\n {s}\n </option>\n ))}\n </select>\n );\n case 'textColor':\n return (\n <ColorButton\n key={id}\n iconName=\"textColor\"\n label={strings.textColor}\n apply={(c) => commands.marks.setTextColor(c)}\n clear={() => commands.marks.clearTextColor()}\n activeColor={state ? commands.marks.getActiveTextColor(state) : null}\n />\n );\n case 'highlight':\n return (\n <ColorButton\n key={id}\n iconName=\"highlight\"\n label={strings.highlight}\n apply={(c) => commands.marks.setHighlight(c)}\n clear={() => commands.marks.clearHighlight()}\n />\n );\n case 'link':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.link}\n aria-label={strings.link}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n if (!state) return;\n const prev = commands.links.getActiveLink(state);\n const url = window.prompt(strings.linkPrompt, prev?.href ?? 'https://');\n if (url === null) return;\n if (url.trim() === '') run(commands.links.removeLink);\n else run(commands.links.setLink({ href: url.trim() }));\n }}\n >\n <ToolbarIcon name=\"link\" />\n </button>\n );\n case 'image':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.image}\n aria-label={strings.image}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => {\n const url = window.prompt(strings.imagePrompt, 'https://');\n if (!url || !url.trim()) return;\n // Prompt for alt text so inserted images are accessible (NF-4).\n const alt = window.prompt(strings.imageAltPrompt, '');\n run(commands.insert.image({ src: url.trim(), alt: alt?.trim() || null }));\n }}\n >\n <ToolbarIcon name=\"image\" />\n </button>\n );\n case 'table':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.insertTable}\n aria-label={strings.insertTable}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => run(commands.insert.table(3, 3, true))}\n >\n <ToolbarIcon name=\"table\" />\n </button>\n );\n case 'importDocx':\n return (\n <button\n key={id}\n type=\"button\"\n className=\"rne-btn\"\n title={strings.importDocx}\n aria-label={strings.importDocx}\n onMouseDown={(e) => e.preventDefault()}\n onClick={() => fileInputRef.current?.click()}\n >\n <ToolbarIcon name=\"importDocx\" />\n </button>\n );\n default:\n return null;\n }\n }\n\n return (\n <div\n ref={toolbarRef}\n className={`rne-toolbar${sticky ? ' rne-toolbar--sticky' : ''}`}\n role=\"toolbar\"\n aria-label=\"Formatting\"\n onKeyDown={onToolbarKeyDown}\n >\n {renderedGroups.map((group, gi) => (\n <Fragment key={gi}>\n {gi > 0 && <span className=\"rne-toolbar-separator\" aria-hidden=\"true\" />}\n <div className=\"rne-toolbar-group\">{group.map(renderItem)}</div>\n </Fragment>\n ))}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".docx,application/vnd.openxmlformats-officedocument.wordprocessingml.document\"\n style={{ display: 'none' }}\n aria-hidden=\"true\"\n tabIndex={-1}\n onChange={onImportFile}\n />\n </div>\n );\n}\n\nfunction isItemAvailable(\n id: ToolbarItemId,\n features: FeatureFlags,\n commands: ReturnType<typeof useEditorContext>['commands'],\n): boolean {\n if (id === 'separator') return false;\n const feature = FEATURE_OF[id];\n if (feature && !features[feature]) return false;\n if (COMMAND_ITEMS.has(id) && !commands.registry[id]) return false;\n return true;\n}\n","'use client';\n\nimport { useEffect, useState } from 'react';\nimport type { SaveStatus } from '../config/types';\nimport { countDocument, type DocumentStats } from '../core/utils';\nimport { useEditorContext } from './EditorContext';\n\nconst STATUS_LABEL: Record<SaveStatus, string> = {\n idle: '',\n savingLocal: 'Saving…',\n savedLocal: 'Saved locally',\n syncing: 'Syncing…',\n synced: 'Synced',\n syncFailed: 'Sync failed',\n offline: 'Offline',\n};\n\ninterface StatusBarProps {\n saveStatus: SaveStatus;\n hasPersistence: boolean;\n}\n\n/**\n * Word/character count (F-4.5) and visible save/sync status (F-9.4, NF-10).\n *\n * The count is an O(n) document walk, so it is recomputed only when the document\n * actually changes (not on selection changes) and is debounced — keeping typing\n * responsive on large documents (NF-1).\n */\nexport function StatusBar({ saveStatus, hasPersistence }: StatusBarProps) {\n const { state, strings } = useEditorContext();\n const doc = state?.doc;\n const [stats, setStats] = useState<DocumentStats | null>(null);\n\n useEffect(() => {\n if (!doc) {\n setStats(null);\n return;\n }\n // `doc` identity is stable across selection-only transactions, so this fires\n // only on real edits. Debounce to avoid walking a large doc on every keystroke.\n const id = setTimeout(() => setStats(countDocument(doc)), 300);\n return () => clearTimeout(id);\n }, [doc]);\n\n return (\n <div className=\"rne-statusbar\">\n <span>\n {stats\n ? `${stats.words} ${strings.words} · ${stats.characters} ${strings.characters}`\n : ''}\n </span>\n {hasPersistence && saveStatus !== 'idle' && (\n <span className=\"rne-status-badge\">\n <span className={`rne-status-dot rne-status-dot--${saveStatus}`} />\n {STATUS_LABEL[saveStatus]}\n </span>\n )}\n </div>\n );\n}\n","'use client';\n\nimport {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { EditorView } from 'prosemirror-view';\nimport { type Command, EditorState, TextSelection } from 'prosemirror-state';\nimport { Node as PMNode, type Schema } from 'prosemirror-model';\n\nimport type { DocumentJSON, EditorStrings, FeatureFlags, PageConfig, SaveStatus } from '../config/types';\nimport {\n DEFAULT_COLOR_PALETTE,\n DEFAULT_FEATURES,\n DEFAULT_FONT_FAMILIES,\n DEFAULT_FONT_SIZES,\n DEFAULT_PAGE,\n DEFAULT_STRINGS,\n resolvePageDimensions,\n themeToCssVars,\n} from '../config/defaults';\nimport { buildSchema } from '../core/schema/schema';\nimport { buildPlugins } from '../core/plugins/index';\nimport type { PaginationGeometry } from '../core/pagination/plugin';\nimport { createCommands, type CommandSet } from '../core/commands/index';\nimport { createDoc, createEditorState } from '../core/state/createEditorState';\nimport { preloadSanitizer } from '../security/sanitize';\nimport { documentToText } from '../export/text';\nimport { documentToHtml } from '../export/html';\nimport { exportDocument } from '../export/index';\nimport { DocumentPersistence } from '../persistence/autosave';\nimport { IndexedDBStore, requestPersistentStorage } from '../persistence/indexeddb';\nimport { ConnectivityMonitor } from '../sync/connectivity';\nimport { SyncEngine } from '../sync/engine';\nimport { EditorContext } from './EditorContext';\nimport { EditorErrorBoundary } from './ErrorBoundary';\nimport { Toolbar } from './toolbar/Toolbar';\nimport { StatusBar } from './StatusBar';\nimport type { EditorContextValue, EditorProps, EditorRef } from './types';\n\ninterface ResolvedConfig {\n features: FeatureFlags;\n page: PageConfig;\n strings: EditorStrings;\n fontFamilies: string[];\n fontSizes: number[];\n colorPalette: string[];\n editable: boolean;\n placeholder: string | undefined;\n}\n\nfunction resolveConfig(props: EditorProps): ResolvedConfig {\n return {\n features: { ...DEFAULT_FEATURES, ...props.features },\n page: {\n ...DEFAULT_PAGE,\n ...props.page,\n margins: { ...DEFAULT_PAGE.margins, ...props.page?.margins },\n },\n strings: { ...DEFAULT_STRINGS, ...props.strings },\n fontFamilies: props.fontFamilies ?? DEFAULT_FONT_FAMILIES,\n fontSizes: props.fontSizes ?? DEFAULT_FONT_SIZES,\n colorPalette: props.colorPalette ?? DEFAULT_COLOR_PALETTE,\n editable: !(props.readOnly || props.mode === 'readonly'),\n placeholder: props.placeholder,\n };\n}\n\n/** CSS pixels per millimetre at 96 DPI (the CSS reference). */\nconst PX_PER_MM = 96 / 25.4;\n/** Visual gap (px) drawn on the canvas between consecutive page sheets. */\nconst PAGE_GAP_PX = 24;\n\n/** Convert a page configuration (mm) into concrete pixel geometry, or null. */\nfunction computePaginationGeometry(page: PageConfig): PaginationGeometry | null {\n if (page.pagination !== 'visual') return null;\n const { width, height } = resolvePageDimensions(page);\n const m = page.margins;\n const pageWidthPx = width * PX_PER_MM;\n const pageHeightPx = height * PX_PER_MM;\n const marginTopPx = m.top * PX_PER_MM;\n const marginBottomPx = m.bottom * PX_PER_MM;\n const marginLeftPx = m.left * PX_PER_MM;\n const contentWidthPx = Math.max(1, (width - m.left - m.right) * PX_PER_MM);\n const contentHeightPx = pageHeightPx - marginTopPx - marginBottomPx;\n if (contentHeightPx <= 0) return null;\n return {\n pageWidthPx,\n pageHeightPx,\n marginTopPx,\n marginBottomPx,\n marginLeftPx,\n contentWidthPx,\n contentHeightPx,\n interPageOffsetPx: marginBottomPx + PAGE_GAP_PX + marginTopPx,\n };\n}\n\nconst EditorInner = forwardRef<EditorRef, EditorProps>(function EditorInner(props, ref) {\n const mountRef = useRef<HTMLDivElement | null>(null);\n const viewRef = useRef<EditorView | null>(null);\n const persistenceRef = useRef<DocumentPersistence | null>(null);\n const pageBgRef = useRef<HTMLDivElement | null>(null);\n const remeasureRef = useRef<(() => void) | null>(null);\n const propsRef = useRef(props);\n propsRef.current = props;\n\n const config = useMemo(() => resolveConfig(props), [props]);\n const cfgRef = useRef(config);\n cfgRef.current = config;\n\n // Build the editing engine (schema + commands) once per feature set + placeholder.\n const featureKey = useMemo(() => JSON.stringify(config.features), [config.features]);\n const engine = useMemo(() => {\n const schema: Schema = buildSchema(config.features);\n const commands: CommandSet = createCommands(schema);\n return { schema, commands };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [featureKey]);\n\n const [editorState, setEditorState] = useState<EditorState | null>(null);\n const [saveStatus, setSaveStatus] = useState<SaveStatus>('idle');\n const [ready, setReady] = useState(false);\n\n // ---- Imperative handle (F-10.15, F-10.16) ----\n const getJSON = useCallback((): DocumentJSON => {\n const view = viewRef.current;\n return (view ? view.state.doc.toJSON() : createDoc(engine.schema, null).toJSON()) as DocumentJSON;\n }, [engine.schema]);\n\n const setContent = useCallback(\n (content: DocumentJSON | string | null) => {\n const view = viewRef.current;\n if (!view) return;\n const doc = createDoc(view.state.schema, content);\n const state = EditorState.create({ doc, plugins: view.state.plugins });\n view.updateState(state);\n setEditorState(state);\n },\n [],\n );\n\n const importDocxIntoEditor = useCallback(\n async (file: ArrayBuffer | Uint8Array | Blob): Promise<{ warnings: string[] }> => {\n const view = viewRef.current;\n if (!view) return { warnings: [] };\n const { importDocx } = await import('../import/docx');\n const result = await importDocx(file, view.state.schema);\n // Replace the whole document via a dispatched transaction so the change is\n // undoable and flows through onChange/autosave like any other edit.\n const node = PMNode.fromJSON(view.state.schema, result.doc);\n const v = viewRef.current;\n if (v) {\n const tr = v.state.tr.replaceWith(0, v.state.doc.content.size, node.content);\n v.dispatch(tr.scrollIntoView());\n }\n return { warnings: result.warnings };\n },\n [],\n );\n\n const handle = useMemo<EditorRef>(\n () => ({\n getJSON,\n getText: (options) => documentToText(getJSON(), options),\n getHTML: () => documentToHtml(getJSON()),\n setContent,\n importDocx: importDocxIntoEditor,\n focus: () => viewRef.current?.focus(),\n isDirty: () => persistenceRef.current?.isDirty() ?? false,\n save: async () => {\n await persistenceRef.current?.saveNow(getJSON());\n },\n clearLocalData: async () => {\n await persistenceRef.current?.clearLocal();\n },\n exportAs: (format, filename) =>\n exportDocument(getJSON(), format, {\n filename: filename ?? propsRef.current.documentId,\n page: cfgRef.current.page,\n title: filename ?? propsRef.current.documentId,\n }),\n getView: () => viewRef.current,\n getState: () => viewRef.current?.state ?? null,\n getSchema: () => viewRef.current?.state.schema ?? null,\n }),\n [getJSON, setContent, importDocxIntoEditor],\n );\n\n useImperativeHandle(ref, () => handle, [handle]);\n\n // ---- Create the ProseMirror view once (golden rule: PM owns the DOM) ----\n useEffect(() => {\n const mount = mountRef.current;\n if (!mount) return;\n\n void preloadSanitizer();\n\n const paginated = cfgRef.current.page.pagination === 'visual';\n const plugins = buildPlugins(engine.schema, {\n placeholder: cfgRef.current.placeholder,\n history: cfgRef.current.features.history,\n extraPlugins: propsRef.current.extensions?.plugins,\n pagination: paginated\n ? {\n getGeometry: () => computePaginationGeometry(cfgRef.current.page),\n getBackgroundLayer: () => pageBgRef.current,\n header: cfgRef.current.page.header,\n footer: cfgRef.current.page.footer,\n register: (fn) => {\n remeasureRef.current = fn;\n },\n }\n : undefined,\n });\n\n const initialContent =\n propsRef.current.value ?? propsRef.current.initialContent ?? null;\n const state = createEditorState({ schema: engine.schema, plugins, content: initialContent });\n\n const view = new EditorView(mount, {\n state,\n editable: () => !(propsRef.current.readOnly || propsRef.current.mode === 'readonly'),\n attributes: {\n class: 'rne-prosemirror',\n role: 'textbox',\n 'aria-multiline': 'true',\n 'aria-label': propsRef.current.ariaLabel ?? 'Document editor',\n dir: propsRef.current.dir ?? 'ltr',\n },\n dispatchTransaction(tr) {\n const v = viewRef.current;\n if (!v) return;\n const newState = v.state.apply(tr);\n v.updateState(newState);\n setEditorState(newState);\n\n const p = propsRef.current;\n if (tr.docChanged) {\n const json = newState.doc.toJSON() as DocumentJSON;\n p.onChange?.(json, handle);\n persistenceRef.current?.scheduleSave(json);\n }\n if (tr.selectionSet) {\n p.onSelectionChange?.(newState);\n }\n },\n });\n\n viewRef.current = view;\n setEditorState(view.state);\n setReady(true);\n propsRef.current.onReady?.(handle);\n\n return () => {\n view.destroy();\n viewRef.current = null;\n setReady(false);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [engine]);\n\n // ---- Keep editability in sync without recreating the view ----\n useEffect(() => {\n viewRef.current?.setProps({\n editable: () => config.editable,\n });\n // Re-render to update toolbar disabled state.\n setEditorState((s) => s);\n }, [config.editable]);\n\n // ---- Local persistence, crash recovery (F-9.2, F-11.9), and sync (F-9.6–F-9.9, F-9.14) ----\n useEffect(() => {\n const documentId = props.documentId;\n const persistenceEnabled = props.persistence?.enabled ?? !!documentId;\n if (!documentId || !persistenceEnabled || !ready) return;\n\n const store = props.persistence?.store ?? new IndexedDBStore();\n const sync = props.sync;\n const auto = sync?.auto ?? true;\n\n let engine: SyncEngine | null = null;\n let monitor: ConnectivityMonitor | null = null;\n\n // Shared status handler: surfaces both local-save and sync transitions, and\n // triggers an upload after each successful local save when online (F-9.6).\n const handleStatus = (status: SaveStatus, detail?: { error?: string }) => {\n setSaveStatus(status);\n propsRef.current.onSaveStatusChange?.(status, detail);\n if (status === 'savedLocal' && engine && auto && (monitor?.isOnline() ?? true)) {\n void engine.flush();\n }\n };\n\n const persistence = new DocumentPersistence({\n documentId,\n store,\n debounceMs: props.persistence?.debounceMs,\n metadata: props.metadata,\n onStatus: handleStatus,\n });\n persistenceRef.current = persistence;\n\n if (sync?.remote) {\n engine = new SyncEngine({\n store,\n remote: sync.remote,\n maxAttempts: sync.maxAttempts,\n onStatus: handleStatus,\n onConflict: sync.onConflict,\n });\n const remotePing = sync.remote.ping?.bind(sync.remote);\n monitor = new ConnectivityMonitor({\n ping: remotePing,\n intervalMs: sync.pingIntervalMs,\n onChange: (online) => {\n if (online) {\n if (auto && engine) void engine.flush();\n } else {\n handleStatus('offline');\n }\n },\n });\n monitor.start();\n if (auto) void engine.flush(); // attempt to drain any queue from a prior session\n }\n\n if (props.persistence?.requestPersistent !== false) {\n void requestPersistentStorage();\n }\n\n let cancelled = false;\n void (async () => {\n const record = await persistence.load();\n if (cancelled || !record) return;\n // Only restore from local storage when no explicit controlled value is set.\n if (propsRef.current.value == null) {\n setContent(record.doc);\n }\n })();\n\n return () => {\n cancelled = true;\n monitor?.stop();\n engine?.cancel();\n void persistence.destroy();\n persistenceRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.documentId, ready, props.sync?.remote]);\n\n // ---- Controlled value sync (F-10.20) ----\n useEffect(() => {\n const view = viewRef.current;\n if (!view || props.value == null) return;\n const current = JSON.stringify(view.state.doc.toJSON());\n const next = JSON.stringify(props.value);\n if (current === next) return;\n const doc = createDoc(view.state.schema, props.value);\n const selectionPos = Math.min(view.state.selection.from, doc.content.size);\n const state = EditorState.create({ doc, plugins: view.state.plugins });\n const withSel = state.apply(\n state.tr.setSelection(TextSelection.create(state.doc, Math.max(0, selectionPos))),\n );\n view.updateState(withSel);\n setEditorState(withSel);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [props.value]);\n\n // ---- Context for toolbar/children ----\n const runCommand = useCallback((command: Command): boolean => {\n const view = viewRef.current;\n if (!view) return false;\n const result = command(view.state, view.dispatch, view);\n view.focus();\n return result;\n }, []);\n\n const contextValue = useMemo<EditorContextValue>(\n () => ({\n view: viewRef.current,\n state: editorState,\n schema: engine.schema,\n commands: engine.commands,\n strings: config.strings,\n features: config.features,\n fontFamilies: config.fontFamilies,\n fontSizes: config.fontSizes,\n colorPalette: config.colorPalette,\n editable: config.editable,\n run: runCommand,\n importDocx: importDocxIntoEditor,\n }),\n [editorState, engine, config, runCommand, importDocxIntoEditor],\n );\n\n // ---- Layout / page surface ----\n const { width } = resolvePageDimensions(config.page);\n const showChrome = config.page.showPageChrome;\n const paginated = config.page.pagination === 'visual';\n\n // Stable signature of the page geometry; force a re-measure when it changes.\n const pageGeometryKey = useMemo(\n () =>\n JSON.stringify({\n p: config.page.pagination,\n s: config.page.size,\n o: config.page.orientation,\n w: config.page.widthMm,\n h: config.page.heightMm,\n m: config.page.margins,\n hdr: config.page.header,\n ftr: config.page.footer,\n }),\n [config.page],\n );\n useEffect(() => {\n if (paginated) remeasureRef.current?.();\n }, [pageGeometryKey, paginated]);\n\n const geometry = useMemo(\n () => computePaginationGeometry(config.page),\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [pageGeometryKey],\n );\n\n const rootStyle = useMemo(() => {\n const base: Record<string, string> = {\n ...themeToCssVars(props.theme),\n '--rne-page-width': `${width}mm`,\n '--rne-page-padding': `${config.page.margins.top}mm ${config.page.margins.right}mm ${config.page.margins.bottom}mm ${config.page.margins.left}mm`,\n };\n if (geometry) {\n base['--rne-page-w'] = `${geometry.pageWidthPx}px`;\n base['--rne-page-h'] = `${geometry.pageHeightPx}px`;\n base['--rne-content-w'] = `${geometry.contentWidthPx}px`;\n base['--rne-mt'] = `${geometry.marginTopPx}px`;\n base['--rne-ml'] = `${geometry.marginLeftPx}px`;\n }\n return { ...base, ...(props.style as Record<string, string> | undefined) };\n }, [props.theme, props.style, width, config.page.margins, geometry]);\n\n const toolbarEnabled = props.toolbar !== false && (props.toolbar?.enabled ?? true) && config.editable;\n const statusBarEnabled = props.statusBar ?? true;\n\n return (\n <EditorContext.Provider value={contextValue}>\n <div\n className={`rne-root${props.className ? ` ${props.className}` : ''}`}\n style={rootStyle as React.CSSProperties}\n data-ready={ready}\n dir={props.dir ?? 'ltr'}\n >\n {toolbarEnabled && <Toolbar config={props.toolbar || undefined} />}\n {props.children}\n <div\n className={`rne-canvas${showChrome ? '' : ' rne-canvas--plain'}${paginated ? ' rne-canvas--paged' : ''}`}\n >\n {paginated ? (\n <div className=\"rne-paged\">\n <div ref={pageBgRef} className=\"rne-page-bg\" aria-hidden=\"true\" />\n <div ref={mountRef} className=\"rne-mount rne-mount--paged\" />\n </div>\n ) : (\n <div className=\"rne-page\">\n <div ref={mountRef} className=\"rne-mount\" />\n </div>\n )}\n </div>\n {statusBarEnabled && <StatusBar saveStatus={saveStatus} hasPersistence={!!props.documentId} />}\n </div>\n </EditorContext.Provider>\n );\n});\n\n/**\n * The embeddable rich document editor (F-10.17). Client-only — load via\n * `next/dynamic(() => import('react-next-editor').then(m => m.Editor), { ssr: false })`.\n * Wrapped in an error boundary so a failure never takes down the host (F-11.2).\n */\nexport const Editor = forwardRef<EditorRef, EditorProps>(function Editor(props, ref) {\n return (\n <EditorErrorBoundary onError={props.onError}>\n <EditorInner {...props} ref={ref} />\n </EditorErrorBoundary>\n );\n});\n"]}
@@ -0,0 +1,37 @@
1
+ 'use strict';
2
+
3
+ var chunk3QWXTDLY_cjs = require('../chunk-3QWXTDLY.cjs');
4
+ require('../chunk-Q7SFCCGT.cjs');
5
+
6
+
7
+
8
+ Object.defineProperty(exports, "ConflictError", {
9
+ enumerable: true,
10
+ get: function () { return chunk3QWXTDLY_cjs.ConflictError; }
11
+ });
12
+ Object.defineProperty(exports, "ConnectivityMonitor", {
13
+ enumerable: true,
14
+ get: function () { return chunk3QWXTDLY_cjs.ConnectivityMonitor; }
15
+ });
16
+ Object.defineProperty(exports, "DocumentPersistence", {
17
+ enumerable: true,
18
+ get: function () { return chunk3QWXTDLY_cjs.DocumentPersistence; }
19
+ });
20
+ Object.defineProperty(exports, "IndexedDBStore", {
21
+ enumerable: true,
22
+ get: function () { return chunk3QWXTDLY_cjs.IndexedDBStore; }
23
+ });
24
+ Object.defineProperty(exports, "MemoryStore", {
25
+ enumerable: true,
26
+ get: function () { return chunk3QWXTDLY_cjs.MemoryStore; }
27
+ });
28
+ Object.defineProperty(exports, "SyncEngine", {
29
+ enumerable: true,
30
+ get: function () { return chunk3QWXTDLY_cjs.SyncEngine; }
31
+ });
32
+ Object.defineProperty(exports, "requestPersistentStorage", {
33
+ enumerable: true,
34
+ get: function () { return chunk3QWXTDLY_cjs.requestPersistentStorage; }
35
+ });
36
+ //# sourceMappingURL=index.cjs.map
37
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"index.cjs"}
@@ -0,0 +1,279 @@
1
+ import { D as DocumentJSON, S as SaveStatus } from '../types-B4z0Quvv.cjs';
2
+
3
+ /**
4
+ * Persistence and sync adapter interfaces (F-10.12). The editor core knows
5
+ * nothing about REST or IndexedDB; consumers inject implementations of these
6
+ * interfaces so the same editor works against any backend/storage. Default
7
+ * IndexedDB and in-memory implementations ship with the package.
8
+ */
9
+ /** A stored document record: canonical JSON plus sync metadata. */
10
+ interface StoredDocument {
11
+ id: string;
12
+ /** Canonical ProseMirror document JSON (F-8.1, C-5). */
13
+ doc: DocumentJSON;
14
+ /** Monotonic local revision, bumped on every local save. */
15
+ rev: number;
16
+ /** Server-acknowledged version, for optimistic-concurrency conflict checks. */
17
+ baseVersion?: string | number | null;
18
+ /** Whether the record has unsynced local changes. */
19
+ dirty: boolean;
20
+ updatedAt: number;
21
+ /** Arbitrary per-document metadata supplied by the host. */
22
+ metadata?: Record<string, unknown>;
23
+ }
24
+ /** An entry in the durable outbox of documents awaiting upload (F-9.5). */
25
+ interface OutboxEntry {
26
+ id: string;
27
+ rev: number;
28
+ queuedAt: number;
29
+ attempts: number;
30
+ lastError?: string | null;
31
+ nextAttemptAt?: number;
32
+ }
33
+ /**
34
+ * Local, durable document store (F-9.2, NF-9). The default implementation uses
35
+ * IndexedDB; an in-memory implementation is provided for SSR/tests.
36
+ */
37
+ interface LocalStoreAdapter {
38
+ getDocument(id: string): Promise<StoredDocument | null>;
39
+ putDocument(record: StoredDocument): Promise<void>;
40
+ deleteDocument(id: string): Promise<void>;
41
+ listDocuments(): Promise<StoredDocument[]>;
42
+ /** Outbox operations for the sync engine. */
43
+ enqueue(entry: OutboxEntry): Promise<void>;
44
+ dequeue(id: string): Promise<void>;
45
+ listOutbox(): Promise<OutboxEntry[]>;
46
+ /** Binary asset (offline image) operations (F-9.10). */
47
+ putAsset?(key: string, blob: Blob): Promise<void>;
48
+ getAsset?(key: string): Promise<Blob | null>;
49
+ deleteAsset?(key: string): Promise<void>;
50
+ /** Purge all locally persisted data (F-12.7). */
51
+ clear(): Promise<void>;
52
+ }
53
+ /** Result of a remote save, carrying the new server version (NF-10). */
54
+ interface RemoteSaveResult {
55
+ version: string | number;
56
+ /** Optional canonical document returned by the server (e.g. rewritten asset URLs). */
57
+ doc?: DocumentJSON;
58
+ }
59
+ /** Raised by a {@link RemoteSyncAdapter} when a stale write is rejected (F-9.9). */
60
+ declare class ConflictError extends Error {
61
+ readonly remote?: {
62
+ version: string | number;
63
+ doc?: DocumentJSON;
64
+ } | undefined;
65
+ constructor(message: string, remote?: {
66
+ version: string | number;
67
+ doc?: DocumentJSON;
68
+ } | undefined);
69
+ }
70
+ /**
71
+ * Remote document API (F-9.6, F-9.7). Injected by the host using its own auth
72
+ * (F-12.4). Implementations MUST use HTTPS (F-12.3) and SHOULD be idempotent
73
+ * (NF-10). On a version conflict, throw {@link ConflictError}.
74
+ */
75
+ interface RemoteSyncAdapter {
76
+ /** Create or update the document on the server; returns the new version. */
77
+ save(record: StoredDocument, signal?: AbortSignal): Promise<RemoteSaveResult>;
78
+ /** Fetch the latest server copy, or null if it does not exist. */
79
+ fetch?(id: string, signal?: AbortSignal): Promise<StoredDocument | null>;
80
+ /** Best-effort reachability check used for connectivity confirmation (§8.7). */
81
+ ping?(signal?: AbortSignal): Promise<boolean>;
82
+ }
83
+ /** Uploads offline-inserted assets and returns canonical URLs (F-9.10, F-12.5). */
84
+ interface AssetUploadAdapter {
85
+ upload(blob: Blob, meta: {
86
+ filename?: string;
87
+ mime: string;
88
+ }): Promise<{
89
+ url: string;
90
+ }>;
91
+ }
92
+ /** Listener for save/sync status transitions (F-9.4, F-10.15). */
93
+ type SaveStatusListener = (status: SaveStatus, detail?: {
94
+ error?: string;
95
+ }) => void;
96
+
97
+ /**
98
+ * In-memory {@link LocalStoreAdapter}. Used as an SSR-safe fallback when
99
+ * IndexedDB is unavailable and as a test double. Not durable across reloads.
100
+ */
101
+ declare class MemoryStore implements LocalStoreAdapter {
102
+ private docs;
103
+ private outbox;
104
+ private assets;
105
+ getDocument(id: string): Promise<StoredDocument | null>;
106
+ putDocument(record: StoredDocument): Promise<void>;
107
+ deleteDocument(id: string): Promise<void>;
108
+ listDocuments(): Promise<StoredDocument[]>;
109
+ enqueue(entry: OutboxEntry): Promise<void>;
110
+ dequeue(id: string): Promise<void>;
111
+ listOutbox(): Promise<OutboxEntry[]>;
112
+ putAsset(key: string, blob: Blob): Promise<void>;
113
+ getAsset(key: string): Promise<Blob | null>;
114
+ deleteAsset(key: string): Promise<void>;
115
+ clear(): Promise<void>;
116
+ }
117
+
118
+ /**
119
+ * Durable {@link LocalStoreAdapter} backed by IndexedDB (§8.7). `localStorage`
120
+ * is explicitly rejected (too small, synchronous, string-only). Falls back to an
121
+ * in-memory store when IndexedDB is unavailable (SSR, private mode) so the
122
+ * editor never crashes (F-11.1).
123
+ */
124
+ declare class IndexedDBStore implements LocalStoreAdapter {
125
+ private dbName;
126
+ private dbPromise;
127
+ private fallback;
128
+ constructor(dbName?: string);
129
+ /** Whether IndexedDB is usable in the current environment. */
130
+ static isSupported(): boolean;
131
+ private db;
132
+ getDocument(id: string): Promise<StoredDocument | null>;
133
+ putDocument(record: StoredDocument): Promise<void>;
134
+ deleteDocument(id: string): Promise<void>;
135
+ listDocuments(): Promise<StoredDocument[]>;
136
+ enqueue(entry: OutboxEntry): Promise<void>;
137
+ dequeue(id: string): Promise<void>;
138
+ listOutbox(): Promise<OutboxEntry[]>;
139
+ putAsset(key: string, blob: Blob): Promise<void>;
140
+ getAsset(key: string): Promise<Blob | null>;
141
+ deleteAsset(key: string): Promise<void>;
142
+ clear(): Promise<void>;
143
+ }
144
+ /**
145
+ * Request persistent storage to reduce eviction risk for unsynced data (F-9.11).
146
+ * Resolves to whether persistence was granted; never throws.
147
+ */
148
+ declare function requestPersistentStorage(): Promise<boolean>;
149
+
150
+ interface DocumentPersistenceOptions {
151
+ documentId: string;
152
+ store: LocalStoreAdapter;
153
+ /** Debounce window for autosave writes (default 800ms). */
154
+ debounceMs?: number;
155
+ /** Initial metadata to attach to the stored record. */
156
+ metadata?: Record<string, unknown>;
157
+ onStatus?: SaveStatusListener;
158
+ }
159
+ /**
160
+ * Manages local-first persistence for a single document (F-8.x, F-9.2, NF-9):
161
+ * debounced autosave of `doc.toJSON()` to the durable store, dirty-flag and
162
+ * outbox maintenance for later sync, and crash/reload recovery via {@link load}.
163
+ * The local store is the source of truth during editing; the network is never in
164
+ * the critical path (C-7, NF-8).
165
+ */
166
+ declare class DocumentPersistence {
167
+ private readonly id;
168
+ private readonly store;
169
+ private readonly debounceMs;
170
+ private readonly onStatus?;
171
+ private metadata?;
172
+ private current;
173
+ private timer;
174
+ private pending;
175
+ private destroyed;
176
+ private writing;
177
+ constructor(options: DocumentPersistenceOptions);
178
+ private emit;
179
+ /** Load the latest locally-persisted document (crash/reload recovery, F-11.9). */
180
+ load(): Promise<StoredDocument | null>;
181
+ /** The current stored record, if loaded/saved. */
182
+ getRecord(): StoredDocument | null;
183
+ /** Whether there are unsynced local changes. */
184
+ isDirty(): boolean;
185
+ /** Schedule a debounced save of the latest document JSON (F-4.8). */
186
+ scheduleSave(doc: DocumentJSON): void;
187
+ /** Immediately persist any pending document (e.g. on blur/unmount). */
188
+ flush(): Promise<void>;
189
+ /**
190
+ * Persist a document to the local store, atomically bump the revision, mark it
191
+ * dirty and enqueue it in the outbox for later upload. Writes are serialized to
192
+ * avoid partial saves (NF-9).
193
+ */
194
+ saveNow(doc: DocumentJSON): Promise<StoredDocument>;
195
+ private makeRecord;
196
+ /** Mark the document as synced after a successful remote save (NF-10). */
197
+ markSynced(version: string | number, serverDoc?: DocumentJSON): Promise<void>;
198
+ /** Purge this document's locally-persisted data and outbox entry (F-12.7). */
199
+ clearLocal(): Promise<void>;
200
+ /** Stop the autosave timer and flush pending work. */
201
+ destroy(): Promise<void>;
202
+ }
203
+
204
+ /**
205
+ * Connectivity detection (§8.7). Listens to `online`/`offline` events but does
206
+ * NOT trust `navigator.onLine` alone (it reports interface presence, not API
207
+ * reachability); when a `ping` is provided, real reachability is confirmed
208
+ * before reporting "online". Safe to construct in any environment.
209
+ */
210
+ interface ConnectivityOptions {
211
+ /** Confirms real API reachability (e.g. a HEAD to the data API). */
212
+ ping?: (signal?: AbortSignal) => Promise<boolean>;
213
+ /** Polling interval in ms while running (default 30s). 0 disables polling. */
214
+ intervalMs?: number;
215
+ onChange?: (online: boolean) => void;
216
+ }
217
+ declare class ConnectivityMonitor {
218
+ private readonly ping?;
219
+ private readonly intervalMs;
220
+ private readonly onChange?;
221
+ private online;
222
+ private timer;
223
+ private started;
224
+ constructor(options?: ConnectivityOptions);
225
+ isOnline(): boolean;
226
+ private readonly handleOnline;
227
+ private readonly handleOffline;
228
+ start(): void;
229
+ stop(): void;
230
+ /** Re-evaluate connectivity now, confirming reachability via ping when set. */
231
+ check(): Promise<boolean>;
232
+ private set;
233
+ }
234
+
235
+ interface SyncEngineOptions {
236
+ store: LocalStoreAdapter;
237
+ remote: RemoteSyncAdapter;
238
+ /** Max upload attempts before a document is parked for manual retry (default 6). */
239
+ maxAttempts?: number;
240
+ /** Base backoff delay in ms (default 1000). Doubles per attempt, capped at 5min. */
241
+ baseDelayMs?: number;
242
+ onStatus?: SaveStatusListener;
243
+ /** Invoked when a version conflict is detected (F-9.9). */
244
+ onConflict?: (local: StoredDocument, remote?: {
245
+ version: string | number;
246
+ }) => void;
247
+ }
248
+ /**
249
+ * Flushes the durable outbox to the REST API on demand/reconnect (F-9.6–F-9.8).
250
+ * Idempotent uploads, exponential backoff on transient failure, and a
251
+ * version-guard conflict path (G-2 default). Edits are never lost: a document
252
+ * stays dirty and queued until the server confirms it.
253
+ */
254
+ declare class SyncEngine {
255
+ private readonly store;
256
+ private readonly remote;
257
+ private readonly maxAttempts;
258
+ private readonly baseDelayMs;
259
+ private readonly onStatus?;
260
+ private readonly onConflict?;
261
+ private flushing;
262
+ private abortController;
263
+ constructor(options: SyncEngineOptions);
264
+ private emit;
265
+ /**
266
+ * Process every queued document once. Re-entrancy-safe: concurrent calls are
267
+ * coalesced. Returns the number of documents successfully synced.
268
+ */
269
+ flush(): Promise<number>;
270
+ /** Abort an in-flight flush (e.g. on going offline or unmount). */
271
+ cancel(): void;
272
+ /**
273
+ * Re-queue a parked/conflicted document for another attempt (used by a
274
+ * host-defined conflict resolution flow after the user chooses to overwrite).
275
+ */
276
+ retry(id: string, baseVersion?: string | number | null): Promise<void>;
277
+ }
278
+
279
+ export { type AssetUploadAdapter, ConflictError, ConnectivityMonitor, type ConnectivityOptions, DocumentPersistence, type DocumentPersistenceOptions, IndexedDBStore, type LocalStoreAdapter, MemoryStore, type OutboxEntry, type RemoteSaveResult, type RemoteSyncAdapter, type SaveStatusListener, type StoredDocument, SyncEngine, type SyncEngineOptions, requestPersistentStorage };