@arbidocs/blocks 0.5.115 → 0.5.116

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 (71) hide show
  1. package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs → ConnectedNativeDocxComparison-546ILGLW.cjs} +8 -8
  2. package/dist/{ConnectedNativeDocxComparison-YXMYJWXY.cjs.map → ConnectedNativeDocxComparison-546ILGLW.cjs.map} +1 -1
  3. package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs → ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs} +8 -8
  4. package/dist/{ConnectedStreamedWordArtifact-2RTCHVPI.cjs.map → ConnectedStreamedWordArtifact-S2ZFZLZQ.cjs.map} +1 -1
  5. package/dist/{FilesViewerDialog-I5QIHQZT.cjs → FilesViewerDialog-6UKR5WEF.cjs} +6 -6
  6. package/dist/{FilesViewerDialog-I5QIHQZT.cjs.map → FilesViewerDialog-6UKR5WEF.cjs.map} +1 -1
  7. package/dist/{NativeDocxEditor-H6TAEVGY.cjs → NativeDocxEditor-2LQY2CTV.cjs} +6 -6
  8. package/dist/{NativeDocxEditor-H6TAEVGY.cjs.map → NativeDocxEditor-2LQY2CTV.cjs.map} +1 -1
  9. package/dist/{chunk-M6IKVKU5.cjs → chunk-2CSLFAGF.cjs} +392 -149
  10. package/dist/chunk-2CSLFAGF.cjs.map +1 -0
  11. package/dist/{chunk-24EDG4PC.cjs → chunk-B2HNNG25.cjs} +5 -5
  12. package/dist/{chunk-24EDG4PC.cjs.map → chunk-B2HNNG25.cjs.map} +1 -1
  13. package/dist/{chunk-IW7CDJTA.cjs → chunk-COD5ENHK.cjs} +4 -4
  14. package/dist/{chunk-IW7CDJTA.cjs.map → chunk-COD5ENHK.cjs.map} +1 -1
  15. package/dist/chunk-HB2O4THB.cjs +18 -0
  16. package/dist/{chunk-CIHERNDO.cjs.map → chunk-HB2O4THB.cjs.map} +1 -1
  17. package/dist/{chunk-WR2SF44W.cjs → chunk-NIE3N6OM.cjs} +4 -4
  18. package/dist/{chunk-WR2SF44W.cjs.map → chunk-NIE3N6OM.cjs.map} +1 -1
  19. package/dist/{chunk-ZTXQIIFV.cjs → chunk-QHOHDNBU.cjs} +6 -6
  20. package/dist/{chunk-ZTXQIIFV.cjs.map → chunk-QHOHDNBU.cjs.map} +1 -1
  21. package/dist/{chunk-A3T3IC3K.cjs → chunk-SB4M3ITT.cjs} +190 -36
  22. package/dist/chunk-SB4M3ITT.cjs.map +1 -0
  23. package/dist/{chunk-X5LANJDZ.cjs → chunk-VGCTYTEW.cjs} +14 -6
  24. package/dist/chunk-VGCTYTEW.cjs.map +1 -0
  25. package/dist/{chunk-3A7QWUAW.cjs → chunk-VKH3BEZE.cjs} +3 -3
  26. package/dist/{chunk-3A7QWUAW.cjs.map → chunk-VKH3BEZE.cjs.map} +1 -1
  27. package/dist/{chunk-42TURFHF.cjs → chunk-YGBHY67W.cjs} +5 -5
  28. package/dist/{chunk-42TURFHF.cjs.map → chunk-YGBHY67W.cjs.map} +1 -1
  29. package/dist/connect/docx.cjs +12 -12
  30. package/dist/connect/index.cjs +78 -78
  31. package/dist/connect/viewer.cjs +4 -4
  32. package/dist/connection/docx/ConnectedNativeDocxEditor.js +10 -2
  33. package/dist/connection/docx/ConnectedNativeDocxEditor.js.map +2 -2
  34. package/dist/connection/viewer/ConnectedDocumentViewer.js +124 -21
  35. package/dist/connection/viewer/ConnectedDocumentViewer.js.map +2 -2
  36. package/dist/connection/viewer/VersionDropdown.d.ts +9 -0
  37. package/dist/connection/viewer/VersionDropdown.js +39 -0
  38. package/dist/connection/viewer/VersionDropdown.js.map +7 -0
  39. package/dist/connection/viewer/ViewerPdfPane.js +4 -1
  40. package/dist/connection/viewer/ViewerPdfPane.js.map +2 -2
  41. package/dist/connection/viewer/useViewerBlobs.d.ts +3 -1
  42. package/dist/connection/viewer/useViewerBlobs.js +14 -8
  43. package/dist/connection/viewer/useViewerBlobs.js.map +2 -2
  44. package/dist/connection/viewer/useViewerTabs.js +10 -0
  45. package/dist/connection/viewer/useViewerTabs.js.map +2 -2
  46. package/dist/docx/DocxCommandMenu.d.ts +8 -0
  47. package/dist/docx/DocxCommandMenu.js +202 -0
  48. package/dist/docx/DocxCommandMenu.js.map +7 -0
  49. package/dist/docx/NativeDocxEditor.d.ts +4 -2
  50. package/dist/docx/NativeDocxEditor.js +51 -12
  51. package/dist/docx/NativeDocxEditor.js.map +2 -2
  52. package/dist/docx/RibbonMenu.d.ts +3 -1
  53. package/dist/docx/RibbonMenu.js +10 -3
  54. package/dist/docx/RibbonMenu.js.map +2 -2
  55. package/dist/docx/RibbonOverflow.d.ts +3 -0
  56. package/dist/docx/RibbonOverflow.js +24 -1
  57. package/dist/docx/RibbonOverflow.js.map +2 -2
  58. package/dist/docx/index.cjs +38 -38
  59. package/dist/docx/signatures/SignatureFields.d.ts +3 -1
  60. package/dist/docx/signatures/SignatureFields.js +17 -8
  61. package/dist/docx/signatures/SignatureFields.js.map +2 -2
  62. package/dist/index.cjs +50 -50
  63. package/dist/styles.css +1 -1
  64. package/dist/workflow-canvas/index.cjs +9 -9
  65. package/node_modules/@arbidocs/coedit/package.json +1 -1
  66. package/package.json +5 -5
  67. package/src/docx/styles.css +94 -0
  68. package/dist/chunk-A3T3IC3K.cjs.map +0 -1
  69. package/dist/chunk-CIHERNDO.cjs +0 -18
  70. package/dist/chunk-M6IKVKU5.cjs.map +0 -1
  71. package/dist/chunk-X5LANJDZ.cjs.map +0 -1
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/docx/DocxCommandMenu.tsx"],
4
+ "sourcesContent": ["import React, { useState } from 'react'\nimport { DocxEditor, useChromeTranslate } from '@docx-editor.dev/react'\nimport {\n BookA,\n ChevronDown,\n FilePenLine,\n Home,\n Image,\n LayoutGrid,\n ListChecks,\n Menu,\n Plus,\n Table,\n UsersRound,\n} from 'lucide-react'\nimport { useDefinedTerms } from './definitions/DefinedTerms'\nimport { RibbonMenu } from './RibbonMenu'\nimport { NamedCommandList, RibbonItem } from './RibbonOverflow'\nimport { StyleGallery } from './StyleGallery'\nimport { NoteButtons } from './WordReferences'\nimport { CrossReferenceButton, UpdateCrossReferencesButton } from './references/EditorMenus'\nimport { LayoutTabContent, LAYOUT_TAB, useContextualTabs } from './layout/LayoutTabs'\nimport {\n GenerateImageButton,\n useGenerateImageTarget,\n type DocxImageGeneration,\n} from './layout/GenerateImage'\nimport { QuickParts } from './template/QuickParts'\nimport { HouseTemplatePanel } from './template/HouseTemplatePanel'\nimport { MySignatureMenu, SignatureFieldMenu } from './signatures/SignatureFields'\n\nfunction DefinedTermButton() {\n const terms = useDefinedTerms()\n if (!terms) return null\n return (\n <button\n type=\"button\"\n className=\"native-docx-ribbon-trigger\"\n aria-label={terms.labels.insert}\n title={`${terms.labels.insert} (type @@)`}\n data-testid=\"docx-insert-defined-term\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => terms.openPicker(event.currentTarget)}\n >\n <BookA size={16} />\n </button>\n )\n}\n\nconst categories = [\n { name: 'Home', icon: Home },\n { name: 'Insert', icon: Plus },\n { name: 'Design', icon: FilePenLine },\n { name: LAYOUT_TAB, icon: LayoutGrid },\n { name: 'References', icon: BookA },\n { name: 'Review', icon: ListChecks },\n] as const\n\n/** One editing menu, with named categories and the existing editor commands. */\nexport function DocxCommandMenu({\n onSave,\n badge,\n imageGeneration,\n}: {\n onSave: () => void\n badge?: React.ReactNode\n imageGeneration?: DocxImageGeneration\n}) {\n const [selected, setSelected] = useState('Home')\n const contextual = useContextualTabs(selected)\n const tab = contextual.shown\n const t = useChromeTranslate()\n useGenerateImageTarget()\n const allCategories = [\n ...categories,\n ...contextual.tabs.map((name) => ({ name, icon: name === 'Table' ? Table : Image })),\n ]\n return (\n <div className=\"native-docx-ribbon native-docx-command-menu\">\n <DocxEditor.Toolbar t={t} preset={false} onSave={onSave}>\n <RibbonMenu\n label=\"Editing tools\"\n icon={\n <>\n <Menu size={16} />\n <span>Editing tools</span>\n <ChevronDown size={14} />\n </>\n }\n className=\"native-docx-command-trigger\"\n popoverClassName=\"native-docx-command-panel\"\n keepMounted\n restoreFocus\n >\n {(close) => (\n <div className=\"native-docx-command-layout\">\n <nav className=\"native-docx-command-categories\" aria-label=\"Editing tool categories\">\n {allCategories.map(({ name, icon: Icon }) => (\n <button\n type=\"button\"\n key={name}\n aria-pressed={tab === name}\n onClick={() => setSelected(name)}\n >\n <Icon size={16} aria-hidden=\"true\" />\n <span>{name}</span>\n </button>\n ))}\n </nav>\n <div\n className=\"native-docx-command-list\"\n role=\"group\"\n aria-label={`${tab} commands`}\n onClick={(event) => {\n const target = event.target as HTMLElement\n const button = target.closest<HTMLButtonElement>('button')\n const item = target.closest<HTMLElement>('[data-ribbon-item]')?.dataset.ribbonItem\n const direct = new Set([\n 'home-undo',\n 'home-redo',\n 'home-save',\n 'home-bold',\n 'home-italic',\n 'home-underline',\n 'home-bullets',\n 'home-numbers',\n 'home-indent',\n 'home-outdent',\n 'home-strike',\n 'home-clear',\n 'references-footnote',\n 'references-endnote',\n 'references-update-cross-references',\n 'table-row-above',\n 'table-row-below',\n 'table-column-left',\n 'table-column-right',\n ])\n if (\n (!button || !button.disabled) &&\n target.closest('[aria-disabled=\"true\"]') === null &&\n ((button && item && direct.has(item)) ||\n target.closest('[role=\"gridcell\"]') ||\n target.closest('[role=\"menuitemradio\"]') ||\n target.closest('[data-testid=\"docx-insert-my-signature\"]') ||\n target.closest('[data-testid=\"docx-insert-my-initials\"]') ||\n target.closest('.native-docx-style-gallery [role=\"option\"]') ||\n (button && button.closest('.native-docx-style-gallery')))\n ) {\n close()\n }\n }}\n >\n <NamedCommandList>\n {tab === 'Home' && (\n <>\n <RibbonItem id=\"home-undo\" label=\"Undo\">\n <DocxEditor.Toolbar.Undo />\n </RibbonItem>\n <RibbonItem id=\"home-redo\" label=\"Redo\">\n <DocxEditor.Toolbar.Redo />\n </RibbonItem>\n <RibbonItem id=\"home-save\" label=\"Save\">\n <DocxEditor.Toolbar.Save />\n </RibbonItem>\n <RibbonItem id=\"home-style\" label=\"Styles\">\n <StyleGallery />\n </RibbonItem>\n <RibbonItem id=\"home-bold\" label=\"Bold\">\n <DocxEditor.Toolbar.Bold />\n </RibbonItem>\n <RibbonItem id=\"home-italic\" label=\"Italic\">\n <DocxEditor.Toolbar.Italic />\n </RibbonItem>\n <RibbonItem id=\"home-underline\" label=\"Underline\">\n <DocxEditor.Toolbar.Underline />\n </RibbonItem>\n <RibbonItem id=\"home-font-family\" label=\"Font family\">\n <DocxEditor.Toolbar.FontFamily />\n </RibbonItem>\n <RibbonItem id=\"home-font-size\" label=\"Font size\">\n <DocxEditor.Toolbar.FontSize />\n </RibbonItem>\n <RibbonItem id=\"home-font-color\" label=\"Font color\">\n <DocxEditor.Toolbar.FontColor />\n </RibbonItem>\n <RibbonItem id=\"home-highlight\" label=\"Highlight\">\n <DocxEditor.Toolbar.Highlight />\n </RibbonItem>\n <RibbonItem id=\"home-alignment\" label=\"Alignment\">\n <DocxEditor.Toolbar.Alignment />\n </RibbonItem>\n <RibbonItem id=\"home-bullets\" label=\"Bulleted list\">\n <DocxEditor.Toolbar.BulletList />\n </RibbonItem>\n <RibbonItem id=\"home-numbers\" label=\"Numbered list\">\n <DocxEditor.Toolbar.NumberedList />\n </RibbonItem>\n <RibbonItem id=\"home-line-spacing\" label=\"Line spacing\">\n <DocxEditor.Toolbar.LineSpacing />\n </RibbonItem>\n <RibbonItem id=\"home-indent\" label=\"Increase indent\">\n <DocxEditor.Toolbar.Indent />\n </RibbonItem>\n <RibbonItem id=\"home-outdent\" label=\"Decrease indent\">\n <DocxEditor.Toolbar.Outdent />\n </RibbonItem>\n <RibbonItem id=\"home-strike\" label=\"Strikethrough\">\n <DocxEditor.Toolbar.Strike />\n </RibbonItem>\n <RibbonItem id=\"home-clear\" label=\"Clear formatting\">\n <DocxEditor.Toolbar.ClearFormatting />\n </RibbonItem>\n </>\n )}\n {tab === 'Insert' && (\n <>\n <RibbonItem id=\"insert-table\" label=\"Table\">\n <DocxEditor.Toolbar.TableInsert />\n </RibbonItem>\n <RibbonItem id=\"insert-picture\" label=\"Picture\">\n <DocxEditor.Toolbar.ImageInsert />\n </RibbonItem>\n {imageGeneration && (\n <RibbonItem id=\"insert-generate-image\" label=\"Generate image\">\n <GenerateImageButton generation={imageGeneration} />\n </RibbonItem>\n )}\n <RibbonItem id=\"insert-page-break\" label=\"Page break\">\n <DocxEditor.Toolbar.Button slotId=\"insert.pageBreak\" />\n </RibbonItem>\n <RibbonItem id=\"insert-link\" label=\"Link\">\n <DocxEditor.Toolbar.Link />\n </RibbonItem>\n <RibbonItem id=\"insert-defined-term\" label=\"Defined term\">\n <DefinedTermButton />\n </RibbonItem>\n <RibbonItem id=\"insert-quick-parts\" label=\"Quick Parts\">\n <QuickParts />\n </RibbonItem>\n <RibbonItem id=\"insert-signature-field\" label=\"Signature field\">\n <SignatureFieldMenu onInserted={close} />\n </RibbonItem>\n <RibbonItem id=\"insert-my-signature\" label=\"My signature\">\n <MySignatureMenu />\n </RibbonItem>\n <RibbonItem id=\"insert-cross-reference\" label=\"Cross-reference\">\n <CrossReferenceButton />\n </RibbonItem>\n </>\n )}\n <LayoutTabContent tab={tab} />\n {tab === 'Design' && (\n <RibbonItem id=\"design-house-template\" label=\"House template\">\n <HouseTemplatePanel />\n </RibbonItem>\n )}\n {tab === 'References' && (\n <>\n <NoteButtons />\n <RibbonItem id=\"references-cross-reference\" label=\"Cross-reference\">\n <CrossReferenceButton />\n </RibbonItem>\n <RibbonItem\n id=\"references-update-cross-references\"\n label=\"Update cross-references\"\n >\n <UpdateCrossReferencesButton />\n </RibbonItem>\n </>\n )}\n {tab === 'Review' && (\n <>\n <RibbonItem id=\"review-editing-mode\" label=\"Editing mode\">\n <DocxEditor.Toolbar.EditingMode />\n </RibbonItem>\n <RibbonItem id=\"review-comments\" label=\"Comments\">\n <DocxEditor.Toolbar.Comments />\n </RibbonItem>\n <RibbonItem id=\"review-options\" label=\"Review options\">\n <RibbonMenu label=\"Review options\" icon={<UsersRound size={16} />}>\n <DocxEditor.Toolbar.Reviewers />\n </RibbonMenu>\n </RibbonItem>\n </>\n )}\n </NamedCommandList>\n </div>\n </div>\n )}\n </RibbonMenu>\n <DocxEditor.Toolbar.TableCellFill hidden />\n </DocxEditor.Toolbar>\n {badge && (\n <span className=\"native-docx-ribbon-badge\" data-testid=\"docx-ribbon-badge\">\n {badge}\n </span>\n )}\n </div>\n )\n}\n"],
5
+ "mappings": "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",
6
+ "names": []
7
+ }
@@ -35,7 +35,7 @@ export interface NativeDocxAdapter {
35
35
  author?: string;
36
36
  subscribeTokenChanges?: (listener: () => void) => () => void;
37
37
  onDirtyChange?: (dirty: boolean) => void;
38
- onVersionSaved?: (documentId: string) => void | Promise<void>;
38
+ onVersionSaved?: (documentId: string, version?: number) => void | Promise<void>;
39
39
  notify?: (message: string, kind: 'success' | 'error') => void;
40
40
  mentions?: readonly DocxMention[];
41
41
  requestAgent?: (documentId: string, request: DocxAgentCommentRequest) => Promise<DocxMentionDelivery | void>;
@@ -89,6 +89,8 @@ export interface NativeDocxEditorProps {
89
89
  compact?: boolean;
90
90
  /** Receives a reader of the live room's state, so the host's save can include the latest keystrokes. */
91
91
  stateRef?: React.MutableRefObject<(() => string | undefined) | null>;
92
+ /** Save the current live room before leaving the editor; false means the caller must stay. */
93
+ saveRef?: React.MutableRefObject<(() => Promise<boolean | number>) | null>;
92
94
  }
93
95
  export declare function DocxParticipants({ session }: {
94
96
  session?: DocxCollaborationSession;
@@ -100,4 +102,4 @@ export declare function DocxRibbon({ onSave, badge, imageGeneration, }: {
100
102
  /** A short state label at the end of the row, such as "Co-editing". */
101
103
  badge?: React.ReactNode;
102
104
  }): React.JSX.Element;
103
- export declare function NativeDocxEditor({ documentId, title, draftContent, initialCommentId, snapshot, onSaved, stream, adapter, compact, stateRef, }: NativeDocxEditorProps): React.JSX.Element;
105
+ export declare function NativeDocxEditor({ documentId, title, draftContent, initialCommentId, snapshot, onSaved, stream, adapter, compact, stateRef, saveRef, }: NativeDocxEditorProps): React.JSX.Element;
@@ -33,6 +33,7 @@ import {
33
33
  } from "lucide-react";
34
34
  import { DefinedTermsProvider, useDefinedTerms } from "./definitions/DefinedTerms.js";
35
35
  import { RibbonMenu } from "./RibbonMenu.js";
36
+ import { DocxCommandMenu } from "./DocxCommandMenu.js";
36
37
  import { RibbonItem, RibbonOverflow } from "./RibbonOverflow.js";
37
38
  import { StyleGallery } from "./StyleGallery.js";
38
39
  import { NoteButtons, WordShortcuts } from "./WordReferences.js";
@@ -100,12 +101,21 @@ class EditorBoundary extends React.Component {
100
101
  ] }) : this.props.children;
101
102
  }
102
103
  }
103
- function RoomInputBinding({ session }) {
104
+ function RoomInputBinding({
105
+ session,
106
+ flushRef
107
+ }) {
104
108
  const editor = useDocxEditor();
105
109
  useEffect(() => {
106
- if (!editor || !session) return;
107
- return session.bindEditorInput(() => editor.surface?.flushPendingInput());
108
- }, [editor, session]);
110
+ if (!editor) return;
111
+ const flush = () => editor.surface?.flushPendingInput();
112
+ flushRef.current = flush;
113
+ const unbind = session?.bindEditorInput(flush);
114
+ return () => {
115
+ if (flushRef.current === flush) flushRef.current = null;
116
+ unbind?.();
117
+ };
118
+ }, [editor, session, flushRef]);
109
119
  return null;
110
120
  }
111
121
  function DocxParticipants({ session }) {
@@ -252,11 +262,14 @@ function NativeDocxEditor({
252
262
  stream,
253
263
  adapter,
254
264
  compact = false,
255
- stateRef
265
+ stateRef,
266
+ saveRef
256
267
  }) {
257
268
  const [ready, setReady] = useState(), [error, setError] = useState(""), [retry, setRetry] = useState(0);
258
269
  const [status, setStatus] = useState("Connecting\u2026"), [dirty, setDirty] = useState(false), [saving, setSaving] = useState(false), [offline, setOffline] = useState(false);
259
270
  const revision = useRef(0);
271
+ const savingRef = useRef(false);
272
+ const flushInputRef = useRef(null);
260
273
  const stageRef = useRef(null), fitCleanup = useRef(void 0), refit = useRef(void 0);
261
274
  const fitting = useRef(true), fitted = useRef(void 0);
262
275
  const [fitWidth, setFitWidth] = useState(true), [zoomPercent, setZoomPercent] = useState(100);
@@ -480,11 +493,16 @@ function NativeDocxEditor({
480
493
  };
481
494
  }, [documentId, isDraft, ready]);
482
495
  async function saveVersion() {
483
- if (!ready || saving || stream) return;
496
+ if (!ready || savingRef.current || stream) return false;
497
+ if (snapshot || !ready.canEdit) return true;
498
+ if (offline) return false;
499
+ savingRef.current = true;
484
500
  setSaving(true);
485
- runBeforeSave(ref.current);
486
- const atRevision = revision.current;
487
501
  try {
502
+ if (!flushInputRef.current) throw new Error("The editor is not ready to save yet.");
503
+ flushInputRef.current();
504
+ runBeforeSave(ref.current);
505
+ const atRevision = revision.current;
488
506
  const result = isDraft ? await (async () => {
489
507
  const bytes = await ref.current?.save();
490
508
  if (!bytes) throw new Error("The editor is not ready.");
@@ -501,17 +519,32 @@ function NativeDocxEditor({
501
519
  setDirty(false);
502
520
  drafts.delete(documentId);
503
521
  }
504
- await Promise.resolve(adapter.onVersionSaved?.(result.document_ext_id)).catch(() => {
505
- });
522
+ const savedVersion = "version" in result && typeof result.version === "number" ? result.version : void 0;
523
+ if (!isDraft && !savedVersion) throw new Error("Could not confirm the saved version.");
524
+ await adapter.onVersionSaved?.(result.document_ext_id, savedVersion);
506
525
  onSaved?.(result.document_ext_id);
526
+ if (revision.current !== atRevision) {
527
+ adapter.notify?.("The document changed while saving. Please try again.", "error");
528
+ return false;
529
+ }
507
530
  adapter.notify?.(isDraft ? "Word note saved" : "DOCX version saved", "success");
531
+ return savedVersion ?? true;
508
532
  } catch (e) {
509
533
  adapter.notify?.(e instanceof Error ? e.message : "Could not save this document.", "error");
510
534
  setStatus("Save failed \xB7 your draft is retained");
535
+ return false;
511
536
  } finally {
537
+ savingRef.current = false;
512
538
  setSaving(false);
513
539
  }
514
540
  }
541
+ useEffect(() => {
542
+ if (!saveRef) return;
543
+ saveRef.current = saveVersion;
544
+ return () => {
545
+ saveRef.current = null;
546
+ };
547
+ });
515
548
  function editorReady(editor) {
516
549
  ref.current = editor;
517
550
  if (streamRef.current) {
@@ -672,7 +705,7 @@ function NativeDocxEditor({
672
705
  ),
673
706
  compact && !stream && /* @__PURE__ */ jsx(CompactToolbar, {}),
674
707
  !compact && !stream && /* @__PURE__ */ jsx(
675
- DocxRibbon,
708
+ DocxCommandMenu,
676
709
  {
677
710
  onSave: () => void saveVersion(),
678
711
  imageGeneration: adapter.imageGeneration && {
@@ -713,7 +746,13 @@ function NativeDocxEditor({
713
746
  getAgentStatus: adapter.getAgentStatus,
714
747
  requestAgent: adapter.requestAgent ? (request) => adapter.requestAgent(documentId, request) : void 0,
715
748
  children: [
716
- /* @__PURE__ */ jsx(RoomInputBinding, { session: ready.room?.session }),
749
+ /* @__PURE__ */ jsx(
750
+ RoomInputBinding,
751
+ {
752
+ session: ready.room?.session,
753
+ flushRef: flushInputRef
754
+ }
755
+ ),
717
756
  /* @__PURE__ */ jsx(AgentUndoRoom.Provider, { value: ready.room?.ydoc ?? null, children: /* @__PURE__ */ jsx(DocxEditorReview, { children: () => /* @__PURE__ */ jsxs(DocxEditorReview.Card, { children: [
718
757
  /* @__PURE__ */ jsx(DocxCommentActivity, {}),
719
758
  /* @__PURE__ */ jsx(AgentUndo, {})
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/docx/NativeDocxEditor.tsx"],
4
- "sourcesContent": ["import { normalizeDocxExport } from './export'\nimport { WordDraftStream } from './streamWordDocument'\nimport {\n DocxMentions,\n DocxCommentActivity,\n type DocxMention,\n type DocxAgentCommentRequest,\n type DocxMentionDelivery,\n type DocxAgentRunStatus,\n} from './DocxMentions'\nimport * as Y from 'yjs'\nimport type { DocumentHandle } from '@docx-editor.dev/core'\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport {\n DocxEditor,\n useChromeTranslate,\n useDocxEditor,\n type FontConfiguration,\n} from '@docx-editor.dev/react'\nimport { collaborationModule, DOCUMENT_COLLABORATION_VERSIONS } from '@arbidocs/coedit'\nimport { awaitMatchingEditor } from './coedit-update'\nimport type { DocxCollaborationSession } from '@arbidocs/coedit'\nimport {\n createHocuspocusCollaboration,\n type HocuspocusCollaborationRoom,\n} from '@arbidocs/coedit/hocuspocus'\nimport { DocxEditorReview, reviewModule } from './review'\nimport { AgentUndo, AgentUndoRoom } from './AgentUndo'\nimport type { EditorModule } from '@docx-editor.dev/core'\nimport type { Editor } from '@docx-editor.dev/core'\nimport {\n Download,\n Save,\n RefreshCw,\n WifiOff,\n Check,\n Type,\n Pilcrow,\n UsersRound,\n BookA,\n} from 'lucide-react'\nimport { DefinedTermsProvider, useDefinedTerms } from './definitions/DefinedTerms'\nimport { RibbonMenu } from './RibbonMenu'\nimport { RibbonItem, RibbonOverflow } from './RibbonOverflow'\nimport { StyleGallery } from './StyleGallery'\nimport { NoteButtons, WordShortcuts } from './WordReferences'\nimport type { DefinitionSource } from '../tags/definitions'\nimport { CrossReferencesProvider, type DocxReferencesAdapter } from './references/CrossReferences'\nimport {\n CrossReferenceButton,\n DocxContextMenuExtras,\n UpdateCrossReferencesButton,\n} from './references/EditorMenus'\nimport { runBeforeSave } from './beforeSave'\nimport { LayoutTabContent, LAYOUT_TAB, useContextualTabs } from './layout/LayoutTabs'\nimport {\n GenerateImageButton,\n useGenerateImageTarget,\n type DocxImageGeneration,\n} from './layout/GenerateImage'\nimport { TableTabKeys } from './layout/TableKeys'\nimport { newFromTemplate } from '@arbidocs/coedit/template'\nimport {\n HouseTemplateProvider,\n resolveHouseTemplate,\n templateFileName,\n type HouseTemplateHost,\n} from './template/HouseTemplate'\nimport { QuickParts } from './template/QuickParts'\nimport {\n MySignatureContextItems,\n SignatureFieldContextItem,\n MySignatureMenu,\n SignatureFieldMenu,\n SignatureFieldsProvider,\n type DocxSavedSignature,\n type DocxSigner,\n} from './signatures/SignatureFields'\nimport { HouseTemplatePanel } from './template/HouseTemplatePanel'\nimport { DocxAuthorContext } from './structural/useTrackedOrNoted'\n\nimport { contentPath } from './content-path'\n\nexport { contentPath }\n\n/** Host integration: no application store, router, or authentication singleton is required. */\nexport interface NativeDocxAdapter {\n request: (path: string, options?: RequestInit) => Promise<Response>\n open: (documentId: string) => Promise<{\n room_id: string\n token: string\n websocket_path: string\n can_edit: boolean\n identity: { actorId: string; name: string; role: 'human' | 'agent' }\n filename: string\n }>\n /** Save the live room as the document's next version (same document id). */\n save: (\n documentId: string,\n state?: string\n ) => Promise<{ document_ext_id: string; version?: number; unchanged?: boolean }>\n loadFonts: () => Promise<FontConfiguration>\n baseUrl?: string\n author?: string\n subscribeTokenChanges?: (listener: () => void) => () => void\n onDirtyChange?: (dirty: boolean) => void\n onVersionSaved?: (documentId: string) => void | Promise<void>\n notify?: (message: string, kind: 'success' | 'error') => void\n mentions?: readonly DocxMention[]\n requestAgent?: (\n documentId: string,\n request: DocxAgentCommentRequest\n ) => Promise<DocxMentionDelivery | void>\n getAgentStatus?: (responseId: string) => Promise<DocxAgentRunStatus>\n /**\n * The workspace's definitions: facts labelled \"Definitions\". Present: the Insert tab offers\n * Defined term, and typing `@@` in the body opens the term type-ahead.\n */\n definitions?: () => Promise<DefinitionSource[]>\n /**\n * References to the workspace's other documents. Present: Insert cross-reference also offers a\n * passage of another document, inserted as a link that opens it there.\n */\n references?: DocxReferencesAdapter\n /** The platform's image generation. Present: the Insert tab offers Generate image. */\n imageGeneration?: DocxImageGeneration\n /**\n * The workspace's house template. Present: a blank note starts from it (its styles, numbering,\n * page setup, headers and footers), Insert offers its Quick Parts, and the Design tab and the\n * style box show where the document's styles differ from it.\n */\n houseTemplate?: HouseTemplateHost\n /** Workspace members who may sign. Present: Insert offers Signature field (or anyone by email). */\n signatureSigners?: readonly DocxSigner[]\n /** One's saved signature. Present: Insert offers My signature (an informal one, as a picture). */\n savedSignature?: DocxSavedSignature\n}\n\nexport interface NativeDocxEditorProps {\n adapter: NativeDocxAdapter\n documentId: string\n title: string\n draftContent?: string\n initialCommentId?: string\n /** Immutable history/compare snapshots must not join the live editing room. */\n snapshot?: boolean\n onSaved?: (id: string) => void\n /**\n * Read-only preview of generated Markdown. The server stores the DOCX itself; when the\n * stream ends the caller swaps this preview for the stored document.\n */\n stream?: {\n content: string\n busy: boolean\n error?: string | null\n }\n /**\n * Embedded as a body field (an email draft): a small formatting toolbar instead of the ribbon, no\n * page furniture or save bar (the host saves), and the person types directly; others' edits (ARBI's)\n * still arrive as tracked changes to accept or reject.\n */\n compact?: boolean\n /** Receives a reader of the live room's state, so the host's save can include the latest keystrokes. */\n stateRef?: React.MutableRefObject<(() => string | undefined) | null>\n}\ninterface Ready {\n document: DocumentHandle | Uint8Array\n modules: readonly EditorModule[]\n fonts: FontConfiguration\n room?: HocuspocusCollaborationRoom\n canEdit: boolean\n author: string\n filename: string\n}\n// Local unsaved notes survive tab switches. Persisted artifacts use server state.\nconst drafts = new Map<string, ArrayBuffer>()\nconst stateBytes = (room: HocuspocusCollaborationRoom) => Y.encodeStateAsUpdate(room.ydoc)\nconst encodeState = (room: HocuspocusCollaborationRoom) => {\n let binary = ''\n for (const byte of stateBytes(room)) binary += String.fromCharCode(byte)\n return btoa(binary)\n}\nfunction covered(room: HocuspocusCollaborationRoom, vector: string, receipt: string) {\n const decode = (value: string) => Uint8Array.from(atob(value), (c) => c.charCodeAt(0))\n const server = Y.decodeStateVector(decode(vector)),\n local = Y.decodeStateVector(Y.encodeStateVector(room.ydoc))\n for (const [client, clock] of local) if ((server.get(client) || 0) < clock) return false\n const deleted = Y.decodeUpdate(stateBytes(room)).ds.clients\n const saved = Y.decodeUpdate(decode(receipt)).ds.clients\n for (const [client, ranges] of deleted)\n for (const range of ranges) {\n if (\n !(saved.get(client) || []).some(\n (s) => s.clock <= range.clock && s.clock + s.len >= range.clock + range.len\n )\n )\n return false\n }\n return true\n}\nclass EditorBoundary extends React.Component<{ children: React.ReactNode }, { error?: Error }> {\n state: { error?: Error } = {}\n static getDerivedStateFromError(error: Error) {\n return { error }\n }\n render() {\n return this.state.error ? (\n <div role=\"alert\" className=\"native-docx-error\">\n Could not render this Word document: {this.state.error.message}\n </div>\n ) : (\n this.props.children\n )\n }\n}\n/**\n * The room writes below the editor's input buffer, so it gets the editor's pending-input flush: it\n * lands queued typing before a peer's change and lays that change out at once, which is when the\n * editor carries its caret (otherwise a fast keystroke lands where the caret was before the change).\n */\nfunction RoomInputBinding({ session }: { session?: DocxCollaborationSession }) {\n const editor = useDocxEditor()\n useEffect(() => {\n if (!editor || !session) return\n return session.bindEditorInput(() => editor.surface?.flushPendingInput())\n }, [editor, session])\n return null\n}\n\nexport function DocxParticipants({ session }: { session?: DocxCollaborationSession }) {\n const [people, setPeople] = useState<readonly { actorId: string; name: string }[]>([])\n useEffect(() => {\n if (!session) return\n setPeople(session.participants())\n return session.subscribeParticipants(setPeople)\n }, [session])\n return (\n <div className=\"native-docx-presence\" aria-label=\"People viewing this document\">\n {people.map((p) => (\n <span className=\"native-docx-avatar\" key={p.actorId} title={p.name}>\n {p.name\n .split(' ')\n .map((s) => s[0])\n .slice(0, 2)\n .join('')}\n </span>\n ))}\n </div>\n )\n}\n\n/** Insert tab: a defined term at the caret (when definitions are offered). */\nfunction DefinedTermButtons() {\n const terms = useDefinedTerms()\n if (!terms) return null\n return (\n <button\n type=\"button\"\n className=\"native-docx-ribbon-trigger\"\n aria-label={terms.labels.insert}\n title={`${terms.labels.insert} (type @@)`}\n data-testid=\"docx-insert-defined-term\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => terms.openPicker(event.currentTarget)}\n >\n <BookA size={16} />\n </button>\n )\n}\n\nconst DOCUMENT_STATES = {\n 'co-editing': {\n label: 'Co-editing',\n title: 'Edits sync live with everyone who has this document open',\n },\n 'read-only': {\n label: 'Read-only',\n title: 'This copy cannot be edited: an earlier version, or the last saved copy',\n },\n draft: { label: 'Private draft', title: 'Only you can see this until you save it' },\n} as const\n\n/** Which document is on screen: shared live, read-only, or a draft only its author sees. */\nfunction DocumentStateBadge({ state }: { state?: keyof typeof DOCUMENT_STATES }) {\n if (!state) return null\n const { label, title } = DOCUMENT_STATES[state]\n return (\n <span data-state={state} title={title}>\n {label}\n </span>\n )\n}\n\nexport function DocxRibbon({\n onSave,\n badge,\n imageGeneration,\n}: {\n onSave: () => void\n /** Insert \u203A Generate image, when the host can generate images. */\n imageGeneration?: DocxImageGeneration\n /** A short state label at the end of the row, such as \"Co-editing\". */\n badge?: React.ReactNode\n}) {\n const [selected, setTab] = useState('Home')\n const contextual = useContextualTabs(selected)\n useGenerateImageTarget()\n const tab = contextual.shown\n const t = useChromeTranslate()\n return (\n <div className=\"native-docx-ribbon\">\n <select aria-label=\"Ribbon tab\" value={tab} onChange={(event) => setTab(event.target.value)}>\n <option>Home</option>\n <option>Insert</option>\n <option>Design</option>\n <option>{LAYOUT_TAB}</option>\n <option>References</option>\n <option>Review</option>\n {contextual.tabs.map((name) => (\n <option key={name}>{name}</option>\n ))}\n </select>\n <DocxEditor.Toolbar t={t} preset={false} onSave={onSave}>\n <DocxEditor.Toolbar.Undo />\n <DocxEditor.Toolbar.Redo />\n <DocxEditor.Toolbar.Save />\n {/* Undo, Redo and Save stay put, like Word's Quick Access Toolbar; the tab's own\n controls collapse into its More menu when the ribbon is too narrow for them. */}\n <RibbonOverflow tab={tab}>\n {tab === 'Home' && (\n <>\n <RibbonItem id=\"home-style\" label=\"Styles\" priority={80}>\n <StyleGallery />\n </RibbonItem>\n <RibbonItem id=\"home-bold\" label=\"Bold\" priority={100}>\n <DocxEditor.Toolbar.Bold />\n </RibbonItem>\n <RibbonItem id=\"home-italic\" label=\"Italic\" priority={95}>\n <DocxEditor.Toolbar.Italic />\n </RibbonItem>\n <RibbonItem id=\"home-underline\" label=\"Underline\" priority={90}>\n <DocxEditor.Toolbar.Underline />\n </RibbonItem>\n <RibbonItem id=\"home-font\" label=\"Font\" priority={60}>\n <RibbonMenu label=\"Font\" icon={<Type size={16} />}>\n <DocxEditor.Toolbar.FontFamily />\n <DocxEditor.Toolbar.FontSize />\n <DocxEditor.Toolbar.FontColor />\n <DocxEditor.Toolbar.Highlight />\n </RibbonMenu>\n </RibbonItem>\n <RibbonItem id=\"home-more-formatting\" label=\"More formatting\" priority={50}>\n <RibbonMenu label=\"More formatting\" icon={<Pilcrow size={16} />}>\n <DocxEditor.Toolbar.Alignment />\n <DocxEditor.Toolbar.BulletList />\n <DocxEditor.Toolbar.NumberedList />\n <DocxEditor.Toolbar.LineSpacing />\n <DocxEditor.Toolbar.Indent />\n <DocxEditor.Toolbar.Outdent />\n <DocxEditor.Toolbar.Strike />\n <DocxEditor.Toolbar.ClearFormatting />\n </RibbonMenu>\n </RibbonItem>\n </>\n )}\n {tab === 'Insert' && (\n <>\n <RibbonItem id=\"insert-table\" label=\"Table\">\n <DocxEditor.Toolbar.TableInsert />\n </RibbonItem>\n <RibbonItem id=\"insert-picture\" label=\"Picture\">\n <DocxEditor.Toolbar.ImageInsert />\n </RibbonItem>\n {imageGeneration && (\n <RibbonItem id=\"insert-generate-image\" label=\"Generate image\">\n <GenerateImageButton generation={imageGeneration} />\n </RibbonItem>\n )}\n <RibbonItem id=\"insert-page-break\" label=\"Page break\">\n <DocxEditor.Toolbar.Button slotId=\"insert.pageBreak\" />\n </RibbonItem>\n <RibbonItem id=\"insert-link\" label=\"Link\">\n <DocxEditor.Toolbar.Link />\n </RibbonItem>\n <RibbonItem id=\"insert-defined-term\" label=\"Defined term\">\n <DefinedTermButtons />\n </RibbonItem>\n <RibbonItem id=\"insert-quick-parts\" label=\"Quick Parts\">\n <QuickParts />\n </RibbonItem>\n <RibbonItem id=\"insert-signature-field\" label=\"Signature field\">\n <SignatureFieldMenu />\n </RibbonItem>\n <RibbonItem id=\"insert-my-signature\" label=\"My signature\">\n <MySignatureMenu />\n </RibbonItem>\n <RibbonItem id=\"insert-cross-reference\" label=\"Cross-reference\">\n <CrossReferenceButton />\n </RibbonItem>\n </>\n )}\n <LayoutTabContent tab={tab} />\n {tab === 'Design' && (\n <RibbonItem id=\"design-house-template\" label=\"House template\">\n <HouseTemplatePanel />\n </RibbonItem>\n )}\n {tab === 'References' && (\n <>\n <NoteButtons />\n <RibbonItem id=\"references-cross-reference\" label=\"Cross-reference\">\n <CrossReferenceButton />\n </RibbonItem>\n <RibbonItem id=\"references-update-cross-references\" label=\"Update cross-references\">\n <UpdateCrossReferencesButton />\n </RibbonItem>\n </>\n )}\n {tab === 'Review' && (\n <>\n <RibbonItem id=\"review-editing-mode\" label=\"Editing mode\" priority={10}>\n <DocxEditor.Toolbar.EditingMode />\n </RibbonItem>\n <RibbonItem id=\"review-comments\" label=\"Comments\">\n <DocxEditor.Toolbar.Comments />\n </RibbonItem>\n <RibbonItem id=\"review-options\" label=\"Review options\">\n <RibbonMenu label=\"Review options\" icon={<UsersRound size={16} />}>\n <DocxEditor.Toolbar.Reviewers />\n </RibbonMenu>\n </RibbonItem>\n </>\n )}\n </RibbonOverflow>\n {/* The toolbar provides its table chrome context only to a direct table-chrome child: this\n hidden one keeps it mounted for the Table tab's borders and shading. */}\n <DocxEditor.Toolbar.TableCellFill hidden />\n </DocxEditor.Toolbar>\n {badge && (\n <span className=\"native-docx-ribbon-badge\" data-testid=\"docx-ribbon-badge\">\n {badge}\n </span>\n )}\n </div>\n )\n}\n\n/** The compact editor's formatting: what an email needs. */\nfunction CompactToolbar() {\n const t = useChromeTranslate()\n return (\n <DocxEditor.Toolbar t={t} preset={false}>\n <DocxEditor.Toolbar.Undo />\n <DocxEditor.Toolbar.Redo />\n <DocxEditor.Toolbar.Bold />\n <DocxEditor.Toolbar.Italic />\n <DocxEditor.Toolbar.Underline />\n <DocxEditor.Toolbar.BulletList />\n <DocxEditor.Toolbar.NumberedList />\n <DocxEditor.Toolbar.Link />\n </DocxEditor.Toolbar>\n )\n}\n\nconst fixedZoomMode = { type: 'fixed' } as const\n/** The zoom menu's levels, in percent, beside Fit width. */\nconst ZOOM_LEVELS = [50, 75, 100, 125, 150, 200]\n\nexport function NativeDocxEditor({\n documentId,\n title,\n draftContent,\n initialCommentId,\n snapshot = false,\n onSaved,\n stream,\n adapter,\n compact = false,\n stateRef,\n}: NativeDocxEditorProps) {\n const [ready, setReady] = useState<Ready>(),\n [error, setError] = useState(''),\n [retry, setRetry] = useState(0)\n const [status, setStatus] = useState('Connecting\u2026'),\n [dirty, setDirty] = useState(false),\n [saving, setSaving] = useState(false),\n [offline, setOffline] = useState(false)\n const revision = useRef(0)\n const stageRef = useRef<HTMLDivElement>(null),\n fitCleanup = useRef<(() => void) | undefined>(undefined),\n refit = useRef<(() => void) | undefined>(undefined)\n // Fit width until the reader picks a zoom (the zoom menu, or Ctrl +/-/0), then keep theirs until\n // they pick Fit width again. `fitted` is the zoom the fit last applied: any other zoom is theirs.\n const fitting = useRef(true),\n fitted = useRef<number | undefined>(undefined)\n const [fitWidth, setFitWidth] = useState(true),\n [zoomPercent, setZoomPercent] = useState(100)\n const ref = useRef<Editor | null>(null),\n dirtyRef = useRef(false),\n draftTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const isDraft = draftContent !== undefined\n const streamRef = useRef(stream)\n streamRef.current = stream\n const streamWriter = useRef<WordDraftStream | null>(null)\n const streamFinished = useRef(false)\n const streamTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const [streamAttempt, setStreamAttempt] = useState(0)\n function updateStream() {\n const current = streamRef.current\n if (!current || !streamWriter.current || streamFinished.current) return\n try {\n streamWriter.current.update(current.content, !current.busy)\n setStatus(\n current.busy\n ? 'Generating \u00B7 editing is locked'\n : current.error\n ? 'Generation stopped \u00B7 draft retained'\n : 'Opening the saved document\u2026'\n )\n if (!current.busy && !current.error) streamFinished.current = true\n } catch (failure) {\n setError(\n failure instanceof Error ? failure.message : 'Could not import the generated document.'\n )\n }\n }\n useEffect(() => {\n if (!streamRef.current) return\n if (!streamRef.current.busy) {\n clearTimeout(streamTimer.current)\n streamTimer.current = undefined\n updateStream()\n } else if (!streamTimer.current) {\n streamTimer.current = setTimeout(() => {\n streamTimer.current = undefined\n updateStream()\n }, 120)\n }\n }, [stream?.content, stream?.busy, stream?.error, streamAttempt])\n useEffect(() => () => clearTimeout(streamTimer.current), [])\n useEffect(() => {\n let cancelled = false\n let room: HocuspocusCollaborationRoom | undefined\n const cleanups: (() => void)[] = []\n setReady(undefined)\n setError('')\n setStatus('Connecting\u2026')\n setDirty(false)\n dirtyRef.current = false\n // A refusal for another room format: \"Updating\u2026\" while the matching editor or server arrives.\n const updating = (reason: string | undefined): boolean => {\n const cancel = awaitMatchingEditor(reason, () => setRetry((x) => x + 1))\n if (!cancel) return false\n cleanups.push(cancel)\n setError('')\n setStatus('Updating\u2026')\n return true\n }\n async function start() {\n const fonts = await adapter.loadFonts()\n if (isDraft || snapshot) {\n const data = isDraft\n ? (!streamRef.current && drafts.get(documentId)) ||\n (draftContent === '' && adapter.houseTemplate\n ? await (async () => {\n // A blank note starts from the house template, as File \u203A New from it does.\n const template = await resolveHouseTemplate(adapter.houseTemplate)\n return newFromTemplate(template.bytes, {\n attachedTemplate: templateFileName(template),\n })\n })()\n : await (\n await adapter.request('/prepare', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ content: draftContent }),\n })\n ).arrayBuffer())\n : await (await adapter.request(contentPath(documentId))).arrayBuffer()\n if (!cancelled) {\n setReady({\n document: new Uint8Array(data),\n fonts,\n modules: [reviewModule()],\n canEdit: !snapshot,\n author: adapter.author || 'You',\n filename: title,\n })\n setStatus(snapshot ? 'Saved version \u00B7 read only' : 'Unsaved note')\n }\n return\n }\n const session = await adapter.open(documentId)\n const ws = new URL(session.websocket_path, adapter.baseUrl || location.origin)\n ws.protocol = ws.protocol === 'https:' ? 'wss:' : 'ws:'\n let initial = true\n room = await createHocuspocusCollaboration({\n url: ws.toString(),\n roomId: session.room_id,\n identity: session.identity,\n offlineEditing: true,\n token: async () => {\n const next = initial ? session : await adapter.open(documentId)\n initial = false\n if (!cancelled)\n setReady((previous) => (previous ? { ...previous, canEdit: next.can_edit } : previous))\n return JSON.stringify({\n capability: next.token,\n versions: DOCUMENT_COLLABORATION_VERSIONS,\n })\n },\n })\n if (cancelled) {\n room.destroy()\n return\n }\n const current = room\n cleanups.push(\n current.session.subscribeStatus((s, _reason, detail) => {\n const disconnected = s === 'disconnected'\n setOffline(disconnected)\n if (s === 'error') {\n if (updating(detail)) return\n setError(\n detail ||\n 'The collaboration session failed. Export your local document before reconnecting.'\n )\n setStatus('Connection failed')\n } else if (disconnected) setStatus('Offline \u00B7 edits buffered locally')\n else if (s === 'ready') {\n setError('')\n setStatus(dirtyRef.current ? 'Saving changes\u2026' : 'Connected')\n }\n })\n )\n const stateless = ({ payload }: { payload: string }) => {\n try {\n const message = JSON.parse(payload) as {\n type: string\n message?: string\n hash?: string\n vector?: string\n receipt?: string\n }\n if (message.type === 'persisted') {\n if (\n !cancelled &&\n message.vector &&\n message.receipt &&\n covered(current, message.vector, message.receipt)\n ) {\n dirtyRef.current = false\n setDirty(false)\n setStatus('All changes saved')\n }\n }\n if (message.type === 'pending') setStatus('Saving changes\u2026')\n if (message.type === 'save-error') setStatus(message.message || 'Autosave failed')\n } catch {\n /* Ignore unrelated provider messages. */\n }\n }\n current.provider.on('stateless', stateless)\n cleanups.push(() => current.provider.off('stateless', stateless))\n if (adapter.subscribeTokenChanges)\n cleanups.push(\n adapter.subscribeTokenChanges(() => {\n void current.provider\n .sendToken()\n .catch(() => setStatus('Could not renew the collaboration session'))\n })\n )\n const refresh = setInterval(\n () => {\n void current.provider\n .sendToken()\n .catch(() => setStatus('Could not renew the collaboration session'))\n },\n 5 * 60 * 1000\n )\n cleanups.push(() => clearInterval(refresh))\n setReady({\n document: current.document,\n fonts,\n modules: [reviewModule(), collaborationModule({ session: current.session })],\n room: current,\n canEdit: session.can_edit,\n author: session.identity.name,\n filename: session.filename,\n })\n setStatus(session.can_edit ? 'All changes saved' : 'Read only \u00B7 live')\n }\n void start().catch((e) => {\n const message = e instanceof Error ? e.message : String(e)\n if (!cancelled && !updating(message)) setError(message)\n })\n return () => {\n cancelled = true\n cleanups.forEach((f) => f())\n clearTimeout(draftTimer.current)\n fitCleanup.current?.()\n room?.destroy()\n }\n }, [documentId, isDraft, snapshot, retry]) // draftContent seeds once, never remount on typing.\n useEffect(() => {\n if (!stateRef) return\n const room = ready?.room\n stateRef.current = () => (room ? encodeState(room) : undefined)\n return () => {\n stateRef.current = null\n }\n }, [stateRef, ready?.room])\n useEffect(() => {\n adapter.onDirtyChange?.(dirty)\n const beforeUnload = (e: BeforeUnloadEvent) => {\n if (dirtyRef.current) e.preventDefault()\n }\n window.addEventListener('beforeunload', beforeUnload)\n return () => {\n window.removeEventListener('beforeunload', beforeUnload)\n adapter.onDirtyChange?.(false)\n }\n }, [dirty])\n async function exportDocument() {\n runBeforeSave(ref.current)\n const data = await ref.current?.save()\n if (!data) return\n const url = URL.createObjectURL(\n new Blob([normalizeDocxExport(data)], {\n type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n })\n )\n const a = document.createElement('a')\n a.href = url\n a.download = title.replace(/\\.[^.]+$/, '') + '.docx'\n a.click()\n setTimeout(() => URL.revokeObjectURL(url), 5000)\n }\n useLayoutEffect(() => {\n const editor = ref.current\n return () => {\n if (isDraft && editor && dirtyRef.current)\n void editor\n .save()\n .then((bytes) => {\n if (bytes) drafts.set(documentId, bytes)\n })\n .catch(() => {})\n }\n }, [documentId, isDraft, ready])\n async function saveVersion() {\n if (!ready || saving || stream) return\n setSaving(true)\n runBeforeSave(ref.current)\n const atRevision = revision.current\n try {\n const result = isDraft\n ? await (async () => {\n const bytes = await ref.current?.save()\n if (!bytes) throw new Error('The editor is not ready.')\n return (\n await adapter.request(`/notes?${new URLSearchParams({ title })}`, {\n method: 'POST',\n headers: {\n 'Content-Type':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n },\n body: bytes,\n })\n ).json() as Promise<{ document_ext_id: string }>\n })()\n : await adapter.save(documentId, ready.room ? encodeState(ready.room) : undefined)\n if (revision.current === atRevision) {\n dirtyRef.current = false\n setDirty(false)\n drafts.delete(documentId)\n }\n await Promise.resolve(adapter.onVersionSaved?.(result.document_ext_id)).catch(() => {\n /* The saved document remains accessible by its ID. */\n })\n onSaved?.(result.document_ext_id)\n adapter.notify?.(isDraft ? 'Word note saved' : 'DOCX version saved', 'success')\n } catch (e) {\n adapter.notify?.(e instanceof Error ? e.message : 'Could not save this document.', 'error')\n setStatus('Save failed \u00B7 your draft is retained')\n } finally {\n setSaving(false)\n }\n }\n function editorReady(editor: Editor) {\n ref.current = editor\n if (streamRef.current) {\n streamWriter.current = new WordDraftStream(editor)\n updateStream()\n }\n fitCleanup.current?.()\n fitted.current = undefined\n const viewport = stageRef.current?.querySelector<HTMLElement>('.native-docx-viewport')\n if (!viewport) return\n let surface: Element | null = null\n const fit = () => {\n // The page itself: laid out after the editor is ready, and resized by every zoom.\n const page = viewport.querySelector('.docx-paginated-surface')\n if (page && page !== surface) resize.observe((surface = page))\n const current = editor.getZoom()\n // A zoom the fit did not apply is the reader's: stop fitting until they pick Fit width again.\n if (\n fitting.current &&\n fitted.current !== undefined &&\n Math.abs(current - fitted.current) > 0.001\n )\n fitting.current = false\n setFitWidth(fitting.current)\n setZoomPercent(Math.round(current * 100))\n if (!fitting.current) return\n const pageWidth = editor.getPageGeometry()[0]?.box.width\n if (!pageWidth) return\n const style = getComputedStyle(viewport)\n const available =\n viewport.clientWidth - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight)\n // The page fills the viewer, its padding the only gutter. Compact (an email body) never\n // magnifies: its text stays the size the email is read at.\n const zoom = Math.max(0.1, Math.min(compact ? 1 : 5, available / pageWidth))\n if (Math.abs(current - zoom) > 0.001) editor.setZoom(zoom)\n fitted.current = editor.getZoom()\n setZoomPercent(Math.round(fitted.current * 100))\n }\n refit.current = fit\n const resize = new ResizeObserver(fit)\n const chrome = new MutationObserver(fit)\n resize.observe(viewport)\n chrome.observe(viewport, {\n attributes: true,\n attributeFilter: ['style', 'data-review-pane', 'data-review-margin'],\n })\n // Where the page mounts, to start watching it if it is laid out after the editor is ready.\n const mount = viewport.querySelector('.docx-content-mount')\n if (mount) chrome.observe(mount, { childList: true })\n if (!fitting.current) editor.setZoom(zoomPercent / 100)\n fit()\n fitCleanup.current = () => {\n resize.disconnect()\n chrome.disconnect()\n refit.current = undefined\n }\n }\n function pickZoom(value: string) {\n const editor = ref.current\n if (!editor) return\n if (value === 'fit') {\n fitting.current = true\n fitted.current = undefined\n refit.current?.()\n return\n }\n fitting.current = false\n setFitWidth(false)\n setZoomPercent(Number(value))\n editor.setZoom(Number(value) / 100)\n }\n function changed() {\n if (snapshot) return\n revision.current += 1\n dirtyRef.current = true\n setDirty(true)\n setStatus(\n isDraft ? 'Unsaved note' : offline ? 'Offline \u00B7 edits buffered locally' : 'Saving changes\u2026'\n )\n if (isDraft) {\n clearTimeout(draftTimer.current)\n draftTimer.current = setTimeout(() => {\n void ref.current?.save().then((bytes) => {\n if (bytes) drafts.set(documentId, bytes)\n })\n }, 200)\n }\n }\n return (\n <section\n className={compact ? 'native-docx-viewer native-docx-compact' : 'native-docx-viewer'}\n data-testid=\"native-docx-editor\"\n aria-busy={!!stream?.busy}\n data-generation-state={\n stream ? (stream.busy ? 'generating' : stream.error ? 'stopped' : 'generated') : 'ready'\n }\n >\n {offline && (\n <div className=\"native-docx-notice\">\n Changes are buffered in this browser. Keep this tab open until the connection returns, or\n download your DOCX.\n </div>\n )}\n {error && (\n <div className=\"native-docx-notice\" data-error=\"true\" role=\"alert\">\n {error}{' '}\n <button\n disabled={!stream && dirty}\n title={dirty ? 'Download your unsaved DOCX before reopening the editor' : undefined}\n onClick={() =>\n stream ? (setError(''), setStreamAttempt((x) => x + 1)) : setRetry((x) => x + 1)\n }\n >\n <RefreshCw size={12} />\n Retry\n </button>\n </div>\n )}\n {!ready && !error && (\n <div className=\"native-docx-error\" role=\"status\">\n Opening Word document\u2026\n </div>\n )}\n {ready && (\n <div className=\"native-docx-body docx-editor\">\n <EditorBoundary key={retry}>\n <DocxEditor.Root\n document={ready.document}\n modules={ready.modules}\n fonts={ready.fonts}\n mode={\n stream || (isDraft && ready.canEdit && !snapshot) || (compact && ready.canEdit)\n ? 'edit'\n : !ready.canEdit || snapshot\n ? 'view'\n : 'suggesting'\n }\n reviewDisplayMode=\"all-markup\"\n zoomMode={fixedZoomMode}\n author={ready.author}\n onReady={editorReady}\n onChange={(change) => {\n if (change.source !== 'load') changed()\n }}\n onFontError={(e) => setError(e.message)}\n >\n <DocxAuthorContext.Provider value={ready.author}>\n <DefinedTermsProvider\n load={adapter.definitions}\n editable={!stream && !snapshot && ready.canEdit}\n notify={adapter.notify}\n >\n <HouseTemplateProvider\n enabled={!stream}\n host={adapter.houseTemplate}\n documentId={isDraft || snapshot ? undefined : documentId}\n editable={!stream && !snapshot && ready.canEdit}\n notify={adapter.notify}\n >\n <CrossReferencesProvider\n editable={!stream && !snapshot && ready.canEdit}\n references={adapter.references}\n documentId={documentId}\n notify={adapter.notify}\n >\n <SignatureFieldsProvider\n signers={adapter.signatureSigners}\n mySignature={adapter.savedSignature}\n editable={!stream && !snapshot && ready.canEdit}\n notify={adapter.notify}\n >\n <DocxEditor.RevisionMarkup\n insertions={{ mark: 'underline', color: 'blue' }}\n deletions={{ mark: 'strikethrough', color: 'red' }}\n movedFrom={{ mark: 'doubleStrikethrough', color: 'green' }}\n movedTo={{ mark: 'doubleUnderline', color: 'green' }}\n trackMoves\n />\n {compact && !stream && <CompactToolbar />}\n {!compact && !stream && (\n <DocxRibbon\n onSave={() => void saveVersion()}\n imageGeneration={\n adapter.imageGeneration && {\n notify: adapter.notify,\n ...adapter.imageGeneration,\n }\n }\n badge={\n // The document's state, in place of a title row above the ribbon.\n <DocumentStateBadge\n state={\n snapshot || !ready.canEdit\n ? 'read-only'\n : ready.room\n ? 'co-editing'\n : isDraft\n ? 'draft'\n : undefined\n }\n />\n }\n />\n )}\n {!stream && <WordShortcuts scope={stageRef} />}\n {!stream && <TableTabKeys scope={stageRef} />}\n <div\n className=\"native-docx-stage\"\n ref={stageRef}\n onMouseDownCapture={(event) => {\n if (event.button === 2 && ref.current?.getSelectionPlacement())\n event.preventDefault()\n }}\n >\n <DocxEditor.Viewport className=\"native-docx-viewport\">\n <DocxEditor.Content />\n <DocxMentions\n initialCommentId={initialCommentId}\n mentions={adapter.mentions}\n notify={adapter.notify}\n getAgentStatus={adapter.getAgentStatus}\n requestAgent={\n adapter.requestAgent\n ? (request) => adapter.requestAgent!(documentId, request)\n : undefined\n }\n >\n <RoomInputBinding session={ready.room?.session} />\n <AgentUndoRoom.Provider value={ready.room?.ydoc ?? null}>\n <DocxEditorReview>\n {() => (\n <DocxEditorReview.Card>\n <DocxCommentActivity />\n <AgentUndo />\n </DocxEditorReview.Card>\n )}\n </DocxEditorReview>\n </AgentUndoRoom.Provider>\n </DocxMentions>\n {!compact && <DocxEditor.HeaderFooterChrome />}\n {!compact && <DocxEditor.NotesChrome />}\n <DocxEditor.Equation />\n <DocxEditor.HyperLink />\n <DocxEditor.ContextMenu>\n <DocxContextMenuExtras />\n <MySignatureContextItems />\n <SignatureFieldContextItem />\n </DocxEditor.ContextMenu>\n </DocxEditor.Viewport>\n {!compact && <DocxEditor.PageNumber />}\n </div>\n </SignatureFieldsProvider>\n </CrossReferencesProvider>\n </HouseTemplateProvider>\n </DefinedTermsProvider>\n </DocxAuthorContext.Provider>\n </DocxEditor.Root>\n </EditorBoundary>\n </div>\n )}\n <div className=\"native-docx-actions\">\n <span className=\"native-docx-status\" role=\"status\">\n {offline ? <WifiOff size={14} /> : !dirty && ready ? <Check size={14} /> : null}\n {status}\n </span>\n <DocxParticipants session={ready?.room?.session} />\n {!compact && (\n <select\n className=\"native-docx-zoom\"\n aria-label=\"Zoom\"\n data-testid=\"native-docx-zoom\"\n disabled={!ready}\n value={fitWidth ? 'fit' : String(zoomPercent)}\n onChange={(event) => pickZoom(event.target.value)}\n >\n <option value=\"fit\">Fit width</option>\n {[...new Set([...ZOOM_LEVELS, ...(fitWidth ? [] : [zoomPercent])])]\n .sort((a, b) => a - b)\n .map((level) => (\n <option key={level} value={String(level)}>\n {level}%\n </option>\n ))}\n </select>\n )}\n {!compact && (\n <button\n onClick={() => void exportDocument()}\n disabled={!ready}\n aria-label=\"Download DOCX\"\n >\n <Download size={14} />\n DOCX\n </button>\n )}\n {!compact && !snapshot && !stream && ready?.canEdit && (\n <button\n className=\"native-docx-save\"\n onClick={() => void saveVersion()}\n disabled={!ready || saving || offline}\n data-testid=\"native-docx-save\"\n >\n <Save size={14} />\n {saving ? 'Saving\u2026' : isDraft ? 'Save note' : 'Save version'}\n </button>\n )}\n </div>\n </section>\n )\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import { normalizeDocxExport } from './export'\nimport { WordDraftStream } from './streamWordDocument'\nimport {\n DocxMentions,\n DocxCommentActivity,\n type DocxMention,\n type DocxAgentCommentRequest,\n type DocxMentionDelivery,\n type DocxAgentRunStatus,\n} from './DocxMentions'\nimport * as Y from 'yjs'\nimport type { DocumentHandle } from '@docx-editor.dev/core'\nimport React, { useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport {\n DocxEditor,\n useChromeTranslate,\n useDocxEditor,\n type FontConfiguration,\n} from '@docx-editor.dev/react'\nimport { collaborationModule, DOCUMENT_COLLABORATION_VERSIONS } from '@arbidocs/coedit'\nimport { awaitMatchingEditor } from './coedit-update'\nimport type { DocxCollaborationSession } from '@arbidocs/coedit'\nimport {\n createHocuspocusCollaboration,\n type HocuspocusCollaborationRoom,\n} from '@arbidocs/coedit/hocuspocus'\nimport { DocxEditorReview, reviewModule } from './review'\nimport { AgentUndo, AgentUndoRoom } from './AgentUndo'\nimport type { EditorModule } from '@docx-editor.dev/core'\nimport type { Editor } from '@docx-editor.dev/core'\nimport {\n Download,\n Save,\n RefreshCw,\n WifiOff,\n Check,\n Type,\n Pilcrow,\n UsersRound,\n BookA,\n} from 'lucide-react'\nimport { DefinedTermsProvider, useDefinedTerms } from './definitions/DefinedTerms'\nimport { RibbonMenu } from './RibbonMenu'\nimport { DocxCommandMenu } from './DocxCommandMenu'\nimport { RibbonItem, RibbonOverflow } from './RibbonOverflow'\nimport { StyleGallery } from './StyleGallery'\nimport { NoteButtons, WordShortcuts } from './WordReferences'\nimport type { DefinitionSource } from '../tags/definitions'\nimport { CrossReferencesProvider, type DocxReferencesAdapter } from './references/CrossReferences'\nimport {\n CrossReferenceButton,\n DocxContextMenuExtras,\n UpdateCrossReferencesButton,\n} from './references/EditorMenus'\nimport { runBeforeSave } from './beforeSave'\nimport { LayoutTabContent, LAYOUT_TAB, useContextualTabs } from './layout/LayoutTabs'\nimport {\n GenerateImageButton,\n useGenerateImageTarget,\n type DocxImageGeneration,\n} from './layout/GenerateImage'\nimport { TableTabKeys } from './layout/TableKeys'\nimport { newFromTemplate } from '@arbidocs/coedit/template'\nimport {\n HouseTemplateProvider,\n resolveHouseTemplate,\n templateFileName,\n type HouseTemplateHost,\n} from './template/HouseTemplate'\nimport { QuickParts } from './template/QuickParts'\nimport {\n MySignatureContextItems,\n SignatureFieldContextItem,\n MySignatureMenu,\n SignatureFieldMenu,\n SignatureFieldsProvider,\n type DocxSavedSignature,\n type DocxSigner,\n} from './signatures/SignatureFields'\nimport { HouseTemplatePanel } from './template/HouseTemplatePanel'\nimport { DocxAuthorContext } from './structural/useTrackedOrNoted'\n\nimport { contentPath } from './content-path'\n\nexport { contentPath }\n\n/** Host integration: no application store, router, or authentication singleton is required. */\nexport interface NativeDocxAdapter {\n request: (path: string, options?: RequestInit) => Promise<Response>\n open: (documentId: string) => Promise<{\n room_id: string\n token: string\n websocket_path: string\n can_edit: boolean\n identity: { actorId: string; name: string; role: 'human' | 'agent' }\n filename: string\n }>\n /** Save the live room as the document's next version (same document id). */\n save: (\n documentId: string,\n state?: string\n ) => Promise<{ document_ext_id: string; version?: number; unchanged?: boolean }>\n loadFonts: () => Promise<FontConfiguration>\n baseUrl?: string\n author?: string\n subscribeTokenChanges?: (listener: () => void) => () => void\n onDirtyChange?: (dirty: boolean) => void\n onVersionSaved?: (documentId: string, version?: number) => void | Promise<void>\n notify?: (message: string, kind: 'success' | 'error') => void\n mentions?: readonly DocxMention[]\n requestAgent?: (\n documentId: string,\n request: DocxAgentCommentRequest\n ) => Promise<DocxMentionDelivery | void>\n getAgentStatus?: (responseId: string) => Promise<DocxAgentRunStatus>\n /**\n * The workspace's definitions: facts labelled \"Definitions\". Present: the Insert tab offers\n * Defined term, and typing `@@` in the body opens the term type-ahead.\n */\n definitions?: () => Promise<DefinitionSource[]>\n /**\n * References to the workspace's other documents. Present: Insert cross-reference also offers a\n * passage of another document, inserted as a link that opens it there.\n */\n references?: DocxReferencesAdapter\n /** The platform's image generation. Present: the Insert tab offers Generate image. */\n imageGeneration?: DocxImageGeneration\n /**\n * The workspace's house template. Present: a blank note starts from it (its styles, numbering,\n * page setup, headers and footers), Insert offers its Quick Parts, and the Design tab and the\n * style box show where the document's styles differ from it.\n */\n houseTemplate?: HouseTemplateHost\n /** Workspace members who may sign. Present: Insert offers Signature field (or anyone by email). */\n signatureSigners?: readonly DocxSigner[]\n /** One's saved signature. Present: Insert offers My signature (an informal one, as a picture). */\n savedSignature?: DocxSavedSignature\n}\n\nexport interface NativeDocxEditorProps {\n adapter: NativeDocxAdapter\n documentId: string\n title: string\n draftContent?: string\n initialCommentId?: string\n /** Immutable history/compare snapshots must not join the live editing room. */\n snapshot?: boolean\n onSaved?: (id: string) => void\n /**\n * Read-only preview of generated Markdown. The server stores the DOCX itself; when the\n * stream ends the caller swaps this preview for the stored document.\n */\n stream?: {\n content: string\n busy: boolean\n error?: string | null\n }\n /**\n * Embedded as a body field (an email draft): a small formatting toolbar instead of the ribbon, no\n * page furniture or save bar (the host saves), and the person types directly; others' edits (ARBI's)\n * still arrive as tracked changes to accept or reject.\n */\n compact?: boolean\n /** Receives a reader of the live room's state, so the host's save can include the latest keystrokes. */\n stateRef?: React.MutableRefObject<(() => string | undefined) | null>\n /** Save the current live room before leaving the editor; false means the caller must stay. */\n saveRef?: React.MutableRefObject<(() => Promise<boolean | number>) | null>\n}\ninterface Ready {\n document: DocumentHandle | Uint8Array\n modules: readonly EditorModule[]\n fonts: FontConfiguration\n room?: HocuspocusCollaborationRoom\n canEdit: boolean\n author: string\n filename: string\n}\n// Local unsaved notes survive tab switches. Persisted artifacts use server state.\nconst drafts = new Map<string, ArrayBuffer>()\nconst stateBytes = (room: HocuspocusCollaborationRoom) => Y.encodeStateAsUpdate(room.ydoc)\nconst encodeState = (room: HocuspocusCollaborationRoom) => {\n let binary = ''\n for (const byte of stateBytes(room)) binary += String.fromCharCode(byte)\n return btoa(binary)\n}\nfunction covered(room: HocuspocusCollaborationRoom, vector: string, receipt: string) {\n const decode = (value: string) => Uint8Array.from(atob(value), (c) => c.charCodeAt(0))\n const server = Y.decodeStateVector(decode(vector)),\n local = Y.decodeStateVector(Y.encodeStateVector(room.ydoc))\n for (const [client, clock] of local) if ((server.get(client) || 0) < clock) return false\n const deleted = Y.decodeUpdate(stateBytes(room)).ds.clients\n const saved = Y.decodeUpdate(decode(receipt)).ds.clients\n for (const [client, ranges] of deleted)\n for (const range of ranges) {\n if (\n !(saved.get(client) || []).some(\n (s) => s.clock <= range.clock && s.clock + s.len >= range.clock + range.len\n )\n )\n return false\n }\n return true\n}\nclass EditorBoundary extends React.Component<{ children: React.ReactNode }, { error?: Error }> {\n state: { error?: Error } = {}\n static getDerivedStateFromError(error: Error) {\n return { error }\n }\n render() {\n return this.state.error ? (\n <div role=\"alert\" className=\"native-docx-error\">\n Could not render this Word document: {this.state.error.message}\n </div>\n ) : (\n this.props.children\n )\n }\n}\n/**\n * The room writes below the editor's input buffer, so it gets the editor's pending-input flush: it\n * lands queued typing before a peer's change and lays that change out at once, which is when the\n * editor carries its caret (otherwise a fast keystroke lands where the caret was before the change).\n */\nfunction RoomInputBinding({\n session,\n flushRef,\n}: {\n session?: DocxCollaborationSession\n flushRef: React.MutableRefObject<(() => void) | null>\n}) {\n const editor = useDocxEditor()\n useEffect(() => {\n if (!editor) return\n const flush = () => editor.surface?.flushPendingInput()\n flushRef.current = flush\n const unbind = session?.bindEditorInput(flush)\n return () => {\n if (flushRef.current === flush) flushRef.current = null\n unbind?.()\n }\n }, [editor, session, flushRef])\n return null\n}\n\nexport function DocxParticipants({ session }: { session?: DocxCollaborationSession }) {\n const [people, setPeople] = useState<readonly { actorId: string; name: string }[]>([])\n useEffect(() => {\n if (!session) return\n setPeople(session.participants())\n return session.subscribeParticipants(setPeople)\n }, [session])\n return (\n <div className=\"native-docx-presence\" aria-label=\"People viewing this document\">\n {people.map((p) => (\n <span className=\"native-docx-avatar\" key={p.actorId} title={p.name}>\n {p.name\n .split(' ')\n .map((s) => s[0])\n .slice(0, 2)\n .join('')}\n </span>\n ))}\n </div>\n )\n}\n\n/** Insert tab: a defined term at the caret (when definitions are offered). */\nfunction DefinedTermButtons() {\n const terms = useDefinedTerms()\n if (!terms) return null\n return (\n <button\n type=\"button\"\n className=\"native-docx-ribbon-trigger\"\n aria-label={terms.labels.insert}\n title={`${terms.labels.insert} (type @@)`}\n data-testid=\"docx-insert-defined-term\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => terms.openPicker(event.currentTarget)}\n >\n <BookA size={16} />\n </button>\n )\n}\n\nconst DOCUMENT_STATES = {\n 'co-editing': {\n label: 'Co-editing',\n title: 'Edits sync live with everyone who has this document open',\n },\n 'read-only': {\n label: 'Read-only',\n title: 'This copy cannot be edited: an earlier version, or the last saved copy',\n },\n draft: { label: 'Private draft', title: 'Only you can see this until you save it' },\n} as const\n\n/** Which document is on screen: shared live, read-only, or a draft only its author sees. */\nfunction DocumentStateBadge({ state }: { state?: keyof typeof DOCUMENT_STATES }) {\n if (!state) return null\n const { label, title } = DOCUMENT_STATES[state]\n return (\n <span data-state={state} title={title}>\n {label}\n </span>\n )\n}\n\nexport function DocxRibbon({\n onSave,\n badge,\n imageGeneration,\n}: {\n onSave: () => void\n /** Insert \u203A Generate image, when the host can generate images. */\n imageGeneration?: DocxImageGeneration\n /** A short state label at the end of the row, such as \"Co-editing\". */\n badge?: React.ReactNode\n}) {\n const [selected, setTab] = useState('Home')\n const contextual = useContextualTabs(selected)\n useGenerateImageTarget()\n const tab = contextual.shown\n const t = useChromeTranslate()\n return (\n <div className=\"native-docx-ribbon\">\n <select aria-label=\"Ribbon tab\" value={tab} onChange={(event) => setTab(event.target.value)}>\n <option>Home</option>\n <option>Insert</option>\n <option>Design</option>\n <option>{LAYOUT_TAB}</option>\n <option>References</option>\n <option>Review</option>\n {contextual.tabs.map((name) => (\n <option key={name}>{name}</option>\n ))}\n </select>\n <DocxEditor.Toolbar t={t} preset={false} onSave={onSave}>\n <DocxEditor.Toolbar.Undo />\n <DocxEditor.Toolbar.Redo />\n <DocxEditor.Toolbar.Save />\n {/* Undo, Redo and Save stay put, like Word's Quick Access Toolbar; the tab's own\n controls collapse into its More menu when the ribbon is too narrow for them. */}\n <RibbonOverflow tab={tab}>\n {tab === 'Home' && (\n <>\n <RibbonItem id=\"home-style\" label=\"Styles\" priority={80}>\n <StyleGallery />\n </RibbonItem>\n <RibbonItem id=\"home-bold\" label=\"Bold\" priority={100}>\n <DocxEditor.Toolbar.Bold />\n </RibbonItem>\n <RibbonItem id=\"home-italic\" label=\"Italic\" priority={95}>\n <DocxEditor.Toolbar.Italic />\n </RibbonItem>\n <RibbonItem id=\"home-underline\" label=\"Underline\" priority={90}>\n <DocxEditor.Toolbar.Underline />\n </RibbonItem>\n <RibbonItem id=\"home-font\" label=\"Font\" priority={60}>\n <RibbonMenu label=\"Font\" icon={<Type size={16} />}>\n <DocxEditor.Toolbar.FontFamily />\n <DocxEditor.Toolbar.FontSize />\n <DocxEditor.Toolbar.FontColor />\n <DocxEditor.Toolbar.Highlight />\n </RibbonMenu>\n </RibbonItem>\n <RibbonItem id=\"home-more-formatting\" label=\"More formatting\" priority={50}>\n <RibbonMenu label=\"More formatting\" icon={<Pilcrow size={16} />}>\n <DocxEditor.Toolbar.Alignment />\n <DocxEditor.Toolbar.BulletList />\n <DocxEditor.Toolbar.NumberedList />\n <DocxEditor.Toolbar.LineSpacing />\n <DocxEditor.Toolbar.Indent />\n <DocxEditor.Toolbar.Outdent />\n <DocxEditor.Toolbar.Strike />\n <DocxEditor.Toolbar.ClearFormatting />\n </RibbonMenu>\n </RibbonItem>\n </>\n )}\n {tab === 'Insert' && (\n <>\n <RibbonItem id=\"insert-table\" label=\"Table\">\n <DocxEditor.Toolbar.TableInsert />\n </RibbonItem>\n <RibbonItem id=\"insert-picture\" label=\"Picture\">\n <DocxEditor.Toolbar.ImageInsert />\n </RibbonItem>\n {imageGeneration && (\n <RibbonItem id=\"insert-generate-image\" label=\"Generate image\">\n <GenerateImageButton generation={imageGeneration} />\n </RibbonItem>\n )}\n <RibbonItem id=\"insert-page-break\" label=\"Page break\">\n <DocxEditor.Toolbar.Button slotId=\"insert.pageBreak\" />\n </RibbonItem>\n <RibbonItem id=\"insert-link\" label=\"Link\">\n <DocxEditor.Toolbar.Link />\n </RibbonItem>\n <RibbonItem id=\"insert-defined-term\" label=\"Defined term\">\n <DefinedTermButtons />\n </RibbonItem>\n <RibbonItem id=\"insert-quick-parts\" label=\"Quick Parts\">\n <QuickParts />\n </RibbonItem>\n <RibbonItem id=\"insert-signature-field\" label=\"Signature field\">\n <SignatureFieldMenu />\n </RibbonItem>\n <RibbonItem id=\"insert-my-signature\" label=\"My signature\">\n <MySignatureMenu />\n </RibbonItem>\n <RibbonItem id=\"insert-cross-reference\" label=\"Cross-reference\">\n <CrossReferenceButton />\n </RibbonItem>\n </>\n )}\n <LayoutTabContent tab={tab} />\n {tab === 'Design' && (\n <RibbonItem id=\"design-house-template\" label=\"House template\">\n <HouseTemplatePanel />\n </RibbonItem>\n )}\n {tab === 'References' && (\n <>\n <NoteButtons />\n <RibbonItem id=\"references-cross-reference\" label=\"Cross-reference\">\n <CrossReferenceButton />\n </RibbonItem>\n <RibbonItem id=\"references-update-cross-references\" label=\"Update cross-references\">\n <UpdateCrossReferencesButton />\n </RibbonItem>\n </>\n )}\n {tab === 'Review' && (\n <>\n <RibbonItem id=\"review-editing-mode\" label=\"Editing mode\" priority={10}>\n <DocxEditor.Toolbar.EditingMode />\n </RibbonItem>\n <RibbonItem id=\"review-comments\" label=\"Comments\">\n <DocxEditor.Toolbar.Comments />\n </RibbonItem>\n <RibbonItem id=\"review-options\" label=\"Review options\">\n <RibbonMenu label=\"Review options\" icon={<UsersRound size={16} />}>\n <DocxEditor.Toolbar.Reviewers />\n </RibbonMenu>\n </RibbonItem>\n </>\n )}\n </RibbonOverflow>\n {/* The toolbar provides its table chrome context only to a direct table-chrome child: this\n hidden one keeps it mounted for the Table tab's borders and shading. */}\n <DocxEditor.Toolbar.TableCellFill hidden />\n </DocxEditor.Toolbar>\n {badge && (\n <span className=\"native-docx-ribbon-badge\" data-testid=\"docx-ribbon-badge\">\n {badge}\n </span>\n )}\n </div>\n )\n}\n\n/** The compact editor's formatting: what an email needs. */\nfunction CompactToolbar() {\n const t = useChromeTranslate()\n return (\n <DocxEditor.Toolbar t={t} preset={false}>\n <DocxEditor.Toolbar.Undo />\n <DocxEditor.Toolbar.Redo />\n <DocxEditor.Toolbar.Bold />\n <DocxEditor.Toolbar.Italic />\n <DocxEditor.Toolbar.Underline />\n <DocxEditor.Toolbar.BulletList />\n <DocxEditor.Toolbar.NumberedList />\n <DocxEditor.Toolbar.Link />\n </DocxEditor.Toolbar>\n )\n}\n\nconst fixedZoomMode = { type: 'fixed' } as const\n/** The zoom menu's levels, in percent, beside Fit width. */\nconst ZOOM_LEVELS = [50, 75, 100, 125, 150, 200]\n\nexport function NativeDocxEditor({\n documentId,\n title,\n draftContent,\n initialCommentId,\n snapshot = false,\n onSaved,\n stream,\n adapter,\n compact = false,\n stateRef,\n saveRef,\n}: NativeDocxEditorProps) {\n const [ready, setReady] = useState<Ready>(),\n [error, setError] = useState(''),\n [retry, setRetry] = useState(0)\n const [status, setStatus] = useState('Connecting\u2026'),\n [dirty, setDirty] = useState(false),\n [saving, setSaving] = useState(false),\n [offline, setOffline] = useState(false)\n const revision = useRef(0)\n const savingRef = useRef(false)\n const flushInputRef = useRef<(() => void) | null>(null)\n const stageRef = useRef<HTMLDivElement>(null),\n fitCleanup = useRef<(() => void) | undefined>(undefined),\n refit = useRef<(() => void) | undefined>(undefined)\n // Fit width until the reader picks a zoom (the zoom menu, or Ctrl +/-/0), then keep theirs until\n // they pick Fit width again. `fitted` is the zoom the fit last applied: any other zoom is theirs.\n const fitting = useRef(true),\n fitted = useRef<number | undefined>(undefined)\n const [fitWidth, setFitWidth] = useState(true),\n [zoomPercent, setZoomPercent] = useState(100)\n const ref = useRef<Editor | null>(null),\n dirtyRef = useRef(false),\n draftTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const isDraft = draftContent !== undefined\n const streamRef = useRef(stream)\n streamRef.current = stream\n const streamWriter = useRef<WordDraftStream | null>(null)\n const streamFinished = useRef(false)\n const streamTimer = useRef<ReturnType<typeof setTimeout> | undefined>(undefined)\n const [streamAttempt, setStreamAttempt] = useState(0)\n function updateStream() {\n const current = streamRef.current\n if (!current || !streamWriter.current || streamFinished.current) return\n try {\n streamWriter.current.update(current.content, !current.busy)\n setStatus(\n current.busy\n ? 'Generating \u00B7 editing is locked'\n : current.error\n ? 'Generation stopped \u00B7 draft retained'\n : 'Opening the saved document\u2026'\n )\n if (!current.busy && !current.error) streamFinished.current = true\n } catch (failure) {\n setError(\n failure instanceof Error ? failure.message : 'Could not import the generated document.'\n )\n }\n }\n useEffect(() => {\n if (!streamRef.current) return\n if (!streamRef.current.busy) {\n clearTimeout(streamTimer.current)\n streamTimer.current = undefined\n updateStream()\n } else if (!streamTimer.current) {\n streamTimer.current = setTimeout(() => {\n streamTimer.current = undefined\n updateStream()\n }, 120)\n }\n }, [stream?.content, stream?.busy, stream?.error, streamAttempt])\n useEffect(() => () => clearTimeout(streamTimer.current), [])\n useEffect(() => {\n let cancelled = false\n let room: HocuspocusCollaborationRoom | undefined\n const cleanups: (() => void)[] = []\n setReady(undefined)\n setError('')\n setStatus('Connecting\u2026')\n setDirty(false)\n dirtyRef.current = false\n // A refusal for another room format: \"Updating\u2026\" while the matching editor or server arrives.\n const updating = (reason: string | undefined): boolean => {\n const cancel = awaitMatchingEditor(reason, () => setRetry((x) => x + 1))\n if (!cancel) return false\n cleanups.push(cancel)\n setError('')\n setStatus('Updating\u2026')\n return true\n }\n async function start() {\n const fonts = await adapter.loadFonts()\n if (isDraft || snapshot) {\n const data = isDraft\n ? (!streamRef.current && drafts.get(documentId)) ||\n (draftContent === '' && adapter.houseTemplate\n ? await (async () => {\n // A blank note starts from the house template, as File \u203A New from it does.\n const template = await resolveHouseTemplate(adapter.houseTemplate)\n return newFromTemplate(template.bytes, {\n attachedTemplate: templateFileName(template),\n })\n })()\n : await (\n await adapter.request('/prepare', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ content: draftContent }),\n })\n ).arrayBuffer())\n : await (await adapter.request(contentPath(documentId))).arrayBuffer()\n if (!cancelled) {\n setReady({\n document: new Uint8Array(data),\n fonts,\n modules: [reviewModule()],\n canEdit: !snapshot,\n author: adapter.author || 'You',\n filename: title,\n })\n setStatus(snapshot ? 'Saved version \u00B7 read only' : 'Unsaved note')\n }\n return\n }\n const session = await adapter.open(documentId)\n const ws = new URL(session.websocket_path, adapter.baseUrl || location.origin)\n ws.protocol = ws.protocol === 'https:' ? 'wss:' : 'ws:'\n let initial = true\n room = await createHocuspocusCollaboration({\n url: ws.toString(),\n roomId: session.room_id,\n identity: session.identity,\n offlineEditing: true,\n token: async () => {\n const next = initial ? session : await adapter.open(documentId)\n initial = false\n if (!cancelled)\n setReady((previous) => (previous ? { ...previous, canEdit: next.can_edit } : previous))\n return JSON.stringify({\n capability: next.token,\n versions: DOCUMENT_COLLABORATION_VERSIONS,\n })\n },\n })\n if (cancelled) {\n room.destroy()\n return\n }\n const current = room\n cleanups.push(\n current.session.subscribeStatus((s, _reason, detail) => {\n const disconnected = s === 'disconnected'\n setOffline(disconnected)\n if (s === 'error') {\n if (updating(detail)) return\n setError(\n detail ||\n 'The collaboration session failed. Export your local document before reconnecting.'\n )\n setStatus('Connection failed')\n } else if (disconnected) setStatus('Offline \u00B7 edits buffered locally')\n else if (s === 'ready') {\n setError('')\n setStatus(dirtyRef.current ? 'Saving changes\u2026' : 'Connected')\n }\n })\n )\n const stateless = ({ payload }: { payload: string }) => {\n try {\n const message = JSON.parse(payload) as {\n type: string\n message?: string\n hash?: string\n vector?: string\n receipt?: string\n }\n if (message.type === 'persisted') {\n if (\n !cancelled &&\n message.vector &&\n message.receipt &&\n covered(current, message.vector, message.receipt)\n ) {\n dirtyRef.current = false\n setDirty(false)\n setStatus('All changes saved')\n }\n }\n if (message.type === 'pending') setStatus('Saving changes\u2026')\n if (message.type === 'save-error') setStatus(message.message || 'Autosave failed')\n } catch {\n /* Ignore unrelated provider messages. */\n }\n }\n current.provider.on('stateless', stateless)\n cleanups.push(() => current.provider.off('stateless', stateless))\n if (adapter.subscribeTokenChanges)\n cleanups.push(\n adapter.subscribeTokenChanges(() => {\n void current.provider\n .sendToken()\n .catch(() => setStatus('Could not renew the collaboration session'))\n })\n )\n const refresh = setInterval(\n () => {\n void current.provider\n .sendToken()\n .catch(() => setStatus('Could not renew the collaboration session'))\n },\n 5 * 60 * 1000\n )\n cleanups.push(() => clearInterval(refresh))\n setReady({\n document: current.document,\n fonts,\n modules: [reviewModule(), collaborationModule({ session: current.session })],\n room: current,\n canEdit: session.can_edit,\n author: session.identity.name,\n filename: session.filename,\n })\n setStatus(session.can_edit ? 'All changes saved' : 'Read only \u00B7 live')\n }\n void start().catch((e) => {\n const message = e instanceof Error ? e.message : String(e)\n if (!cancelled && !updating(message)) setError(message)\n })\n return () => {\n cancelled = true\n cleanups.forEach((f) => f())\n clearTimeout(draftTimer.current)\n fitCleanup.current?.()\n room?.destroy()\n }\n }, [documentId, isDraft, snapshot, retry]) // draftContent seeds once, never remount on typing.\n useEffect(() => {\n if (!stateRef) return\n const room = ready?.room\n stateRef.current = () => (room ? encodeState(room) : undefined)\n return () => {\n stateRef.current = null\n }\n }, [stateRef, ready?.room])\n useEffect(() => {\n adapter.onDirtyChange?.(dirty)\n const beforeUnload = (e: BeforeUnloadEvent) => {\n if (dirtyRef.current) e.preventDefault()\n }\n window.addEventListener('beforeunload', beforeUnload)\n return () => {\n window.removeEventListener('beforeunload', beforeUnload)\n adapter.onDirtyChange?.(false)\n }\n }, [dirty])\n async function exportDocument() {\n runBeforeSave(ref.current)\n const data = await ref.current?.save()\n if (!data) return\n const url = URL.createObjectURL(\n new Blob([normalizeDocxExport(data)], {\n type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n })\n )\n const a = document.createElement('a')\n a.href = url\n a.download = title.replace(/\\.[^.]+$/, '') + '.docx'\n a.click()\n setTimeout(() => URL.revokeObjectURL(url), 5000)\n }\n useLayoutEffect(() => {\n const editor = ref.current\n return () => {\n if (isDraft && editor && dirtyRef.current)\n void editor\n .save()\n .then((bytes) => {\n if (bytes) drafts.set(documentId, bytes)\n })\n .catch(() => {})\n }\n }, [documentId, isDraft, ready])\n async function saveVersion() {\n if (!ready || savingRef.current || stream) return false\n if (snapshot || !ready.canEdit) return true\n if (offline) return false\n savingRef.current = true\n setSaving(true)\n try {\n if (!flushInputRef.current) throw new Error('The editor is not ready to save yet.')\n flushInputRef.current()\n runBeforeSave(ref.current)\n const atRevision = revision.current\n const result = isDraft\n ? await (async () => {\n const bytes = await ref.current?.save()\n if (!bytes) throw new Error('The editor is not ready.')\n return (\n await adapter.request(`/notes?${new URLSearchParams({ title })}`, {\n method: 'POST',\n headers: {\n 'Content-Type':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n },\n body: bytes,\n })\n ).json() as Promise<{ document_ext_id: string }>\n })()\n : await adapter.save(documentId, ready.room ? encodeState(ready.room) : undefined)\n if (revision.current === atRevision) {\n dirtyRef.current = false\n setDirty(false)\n drafts.delete(documentId)\n }\n const savedVersion =\n 'version' in result && typeof result.version === 'number' ? result.version : undefined\n if (!isDraft && !savedVersion) throw new Error('Could not confirm the saved version.')\n await adapter.onVersionSaved?.(result.document_ext_id, savedVersion)\n onSaved?.(result.document_ext_id)\n if (revision.current !== atRevision) {\n adapter.notify?.('The document changed while saving. Please try again.', 'error')\n return false\n }\n adapter.notify?.(isDraft ? 'Word note saved' : 'DOCX version saved', 'success')\n return savedVersion ?? true\n } catch (e) {\n adapter.notify?.(e instanceof Error ? e.message : 'Could not save this document.', 'error')\n setStatus('Save failed \u00B7 your draft is retained')\n return false\n } finally {\n savingRef.current = false\n setSaving(false)\n }\n }\n useEffect(() => {\n if (!saveRef) return\n saveRef.current = saveVersion\n return () => {\n saveRef.current = null\n }\n })\n function editorReady(editor: Editor) {\n ref.current = editor\n if (streamRef.current) {\n streamWriter.current = new WordDraftStream(editor)\n updateStream()\n }\n fitCleanup.current?.()\n fitted.current = undefined\n const viewport = stageRef.current?.querySelector<HTMLElement>('.native-docx-viewport')\n if (!viewport) return\n let surface: Element | null = null\n const fit = () => {\n // The page itself: laid out after the editor is ready, and resized by every zoom.\n const page = viewport.querySelector('.docx-paginated-surface')\n if (page && page !== surface) resize.observe((surface = page))\n const current = editor.getZoom()\n // A zoom the fit did not apply is the reader's: stop fitting until they pick Fit width again.\n if (\n fitting.current &&\n fitted.current !== undefined &&\n Math.abs(current - fitted.current) > 0.001\n )\n fitting.current = false\n setFitWidth(fitting.current)\n setZoomPercent(Math.round(current * 100))\n if (!fitting.current) return\n const pageWidth = editor.getPageGeometry()[0]?.box.width\n if (!pageWidth) return\n const style = getComputedStyle(viewport)\n const available =\n viewport.clientWidth - parseFloat(style.paddingLeft) - parseFloat(style.paddingRight)\n // The page fills the viewer, its padding the only gutter. Compact (an email body) never\n // magnifies: its text stays the size the email is read at.\n const zoom = Math.max(0.1, Math.min(compact ? 1 : 5, available / pageWidth))\n if (Math.abs(current - zoom) > 0.001) editor.setZoom(zoom)\n fitted.current = editor.getZoom()\n setZoomPercent(Math.round(fitted.current * 100))\n }\n refit.current = fit\n const resize = new ResizeObserver(fit)\n const chrome = new MutationObserver(fit)\n resize.observe(viewport)\n chrome.observe(viewport, {\n attributes: true,\n attributeFilter: ['style', 'data-review-pane', 'data-review-margin'],\n })\n // Where the page mounts, to start watching it if it is laid out after the editor is ready.\n const mount = viewport.querySelector('.docx-content-mount')\n if (mount) chrome.observe(mount, { childList: true })\n if (!fitting.current) editor.setZoom(zoomPercent / 100)\n fit()\n fitCleanup.current = () => {\n resize.disconnect()\n chrome.disconnect()\n refit.current = undefined\n }\n }\n function pickZoom(value: string) {\n const editor = ref.current\n if (!editor) return\n if (value === 'fit') {\n fitting.current = true\n fitted.current = undefined\n refit.current?.()\n return\n }\n fitting.current = false\n setFitWidth(false)\n setZoomPercent(Number(value))\n editor.setZoom(Number(value) / 100)\n }\n function changed() {\n if (snapshot) return\n revision.current += 1\n dirtyRef.current = true\n setDirty(true)\n setStatus(\n isDraft ? 'Unsaved note' : offline ? 'Offline \u00B7 edits buffered locally' : 'Saving changes\u2026'\n )\n if (isDraft) {\n clearTimeout(draftTimer.current)\n draftTimer.current = setTimeout(() => {\n void ref.current?.save().then((bytes) => {\n if (bytes) drafts.set(documentId, bytes)\n })\n }, 200)\n }\n }\n return (\n <section\n className={compact ? 'native-docx-viewer native-docx-compact' : 'native-docx-viewer'}\n data-testid=\"native-docx-editor\"\n aria-busy={!!stream?.busy}\n data-generation-state={\n stream ? (stream.busy ? 'generating' : stream.error ? 'stopped' : 'generated') : 'ready'\n }\n >\n {offline && (\n <div className=\"native-docx-notice\">\n Changes are buffered in this browser. Keep this tab open until the connection returns, or\n download your DOCX.\n </div>\n )}\n {error && (\n <div className=\"native-docx-notice\" data-error=\"true\" role=\"alert\">\n {error}{' '}\n <button\n disabled={!stream && dirty}\n title={dirty ? 'Download your unsaved DOCX before reopening the editor' : undefined}\n onClick={() =>\n stream ? (setError(''), setStreamAttempt((x) => x + 1)) : setRetry((x) => x + 1)\n }\n >\n <RefreshCw size={12} />\n Retry\n </button>\n </div>\n )}\n {!ready && !error && (\n <div className=\"native-docx-error\" role=\"status\">\n Opening Word document\u2026\n </div>\n )}\n {ready && (\n <div className=\"native-docx-body docx-editor\">\n <EditorBoundary key={retry}>\n <DocxEditor.Root\n document={ready.document}\n modules={ready.modules}\n fonts={ready.fonts}\n mode={\n stream || (isDraft && ready.canEdit && !snapshot) || (compact && ready.canEdit)\n ? 'edit'\n : !ready.canEdit || snapshot\n ? 'view'\n : 'suggesting'\n }\n reviewDisplayMode=\"all-markup\"\n zoomMode={fixedZoomMode}\n author={ready.author}\n onReady={editorReady}\n onChange={(change) => {\n if (change.source !== 'load') changed()\n }}\n onFontError={(e) => setError(e.message)}\n >\n <DocxAuthorContext.Provider value={ready.author}>\n <DefinedTermsProvider\n load={adapter.definitions}\n editable={!stream && !snapshot && ready.canEdit}\n notify={adapter.notify}\n >\n <HouseTemplateProvider\n enabled={!stream}\n host={adapter.houseTemplate}\n documentId={isDraft || snapshot ? undefined : documentId}\n editable={!stream && !snapshot && ready.canEdit}\n notify={adapter.notify}\n >\n <CrossReferencesProvider\n editable={!stream && !snapshot && ready.canEdit}\n references={adapter.references}\n documentId={documentId}\n notify={adapter.notify}\n >\n <SignatureFieldsProvider\n signers={adapter.signatureSigners}\n mySignature={adapter.savedSignature}\n editable={!stream && !snapshot && ready.canEdit}\n notify={adapter.notify}\n >\n <DocxEditor.RevisionMarkup\n insertions={{ mark: 'underline', color: 'blue' }}\n deletions={{ mark: 'strikethrough', color: 'red' }}\n movedFrom={{ mark: 'doubleStrikethrough', color: 'green' }}\n movedTo={{ mark: 'doubleUnderline', color: 'green' }}\n trackMoves\n />\n {compact && !stream && <CompactToolbar />}\n {!compact && !stream && (\n <DocxCommandMenu\n onSave={() => void saveVersion()}\n imageGeneration={\n adapter.imageGeneration && {\n notify: adapter.notify,\n ...adapter.imageGeneration,\n }\n }\n badge={\n // The document's state, in place of a title row above the ribbon.\n <DocumentStateBadge\n state={\n snapshot || !ready.canEdit\n ? 'read-only'\n : ready.room\n ? 'co-editing'\n : isDraft\n ? 'draft'\n : undefined\n }\n />\n }\n />\n )}\n {!stream && <WordShortcuts scope={stageRef} />}\n {!stream && <TableTabKeys scope={stageRef} />}\n <div\n className=\"native-docx-stage\"\n ref={stageRef}\n onMouseDownCapture={(event) => {\n if (event.button === 2 && ref.current?.getSelectionPlacement())\n event.preventDefault()\n }}\n >\n <DocxEditor.Viewport className=\"native-docx-viewport\">\n <DocxEditor.Content />\n <DocxMentions\n initialCommentId={initialCommentId}\n mentions={adapter.mentions}\n notify={adapter.notify}\n getAgentStatus={adapter.getAgentStatus}\n requestAgent={\n adapter.requestAgent\n ? (request) => adapter.requestAgent!(documentId, request)\n : undefined\n }\n >\n <RoomInputBinding\n session={ready.room?.session}\n flushRef={flushInputRef}\n />\n <AgentUndoRoom.Provider value={ready.room?.ydoc ?? null}>\n <DocxEditorReview>\n {() => (\n <DocxEditorReview.Card>\n <DocxCommentActivity />\n <AgentUndo />\n </DocxEditorReview.Card>\n )}\n </DocxEditorReview>\n </AgentUndoRoom.Provider>\n </DocxMentions>\n {!compact && <DocxEditor.HeaderFooterChrome />}\n {!compact && <DocxEditor.NotesChrome />}\n <DocxEditor.Equation />\n <DocxEditor.HyperLink />\n <DocxEditor.ContextMenu>\n <DocxContextMenuExtras />\n <MySignatureContextItems />\n <SignatureFieldContextItem />\n </DocxEditor.ContextMenu>\n </DocxEditor.Viewport>\n {!compact && <DocxEditor.PageNumber />}\n </div>\n </SignatureFieldsProvider>\n </CrossReferencesProvider>\n </HouseTemplateProvider>\n </DefinedTermsProvider>\n </DocxAuthorContext.Provider>\n </DocxEditor.Root>\n </EditorBoundary>\n </div>\n )}\n <div className=\"native-docx-actions\">\n <span className=\"native-docx-status\" role=\"status\">\n {offline ? <WifiOff size={14} /> : !dirty && ready ? <Check size={14} /> : null}\n {status}\n </span>\n <DocxParticipants session={ready?.room?.session} />\n {!compact && (\n <select\n className=\"native-docx-zoom\"\n aria-label=\"Zoom\"\n data-testid=\"native-docx-zoom\"\n disabled={!ready}\n value={fitWidth ? 'fit' : String(zoomPercent)}\n onChange={(event) => pickZoom(event.target.value)}\n >\n <option value=\"fit\">Fit width</option>\n {[...new Set([...ZOOM_LEVELS, ...(fitWidth ? [] : [zoomPercent])])]\n .sort((a, b) => a - b)\n .map((level) => (\n <option key={level} value={String(level)}>\n {level}%\n </option>\n ))}\n </select>\n )}\n {!compact && (\n <button\n onClick={() => void exportDocument()}\n disabled={!ready}\n aria-label=\"Download DOCX\"\n >\n <Download size={14} />\n DOCX\n </button>\n )}\n {!compact && !snapshot && !stream && ready?.canEdit && (\n <button\n className=\"native-docx-save\"\n onClick={() => void saveVersion()}\n disabled={!ready || saving || offline}\n data-testid=\"native-docx-save\"\n >\n <Save size={14} />\n {saving ? 'Saving\u2026' : isDraft ? 'Save note' : 'Save version'}\n </button>\n )}\n </div>\n </section>\n )\n}\n"],
5
+ "mappings": "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",
6
6
  "names": []
7
7
  }
@@ -5,7 +5,7 @@ import React from 'react';
5
5
  * press outside it. `children` may be a function that receives `close`, for panels that close
6
6
  * themselves once the user has picked something.
7
7
  */
8
- export declare function RibbonMenu({ label, icon, children, className, testId, title, keepMounted, popoverClassName, }: {
8
+ export declare function RibbonMenu({ label, icon, children, className, testId, title, keepMounted, popoverClassName, restoreFocus, }: {
9
9
  label: string;
10
10
  /** Tooltip; defaults to `label`. */
11
11
  title?: string;
@@ -17,4 +17,6 @@ export declare function RibbonMenu({ label, icon, children, className, testId, t
17
17
  /** Keep the panel's content mounted (hidden) while closed, so its controls keep their state. */
18
18
  keepMounted?: boolean;
19
19
  popoverClassName?: string;
20
+ /** Return keyboard focus to the trigger when Escape closes this menu. */
21
+ restoreFocus?: boolean;
20
22
  }): React.JSX.Element;
@@ -9,17 +9,23 @@ function RibbonMenu({
9
9
  testId,
10
10
  title,
11
11
  keepMounted = false,
12
- popoverClassName
12
+ popoverClassName,
13
+ restoreFocus = false
13
14
  }) {
14
15
  const [open, setOpen] = useState(false);
15
16
  const element = useRef(null);
17
+ const trigger = useRef(null);
16
18
  useEffect(() => {
17
19
  if (!open) return;
18
20
  const dismiss = (event) => {
19
21
  if (!element.current?.contains(event.target)) setOpen(false);
20
22
  };
21
23
  const escape = (event) => {
22
- if (event.key === "Escape") setOpen(false);
24
+ if (event.key === "Escape") {
25
+ if (restoreFocus && element.current?.contains(document.activeElement))
26
+ trigger.current?.focus();
27
+ setOpen(false);
28
+ }
23
29
  };
24
30
  document.addEventListener("pointerdown", dismiss);
25
31
  document.addEventListener("keydown", escape);
@@ -27,12 +33,13 @@ function RibbonMenu({
27
33
  document.removeEventListener("pointerdown", dismiss);
28
34
  document.removeEventListener("keydown", escape);
29
35
  };
30
- }, [open]);
36
+ }, [open, restoreFocus]);
31
37
  return /* @__PURE__ */ jsxs("div", { className: "native-docx-ribbon-menu", ref: element, children: [
32
38
  /* @__PURE__ */ jsx(
33
39
  "button",
34
40
  {
35
41
  type: "button",
42
+ ref: trigger,
36
43
  className: ["native-docx-ribbon-trigger", className].filter(Boolean).join(" "),
37
44
  "aria-label": label,
38
45
  title: title ?? label,