@arbidocs/blocks 0.4.99 → 0.4.101

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 (38) hide show
  1. package/dist/{chunk-44TPPPRJ.cjs → chunk-FAGQTB3D.cjs} +958 -272
  2. package/dist/chunk-FAGQTB3D.cjs.map +1 -0
  3. package/dist/{chunk-C5RF47LD.js → chunk-G5JH2YMQ.js} +3 -3
  4. package/dist/{chunk-C5RF47LD.js.map → chunk-G5JH2YMQ.js.map} +1 -1
  5. package/dist/{chunk-4ZTIMQ7Z.js → chunk-MYALCKDR.js} +963 -277
  6. package/dist/chunk-MYALCKDR.js.map +1 -0
  7. package/dist/{chunk-MABEOI4S.cjs → chunk-Y5XW57U4.cjs} +5 -5
  8. package/dist/{chunk-MABEOI4S.cjs.map → chunk-Y5XW57U4.cjs.map} +1 -1
  9. package/dist/{chunk-3ICWR3BK.js → chunk-YGREW5TZ.js} +3 -3
  10. package/dist/{chunk-3ICWR3BK.js.map → chunk-YGREW5TZ.js.map} +1 -1
  11. package/dist/{chunk-QBEUCOC7.cjs → chunk-ZT2EBBSC.cjs} +5 -5
  12. package/dist/{chunk-QBEUCOC7.cjs.map → chunk-ZT2EBBSC.cjs.map} +1 -1
  13. package/dist/connect/docx.cjs +6 -6
  14. package/dist/connect/docx.js +4 -4
  15. package/dist/connect/index.cjs +3 -3
  16. package/dist/connect/index.js +2 -2
  17. package/dist/docx/NativeDocxEditor.d.ts +7 -2
  18. package/dist/docx/definitions/DefinedTerms.d.ts +1 -12
  19. package/dist/docx/definitions/commands.d.ts +3 -27
  20. package/dist/docx/index.cjs +38 -38
  21. package/dist/docx/index.d.ts +2 -1
  22. package/dist/docx/index.js +3 -3
  23. package/dist/docx/layout/GenerateImage.d.ts +50 -0
  24. package/dist/docx/layout/LayoutRibbon.d.ts +32 -0
  25. package/dist/docx/layout/LayoutTabs.d.ts +20 -0
  26. package/dist/docx/layout/PictureRibbon.d.ts +23 -0
  27. package/dist/docx/layout/TableKeys.d.ts +25 -0
  28. package/dist/docx/layout/TableRibbon.d.ts +11 -0
  29. package/dist/docx/layout/caption.d.ts +38 -0
  30. package/dist/docx/layout/presets.d.ts +40 -0
  31. package/dist/index.cjs +5 -5
  32. package/dist/index.js +1 -1
  33. package/package.json +5 -4
  34. package/src/docx/README.md +24 -3
  35. package/src/docx/layout/layout.css +120 -0
  36. package/src/docx/styles.css +2 -0
  37. package/dist/chunk-44TPPPRJ.cjs.map +0 -1
  38. package/dist/chunk-4ZTIMQ7Z.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/docx/export.ts","../src/docx/review/reviewModule.ts","../src/docx/review/useReview.ts","../src/docx/review/commentText.ts","../src/docx/review/DocxEditorReview.tsx","../src/docx/mentions.ts","../src/docx/DocxMentions.tsx","../src/docx/definitions/fragment.ts","../src/docx/definitions/commands.ts","../src/docx/definitions/port.ts","../src/docx/structural/trackedOrNoted.ts","../src/docx/structural/useTrackedOrNoted.ts","../src/docx/definitions/DefinedTerms.tsx","../src/docx/template/HouseTemplate.tsx","../src/docx/streamWordDocument.tsx","../src/docx/RibbonMenu.tsx","../src/docx/wordStyles.ts","../src/docx/StyleGallery.tsx","../src/docx/WordReferences.tsx","../src/docx/template/QuickParts.tsx","../src/docx/template/HouseTemplatePanel.tsx","../src/docx/NativeDocxEditor.tsx","../src/docx/fonts.ts"],"names":["document","useDocxEditor","useContext","mentions","createContext","useState","jsxs","jsx","AiMarkdown","useRef","useEffect","status","covered","attr","ok","useCallback","useMemo","createPortal","Dialog","DialogContent","DialogHeader","DialogTitle","React","Fragment","trackInsertion","ChevronDown","useParagraphStyle","footnote","endnote","styles","editor","levels","DocxEditor","useLayoutEffect","Check","Download"],"mappings":"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","file":"chunk-4ZTIMQ7Z.js","sourcesContent":["import { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\n\n/** Repair Word package declarations and duplicate fragment revision IDs on export. */\nexport function normalizeDocxExport(data: ArrayBuffer): ArrayBuffer {\n const files = unzipSync(new Uint8Array(data))\n const part = '[Content_Types].xml'\n const xml = new DOMParser().parseFromString(strFromU8(files[part]), 'application/xml')\n if (xml.getElementsByTagName('parsererror').length) throw new Error('Invalid DOCX content types.')\n const namespace = 'http://schemas.openxmlformats.org/package/2006/content-types'\n const types: Record<string, string> = {\n 'word/comments.xml':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.comments+xml',\n 'word/commentsExtended.xml':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtended+xml',\n 'word/commentsIds.xml':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsIds+xml',\n 'word/commentsExtensible.xml':\n 'application/vnd.openxmlformats-officedocument.wordprocessingml.commentsExtensible+xml',\n }\n let changed = false\n for (const [name, type] of Object.entries(types)) {\n if (!files[name]) continue\n let override = Array.from(xml.getElementsByTagNameNS(namespace, 'Override')).find(\n (node) => node.getAttribute('PartName') === '/' + name\n )\n if (!override) {\n override = xml.createElementNS(namespace, 'Override')\n override.setAttribute('PartName', '/' + name)\n xml.documentElement.appendChild(override)\n }\n if (override.getAttribute('ContentType') !== type) {\n override.setAttribute('ContentType', type)\n changed = true\n }\n }\n if (changed) files[part] = strToU8(new XMLSerializer().serializeToString(xml))\n const word = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\n for (const name of Object.keys(files)) {\n if (!/^word\\/(document|header\\d*|footer\\d*|footnotes|endnotes|comments)\\.xml$/.test(name))\n continue\n const document = new DOMParser().parseFromString(strFromU8(files[name]), 'application/xml')\n if (document.getElementsByTagName('parsererror').length)\n throw new Error('Invalid Word document XML.')\n const elements = Array.from(document.getElementsByTagName('*'))\n const used = new Set(\n elements.map((element) => element.getAttributeNS(word, 'id')).filter(Boolean)\n )\n const seen = new Set<string>()\n let next = 1,\n repaired = false\n for (const element of elements) {\n if (\n element.namespaceURI !== word ||\n !['ins', 'del', 'moveFrom', 'moveTo'].includes(element.localName)\n )\n continue\n const id = element.getAttributeNS(word, 'id')\n if (!id) continue\n if (seen.has(id)) {\n while (used.has(String(next))) next++\n const unique = String(next++)\n const attribute = element.getAttributeNodeNS(word, 'id')!\n element.setAttributeNS(word, attribute.name, unique)\n used.add(unique)\n repaired = true\n } else seen.add(id)\n }\n if (repaired) {\n files[name] = strToU8(new XMLSerializer().serializeToString(document))\n changed = true\n }\n }\n if (!changed) return data\n return zipSync(files).slice().buffer as ArrayBuffer\n}\n","import type { EditorModule } from '@docx-editor.dev/core'\nimport { collectReviewItems, revisionItemsOf } from '@docx-editor.dev/core/store'\n\ntype Part = Parameters<typeof revisionItemsOf>[0]\ntype PartNode = { id: string; children?: readonly PartNode[] }\n\nfunction findNode(node: PartNode, id: string): PartNode | undefined {\n if (node.id === id) return node\n for (const child of node.children ?? []) {\n const found = findNode(child, id)\n if (found) return found\n }\n return undefined\n}\n\n/** Revisions wholly inside one paragraph, read from a paragraph-scoped view of the part. */\nfunction revisionItemsOfParagraph(part: Part, paragraphId: string) {\n const paragraph = findNode(part.root as unknown as PartNode, paragraphId)\n if (!paragraph) return []\n return revisionItemsOf({ ...part, root: paragraph as unknown as Part['root'] })\n}\n\n/**\n * Comments and tracked changes: the review queue derivation and the markup display modes, both\n * provided by the Apache-2.0 core engine.\n */\nexport function reviewModule(): EditorModule {\n return {\n id: 'review',\n review: {\n displayModes: ['all-markup', 'simple-markup', 'proposed', 'original'],\n collectReviewItems,\n revisionItemsOfParagraph,\n },\n }\n}\n","import { createContext, useContext, useMemo } from 'react'\nimport type { Editor, ExecResult, ReviewItemPlacement } from '@docx-editor.dev/core'\nimport { useDocxEditor, useEditorSnapshot } from '@docx-editor.dev/react'\n\nexport type ReviewEntry = ReviewItemPlacement\n\nexport interface ReviewApi {\n /** False until the editor has mounted. */\n ready: boolean\n /** Every pending decision, in document order. */\n items: readonly ReviewEntry[]\n activeKey: string | null\n paneOpen: boolean\n setPaneOpen(open: boolean): void\n /** Focus a card's range in the document. Returns false when the engine refuses. */\n setActive(key: string | null, options?: { reveal?: false }): boolean\n reply(entry: ReviewEntry, text: string): boolean\n accept(entry: ReviewEntry): boolean\n reject(entry: ReviewEntry): boolean\n resolve(entry: ReviewEntry, resolved: boolean): boolean\n remove(entry: ReviewEntry): boolean\n addComment(text: string): boolean\n /** Move the document caret to the next or previous tracked change, wrapping at the ends. */\n navigate(direction: 'next' | 'previous'): boolean\n /** Accept or reject every change shown, as one undo step. */\n resolveAll(action: 'accept' | 'reject'): boolean\n}\n\nconst NONE: readonly ReviewEntry[] = []\n\nconst ok = (result: ExecResult | undefined): boolean => result?.ok === true\n\nexport function useReview(): ReviewApi {\n const editor = useDocxEditor() as Editor | null\n // Re-render on every editor event so pane state and the active card stay current.\n const version = useEditorSnapshot(editor)\n const revision = editor?.getReviewRevision() ?? 0\n // The queue is re-derived only when the editor's review revision moves.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const items = useMemo(() => (editor ? editor.getReviewItems() : NONE), [editor, revision])\n const paneOpen = editor?.isReviewPaneOpen() ?? false\n const activeKey = items.find((item) => item.isActive)?.key ?? null\n\n return useMemo<ReviewApi>(\n () => ({\n ready: editor !== null,\n items,\n activeKey,\n paneOpen,\n setPaneOpen: (open) => {\n if (editor && editor.isReviewPaneOpen() !== open) editor.exec({ type: 'toggleReviewPane' })\n },\n setActive: (key, options) => ok(editor?.setActiveReviewItem(key, options)),\n reply: (entry, text) => ok(editor?.replyToReviewItem(entry.key, text)),\n accept: (entry) => ok(editor?.acceptReviewItem(entry.key)),\n reject: (entry) => ok(editor?.rejectReviewItem(entry.key)),\n resolve: (entry, resolved) => ok(editor?.setCommentResolved(entry.key, resolved)),\n remove: (entry) => ok(editor?.deleteReviewItem(entry.key)),\n addComment: (text) => ok(editor?.addComment(text)),\n navigate: (direction) => ok(editor?.exec({ type: 'navigateReviewChange', direction })),\n resolveAll: (action) => ok(editor?.exec({ type: 'resolveAllReviewChanges', action })),\n }),\n [editor, items, activeKey, paneOpen, version]\n )\n}\n\nexport const ReviewItemContext = createContext<ReviewEntry | null>(null)\n\n/** The card being rendered. Null outside a card. */\nexport function useReviewItem(): ReviewEntry | null {\n return useContext(ReviewItemContext)\n}\n","import type { ReviewEntry } from './useReview'\n\ntype Node = {\n readonly kind?: string\n readonly localName?: string\n readonly value?: string\n readonly children?: readonly Node[]\n}\n\n/** Elements whose text is not the comment's words: deleted text, field codes, properties. */\nconst SKIP = new Set(['delText', 'instrText', 'delInstrText', 'pPr', 'rPr'])\n\nfunction inline(node: Node): string {\n if (node.kind === 'textValue') return node.value ?? ''\n if (node.localName && SKIP.has(node.localName)) return ''\n if (node.localName === 'br' || node.localName === 'cr') return '\\n'\n if (node.localName === 'tab') return '\\t'\n return (node.children ?? []).map(inline).join('')\n}\n\n/**\n * A comment's words with its paragraphs on their own lines. The engine's `text` joins a comment's\n * paragraphs with spaces, which flattens the markdown ARBI writes (one paragraph per line) into a\n * run-on line; reading the paragraphs keeps lists and headings intact.\n */\nexport function commentText(entry: ReviewEntry): string {\n if (entry.kind !== 'comment') return entry.text\n const blocks = (entry.item?.comment?.blocks ?? []) as unknown as readonly Node[]\n const text = blocks.map(inline).join('\\n').trim()\n return text || entry.text\n}\n","import React, { useCallback, useContext, useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { ReviewRailContext, useDocxEditor } from '@docx-editor.dev/react'\nimport { AiMarkdown } from '@arbidocs/react/ui'\nimport {\n Check,\n CheckCheck,\n ChevronDown,\n ChevronLeft,\n ChevronRight,\n ChevronUp,\n CircleCheck,\n MessageSquare,\n MessageSquarePlus,\n PencilLine,\n RotateCcw,\n SendHorizontal,\n Trash2,\n X,\n} from 'lucide-react'\nimport { commentText } from './commentText'\nimport { ReviewItemContext, useReview, type ReviewEntry } from './useReview'\n\nconst CARD_GAP = 8\n/** Margin symbols closer than this share one symbol, so a busy paragraph stays tappable. */\nconst CLUSTER_GAP = 24\n/**\n * Scroll-area width from which the cards get their own column beside the page, as in Word.\n * Narrower than this the page needs the room, so only margin symbols are shown and a symbol\n * opens its thread in a bubble.\n */\nconst REVIEW_MARGIN_MIN_WIDTH = 900\n\nconst REVISION_LABELS: Record<string, string> = {\n insert: 'Inserted',\n delete: 'Deleted',\n replace: 'Replaced',\n moveFrom: 'Moved from here',\n moveTo: 'Moved to here',\n format: 'Formatted',\n paragraphMark: 'Paragraph break',\n structural: 'Table change',\n}\n\ntype Review = ReturnType<typeof useReview>\ntype Layout = 'margin' | 'compact'\n\nfunction isTopLevel(entry: ReviewEntry): boolean {\n if (entry.kind === 'comment') return !entry.parentId && !entry.parentRevisionId\n if (entry.kind === 'custom') return entry.item.carded\n return true\n}\n\nfunction kindLabel(entry: ReviewEntry): string {\n if (entry.kind === 'revision') return REVISION_LABELS[entry.revisionKind] ?? 'Change'\n if (entry.kind === 'comment') return entry.resolved ? 'Resolved' : 'Comment'\n return 'Note'\n}\n\nfunction parseDate(value: string | undefined): Date | null {\n if (!value) return null\n const date = new Date(value)\n return Number.isNaN(date.getTime()) ? null : date\n}\n\nfunction relativeDate(date: Date): string {\n const seconds = (Date.now() - date.getTime()) / 1000\n if (seconds < 45) return 'just now'\n if (seconds < 45 * 60) return `${Math.round(seconds / 60)}m ago`\n if (seconds < 22 * 3600) return `${Math.round(seconds / 3600)}h ago`\n if (seconds < 7 * 86400) return `${Math.round(seconds / 86400)}d ago`\n const sameYear = date.getFullYear() === new Date().getFullYear()\n return date.toLocaleDateString(undefined, {\n day: 'numeric',\n month: 'short',\n year: sameYear ? undefined : 'numeric',\n })\n}\n\n/** A stable hue per author, so each reviewer keeps one colour across cards and sessions. */\nfunction authorHue(author: string): number {\n let hash = 0\n for (const char of author) hash = (hash * 31 + char.charCodeAt(0)) | 0\n return Math.abs(hash) % 360\n}\n\nfunction Avatar({ entry }: { entry: ReviewEntry }) {\n return (\n <span\n className=\"native-docx-review-avatar\"\n aria-hidden=\"true\"\n style={{ '--review-author-hue': authorHue(entry.author || '') } as React.CSSProperties}\n >\n {entry.initials}\n </span>\n )\n}\n\nfunction Byline({ entry, children }: { entry: ReviewEntry; children?: React.ReactNode }) {\n const date = parseDate(entry.date)\n return (\n <div className=\"native-docx-review-byline\">\n <Avatar entry={entry} />\n <div className=\"native-docx-review-who\">\n <span className=\"native-docx-review-author\">{entry.author || 'Reviewer'}</span>\n <span className=\"native-docx-review-meta\">\n {kindLabel(entry)}\n {date && (\n <>\n {' · '}\n <time\n className=\"native-docx-review-date\"\n dateTime={date.toISOString()}\n title={date.toLocaleString()}\n >\n {relativeDate(date)}\n </time>\n </>\n )}\n </span>\n </div>\n {children}\n </div>\n )\n}\n\n/** The words a change covers, drawn the way the page marks them up. */\nfunction ChangeText({ entry }: { entry: ReviewEntry & { kind: 'revision' } }) {\n const removed = entry.revisionKind === 'replace' ? entry.replacedText : undefined\n const struck = entry.revisionKind === 'delete' || entry.revisionKind === 'moveFrom'\n const added =\n entry.revisionKind === 'insert' || entry.revisionKind === 'moveTo' || removed !== undefined\n return (\n <p className=\"native-docx-review-change\" data-testid=\"review-text\">\n {removed && (\n <>\n <del>{removed}</del>\n <span className=\"native-docx-review-arrow\" aria-hidden=\"true\">\n →\n </span>\n </>\n )}\n {struck ? (\n <del>{entry.text}</del>\n ) : added ? (\n <ins>{entry.text}</ins>\n ) : (\n <span>{entry.text}</span>\n )}\n </p>\n )\n}\n\n/**\n * A comment's words, formatted like every other message in the app (ARBI answers in markdown).\n * The text comes from the .docx, which anyone may have written, so inline HTML stays text.\n */\nfunction CommentText({ text, testId }: { text: string; testId?: string }) {\n return (\n <div className=\"native-docx-review-text\" data-testid={testId}>\n <AiMarkdown className=\"native-docx-review-markdown\" allowHtml={false}>\n {text}\n </AiMarkdown>\n </div>\n )\n}\n\nfunction Reply({ entry }: { entry: ReviewEntry }) {\n return (\n <div className=\"native-docx-review-message\">\n <Byline entry={entry} />\n <CommentText text={commentText(entry)} />\n </div>\n )\n}\n\nfunction ReplyForm({\n entry,\n review,\n onDismiss,\n}: {\n entry: ReviewEntry\n review: Review\n onDismiss: () => void\n}) {\n const [text, setText] = useState('')\n return (\n <form\n className=\"native-docx-review-reply\"\n onClick={(event) => event.stopPropagation()}\n onSubmit={(event) => {\n event.preventDefault()\n const value = text.trim()\n if (value && review.reply(entry, value)) setText('')\n }}\n >\n <input\n data-testid=\"review-reply-input\"\n aria-label=\"Reply\"\n placeholder=\"Reply…\"\n value={text}\n onChange={(event) => setText(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n onDismiss()\n }\n }}\n />\n <button\n type=\"submit\"\n className=\"native-docx-review-icon native-docx-review-send\"\n aria-label=\"Reply\"\n title=\"Reply\"\n disabled={!text.trim()}\n >\n <SendHorizontal size={14} />\n </button>\n <button\n type=\"button\"\n className=\"native-docx-review-icon\"\n data-testid=\"review-reply-cancel\"\n aria-label=\"Cancel\"\n title=\"Cancel\"\n onClick={onDismiss}\n >\n <X size={14} />\n </button>\n </form>\n )\n}\n\nfunction Card({\n entry,\n replies,\n review,\n extra,\n cardRef,\n top,\n onDismiss,\n}: {\n entry: ReviewEntry\n replies: readonly ReviewEntry[]\n review: Review\n extra?: React.ReactNode\n cardRef?: (element: HTMLElement | null) => void\n /** Omitted for a card inside a bubble, which flows instead of sitting at its anchor. */\n top?: number\n onDismiss: () => void\n}) {\n const resolved = entry.kind === 'comment' && entry.resolved\n return (\n <ReviewItemContext.Provider value={entry}>\n <article\n ref={cardRef}\n className=\"native-docx-review-card\"\n tabIndex={0}\n aria-label={`${entry.kind === 'revision' ? 'Change' : 'Comment'} by ${entry.author || 'reviewer'}`}\n onKeyDown={(event) => {\n if (event.target !== event.currentTarget) return\n if ((event.key === 'Enter' || event.key === ' ') && entry.activatable) {\n event.preventDefault()\n review.setActive(entry.key)\n }\n }}\n data-testid=\"review-card\"\n data-kind={entry.kind}\n data-change={entry.kind === 'revision' ? entry.revisionKind : undefined}\n data-active={entry.isActive || undefined}\n data-resolved={resolved || undefined}\n data-floating={top === undefined || undefined}\n style={top === undefined ? undefined : { top }}\n onClick={() => {\n if (entry.activatable && !entry.isActive) review.setActive(entry.key)\n }}\n >\n <Byline entry={entry}>\n {entry.kind === 'comment' && (\n <div className=\"native-docx-review-tools\">\n <button\n type=\"button\"\n className=\"native-docx-review-icon\"\n data-testid=\"review-resolve\"\n aria-label={entry.resolved ? 'Reopen' : 'Resolve'}\n title={entry.resolved ? 'Reopen' : 'Resolve'}\n onClick={(event) => {\n event.stopPropagation()\n review.resolve(entry, !entry.resolved)\n }}\n >\n {entry.resolved ? <RotateCcw size={14} /> : <CircleCheck size={14} />}\n </button>\n <button\n type=\"button\"\n className=\"native-docx-review-icon\"\n data-testid=\"review-delete\"\n aria-label=\"Delete\"\n title=\"Delete\"\n onClick={(event) => {\n event.stopPropagation()\n review.remove(entry)\n }}\n >\n <Trash2 size={14} />\n </button>\n </div>\n )}\n </Byline>\n {entry.kind === 'revision' ? (\n <ChangeText entry={entry} />\n ) : (\n <CommentText text={commentText(entry)} testId=\"review-text\" />\n )}\n {replies.length > 0 && (\n <div className=\"native-docx-review-thread\">\n {replies.map((reply) => (\n <Reply key={reply.key} entry={reply} />\n ))}\n </div>\n )}\n {extra}\n {entry.kind === 'revision' && !entry.readOnly && (\n <div className=\"native-docx-review-decide\">\n <button\n type=\"button\"\n className=\"native-docx-review-accept\"\n data-testid=\"review-accept\"\n onClick={(event) => {\n event.stopPropagation()\n review.accept(entry)\n }}\n >\n <Check size={14} />\n Accept\n </button>\n <button\n type=\"button\"\n className=\"native-docx-review-reject\"\n data-testid=\"review-reject\"\n onClick={(event) => {\n event.stopPropagation()\n review.reject(entry)\n }}\n >\n <X size={14} />\n Reject\n </button>\n </div>\n )}\n {entry.isActive && entry.kind !== 'custom' && (\n <ReplyForm entry={entry} review={review} onDismiss={onDismiss} />\n )}\n </article>\n </ReviewItemContext.Provider>\n )\n}\n\nfunction Draft({\n top,\n onSubmit,\n onCancel,\n formRef,\n}: {\n /** Omitted inside a bubble. */\n top?: number\n formRef?: (element: HTMLElement | null) => void\n onSubmit: (text: string) => void\n onCancel: () => void\n}) {\n const [text, setText] = useState('')\n const input = useRef<HTMLInputElement>(null)\n useEffect(() => input.current?.focus(), [])\n return (\n <form\n ref={formRef}\n className=\"native-docx-review-card native-docx-review-draft\"\n data-testid=\"review-draft\"\n data-floating={top === undefined || undefined}\n style={top === undefined ? undefined : { top }}\n onSubmit={(event) => {\n event.preventDefault()\n if (text.trim()) onSubmit(text.trim())\n }}\n >\n <input\n ref={input}\n data-testid=\"review-draft-input\"\n aria-label=\"Comment\"\n placeholder=\"Add a comment…\"\n value={text}\n onChange={(event) => setText(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n onCancel()\n }\n }}\n />\n <div className=\"native-docx-review-decide\">\n <button type=\"submit\" className=\"native-docx-review-accept\" disabled={!text.trim()}>\n Comment\n </button>\n <button\n type=\"button\"\n className=\"native-docx-review-plain\"\n data-testid=\"review-draft-cancel\"\n onClick={onCancel}\n >\n Cancel\n </button>\n </div>\n </form>\n )\n}\n\n/** The scroll container the rail is drawn in, and its width once laid out (0 until then). */\nfunction useScrollArea(anchor: React.RefObject<HTMLElement | null>, ready: boolean) {\n const [area, setArea] = useState<{ element: HTMLElement | null; width: number }>({\n element: null,\n width: 0,\n })\n useLayoutEffect(() => {\n const element = anchor.current?.closest<HTMLElement>('.docx-editor__scroll-container') ?? null\n const measure = () =>\n setArea((previous) =>\n previous.element === element && previous.width === (element?.clientWidth ?? 0)\n ? previous\n : { element, width: element?.clientWidth ?? 0 }\n )\n measure()\n if (!element || typeof ResizeObserver === 'undefined') return\n const observer = new ResizeObserver(measure)\n observer.observe(element)\n return () => observer.disconnect()\n }, [anchor, ready])\n return area\n}\n\n/**\n * The review rail: one card per comment thread or tracked change, aligned to its place in the page.\n * With room beside the page the cards stand in their own margin column, as in Word; without it only\n * margin symbols are shown, and a symbol opens its thread in a bubble. Everything it shows and every\n * action it takes goes through the editor's own review API.\n */\nfunction DocxEditorReviewRail({\n children,\n}: {\n children?: (entry: ReviewEntry) => React.ReactNode\n}) {\n const editor = useDocxEditor()\n const registry = useContext(ReviewRailContext)\n const review = useReview()\n const [draft, setDraft] = useState<{ anchorY: number } | null>(null)\n const [tops, setTops] = useState<Record<string, number>>({})\n const [showResolved, setShowResolved] = useState(true)\n const elements = useRef(new Map<string, HTMLElement>())\n const anchor = useRef<HTMLDivElement>(null)\n const toolbar = useRef<HTMLDivElement>(null)\n const area = useScrollArea(anchor, review.ready)\n // Unmeasured (first frame, or no layout at all) counts as wide, as the engine's own gutter does.\n const layout: Layout =\n area.width === 0 || area.width >= REVIEW_MARGIN_MIN_WIDTH ? 'margin' : 'compact'\n\n const openDraft = useCallback(() => {\n const placement = editor?.getSelectionPlacement()\n if (!placement) return\n review.setPaneOpen(true)\n setDraft({ anchorY: placement.anchorY })\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor, review.setPaneOpen])\n\n useEffect(() => registry?.register(), [registry])\n useEffect(() => registry?.registerCommentDraft(openDraft), [registry, openDraft])\n\n // Each layout starts in its own default: the margin column shown, the bubble closed. Later the\n // reader's own toggles stand until the layout itself changes.\n const shownLayout = useRef<Layout | null>(null)\n useEffect(() => {\n if (!review.ready || area.width === 0 || shownLayout.current === layout) return\n // On a compact screen a new tracked change must not open a bubble by itself.\n editor?.setReviewPaneOptions({ opening: layout === 'margin' ? 'auto' : 'manual' })\n // The engine starts with its pane open; on a first compact frame that would be a bubble nobody\n // asked for. A thread already activated on open (a deep link to a comment) stays shown.\n const deepLinked = shownLayout.current === null && review.activeKey !== null\n shownLayout.current = layout\n if (layout === 'margin') review.setPaneOpen(true)\n else if (!deepLinked) {\n setDraft(null)\n review.setPaneOpen(false)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor, layout, area.width, review.ready, review.setPaneOpen])\n\n const scale = editor?.getRenderScale() ?? 1\n const top = review.items\n .filter(isTopLevel)\n .filter((entry) => entry.anchorY !== null)\n .filter((entry) => showResolved || entry.kind !== 'comment' || !entry.resolved)\n const changes = review.items.filter((entry) => entry.kind === 'revision').length\n const comments = top.filter((entry) => entry.kind === 'comment').length\n const hasResolved = review.items.some((entry) => entry.kind === 'comment' && entry.resolved)\n const repliesOf = useCallback(\n (entry: ReviewEntry) =>\n review.items.filter(\n (other) =>\n other.kind === 'comment' &&\n (other.parentId === entry.id || other.parentRevisionId === entry.id)\n ),\n [review.items]\n )\n const column = layout === 'margin' && review.paneOpen && (top.length > 0 || draft !== null)\n const bubbleOpen = layout === 'compact' && (review.paneOpen || draft !== null)\n\n // The margin column takes its room from the page, which the editor then refits beside it.\n useEffect(() => {\n const element = area.element\n if (!element) return\n if (column) element.setAttribute('data-review-margin', '')\n else element.removeAttribute('data-review-margin')\n return () => element.removeAttribute('data-review-margin')\n }, [area.element, column])\n\n const dismiss = useCallback(() => {\n setDraft(null)\n if (layout === 'compact') review.setPaneOpen(false)\n else review.setActive(null)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [layout, review.setPaneOpen, review.setActive])\n\n // A bubble closes when the reader goes back to the page, or presses Escape.\n useEffect(() => {\n const element = area.element\n if (!element || !bubbleOpen) return\n const close = (event: PointerEvent) => {\n const target = event.target\n if (\n target instanceof Element &&\n target.closest(\n '.native-docx-review-bubble, .native-docx-review-marker, .native-docx-review-add'\n )\n )\n return\n dismiss()\n }\n // Focus may still be on the symbol that opened the bubble, so Escape is heard on the whole area.\n // On the document, after React: a field that handled Escape itself (a mention list) stops it.\n const escape = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return\n if (!(event.target instanceof Node) || !element.contains(event.target)) return\n // Handled: one press closes one layer, so the panel holding the document stays open.\n event.preventDefault()\n dismiss()\n }\n const document = element.ownerDocument\n element.addEventListener('pointerdown', close)\n document.addEventListener('keydown', escape)\n return () => {\n element.removeEventListener('pointerdown', close)\n document.removeEventListener('keydown', escape)\n }\n }, [area.element, bubbleOpen, dismiss])\n\n // Stack cards downward from their anchors, below the column's header, so none overlaps the one\n // above it (nor the header).\n useLayoutEffect(() => {\n if (!column) return\n const next: Record<string, number> = {}\n let floor = (toolbar.current?.offsetHeight ?? 0) + CARD_GAP\n const rows: { key: string; y: number }[] = top.map((entry) => ({\n key: entry.key,\n y: (entry.anchorY ?? 0) * scale,\n }))\n if (draft) rows.push({ key: '__draft', y: draft.anchorY * scale })\n rows.sort((a, b) => a.y - b.y)\n for (const row of rows) {\n const y = Math.max(row.y, floor)\n next[row.key] = y\n const height = elements.current.get(row.key)?.offsetHeight ?? 96\n floor = y + height + CARD_GAP\n }\n setTops((previous) => {\n const same =\n Object.keys(next).length === Object.keys(previous).length &&\n Object.entries(next).every(([key, value]) => previous[key] === value)\n return same ? previous : next\n })\n })\n\n if (!review.ready) return <div ref={anchor} className=\"native-docx-review\" />\n\n const selection = editor?.getSelectionPlacement()\n const addComment = selection && (\n <button\n type=\"button\"\n className=\"native-docx-review-add\"\n data-testid=\"review-add-comment\"\n aria-label=\"Add comment\"\n title=\"Add comment\"\n style={{ top: selection.anchorY * scale }}\n onMouseDown={(event) => event.preventDefault()}\n onClick={openDraft}\n >\n <MessageSquarePlus size={14} />\n </button>\n )\n\n if (column) {\n return (\n <div ref={anchor} className=\"native-docx-review\">\n <aside className=\"native-docx-review-pane\" data-testid=\"review-pane\" aria-label=\"Review\">\n {addComment}\n <div ref={toolbar} className=\"native-docx-review-toolbar\" data-testid=\"review-toolbar\">\n <span className=\"native-docx-review-summary\">\n {[\n changes && `${changes} ${changes === 1 ? 'change' : 'changes'}`,\n comments && `${comments} ${comments === 1 ? 'comment' : 'comments'}`,\n ]\n .filter(Boolean)\n .join(' · ') || 'Review'}\n </span>\n {hasResolved && (\n <label className=\"native-docx-review-switch\">\n <input\n type=\"checkbox\"\n data-testid=\"review-show-resolved\"\n checked={showResolved}\n onChange={(event) => setShowResolved(event.target.checked)}\n />\n Resolved\n </label>\n )}\n {changes > 0 && <BulkActions review={review} navigate />}\n </div>\n {draft && (\n <Draft\n top={tops.__draft ?? draft.anchorY * scale}\n formRef={(element) => {\n if (element) elements.current.set('__draft', element)\n }}\n onCancel={() => setDraft(null)}\n onSubmit={(text) => {\n if (review.addComment(text)) setDraft(null)\n }}\n />\n )}\n {top.map((entry) => (\n <Card\n key={entry.key}\n entry={entry}\n replies={repliesOf(entry)}\n review={review}\n extra={children?.(entry)}\n top={tops[entry.key] ?? (entry.anchorY ?? 0) * scale}\n onDismiss={dismiss}\n cardRef={(element) => {\n if (element) elements.current.set(entry.key, element)\n else elements.current.delete(entry.key)\n }}\n />\n ))}\n </aside>\n </div>\n )\n }\n\n // Margin symbols: one per cluster of nearby items, opening the margin (wide) or a bubble (compact).\n const clusters: { y: number; entries: ReviewEntry[] }[] = []\n for (const entry of [...top].sort((a, b) => (a.anchorY ?? 0) - (b.anchorY ?? 0))) {\n const y = (entry.anchorY ?? 0) * scale\n const last = clusters[clusters.length - 1]\n if (last && y - last.y < CLUSTER_GAP) last.entries.push(entry)\n else clusters.push({ y, entries: [entry] })\n }\n const shown = bubbleOpen\n ? draft\n ? null\n : (clusters.find((cluster) => cluster.entries.some((entry) => entry.isActive)) ?? clusters[0])\n : undefined\n const focus = shown?.entries.find((entry) => entry.isActive) ?? shown?.entries[0]\n const position = focus ? top.indexOf(focus) : -1\n const step = (offset: number) => {\n const next = top[position + offset]\n if (next) review.setActive(next.key)\n }\n\n return (\n <div ref={anchor} className=\"native-docx-review\">\n <div className=\"native-docx-review-markers\" data-testid=\"review-markers\">\n {addComment}\n {clusters.map((cluster) => {\n const [first] = cluster.entries\n const comment = cluster.entries.some((entry) => entry.kind === 'comment')\n return (\n <button\n key={first.key}\n type=\"button\"\n className=\"native-docx-review-marker\"\n data-testid=\"review-marker\"\n data-kind={comment ? 'comment' : first.kind}\n data-active={cluster === shown || undefined}\n aria-label={\n cluster.entries.length === 1\n ? `${first.author}: ${first.text.slice(0, 60)}`\n : `${cluster.entries.length} comments and changes`\n }\n aria-expanded={layout === 'compact' ? cluster === shown : undefined}\n style={{ top: cluster.y }}\n onClick={() => {\n if (layout === 'compact' && cluster === shown) return dismiss()\n setDraft(null)\n review.setPaneOpen(true)\n review.setActive(first.key)\n }}\n >\n {comment ? <MessageSquare size={13} /> : <PencilLine size={13} />}\n {cluster.entries.length > 1 && (\n <span className=\"native-docx-review-count\">{cluster.entries.length}</span>\n )}\n </button>\n )\n })}\n {bubbleOpen && (draft || shown || top.length === 0) && (\n <div\n className=\"native-docx-review-bubble\"\n data-testid=\"review-bubble\"\n role=\"dialog\"\n data-state=\"open\"\n aria-label=\"Review\"\n style={{\n top: draft ? draft.anchorY * scale : (shown?.y ?? 0),\n width: Math.max(220, Math.min(340, area.width - 56)),\n }}\n onKeyDown={(event) => {\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n dismiss()\n }\n }}\n >\n {draft ? (\n <Draft\n onCancel={dismiss}\n onSubmit={(text) => {\n if (review.addComment(text)) setDraft(null)\n }}\n />\n ) : (\n <>\n <div className=\"native-docx-review-bubble-head\">\n {top.length > 1 && position >= 0 && (\n <>\n <button\n type=\"button\"\n className=\"native-docx-review-icon\"\n data-testid=\"review-bubble-previous\"\n aria-label=\"Previous\"\n disabled={position === 0}\n onClick={() => step(-1)}\n >\n <ChevronLeft size={14} />\n </button>\n <span className=\"native-docx-review-summary\">\n {position + 1} of {top.length}\n </span>\n <button\n type=\"button\"\n className=\"native-docx-review-icon\"\n data-testid=\"review-bubble-next\"\n aria-label=\"Next\"\n disabled={position === top.length - 1}\n onClick={() => step(1)}\n >\n <ChevronRight size={14} />\n </button>\n </>\n )}\n <button\n type=\"button\"\n className=\"native-docx-review-icon native-docx-review-close\"\n data-testid=\"review-bubble-close\"\n aria-label=\"Close\"\n onClick={dismiss}\n >\n <X size={14} />\n </button>\n </div>\n {shown?.entries.map((entry) => (\n <Card\n key={entry.key}\n entry={entry}\n replies={repliesOf(entry)}\n review={review}\n extra={children?.(entry)}\n onDismiss={dismiss}\n />\n ))}\n {!shown && (\n <p className=\"native-docx-review-empty\" data-testid=\"review-empty\">\n No comments or changes.\n </p>\n )}\n {changes > 1 && (\n <div className=\"native-docx-review-bubble-foot\">\n <BulkActions review={review} />\n </div>\n )}\n </>\n )}\n </div>\n )}\n </div>\n </div>\n )\n}\n\nfunction BulkActions({ review, navigate }: { review: Review; navigate?: boolean }) {\n return (\n <div className=\"native-docx-review-bulk\">\n {navigate && (\n <span className=\"native-docx-review-segment\">\n <button\n type=\"button\"\n className=\"native-docx-review-icon\"\n data-testid=\"review-previous\"\n aria-label=\"Previous change\"\n title=\"Previous change\"\n onClick={() => review.navigate('previous')}\n >\n <ChevronUp size={14} />\n </button>\n <button\n type=\"button\"\n className=\"native-docx-review-icon\"\n data-testid=\"review-next\"\n aria-label=\"Next change\"\n title=\"Next change\"\n onClick={() => review.navigate('next')}\n >\n <ChevronDown size={14} />\n </button>\n </span>\n )}\n <button\n type=\"button\"\n className=\"native-docx-review-accept\"\n data-testid=\"review-accept-all\"\n onClick={() => review.resolveAll('accept')}\n >\n <CheckCheck size={14} />\n Accept all\n </button>\n <button\n type=\"button\"\n className=\"native-docx-review-reject\"\n data-testid=\"review-reject-all\"\n onClick={() => review.resolveAll('reject')}\n >\n <X size={14} />\n Reject all\n </button>\n </div>\n )\n}\n\nfunction ReviewCardSlot({ children }: { children?: React.ReactNode }) {\n return <div className=\"native-docx-review-extra\">{children}</div>\n}\n\nexport const DocxEditorReview = Object.assign(DocxEditorReviewRail, { Card: ReviewCardSlot })\n","import { extractMentions, type MentionCandidate } from '../chat/mentions'\n\nexport interface DocxMention {\n id: string\n name: string\n kind: 'human' | 'agent'\n}\n\nexport function mentionCandidates(mentions: readonly DocxMention[]): MentionCandidate[] {\n return [\n { id: 'arbi', label: 'ARBI', kind: 'assistant' as const },\n ...mentions\n .filter((person) => person.name.trim())\n .map((person) => ({\n id: person.id,\n label: person.name,\n kind: person.kind === 'agent' ? ('assistant' as const) : ('user' as const),\n })),\n ]\n}\n\nexport function mentionedDocxRecipients(text: string, mentions: readonly DocxMention[]): string[] {\n return extractMentions(text, mentionCandidates(mentions)).map((person) => person.id)\n}\n","import React, { createContext, useContext, useEffect, useRef, useState } from 'react'\nimport { createPortal } from 'react-dom'\nimport { useReview, useReviewItem } from './review'\nimport { commentText } from './review/commentText'\nimport { AiMarkdown, Dialog, DialogContent, DialogHeader, DialogTitle } from '@arbidocs/react/ui'\nimport { MentionMenu } from '../chat/MentionMenu'\nimport { filterMentionCandidates, findMentionQuery } from '../chat/mentions'\nimport { mentionCandidates, mentionedDocxRecipients, type DocxMention } from './mentions'\nexport type { DocxMention } from './mentions'\n\nexport interface DocxAgentCommentRequest {\n commentId: string\n instruction: string\n requestId: string\n recipientIds: string[]\n}\n\nexport type DocxAgentRunStatus =\n 'queued' | 'in_progress' | 'completed' | 'failed' | 'cancelled' | 'incomplete'\nexport interface DocxMentionDelivery {\n responseIds: string[]\n}\ntype Activity = {\n commentId: string\n label: string\n status: DocxAgentRunStatus | 'delivering' | 'unknown'\n}\nconst ActivityContext = createContext<Record<string, Activity>>({})\n\n/** Extra card content using the upstream review context, including a full-thread reader. */\nexport function DocxCommentActivity() {\n const item = useReviewItem()\n const review = useReview()\n const activity = useContext(ActivityContext)\n const [reading, setReading] = useState(false)\n if (!item || item.kind !== 'comment') return null\n const commentId = item.parentId || item.item.id\n const thread = review.items.filter(\n (entry) =>\n entry.kind === 'comment' && (entry.item.id === commentId || entry.parentId === commentId)\n )\n const statuses = Object.entries(activity).filter(([, run]) => run.commentId === commentId)\n const labels = {\n delivering: 'Delivering mention…',\n queued: 'Queued…',\n in_progress: 'Working…',\n completed: 'Finished',\n failed: 'Failed',\n cancelled: 'Stopped',\n incomplete: 'Incomplete',\n unknown: 'Status unavailable',\n }\n return (\n <div className=\"native-docx-comment-extra\" data-review-selectable=\"\">\n {statuses.map(([id, run]) => (\n <div\n key={id}\n role=\"status\"\n data-testid=\"docx-comment-agent-status\"\n data-status={run.status}\n className=\"native-docx-comment-activity\"\n >\n {['delivering', 'queued', 'in_progress'].includes(run.status) && (\n <span className=\"native-docx-agent-spinner\" aria-hidden=\"true\" />\n )}\n {run.label}: {labels[run.status]}\n </div>\n ))}\n <button\n type=\"button\"\n data-testid=\"docx-read-full-thread\"\n onClick={(event) => {\n event.stopPropagation()\n setReading(true)\n }}\n >\n Read full thread\n </button>\n <Dialog open={reading} onOpenChange={setReading}>\n <DialogContent\n className=\"max-h-[85dvh] overflow-y-auto\"\n onClick={(event) => event.stopPropagation()}\n >\n <DialogHeader>\n <DialogTitle>Document comment</DialogTitle>\n </DialogHeader>\n {thread.map((entry) => (\n <div key={entry.key} className=\"space-y-1 border-b pb-4 last:border-0\">\n <p className=\"text-sm font-medium\">{entry.author || 'Reviewer'}</p>\n <div data-testid=\"docx-full-comment-text\">\n {/* A .docx comment anyone may have written: markdown formats, inline HTML stays text. */}\n <AiMarkdown allowHtml={false}>{commentText(entry)}</AiMarkdown>\n </div>\n </div>\n ))}\n {statuses.map(([id, run]) => (\n <p key={id} role=\"status\" className=\"text-sm\">\n {run.label}: {labels[run.status]}\n </p>\n ))}\n </DialogContent>\n </Dialog>\n </div>\n )\n}\n\n/** Adds mentions to the upstream comment inputs without replacing its review layout. */\nexport function DocxMentions({\n children,\n mentions = [],\n initialCommentId,\n requestAgent,\n getAgentStatus,\n notify,\n}: {\n children: React.ReactNode\n mentions?: readonly DocxMention[]\n initialCommentId?: string\n requestAgent?: (request: DocxAgentCommentRequest) => Promise<DocxMentionDelivery | void>\n getAgentStatus?: (responseId: string) => Promise<DocxAgentRunStatus>\n notify?: (message: string, kind: 'success' | 'error') => void\n}) {\n const review = useReview()\n const [activity, setActivity] = useState<Record<string, Activity>>({})\n const root = useRef<HTMLDivElement>(null)\n const [composers, setComposers] = useState<HTMLInputElement[]>([])\n useEffect(() => {\n const element = root.current\n if (!element || !requestAgent) return\n const discover = () => {\n const fields = Array.from(\n element.querySelectorAll<HTMLInputElement>(\n '[data-testid=\"review-draft-input\"], [data-testid=\"review-reply-input\"]'\n )\n ).filter((field) => !field.readOnly && !!field.closest('form'))\n setComposers((previous) =>\n previous.length === fields.length &&\n previous.every((field, index) => field === fields[index])\n ? previous\n : fields\n )\n }\n discover()\n const observer = new MutationObserver(discover)\n observer.observe(element, { childList: true, subtree: true })\n return () => observer.disconnect()\n }, [requestAgent])\n const prefixMention = (field: HTMLInputElement, name = 'ARBI') => {\n const value = `@${name} ${field.value}`\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set?.call(field, value)\n field.dispatchEvent(new Event('input', { bubbles: true }))\n field.focus()\n field.setSelectionRange(value.length, value.length)\n setSuggestions(null)\n }\n const alive = useRef(true)\n useEffect(() => {\n alive.current = true\n return () => {\n alive.current = false\n }\n }, [])\n const activated = useRef<string | undefined>(undefined)\n useEffect(() => {\n if (!initialCommentId || activated.current === initialCommentId || !review.ready) return\n const target = review.items.find(\n (item) => item.kind === 'comment' && item.item.id === initialCommentId\n )\n if (!target) return\n review.setPaneOpen(true)\n if (review.setActive(target.key)) activated.current = initialCommentId\n }, [initialCommentId, review])\n const input = useRef<HTMLInputElement | null>(null)\n const replyTarget = useRef<{ field: HTMLInputElement; key: string } | null>(null)\n const pending = useRef<{\n ids: Set<string>\n text: string\n requestId: string\n recipientIds: string[]\n } | null>(null)\n const [suggestions, setSuggestions] = useState<{\n query: string\n from: number\n left: number\n top: number\n } | null>(null)\n const [selected, setSelected] = useState(0)\n const candidates = filterMentionCandidates(\n mentionCandidates(mentions),\n suggestions?.query || ''\n ).slice(0, 8)\n\n useEffect(() => {\n const submission = pending.current\n if (!submission || !requestAgent) return\n const created = review.items.find(\n (item) =>\n item.kind === 'comment' &&\n !submission.ids.has(item.item.id) &&\n item.text.trim() === submission.text\n )\n if (!created || created.kind !== 'comment') return\n pending.current = null\n const commentId = created.parentId || created.item.id\n const label = submission.recipientIds.includes('arbi') ? 'ARBI' : 'Mentioned agent'\n const update = (status: Activity['status']) => {\n if (alive.current)\n setActivity((previous) => ({\n ...previous,\n [submission.requestId]: { commentId, label, status },\n }))\n }\n // Human-only mentions deliver notifications without showing an agent spinner.\n const hasAgent = submission.recipientIds.some(\n (id) =>\n id === 'arbi' || mentions.some((person) => person.id === id && person.kind === 'agent')\n )\n if (hasAgent) update('delivering')\n void requestAgent({\n commentId,\n instruction: submission.text,\n requestId: submission.requestId,\n recipientIds: submission.recipientIds,\n })\n .then(async (delivery) => {\n if (!delivery?.responseIds.length || !getAgentStatus) {\n if (hasAgent) update('unknown')\n return\n }\n update('queued')\n while (alive.current) {\n try {\n const states = await Promise.all(delivery.responseIds.map((id) => getAgentStatus(id)))\n if (!alive.current) return\n const active =\n states.find((status) => status === 'in_progress') ||\n states.find((status) => status === 'queued')\n const status = active || states.find((status) => status !== 'completed') || 'completed'\n update(status)\n if (!active) return\n } catch {\n // A polling failure is not proof that the agent failed.\n update('unknown')\n }\n await new Promise((resolve) => setTimeout(resolve, 2000))\n }\n })\n .catch((error: unknown) => {\n if (hasAgent) update('failed')\n notify?.(\n error instanceof Error ? error.message : 'Could not start the document agent.',\n 'error'\n )\n })\n }, [review.items, requestAgent, getAgentStatus, mentions, notify])\n\n const choose = (name: string) => {\n const field = input.current\n if (!field || !suggestions) return\n const end = field.selectionStart ?? field.value.length\n const value = field.value.slice(0, suggestions.from) + '@' + name + ' ' + field.value.slice(end)\n // The native setter and input event preserve the upstream controlled input's state.\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set?.call(field, value)\n field.dispatchEvent(new Event('input', { bubbles: true }))\n field.focus()\n field.setSelectionRange(suggestions.from + name.length + 2, suggestions.from + name.length + 2)\n setSuggestions(null)\n }\n const captureSubmission = (target: EventTarget): boolean => {\n const form = (target as HTMLElement).closest('form')\n const field = form?.querySelector<HTMLInputElement>(\n '[data-testid=\"review-draft-input\"], [data-testid=\"review-reply-input\"]'\n )\n if (!field || field.readOnly || !requestAgent) return false\n const recipientIds = mentionedDocxRecipients(field.value, mentions)\n if (!recipientIds.length) return false\n pending.current = {\n ids: new Set(review.items.filter((i) => i.kind === 'comment').map((i) => i.item.id)),\n text: field.value.trim(),\n requestId: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,\n recipientIds,\n }\n // The engine may move its caret to an overlapping tracked revision while\n // an input selection changes. Bind a mentioned reply to the card where\n // composition started, rather than whichever range happens to be active.\n const pinned = replyTarget.current\n const thread = pinned\n ? review.items.find((item) => item.key === pinned.key && item.kind === 'comment')\n : undefined\n if (field.dataset.testid === 'review-reply-input' && pinned && !thread) {\n pending.current = null\n notify?.('This comment was removed. Open a current thread before replying.', 'error')\n return true\n }\n if (field.dataset.testid === 'review-reply-input' && thread) {\n if (!review.reply(thread, field.value.trim())) {\n pending.current = null\n notify?.('Could not post this reply. The comment may have been removed.', 'error')\n } else {\n Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value')?.set?.call(field, '')\n field.dispatchEvent(new Event('input', { bubbles: true }))\n replyTarget.current = null\n review.setActive(thread.key, { reveal: false })\n }\n return true\n }\n return false\n }\n return (\n <ActivityContext.Provider value={activity}>\n <div\n className=\"native-docx-mentions\"\n ref={root}\n onFocusCapture={(event) => {\n const field = event.target\n if (\n !(field instanceof HTMLInputElement) ||\n field.dataset.testid !== 'review-reply-input' ||\n field.value ||\n !requestAgent\n )\n return\n const target = review.items.find(\n (entry) => entry.key === review.activeKey && entry.kind === 'comment'\n )\n if (!target || target.kind !== 'comment') return\n const commentId = target.parentId || target.item.id\n const replies = review.items.filter(\n (entry) => entry.kind === 'comment' && entry.parentId === commentId\n )\n const author = replies.at(-1)?.author || target.author\n const agent = mentions.find((person) => person.kind === 'agent' && person.name === author)\n if (agent || author === 'ARBI' || author === 'Assistant')\n prefixMention(\n field,\n author === 'ARBI' || author === 'Assistant' ? 'ARBI' : agent?.name || 'ARBI'\n )\n }}\n onInputCapture={(event) => {\n const field = event.target\n if (!(field instanceof HTMLInputElement) || !field.dataset.testid?.startsWith('review-'))\n return\n if (!replyTarget.current && review.activeKey)\n replyTarget.current = { field, key: review.activeKey }\n input.current = field\n const before = field.value.slice(0, field.selectionStart ?? field.value.length)\n const match = findMentionQuery(before, before.length)\n if (!match) return setSuggestions(null)\n const rect = field.getBoundingClientRect()\n setSelected(0)\n setSuggestions({\n query: match.query,\n from: match.start,\n left: rect.left,\n top: rect.bottom,\n })\n }}\n onPointerDownCapture={(event) => {\n const target = event.target\n if (\n target instanceof HTMLElement &&\n target.closest('[data-testid=\"review-marker\"], [data-testid=\"review-reply-cancel\"]')\n )\n replyTarget.current = null\n }}\n onSubmitCapture={(event) => {\n if (captureSubmission(event.target)) {\n event.preventDefault()\n event.stopPropagation()\n }\n }}\n onKeyDownCapture={(event) => {\n if (suggestions && candidates.length) {\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault()\n event.stopPropagation()\n setSelected(\n (s) =>\n (s + (event.key === 'ArrowDown' ? 1 : candidates.length - 1)) % candidates.length\n )\n return\n }\n if (event.key === 'Enter' || event.key === 'Tab') {\n event.preventDefault()\n event.stopPropagation()\n choose(candidates[selected]?.label || candidates[0].label)\n return\n }\n if (event.key === 'Escape') {\n event.preventDefault()\n event.stopPropagation()\n setSuggestions(null)\n return\n }\n }\n if (event.key === 'Enter' && captureSubmission(event.target)) {\n event.preventDefault()\n event.stopPropagation()\n }\n }}\n >\n {children}\n {composers\n .filter((field) => field.isConnected && field.closest('form'))\n .map((field, index) =>\n createPortal(\n <button\n type=\"button\"\n className=\"native-docx-include-arbi\"\n data-testid=\"docx-include-arbi\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={(event) => {\n event.stopPropagation()\n if (!mentionedDocxRecipients(field.value, mentions).includes('arbi'))\n prefixMention(field)\n else field.focus()\n }}\n >\n Include ARBI\n </button>,\n field.closest('form')!,\n `mention-${index}`\n )\n )}\n {suggestions && candidates.length > 0 && (\n <div\n onPointerDown={(event) => event.stopPropagation()}\n onMouseDown={(event) => {\n event.preventDefault()\n event.stopPropagation()\n }}\n onClick={(event) => event.stopPropagation()}\n style={{\n position: 'fixed',\n left: suggestions.left,\n top: suggestions.top,\n width: 280,\n zIndex: 1000,\n }}\n >\n <MentionMenu\n open\n placement=\"below\"\n items={candidates}\n selectedIndex={selected}\n setSelectedIndex={setSelected}\n onSelect={(person) => choose(person.label)}\n labels={{ list: 'Mention workspace member' }}\n />\n </div>\n )}\n </div>\n </ActivityContext.Provider>\n )\n}\n","/**\n * Defined-term content as WordprocessingML, and the clipboard fragment that carries it into the\n * editor. The engine has no \"insert bookmark\" command, but its paste lands an embedded `.docx`\n * fragment with everything in it — `w:bookmarkStart`/`w:bookmarkEnd` and `w:hyperlink w:anchor`\n * included — freshening bookmark ids as it goes. So the term link, the bookmarked definition and a\n * new Definitions heading are written here and pasted.\n */\n\nimport { docxPackage, documentXml, esc, stylesXml } from '../../tags/ooxml'\nimport type { Definition } from '../../tags/definitions'\nimport { trackInsertion, type Revision } from '@arbidocs/coedit/template'\n\n/** Character style of an inserted term: a dotted underline, so a defined term reads as one. */\nexport const DEFINED_TERM_STYLE = 'DefinedTerm'\n\n// No document defaults: the paste writes a fragment's defaults onto its runs as direct formatting,\n// and pasted terms and definitions should take the formatting of the document they land in.\nconst FRAGMENT_STYLES = stylesXml(\n '',\n `<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/><w:qFormat/></w:style><w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${DEFINED_TERM_STYLE}\"><w:name w:val=\"Defined Term\"/><w:rPr><w:u w:val=\"dotted\" w:color=\"7F7F7F\"/></w:rPr></w:style>`\n)\n\nconst textRun = (text: string, props = '') =>\n `<w:r>${props ? `<w:rPr>${props}</w:rPr>` : ''}<w:t xml:space=\"preserve\">${esc(text)}</w:t></w:r>`\n\n/** What Word shows on hover over a term: its definition, as one line of at most 255 characters. */\nexport function definitionTooltip(definition: Pick<Definition, 'term' | 'rest'>): string {\n const line = `“${definition.term}”${definition.rest}`.replace(/\\s+/g, ' ').trim()\n return line.length > 255 ? `${line.slice(0, 254)}…` : line\n}\n\n/** The definition paragraph's text as the document shows it: `“Shares” means the issued shares.` */\nexport const definitionParagraphText = (definition: Pick<Definition, 'term' | 'rest'>) =>\n `“${definition.term}”${definition.rest}`\n\n/**\n * A definition paragraph: the quoted term in bold, bookmarked (`bookmark`), then the definition as\n * the fact writes it. `id` is the bookmark id inside the fragment; the paste renumbers it.\n */\nexport function definitionParagraphXml(\n definition: Pick<Definition, 'term' | 'rest'>,\n bookmark: string,\n id = 0\n): string {\n return `<w:p><w:bookmarkStart w:id=\"${id}\" w:name=\"${esc(bookmark)}\"/>${textRun('“')}${textRun(\n definition.term,\n '<w:b/>'\n )}${textRun('”')}<w:bookmarkEnd w:id=\"${id}\"/>${textRun(definition.rest)}</w:p>`\n}\n\n/** A heading paragraph: the document's own heading style when it has one, else bold text. */\nexport function headingParagraphXml(text: string, styleId?: string): string {\n return styleId\n ? `<w:p><w:pPr><w:pStyle w:val=\"${esc(styleId)}\"/></w:pPr>${textRun(text)}</w:p>`\n : `<w:p><w:pPr><w:keepNext/></w:pPr>${textRun(text, '<w:b/>')}</w:p>`\n}\n\n/** The term as an internal link to its definition's bookmark, with the definition as its tooltip. */\nexport function termLinkXml(term: string, bookmark: string, tooltip: string): string {\n return `<w:p><w:hyperlink w:anchor=\"${esc(bookmark)}\" w:tooltip=\"${esc(tooltip)}\" w:history=\"1\">${textRun(\n term,\n `<w:rStyle w:val=\"${DEFINED_TERM_STYLE}\"/>`\n )}</w:hyperlink></w:p>`\n}\n\nfunction base64(bytes: Uint8Array): string {\n let binary = ''\n for (let i = 0; i < bytes.length; i += 0x8000)\n binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000))\n return btoa(binary)\n}\n\n/**\n * Clipboard HTML carrying `body` (paragraph XML) as the editor's own fragment. `covered` says the\n * last paragraph mark is part of it: the paste then ends with a whole paragraph (a block inserted\n * before the caret's paragraph) instead of running into the text after the caret (inline).\n * With a `revision`, the fragment is one tracked insertion by it.\n */\nexport function fragmentHtml(body: string, covered: boolean, revision?: Revision | null): string {\n const untracked = docxPackage({\n document: documentXml(body),\n styles: FRAGMENT_STYLES,\n title: 'Defined terms',\n })\n const bytes = revision ? trackInsertion(untracked, revision, covered) : untracked\n return `<div data-docx-fragment=\"${base64(bytes)}\" data-docx-fragment-end=\"${\n covered ? 'covered' : 'open'\n }\"></div>`\n}\n","/**\n * The defined-term commands: insert a term as a link to its definition (adding the definition to\n * the document's Definitions section when it is not there yet), and update the section from the\n * definition facts. Written against {@link DefinitionsPort}, so they run on the live editor and on\n * the in-memory model the tests use alike.\n *\n * Where the Definitions section is: the first top-level paragraph titled \"Definitions\",\n * \"Definitions and interpretation\", \"Interpretation\", \"Defined terms\" or \"Glossary\" (clause numbers\n * ignored), up to the next heading. A document without one gets a \"Definitions\" heading at its end:\n * appended, it never splits the clause being drafted, and it is where a reader of a draft looks\n * for a schedule of terms. Inside the section, definitions are kept in alphabetical order.\n */\n\nimport {\n compareTerms,\n definitionBookmark,\n definitionIdOfBookmark,\n DEFINITION_BOOKMARK_PREFIX,\n parseDefinition,\n type Definition,\n} from '../../tags/definitions'\nimport {\n definitionParagraphText,\n definitionParagraphXml,\n definitionTooltip,\n headingParagraphXml,\n termLinkXml,\n} from './fragment'\nimport type { DefinitionsPort, DocParagraph, DocPoint } from './port'\n\n/** Title of a Definitions section the commands create. */\nexport const DEFINITIONS_HEADING = 'Definitions'\n\nconst SECTION_TITLE =\n /^(definitions?(\\s*(and|&)\\s*interpretations?)?|interpretations?(\\s*(and|&)\\s*definitions?)?|defined\\s+terms|glossary)$/i\n/** Clause numbering in front of a title: `1.`, `1.1`, `Clause 1`, `A)`, `Schedule 2 -`. */\nconst NUMBERING =\n /^(?:(?:clause|section|article|schedule|part)\\s+)?(?:[0-9]+(?:\\.[0-9]+)*|[A-Z]|[ivxlc]+)[.):]?\\s+(?:[-–—]\\s*)?/i\n\n/** Whether a paragraph titles a Definitions section. */\nexport function isDefinitionsTitle(paragraph: DocParagraph): boolean {\n if (!paragraph.topLevel) return false\n const title = paragraph.text\n .trim()\n .replace(NUMBERING, '')\n .replace(/[.:]+$/, '')\n .trim()\n return SECTION_TITLE.test(title) && (paragraph.heading || title.length <= 40)\n}\n\n/** The Definitions section: its title's index and the paragraphs after it, up to the next heading. */\nexport interface DefinitionsSection {\n title: number\n /** First paragraph after the title. */\n start: number\n /** Index after the section's last paragraph (the next heading, a table, or the end). */\n end: number\n}\n\nexport function findDefinitionsSection(\n paragraphs: readonly DocParagraph[]\n): DefinitionsSection | null {\n const title = paragraphs.findIndex(isDefinitionsTitle)\n if (title < 0) return null\n let end = title + 1\n while (end < paragraphs.length && paragraphs[end].topLevel && !paragraphs[end].heading) end++\n return { title, start: title + 1, end }\n}\n\n/** The term a section paragraph defines, or `null` (an interpretation rule, a blank line…). */\nconst termOf = (paragraph: DocParagraph) => parseDefinition(paragraph.text)?.term ?? null\n\n/**\n * Where a definition of `term` goes in the section, alphabetically: before the first definition\n * whose term sorts after it, else after the last definition (else right after the title).\n */\nexport function insertionIndex(\n paragraphs: readonly DocParagraph[],\n section: DefinitionsSection,\n term: string,\n skip: ReadonlySet<string> = new Set()\n): number {\n let afterLast = section.start\n for (let i = section.start; i < section.end; i++) {\n if (skip.has(paragraphs[i].id)) continue\n const other = termOf(paragraphs[i])\n if (other === null) continue\n if (compareTerms(other, term) > 0) return i\n afterLast = i + 1\n }\n return afterLast\n}\n\n/** The document's heading style, read off its headings (so a new section matches them). */\nconst headingStyle = (paragraphs: readonly DocParagraph[]) =>\n paragraphs.find((p) => p.topLevel && p.heading && p.styleId)?.styleId\n\n/**\n * Paste `body` (`count` paragraphs) as paragraphs at `index`: before the paragraph there, or after\n * the last one. Answers the paragraph id of `keep` afterwards — pasting before a paragraph hands its\n * node to the first pasted paragraph, so a caret is tracked by position, not by id.\n */\nfunction insertParagraphs(\n port: DefinitionsPort,\n index: number,\n body: string,\n count: number,\n keep?: DocPoint\n): DocPoint | undefined {\n const before = port.paragraphs()\n const kept = keep ? before.findIndex((p) => p.id === keep.paragraphId) : -1\n if (index < before.length) {\n port.setCaret({ paragraphId: before[index].id, offset: 0 })\n } else {\n // At the end: open an empty paragraph to paste in front of (it stays as the last line).\n const last = before[before.length - 1]\n port.setCaret({ paragraphId: last.id, offset: last.text.length })\n port.splitParagraph()\n const opened = port.paragraphs()\n port.setCaret({ paragraphId: opened[opened.length - 1].id, offset: 0 })\n }\n if (!port.paste(body, '', true)) throw new Error('The definition could not be added.')\n if (!keep || kept < 0) return keep\n const after = port.paragraphs()\n const moved = index <= kept ? kept + count : kept\n return { paragraphId: after[moved]?.id ?? keep.paragraphId, offset: keep.offset }\n}\n\n/**\n * Add a definition paragraph to the Definitions section (made at the end of the document when there\n * is none), in alphabetical order. Answers where `keep` moved to.\n */\nexport function addDefinition(\n port: DefinitionsPort,\n definition: Definition,\n keep?: DocPoint\n): DocPoint | undefined {\n const paragraphs = port.paragraphs()\n const section = findDefinitionsSection(paragraphs)\n const paragraph = definitionParagraphXml(definition, definitionBookmark(definition.id))\n if (section)\n return insertParagraphs(\n port,\n insertionIndex(paragraphs, section, definition.term),\n paragraph,\n 1,\n keep\n )\n return insertParagraphs(\n port,\n paragraphs.length,\n headingParagraphXml(DEFINITIONS_HEADING, headingStyle(paragraphs)) + paragraph,\n 2,\n keep\n )\n}\n\n/** Whether a bookmark is declared anywhere in the body. */\nconst hasBookmark = (paragraphs: readonly DocParagraph[], name: string) =>\n paragraphs.some((p) => p.bookmarks.includes(name))\n\nexport interface InsertTermResult {\n /** The definition was not in the document yet and was added to its Definitions section. */\n addedDefinition: boolean\n}\n\n/**\n * Insert a defined term at the caret: the term as an internal link to its definition's bookmark\n * (its definition as the link's tooltip), the definition added to the Definitions section first\n * when the document does not have it. `replace` characters before the caret (a typed `@@query`)\n * are removed first. The caret ends after the term.\n */\nexport function insertDefinedTerm(\n port: DefinitionsPort,\n definition: Definition,\n options: { replace?: number } = {}\n): InsertTermResult {\n const start = port.caret()\n if (!start) throw new Error('Place the cursor where the term should go.')\n let caret = start\n if (options.replace) {\n caret = { paragraphId: start.paragraphId, offset: Math.max(0, start.offset - options.replace) }\n port.deleteRange(caret, start)\n }\n const bookmark = definitionBookmark(definition.id)\n const addedDefinition = !hasBookmark(port.paragraphs(), bookmark)\n if (addedDefinition) caret = addDefinition(port, definition, caret) ?? caret\n port.setCaret(caret)\n if (\n !port.paste(\n termLinkXml(definition.term, bookmark, definitionTooltip(definition)),\n definition.term,\n false\n )\n )\n throw new Error('The term could not be inserted.')\n port.setCaret({ paragraphId: caret.paragraphId, offset: caret.offset + definition.term.length })\n return { addedDefinition }\n}\n\n/** A definition in the section that nothing in the document uses. */\nexport interface UnusedDefinition {\n term: string\n paragraphId: string\n}\n\nexport interface UpdateDefinitionsResult {\n /** Terms whose definitions were added (linked from the text, missing from the section). */\n added: string[]\n /** Terms whose wording changed to the fact's current text. */\n refreshed: string[]\n /** Terms moved back into alphabetical order. */\n reordered: string[]\n /** Definitions in the section never used in the rest of the document (left in place). */\n unused: UnusedDefinition[]\n /** Linked bookmarks whose definition fact no longer exists or is no longer a definition. */\n unknown: string[]\n}\n\nconst escapeRegExp = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n\n/** Whether `term` appears as a whole word (any case) in `text`. */\nconst mentions = (text: string, term: string) =>\n new RegExp(`(^|[^\\\\p{L}\\\\p{N}])${escapeRegExp(term)}($|[^\\\\p{L}\\\\p{N}])`, 'iu').test(text)\n\n/**\n * Update the Definitions section from the definition facts (`definitions`, by fact id): add the\n * definitions the text links to but the section lacks, refresh the wording of the ones it has,\n * put them back in alphabetical order, and report — without removing anything — the definitions\n * in the section the rest of the document never uses.\n */\nexport function updateDefinitions(\n port: DefinitionsPort,\n definitions: ReadonlyMap<string, Definition>\n): UpdateDefinitionsResult {\n const result: UpdateDefinitionsResult = {\n added: [],\n refreshed: [],\n reordered: [],\n unused: [],\n unknown: [],\n }\n let paragraphs = port.paragraphs()\n const linked = new Set(\n paragraphs.flatMap((p) =>\n p.links.map((l) => l.anchor).filter((a) => a.startsWith(DEFINITION_BOOKMARK_PREFIX))\n )\n )\n const declared = new Map<string, DocParagraph>()\n for (const p of paragraphs)\n for (const b of p.bookmarks)\n if (b.startsWith(DEFINITION_BOOKMARK_PREFIX) && !declared.has(b)) declared.set(b, p)\n\n const factOf = (bookmark: string) => {\n const id = definitionIdOfBookmark(bookmark)\n return id ? definitions.get(id) : undefined\n }\n for (const bookmark of [...linked, ...declared.keys()])\n if (!factOf(bookmark) && !result.unknown.includes(bookmark)) result.unknown.push(bookmark)\n\n // Managed paragraphs to rewrite: wording changed, or out of alphabetical order in the section.\n const section = findDefinitionsSection(paragraphs)\n const rewrite = new Map<string, Definition>()\n for (const [bookmark, paragraph] of declared) {\n const fact = factOf(bookmark)\n if (fact && paragraph.text !== definitionParagraphText(fact)) {\n rewrite.set(paragraph.id, fact)\n result.refreshed.push(fact.term)\n }\n }\n if (section) {\n let previous: string | null = null\n for (let i = section.start; i < section.end; i++) {\n const p = paragraphs[i]\n const term = termOf(p)\n if (term === null) continue\n const bookmark = p.bookmarks.find((b) => b.startsWith(DEFINITION_BOOKMARK_PREFIX))\n const fact = bookmark ? factOf(bookmark) : undefined\n if (previous !== null && compareTerms(term, previous) < 0 && fact) {\n if (!rewrite.has(p.id)) result.reordered.push(fact.term)\n rewrite.set(p.id, fact)\n continue\n }\n previous = term\n }\n }\n\n // Remove the paragraphs to rewrite (each joined onto the one before, which keeps its own\n // formatting), then add them back with every missing definition, each in alphabetical place.\n for (const id of [...rewrite.keys()].reverse()) {\n const index = paragraphs.findIndex((p) => p.id === id)\n const previous = paragraphs[index - 1]\n const target = paragraphs[index]\n if (!previous) continue\n port.deleteRange(\n { paragraphId: previous.id, offset: previous.text.length },\n { paragraphId: target.id, offset: target.text.length }\n )\n paragraphs = port.paragraphs()\n }\n const toAdd = [...rewrite.values()]\n for (const bookmark of linked) {\n const fact = factOf(bookmark)\n if (fact && !declared.has(bookmark) && !toAdd.some((d) => d.id === fact.id)) {\n toAdd.push(fact)\n result.added.push(fact.term)\n }\n }\n toAdd.sort((a, b) => compareTerms(a.term, b.term))\n for (const definition of toAdd) addDefinition(port, definition)\n\n // Unused: a section definition with no link to it and no mention of its term outside the section.\n paragraphs = port.paragraphs()\n const after = findDefinitionsSection(paragraphs)\n if (after) {\n const inSection = (i: number) => i >= after.title && i < after.end\n const outside = paragraphs.filter((_, i) => !inSection(i))\n const linkedNow = new Set(outside.flatMap((p) => p.links.map((l) => l.anchor)))\n const outsideText = outside.map((p) => p.text).join('\\n')\n for (let i = after.start; i < after.end; i++) {\n const p = paragraphs[i]\n const term = termOf(p)\n if (term === null) continue\n const used = p.bookmarks.some((b) => linkedNow.has(b)) || mentions(outsideText, term)\n if (!used) result.unused.push({ term, paragraphId: p.id })\n }\n }\n return result\n}\n\n/** Term groups keyed for quick lookup of the definition a bookmark points at. */\nexport function definitionsById(definitions: readonly Definition[]): Map<string, Definition> {\n return new Map(definitions.map((d) => [d.id, d]))\n}\n\n/** The definition an internal link points at, from its bookmark name. */\nexport function definitionOfAnchor(\n anchor: string,\n definitions: ReadonlyMap<string, Definition>\n): Definition | undefined {\n const id = definitionIdOfBookmark(anchor.replace(/^#/, ''))\n return id ? definitions.get(id) : undefined\n}\n","/**\n * The few things the defined-term commands need from a live Word editor, behind an interface so\n * the commands are tested against a small in-memory model rather than the engine.\n */\n\nimport type { DocxEditorInstance } from '@docx-editor.dev/core'\nimport type { Revision } from '@arbidocs/coedit/template'\nimport { fragmentHtml } from './fragment'\n\n/** A position: a paragraph (the engine's node id) and a UTF-16 offset into its text. */\nexport interface DocPoint {\n paragraphId: string\n offset: number\n}\n\n/** An internal link in a paragraph. */\nexport interface DocLink {\n anchor: string\n text: string\n}\n\n/** One paragraph, in document order. */\nexport interface DocParagraph {\n id: string\n text: string\n /** Styled as a heading (a `Heading n` style or an outline level). */\n heading: boolean\n styleId?: string\n /** A paragraph of the body itself, not inside a table. */\n topLevel: boolean\n /** Names of the bookmarks that start in it. */\n bookmarks: string[]\n /** Its internal links (`w:hyperlink w:anchor`). */\n links: DocLink[]\n}\n\nexport interface DefinitionsPort {\n /** Every body paragraph, in document order (table cells included, `topLevel: false`). */\n paragraphs(): DocParagraph[]\n /** The caret, or `null` when the selection is a range or there is none. */\n caret(): DocPoint | null\n setCaret(point: DocPoint): void\n /** Delete everything between two points (across paragraphs: the marks between them go too). */\n deleteRange(from: DocPoint, to: DocPoint): void\n /**\n * Paste paragraph XML at the caret. `covered`: the fragment ends with a whole paragraph, so at\n * the start of a paragraph it lands as paragraphs before it. Otherwise it runs inline.\n */\n paste(body: string, text: string, covered: boolean): boolean\n /** Split the caret's paragraph (Enter), the caret moving into the new one. */\n splitParagraph(): void\n}\n\ntype Node = {\n id: string\n kind: string\n localName?: string\n value?: string\n attributes?: readonly { localName: string; value: string }[]\n children?: readonly Node[]\n}\n\nconst attr = (node: Node, name: string) => node.attributes?.find((a) => a.localName === name)?.value\n\n/** A heading style id in any of the spellings Word localises it to (`Heading1`, `berschrift1`…). */\nconst HEADING_STYLE = /^(heading|berschrift|titre|t[ií]tulo|titolo|kop)\\s*\\d/i\n\n/** The paragraphs of a part's body, read from the engine's OOXML tree. */\nexport function readParagraphs(root: Node): DocParagraph[] {\n const out: DocParagraph[] = []\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n const visit = (node: Node, topLevel: boolean, pending: string[]) => {\n for (const child of node.children ?? []) {\n if (child.kind === 'paragraph') {\n out.push(readParagraph(child, topLevel, pending.splice(0)))\n } else if (child.localName === 'bookmarkStart') {\n // A bookmark between paragraphs belongs to the next one.\n const name = attr(child, 'name')\n if (name) pending.push(name)\n } else if (\n child.localName === 'tbl' ||\n child.localName === 'tr' ||\n child.localName === 'tc'\n ) {\n visit(child, false, pending)\n } else if (child.localName === 'sdt' || child.localName === 'sdtContent') {\n visit(child, topLevel, pending)\n }\n }\n }\n visit(body, true, [])\n return out\n}\n\nfunction readParagraph(node: Node, topLevel: boolean, bookmarks: string[]): DocParagraph {\n let text = ''\n const links: DocLink[] = []\n let styleId: string | undefined\n let outline = false\n const walk = (n: Node, link?: DocLink) => {\n for (const c of n.children ?? []) {\n if (c.kind === 'paragraphProperties' || c.localName === 'pPr') {\n for (const p of c.children ?? []) {\n if (p.localName === 'pStyle') styleId = attr(p, 'val')\n if (p.localName === 'outlineLvl' && Number(attr(p, 'val')) < 9) outline = true\n }\n continue\n }\n if (c.localName === 'delText' || c.localName === 'del' || c.localName === 'rPr') continue\n if (c.localName === 'bookmarkStart') {\n const name = attr(c, 'name')\n if (name) bookmarks.push(name)\n continue\n }\n if (c.localName === 'hyperlink') {\n const anchor = attr(c, 'anchor')\n const next = anchor ? { anchor, text: '' } : undefined\n walk(c, next ?? link)\n if (next) links.push(next)\n continue\n }\n if (c.kind === 'textValue') {\n text += c.value ?? ''\n if (link) link.text += c.value ?? ''\n continue\n }\n if (c.localName === 'tab') text += '\\t'\n walk(c, link)\n }\n }\n walk(node)\n return {\n id: node.id,\n text,\n heading: outline || (!!styleId && HEADING_STYLE.test(styleId)),\n styleId,\n topLevel,\n bookmarks,\n links,\n }\n}\n\n/**\n * The port over a live editor. Writes go through the editor's own commands and paste; with a\n * `revision`, what it pastes is a tracked insertion by it (see `trackedOrNoted`).\n */\nexport function editorPort(\n editor: DocxEditorInstance,\n revision?: Revision | null\n): DefinitionsPort {\n const surface = () => {\n const s = editor.surface\n if (!s) throw new Error('The document is not open.')\n return s\n }\n return {\n paragraphs: () => readParagraphs(surface().session.part().root as unknown as Node),\n caret: () => {\n const selection = surface().state().selection\n if (!selection) return null\n const { anchor, head } = selection\n return anchor.paragraphId === head.paragraphId && anchor.offset === head.offset\n ? { paragraphId: anchor.paragraphId, offset: anchor.offset }\n : null\n },\n setCaret: (point) => surface().setSelection({ anchor: point, head: point }),\n deleteRange: (from, to) => {\n surface().setSelection({ anchor: from, head: to })\n surface().deleteSelection()\n },\n paste: (body, text, covered) =>\n editor.exec({ type: 'paste', text, html: fragmentHtml(body, covered, revision) }).ok,\n splitParagraph: () => surface().splitParagraph(),\n }\n}\n\n/**\n * Run `fn` with direct editing. The engine pastes rich content (bookmarks, links) only outside\n * Suggesting mode, so a suggesting editor switches for the command and back; a read-only one refuses.\n */\nexport function withDirectEditing<T>(editor: DocxEditorInstance, fn: () => T): T {\n const mode = editor.getEditingMode()\n if (mode === 'viewing') throw new Error('This document is read only.')\n if (mode === 'suggesting') editor.setEditingMode('editing')\n try {\n return fn()\n } finally {\n if (mode === 'suggesting') editor.setEditingMode('suggesting')\n }\n}\n\n/**\n * Keep the caret where a command left it across the collaboration room's next re-install.\n *\n * A paste lands as a package-level write; in a collaboration room the engine then re-installs the\n * document, numbering its paragraph nodes afresh by position. The selection keeps its old node id,\n * which after a paragraph was inserted above it names a different paragraph, so the next keystroke\n * would go nowhere. The paragraph's own `w14:paraId` survives the re-install: the caret is put back\n * on it once, unless the person has moved it meanwhile.\n */\nexport function holdCaret(editor: DocxEditorInstance, timeoutMs = 5000): void {\n const surface = editor.surface\n const selection = surface?.state().selection\n if (!surface || !selection) return\n const { paragraphId, offset } = selection.head\n const paraId = surface.session.paraIdOf(paragraphId)\n if (!paraId) return\n let done = false\n const stop = () => {\n done = true\n offChange()\n offSelection()\n clearTimeout(timer)\n }\n const restore = () => {\n if (done) return\n const now = surface.state().selection\n const node = surface.session.nodeIdOf(paraId)\n if (!now || !node) return\n // Moved by the person since: leave it. Same node: nothing re-installed yet.\n if (now.head.offset !== offset || now.head.paragraphId !== paragraphId) return stop()\n if (node === paragraphId) return\n stop()\n const point = { paragraphId: node, offset }\n surface.setSelection({ anchor: point, head: point })\n }\n const offChange = editor.on('change', restore)\n const offSelection = editor.on('selectionChange', restore)\n const timer = setTimeout(stop, timeoutMs)\n}\n","/**\n * Structural inserts (a defined term, a cross-reference, a Quick Part…) in Suggesting mode.\n *\n * The engine pastes rich fragments only with direct editing, so a suggesting editor switches for\n * the paste and back. Done naively the insert then lands untracked. The rule here:\n * - not suggesting: insert as before;\n * - suggesting: insert the fragment as a tracked insertion (`insert` receives the revision to\n * mark it with, see `trackInsertion` in `@arbidocs/coedit/template`), so it shows in the\n * review pane and accept/reject takes all of it;\n * - if no tracked change by that revision came out of it, attach an attributed comment to the\n * inserted range instead (\"Inserted defined term: Shares\"), so the insert is still reviewable.\n *\n * Written against a small port, not the React editor, so the collaboration service's headless\n * path can apply the same rule.\n */\n\nimport type { DocxEditorInstance } from '@docx-editor.dev/core'\nimport type { Revision } from '@arbidocs/coedit/template'\nimport type { DocPoint } from '../definitions/port'\n\nexport type { Revision }\n\nexport type EditingMode = 'editing' | 'suggesting' | 'viewing'\n\n/** What the rule needs from an editor. */\nexport interface StructuralPort {\n mode(): EditingMode\n setMode(mode: EditingMode): void\n caret(): DocPoint | null\n /** How many tracked changes in the document carry exactly this author and date. */\n trackedBy(revision: Revision): number\n /** Comment on the range between two points as the editor's author; false when refused. */\n comment(from: DocPoint, to: DocPoint, text: string): boolean\n}\n\nexport interface StructuralInsert<T> {\n /** What the comment says when the insert could not be tracked: \"Inserted Quick Part: Execution\". */\n label: string\n /** The author tracked changes are attributed to. */\n author: string\n /** Do the insert, marking it with `revision` when one is given. */\n insert: (revision: Revision | null) => T\n /** Whether `insert`'s result means something was inserted (default: truthy). */\n inserted?: (result: T) => boolean\n}\n\nexport interface StructuralOutcome<T> {\n result: T\n /** `direct`: not suggesting; `tracked`: a suggestion; `noted`: inserted with a comment on it. */\n how: 'direct' | 'tracked' | 'noted'\n}\n\n/** `w:date` as Word writes it: UTC, to the second. */\nexport const revisionDate = (at = new Date()) => at.toISOString().replace(/\\.\\d{3}Z$/, 'Z')\n\n/** Insert a structural fragment so that, while suggesting, it is reviewable. Throws when read only. */\nexport function trackedOrNoted<T>(\n port: StructuralPort,\n { label, author, insert, inserted = Boolean }: StructuralInsert<T>\n): StructuralOutcome<T> {\n const mode = port.mode()\n if (mode === 'viewing') throw new Error('This document is read only.')\n if (mode !== 'suggesting') return { result: insert(null), how: 'direct' }\n\n const revision = { author, date: revisionDate() }\n const before = port.caret()\n const tracked = port.trackedBy(revision)\n port.setMode('editing')\n let result: T\n try {\n result = insert(revision)\n } finally {\n port.setMode('suggesting')\n }\n if (!inserted(result) || port.trackedBy(revision) > tracked)\n return { result, how: inserted(result) ? 'tracked' : 'direct' }\n const after = port.caret()\n if (before && after && port.comment(before, after, label)) return { result, how: 'noted' }\n return { result, how: 'direct' }\n}\n\ntype TreeNode = {\n localName?: string\n attributes?: readonly { localName: string; value: string }[]\n children?: readonly TreeNode[]\n}\nconst attr = (node: TreeNode, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** The port over a live editor. */\nexport function structuralPort(editor: DocxEditorInstance): StructuralPort {\n return {\n mode: () => editor.getEditingMode(),\n setMode: (mode) => void editor.setEditingMode(mode),\n caret: () => {\n const head = editor.surface?.state().selection?.head\n return head ? { paragraphId: head.paragraphId, offset: head.offset } : null\n },\n // Read from the story's tree: the review pane merges adjacent insertions by one author into\n // one card, so a card's date need not be this insert's.\n trackedBy: ({ author, date }) => {\n const root = editor.surface?.session.part().root as unknown as TreeNode | undefined\n let count = 0\n const visit = (node: TreeNode) => {\n if (\n node.localName === 'ins' &&\n attr(node, 'author') === author &&\n attr(node, 'date') === date\n )\n count++\n node.children?.forEach(visit)\n }\n if (root) visit(root)\n return count\n },\n comment: (from, to, text) => {\n const surface = editor.surface\n if (!surface) return false\n surface.setSelection({ anchor: from, head: to })\n const ok = editor.addComment(text).ok\n surface.setSelection({ anchor: to, head: to })\n return ok\n },\n }\n}\n","import { createContext, useCallback, useContext } from 'react'\nimport { useDocxEditor } from '@docx-editor.dev/react'\nimport {\n structuralPort,\n trackedOrNoted,\n type StructuralInsert,\n type StructuralOutcome,\n} from './trackedOrNoted'\n\n/** The name the editor attributes changes to (`DocxEditor.Root`'s `author`), for the ribbon's inserts. */\nexport const DocxAuthorContext = createContext('You')\n\n/** `trackedOrNoted` bound to the editor in context and its author; undefined before it is ready. */\nexport function useTrackedOrNoted() {\n const editor = useDocxEditor()\n const author = useContext(DocxAuthorContext)\n return useCallback(\n <T>(spec: Omit<StructuralInsert<T>, 'author'>): StructuralOutcome<T> | undefined =>\n editor ? trackedOrNoted(structuralPort(editor), { ...spec, author }) : undefined,\n [editor, author]\n )\n}\n","/**\n * Defined terms in the Word editor: a type-ahead of the workspace's definitions (typing `@@` in the\n * body, or Insert › Defined term), a hover card on an inserted term, and Update definitions. Mount\n * `DefinedTermsProvider` inside `DocxEditor.Root`; the ribbon's buttons read it from context.\n */\n\nimport React, {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react'\nimport { createPortal } from 'react-dom'\nimport { useDocxEditor } from '@docx-editor.dev/react'\nimport {\n cn,\n Button,\n Dialog,\n DialogContent,\n DialogDescription,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from '@arbidocs/react/ui'\nimport { listOptionId } from '../../lib/useListKeyNav'\nimport {\n definitionLabels,\n filterTermGroups,\n groupDefinitions,\n toDefinition,\n type DefinedTermGroup,\n type Definition,\n type DefinitionSource,\n} from '../../tags/definitions'\nimport {\n definitionOfAnchor,\n insertDefinedTerm,\n updateDefinitions,\n type UpdateDefinitionsResult,\n} from './commands'\nimport { editorPort, holdCaret, withDirectEditing, type DocPoint } from './port'\nimport { useTrackedOrNoted } from '../structural/useTrackedOrNoted'\n\n/** Typing this in the body opens the type-ahead. */\nexport const DEFINED_TERM_TRIGGER = '@@'\n/** `@@` then up to 40 characters of query, at the caret, after a word boundary. */\nconst TRIGGER_QUERY = /(?:^|[\\s([{\"“‘'])@@([^@\\n\\t]{0,40})$/\nconst MAX_GROUPS = 8\n/** Definitions are read again when the picker opens after this long. */\nconst STALE_AFTER_MS = 30_000\n\nexport interface DefinedTermsLabels {\n insert: string\n update: string\n search: string\n allAgreements: string\n loading: string\n empty: string\n noMatch: string\n hint: string\n preferred: string\n alsoIn: (source: string) => string\n updated: string\n updateSummary: (r: UpdateDefinitionsResult) => string\n unusedTitle: string\n unusedNone: string\n unknownTitle: string\n show: string\n close: string\n}\n\nexport const DEFAULT_DEFINED_TERMS_LABELS: DefinedTermsLabels = {\n insert: 'Defined term',\n update: 'Update definitions',\n search: 'Search defined terms',\n allAgreements: 'All definitions',\n loading: 'Loading definitions…',\n empty: 'No definitions yet. Label a fact “Definitions” to use it here.',\n noMatch: 'No defined term matches.',\n hint: 'Enter to insert · Esc to close',\n preferred: 'Preferred',\n alsoIn: (source) => `Also defined${source ? ` in ${source}` : ''}`,\n updated: 'Definitions updated',\n updateSummary: (r) =>\n [\n r.added.length ? `${r.added.length} added` : '',\n r.refreshed.length ? `${r.refreshed.length} reworded` : '',\n r.reordered.length ? `${r.reordered.length} reordered` : '',\n ]\n .filter(Boolean)\n .join(' · ') || 'The Definitions section is up to date.',\n unusedTitle: 'Defined but never used',\n unusedNone: 'Every definition in the section is used.',\n unknownTitle: 'Links to definitions that no longer exist',\n show: 'Show',\n close: 'Close',\n}\n\ninterface DefinedTermsContextValue {\n /** Open the type-ahead at the caret, with a search box. */\n openPicker: (anchor?: HTMLElement | null) => void\n /** Update the Definitions section and show what changed. */\n update: () => void\n labels: DefinedTermsLabels\n}\n\nconst DefinedTermsContext = createContext<DefinedTermsContextValue | null>(null)\n\n/** The defined-term commands, or `null` where the editor has no definitions to offer. */\nexport const useDefinedTerms = () => useContext(DefinedTermsContext)\n\ninterface PickerState {\n mode: 'typing' | 'search'\n query: string\n left: number\n top: number\n /** Where the term goes (search mode: the caret when the picker opened). */\n caret: DocPoint | null\n}\n\n/** One row of the type-ahead: a definition of a term (the preferred one first in its group). */\ninterface Row {\n group: DefinedTermGroup\n definition: Definition\n variant: boolean\n}\n\nfunction rowsOf(groups: readonly DefinedTermGroup[]): Row[] {\n return groups.flatMap((group) =>\n group.definitions.map((definition, i) => ({ group, definition, variant: i > 0 }))\n )\n}\n\nconst sourceOf = (d: Definition) =>\n [d.source, ...(d.labels ?? []).map((l) => l.name)].filter(Boolean).join(' · ')\n\nexport interface DefinedTermsProviderProps {\n children: React.ReactNode\n /** The workspace's definition facts. Absent: no defined-term features. */\n load?: () => Promise<DefinitionSource[]>\n /** Editing is possible (not a snapshot, a stream or a read-only document). */\n editable: boolean\n notify?: (message: string, kind: 'success' | 'error') => void\n labels?: Partial<DefinedTermsLabels>\n}\n\nexport function DefinedTermsProvider({\n children,\n load,\n editable,\n notify,\n labels,\n}: DefinedTermsProviderProps) {\n const editor = useDocxEditor()\n const track = useTrackedOrNoted()\n const l = useMemo(() => ({ ...DEFAULT_DEFINED_TERMS_LABELS, ...labels }), [labels])\n const [sources, setSources] = useState<DefinitionSource[] | null>(null)\n const loadedAt = useRef(0)\n const loading = useRef<Promise<DefinitionSource[]> | null>(null)\n const [labelId, setLabelId] = useState<string | null>(null)\n const [picker, setPicker] = useState<PickerState | null>(null)\n const [selected, setSelected] = useState(0)\n const [report, setReport] = useState<UpdateDefinitionsResult | null>(null)\n const marker = useRef<HTMLSpanElement>(null)\n const dismissedAt = useRef<string | null>(null)\n\n const refresh = useCallback(\n (force = false): Promise<DefinitionSource[]> => {\n if (!load) return Promise.resolve([])\n if (!force && sources && Date.now() - loadedAt.current < STALE_AFTER_MS)\n return Promise.resolve(sources)\n if (!loading.current)\n loading.current = load()\n .then((list) => {\n loadedAt.current = Date.now()\n setSources(list)\n return list\n })\n .catch((error: unknown) => {\n notify?.(\n error instanceof Error ? error.message : 'Could not load definitions.',\n 'error'\n )\n // Stop showing \"Loading…\": the picker offers what it had, or nothing.\n setSources((previous) => previous ?? [])\n return sources ?? []\n })\n .finally(() => {\n loading.current = null\n })\n return loading.current\n },\n [load, sources, notify]\n )\n\n const all = useMemo(() => groupDefinitions(sources ?? []).groups, [sources])\n const byId = useMemo(\n () => new Map(all.flatMap((g) => g.definitions).map((d) => [d.id, d] as const)),\n [all]\n )\n const agreements = useMemo(() => definitionLabels(sources ?? []), [sources])\n const groups = useMemo(\n () =>\n picker\n ? filterTermGroups(groupDefinitions(sources ?? [], { labelId }).groups, picker.query).slice(\n 0,\n MAX_GROUPS\n )\n : [],\n [sources, labelId, picker]\n )\n const rows = useMemo(() => rowsOf(groups), [groups])\n useEffect(() => setSelected(0), [picker?.query, labelId])\n\n const container = () => marker.current?.closest('.native-docx-viewer') ?? document.body\n const [viewer, setViewer] = useState<Element | null>(null)\n useEffect(() => setViewer(container()), [])\n const refreshRef = useRef(refresh)\n refreshRef.current = refresh\n const firstHover = useCallback(() => void refreshRef.current(), [])\n const caretRect = () =>\n container().querySelector('.docx-editor-one-surface__caret')?.getBoundingClientRect()\n\n const attempt = useCallback(\n <T,>(fn: () => T): T | undefined => {\n try {\n return fn()\n } catch (error) {\n notify?.(error instanceof Error ? error.message : 'Could not change the document.', 'error')\n return undefined\n }\n },\n [notify]\n )\n const run = useCallback(\n <T,>(fn: () => T): T | undefined =>\n editor ? attempt(() => withDirectEditing(editor, fn)) : undefined,\n [editor, attempt]\n )\n\n const pick = useCallback(\n (row: Row | undefined) => {\n if (!editor || !picker || !row) return\n const port = editorPort(editor)\n // To the caret the search kept, or over the typed `@@query`: the person's own typing, taken\n // out rather than suggested for deletion.\n const placed = run(() => {\n if (picker.mode === 'search' && picker.caret) port.setCaret(picker.caret)\n const caret = port.caret()\n if (!caret) throw new Error('Place the cursor where the term should go.')\n const typed =\n picker.mode === 'typing' ? DEFINED_TERM_TRIGGER.length + picker.query.length : 0\n if (typed) port.deleteRange({ ...caret, offset: Math.max(0, caret.offset - typed) }, caret)\n return true\n })\n const result = placed\n ? attempt(\n () =>\n track({\n label: `Inserted defined term: ${row.definition.term}`,\n insert: (revision) =>\n insertDefinedTerm(editorPort(editor, revision), row.definition),\n })?.result\n )\n : undefined\n setPicker(null)\n editor.surface?.focus()\n if (result) holdCaret(editor)\n if (result?.addedDefinition)\n notify?.(`“${row.definition.term}” added to the Definitions section.`, 'success')\n },\n [editor, picker, run, attempt, track, notify]\n )\n\n const openPicker = useCallback(\n (anchor?: HTMLElement | null) => {\n if (!editor || !editable) return\n const caret = editorPort(editor).caret()\n const rect = caretRect() ?? anchor?.getBoundingClientRect()\n void refresh()\n setPicker({\n mode: 'search',\n query: '',\n left: rect?.left ?? 120,\n top: (rect?.bottom ?? 120) + 4,\n caret,\n })\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [editor, editable, refresh]\n )\n\n // Typing `@@` in the body opens the type-ahead; what follows narrows it.\n useEffect(() => {\n if (!editor || !editable || !load) return\n let frame = 0\n const check = () => {\n cancelAnimationFrame(frame)\n frame = requestAnimationFrame(() => {\n const port = editorPort(editor)\n const caret = port.caret()\n const paragraph = caret && port.paragraphs().find((p) => p.id === caret.paragraphId)\n const match = paragraph && TRIGGER_QUERY.exec(paragraph.text.slice(0, caret.offset))\n setPicker((current) => {\n if (current?.mode === 'search') return current\n if (!match || !caret) return null\n const key = `${caret.paragraphId}:${caret.offset - match[1].length}`\n if (dismissedAt.current === key) return null\n const rect = caretRect()\n return {\n mode: 'typing',\n query: match[1],\n left: current?.left ?? rect?.left ?? 120,\n top: current?.top ?? (rect?.bottom ?? 120) + 4,\n caret,\n }\n })\n if (match) void refresh()\n })\n }\n const offChange = editor.on('change', check)\n const offSelection = editor.on('selectionChange', check)\n return () => {\n cancelAnimationFrame(frame)\n offChange()\n offSelection()\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [editor, editable, load, refresh])\n\n // While the type-ahead is open from typing, the arrows, Enter, Tab and Esc drive it.\n useEffect(() => {\n if (picker?.mode !== 'typing') return\n const keys = (event: KeyboardEvent) => {\n if (event.key === 'Escape') {\n dismissedAt.current = picker.caret\n ? `${picker.caret.paragraphId}:${picker.caret.offset - picker.query.length}`\n : null\n setPicker(null)\n } else if (!rows.length) return\n else if (event.key === 'ArrowDown') setSelected((i) => (i + 1) % rows.length)\n else if (event.key === 'ArrowUp') setSelected((i) => (i - 1 + rows.length) % rows.length)\n else if (event.key === 'Enter' || event.key === 'Tab') pick(rows[selected] ?? rows[0])\n else return\n event.preventDefault()\n event.stopPropagation()\n }\n window.addEventListener('keydown', keys, true)\n return () => window.removeEventListener('keydown', keys, true)\n }, [picker, rows, selected, pick])\n\n const update = useCallback(() => {\n if (!editor || !editable) return\n void refresh(true).then((list) => {\n const definitions = new Map(\n list.flatMap((s) => {\n const d = toDefinition(s)\n return d ? [[d.id, d] as const] : []\n })\n )\n // The update edits the section, moving the selection: the caret goes back to its paragraph\n // (found by its w14:paraId, which survives the edits) afterwards.\n const surface = editor.surface\n const before = surface?.state().selection?.head\n const paraId = before && surface?.session.paraIdOf(before.paragraphId)\n const result = run(() => updateDefinitions(editorPort(editor), definitions))\n const node = paraId && surface?.session.nodeIdOf(paraId)\n if (result && before && node) {\n const point = { paragraphId: node, offset: before.offset }\n surface.setSelection({ anchor: point, head: point })\n holdCaret(editor)\n }\n if (result) setReport(result)\n })\n }, [editor, editable, refresh, run])\n\n const value = useMemo<DefinedTermsContextValue | null>(\n () => (load && editable ? { openPicker, update, labels: l } : null),\n [load, editable, openPicker, update, l]\n )\n\n return (\n <DefinedTermsContext.Provider value={value}>\n <span ref={marker} hidden />\n {children}\n {load && (\n <DefinedTermHover\n root={viewer}\n resolve={(anchor) => definitionOfAnchor(anchor, byId)}\n onFirstHover={firstHover}\n />\n )}\n {picker &&\n createPortal(\n <DefinedTermMenu\n picker={picker}\n rows={rows}\n loading={sources === null}\n selected={selected}\n setSelected={setSelected}\n agreements={agreements}\n labelId={labelId}\n setLabelId={setLabelId}\n onQuery={(query) => setPicker((p) => (p ? { ...p, query } : p))}\n onPick={pick}\n onClose={() => {\n setPicker(null)\n editor?.surface?.focus()\n }}\n labels={l}\n />,\n document.body\n )}\n <Dialog open={!!report} onOpenChange={(open) => !open && setReport(null)}>\n <DialogContent\n className=\"max-h-[85dvh] overflow-y-auto\"\n data-testid=\"docx-definitions-report\"\n >\n <DialogHeader>\n <DialogTitle>{l.updated}</DialogTitle>\n <DialogDescription>{report && l.updateSummary(report)}</DialogDescription>\n </DialogHeader>\n {report && (\n <div className=\"space-y-4 text-sm\">\n <section>\n <h3 className=\"mb-1 font-medium\">{l.unusedTitle}</h3>\n {report.unused.length ? (\n <ul className=\"space-y-1\" data-testid=\"docx-definitions-unused\">\n {report.unused.map((u) => (\n <li key={u.paragraphId} className=\"flex items-center justify-between gap-2\">\n <span>{u.term}</span>\n <Button\n size=\"sm\"\n variant=\"ghost\"\n onClick={() => {\n const surface = editor?.surface\n surface?.setSelection({\n anchor: { paragraphId: u.paragraphId, offset: 0 },\n head: { paragraphId: u.paragraphId, offset: 0 },\n })\n surface?.revealParagraph(u.paragraphId)\n setReport(null)\n }}\n >\n {l.show}\n </Button>\n </li>\n ))}\n </ul>\n ) : (\n <p className=\"text-muted-foreground\">{l.unusedNone}</p>\n )}\n </section>\n {report.unknown.length > 0 && (\n <section>\n <h3 className=\"mb-1 font-medium\">{l.unknownTitle}</h3>\n <ul className=\"list-disc pl-5 text-muted-foreground\">\n {report.unknown.map((name) => (\n <li key={name}>{name}</li>\n ))}\n </ul>\n </section>\n )}\n </div>\n )}\n <DialogFooter>\n <Button variant=\"outline\" onClick={() => setReport(null)}>\n {l.close}\n </Button>\n </DialogFooter>\n </DialogContent>\n </Dialog>\n </DefinedTermsContext.Provider>\n )\n}\n\nfunction DefinedTermMenu({\n picker,\n rows,\n loading,\n selected,\n setSelected,\n agreements,\n labelId,\n setLabelId,\n onQuery,\n onPick,\n onClose,\n labels: l,\n}: {\n picker: PickerState\n rows: Row[]\n loading: boolean\n selected: number\n setSelected: (i: number) => void\n agreements: { id: string; name: string }[]\n labelId: string | null\n setLabelId: (id: string | null) => void\n onQuery: (q: string) => void\n onPick: (row: Row | undefined) => void\n onClose: () => void\n labels: DefinedTermsLabels\n}) {\n const listboxId = React.useId()\n const element = useRef<HTMLDivElement>(null)\n const search = picker.mode === 'search'\n useEffect(() => {\n const dismiss = (event: PointerEvent) => {\n if (!element.current?.contains(event.target as Node)) onClose()\n }\n document.addEventListener('pointerdown', dismiss)\n return () => document.removeEventListener('pointerdown', dismiss)\n }, [onClose])\n useEffect(() => {\n element.current\n ?.querySelector(`[data-index=\"${selected}\"]`)\n ?.scrollIntoView?.({ block: 'nearest' })\n }, [selected])\n const left = Math.max(8, Math.min(picker.left, window.innerWidth - 368))\n return (\n <div\n ref={element}\n className=\"native-docx-term-menu rounded-md border border-border bg-popover text-popover-foreground shadow-lg\"\n style={{ position: 'fixed', left, top: picker.top, width: 360, zIndex: 1000 }}\n data-testid=\"docx-defined-term-menu\"\n onMouseDown={(event) => {\n if (!(\n event.target instanceof HTMLInputElement || event.target instanceof HTMLSelectElement\n ))\n event.preventDefault()\n }}\n >\n {(search || agreements.length > 0) && (\n <div className=\"flex items-center gap-2 border-b border-border/50 p-2\">\n {search && (\n <input\n autoFocus\n className=\"min-w-0 flex-1 rounded border border-border bg-background px-2 py-1 text-sm\"\n placeholder={l.search}\n aria-label={l.search}\n role=\"combobox\"\n aria-expanded\n aria-controls={listboxId}\n aria-activedescendant={rows.length ? listOptionId(listboxId, selected) : undefined}\n value={picker.query}\n data-testid=\"docx-defined-term-search\"\n onChange={(event) => onQuery(event.target.value)}\n onKeyDown={(event) => {\n if (event.key === 'Escape') onClose()\n else if (!rows.length) return\n else if (event.key === 'ArrowDown') setSelected((selected + 1) % rows.length)\n else if (event.key === 'ArrowUp')\n setSelected((selected - 1 + rows.length) % rows.length)\n else if (event.key === 'Enter') onPick(rows[selected] ?? rows[0])\n else return\n event.preventDefault()\n }}\n />\n )}\n {agreements.length > 0 && (\n <select\n className=\"max-w-[45%] rounded border border-border bg-background px-1 py-1 text-xs\"\n aria-label=\"Narrow to\"\n value={labelId ?? ''}\n data-testid=\"docx-defined-term-label\"\n onChange={(event) => setLabelId(event.target.value || null)}\n >\n <option value=\"\">{l.allAgreements}</option>\n {agreements.map((a) => (\n <option key={a.id} value={a.id}>\n {a.name}\n </option>\n ))}\n </select>\n )}\n </div>\n )}\n <div className=\"border-b border-border/50 px-3 py-1.5 text-xs text-muted-foreground\">\n {l.hint}\n </div>\n <div\n id={listboxId}\n role=\"listbox\"\n aria-label={l.search}\n className=\"scrollbar-subtle max-h-72 overflow-y-auto py-1\"\n >\n {rows.length === 0 && (\n <p className=\"px-3 py-2 text-sm text-muted-foreground\">\n {loading ? l.loading : picker.query ? l.noMatch : l.empty}\n </p>\n )}\n {rows.map((row, index) => (\n <div\n key={row.definition.id}\n id={listOptionId(listboxId, index)}\n role=\"option\"\n aria-selected={index === selected}\n data-index={index}\n data-testid={`docx-defined-term-${row.definition.id}`}\n className={cn(\n 'cursor-pointer px-3 py-1.5 text-sm',\n row.variant && 'pl-6',\n index === selected ? 'bg-accent text-accent-foreground' : 'hover:bg-accent/50'\n )}\n onMouseEnter={() => setSelected(index)}\n onClick={() => onPick(row)}\n >\n <div className=\"flex items-baseline gap-2\">\n <span className={cn('shrink-0', row.variant ? 'text-xs' : 'font-medium')}>\n {row.variant ? l.alsoIn(sourceOf(row.definition)) : row.group.term}\n </span>\n {!row.variant && sourceOf(row.definition) && (\n <span className=\"truncate text-xs text-muted-foreground\">\n {sourceOf(row.definition)}\n </span>\n )}\n {!row.variant && row.group.definitions.length > 1 && row.definition.confirmed && (\n <span className=\"ml-auto shrink-0 rounded bg-muted px-1 text-[10px] uppercase text-muted-foreground\">\n {l.preferred}\n </span>\n )}\n </div>\n <p className=\"line-clamp-2 text-xs text-muted-foreground\">{row.definition.meaning}</p>\n </div>\n ))}\n </div>\n </div>\n )\n}\n\n/**\n * A card over an inserted term showing its definition. Terms are painted as internal links to\n * `#_dt_…` bookmarks; the link's own tooltip (what Word shows) is held back while the card shows.\n */\nfunction DefinedTermHover({\n root,\n resolve,\n onFirstHover,\n}: {\n root: Element | null\n resolve: (anchor: string) => Definition | undefined\n onFirstHover: () => void\n}) {\n const [card, setCard] = useState<{\n left: number\n top: number\n anchor: string\n fallback: string\n } | null>(null)\n const hovered = useRef(false)\n useEffect(() => {\n if (!root) return\n const over = (event: Event) => {\n const link = (event.target as Element | null)?.closest?.(\n 'a.docx-hyperlink[data-docx-link-kind=\"internal\"]'\n ) as HTMLAnchorElement | null\n const href = link?.getAttribute('href') ?? ''\n if (!link || !href.startsWith('#_dt_')) return\n if (!hovered.current) {\n hovered.current = true\n onFirstHover()\n }\n const title = link.getAttribute('title')\n if (title) {\n link.dataset.definition = title\n link.removeAttribute('title')\n }\n const rect = link.getBoundingClientRect()\n setCard({\n left: rect.left,\n top: rect.bottom + 6,\n anchor: href.slice(1),\n fallback: link.dataset.definition ?? '',\n })\n }\n const out = (event: Event) => {\n const link = (event.target as Element | null)?.closest?.('a.docx-hyperlink')\n if (link && !link.contains((event as MouseEvent).relatedTarget as Node)) setCard(null)\n }\n root.addEventListener('mouseover', over)\n root.addEventListener('mouseout', out)\n // A repaint can replace the link under the pointer without a mouseout: typing, clicking or\n // scrolling also hides the card.\n const hide = () => setCard(null)\n window.addEventListener('keydown', hide, true)\n window.addEventListener('pointerdown', hide, true)\n window.addEventListener('scroll', hide, true)\n return () => {\n root.removeEventListener('mouseover', over)\n root.removeEventListener('mouseout', out)\n window.removeEventListener('keydown', hide, true)\n window.removeEventListener('pointerdown', hide, true)\n window.removeEventListener('scroll', hide, true)\n }\n }, [root, onFirstHover])\n if (!card) return null\n const definition = resolve(card.anchor)\n return createPortal(\n <div\n role=\"tooltip\"\n className=\"native-docx-term-card rounded-md border border-border bg-popover p-3 text-sm text-popover-foreground shadow-lg\"\n style={{\n position: 'fixed',\n left: Math.max(8, Math.min(card.left, window.innerWidth - 348)),\n top: card.top,\n width: 340,\n zIndex: 1000,\n pointerEvents: 'none',\n }}\n data-testid=\"docx-defined-term-card\"\n >\n {definition ? (\n <>\n <p className=\"font-medium\">{definition.term}</p>\n <p className=\"mt-1 text-muted-foreground\">{definition.meaning}</p>\n {sourceOf(definition) && (\n <p className=\"mt-2 text-xs text-muted-foreground\">{sourceOf(definition)}</p>\n )}\n </>\n ) : (\n <p>{card.fallback}</p>\n )}\n </div>,\n document.body\n )\n}\n","/**\n * The house template inside the Word editor: which template applies (the workspace's, else the\n * deployment's, else ARBI's built-in legal template), its Quick Parts, and where this document's\n * styles have drifted from it. Mount `HouseTemplateProvider` inside `DocxEditor.Root`; the ribbon's\n * Quick Parts, Design tab and the style box read it from context.\n */\n\nimport React, { createContext, useCallback, useContext, useEffect, useMemo, useState } from 'react'\nimport { useDocxEditor } from '@docx-editor.dev/react'\nimport {\n attachedTemplateOf,\n buildingBlockFragment,\n defaultLegalTemplate,\n fragmentClipboardHtml,\n linkedLevelStyles,\n listBuildingBlocks,\n trackInsertion,\n type LinkedLevel,\n styleDivergence,\n type BuildingBlockInfo,\n type StyleDivergence,\n} from '@arbidocs/coedit/template'\nimport { useTrackedOrNoted } from '../structural/useTrackedOrNoted'\n\nexport type HouseTemplateSource = 'workspace' | 'deployment' | 'builtin'\n\nexport interface HouseTemplate {\n /** The .dotx/.docx bytes. */\n bytes: Uint8Array\n /** What to call it: its filename, or \"ARBI legal template\". */\n name: string\n source: HouseTemplateSource\n /** The workspace document it is, when it is one. */\n documentId?: string\n}\n\n/** How the host stores and resolves house templates. */\nexport interface HouseTemplateHost {\n /** The template that applies in this workspace. Falls back to the built-in one when it fails. */\n load: () => Promise<HouseTemplate>\n /**\n * Make a workspace document the workspace's house template. Present only when the user may\n * (a workspace owner) and the server stores house templates.\n */\n setFromDocument?: (documentId: string) => Promise<void>\n}\n\nexport const BUILTIN_TEMPLATE_NAME = 'ARBI legal template'\n\n/** The file name a document records as its attached template (`w:attachedTemplate`). */\nexport const templateFileName = (t: Pick<HouseTemplate, 'name'>) =>\n /\\.(dotx|dotm|docx|docm)$/i.test(t.name) ? t.name : `${t.name}.dotx`\n\nlet builtin: HouseTemplate | undefined\n/** ARBI's built-in UK legal template, with its Quick Parts. */\nexport function builtinHouseTemplate(): HouseTemplate {\n builtin ??= { bytes: defaultLegalTemplate(), name: BUILTIN_TEMPLATE_NAME, source: 'builtin' }\n return builtin\n}\n\n/** The template a host resolves, or the built-in one when there is no host or it fails. */\nexport async function resolveHouseTemplate(host?: HouseTemplateHost): Promise<HouseTemplate> {\n if (!host) return builtinHouseTemplate()\n try {\n return await host.load()\n } catch {\n return builtinHouseTemplate()\n }\n}\n\ninterface HouseTemplateContextValue {\n template: HouseTemplate\n blocks: readonly BuildingBlockInfo[]\n /** Null until measured (or for a document that cannot be read). */\n divergence: StyleDivergence | null\n /** The document was started from this template (it records it as attached). */\n basedOnTemplate: boolean\n /** Outline levels linked to styles in this document (Level 1 → Level 2 …), by style id. */\n levels: Readonly<Record<string, LinkedLevel>>\n /** Insert a Quick Part at the caret, with the styles, numbering and pictures it uses. */\n insertBlock: (name: string) => boolean\n /** Measure the divergence again (after something brought styles in). */\n refresh: () => void\n /** Present when this document may become the workspace's house template. */\n setAsHouseTemplate?: () => Promise<void>\n editable: boolean\n}\n\nconst HouseTemplateContext = createContext<HouseTemplateContextValue | null>(null)\n\nexport const useHouseTemplate = () => useContext(HouseTemplateContext)\n\nexport function HouseTemplateProvider({\n host,\n documentId,\n editable,\n notify,\n enabled = true,\n children,\n}: {\n /** False for a generating draft: no template chrome, no measuring. */\n enabled?: boolean\n host?: HouseTemplateHost\n /** The stored document this editor shows; absent for an unsaved note. */\n documentId?: string\n editable: boolean\n notify?: (message: string, kind: 'success' | 'error') => void\n children: React.ReactNode\n}) {\n const editor = useDocxEditor()\n const track = useTrackedOrNoted()\n const [template, setTemplate] = useState<HouseTemplate>(builtinHouseTemplate)\n const [divergence, setDivergence] = useState<StyleDivergence | null>(null)\n const [basedOnTemplate, setBasedOnTemplate] = useState(false)\n const [levels, setLevels] = useState<Readonly<Record<string, LinkedLevel>>>({})\n const [generation, setGeneration] = useState(0)\n\n useEffect(() => {\n let live = true\n void resolveHouseTemplate(host).then((t) => live && setTemplate(t))\n return () => {\n live = false\n }\n }, [host])\n\n const blocks = useMemo(() => {\n try {\n return listBuildingBlocks(template.bytes)\n } catch {\n return []\n }\n }, [template])\n\n useEffect(() => {\n if (!editor || !enabled) return\n let live = true\n void editor\n .save()\n .then((saved) => {\n if (!live || !saved) return\n const bytes = new Uint8Array(saved)\n setBasedOnTemplate(attachedTemplateOf(bytes) === templateFileName(template))\n setLevels(linkedLevelStyles(bytes))\n setDivergence(styleDivergence(bytes, template.bytes))\n })\n .catch(() => live && setDivergence(null))\n return () => {\n live = false\n }\n }, [editor, template, generation, enabled])\n\n const refresh = useCallback(() => setGeneration((g) => g + 1), [])\n\n const insertBlock = useCallback(\n (name: string) => {\n if (!editor || !editable) return false\n const fragment = buildingBlockFragment(template.bytes, name)\n if (!fragment) return false\n try {\n // While suggesting, the block lands as one tracked insertion (or with a comment on it).\n const result = track({\n label: `Inserted Quick Part: ${name}`,\n insert: (revision) =>\n editor.exec({\n type: 'paste',\n text: '',\n html: fragmentClipboardHtml(\n revision ? trackInsertion(fragment, revision, true) : fragment\n ),\n }),\n inserted: (r) => r.ok,\n })?.result\n if (!result?.ok) throw new Error(result?.reason ?? 'The block could not be inserted here.')\n refresh()\n return true\n } catch (failure) {\n notify?.(\n failure instanceof Error ? failure.message : 'Could not insert the block.',\n 'error'\n )\n return false\n }\n },\n [editor, editable, template, notify, refresh, track]\n )\n\n const setAsHouseTemplate = useMemo(\n () =>\n host?.setFromDocument && documentId\n ? async () => {\n try {\n await host.setFromDocument!(documentId)\n setTemplate(await resolveHouseTemplate(host))\n notify?.('This document is now the house template for new documents.', 'success')\n } catch (failure) {\n notify?.(\n failure instanceof Error ? failure.message : 'Could not set the house template.',\n 'error'\n )\n }\n }\n : undefined,\n [host, documentId, notify]\n )\n\n const value = useMemo(\n () => ({\n template,\n blocks,\n divergence,\n basedOnTemplate,\n levels,\n insertBlock,\n refresh,\n setAsHouseTemplate,\n editable,\n }),\n [\n template,\n blocks,\n divergence,\n basedOnTemplate,\n levels,\n insertBlock,\n refresh,\n setAsHouseTemplate,\n editable,\n ]\n )\n return (\n <HouseTemplateContext.Provider value={enabled ? value : null}>\n {children}\n </HouseTemplateContext.Provider>\n )\n}\n","import React from 'react'\nimport { renderToStaticMarkup } from 'react-dom/server'\nimport { AiMarkdown, splitMarkdownBlocks } from '@arbidocs/react/ui'\nimport type { Editor } from '@docx-editor.dev/core'\n\n/** Use the existing renderer; remove presentation controls, not Markdown syntax. */\nexport function wordDraftHtml(markdown: string): string {\n const template = document.createElement('template')\n template.innerHTML = renderToStaticMarkup(<AiMarkdown>{markdown}</AiMarkdown>)\n template.content\n .querySelectorAll('button, svg, [data-testid=\"code-block-header\"]')\n .forEach((node) => node.remove())\n // Code labels and copy controls belong to the preview, not the Word document.\n template.content.querySelectorAll('[data-testid=\"markdown-code-block\"]').forEach((node) => {\n const pre = node.querySelector('pre')\n if (pre) node.replaceWith(pre)\n })\n return template.innerHTML\n}\n\nfunction requireEdit(result: ReturnType<Editor['exec']>) {\n if (!result.ok) throw new Error(result.reason)\n}\n\n/** Completed blocks are immutable; only the unfinished block is replaced. */\nexport class WordDraftStream {\n private committed: string[] = []\n private pending?: { start: string; end: string }\n private resetAfterFailure = false\n constructor(private readonly editor: Editor) {}\n\n update(content: string, complete: boolean) {\n const blocks = splitMarkdownBlocks(content)\n const completeCount = complete ? blocks.length : Math.max(0, blocks.length - 1)\n requireEdit(this.editor.setEditingMode('editing'))\n try {\n if (\n this.resetAfterFailure ||\n this.committed.some((block, index) => blocks[index] !== block)\n ) {\n requireEdit(this.editor.exec({ type: 'selectAll' }))\n requireEdit(this.editor.exec({ type: 'deleteText' }))\n this.committed = []\n this.pending = undefined\n this.resetAfterFailure = false\n }\n for (let index = this.committed.length; index < blocks.length; index++) {\n const tail = this.editor.query({ type: 'paragraphs' }).at(-1)\n const start = this.pending?.start || tail?.paraId\n if (!start) throw new Error('The draft insertion paragraph is unavailable.')\n requireEdit(\n this.editor.exec(\n this.pending\n ? {\n type: 'setSelection',\n range: { from: { paraId: start }, to: { paraId: this.pending.end } },\n }\n : { type: 'setSelection', anchor: { paraId: start } }\n )\n )\n const html = wordDraftHtml(blocks[index]) + '<p></p>'\n const element = document.createElement('div')\n element.innerHTML = html\n const startIndex = this.editor\n .query({ type: 'paragraphs' })\n .findIndex((p) => p.paraId === start)\n requireEdit(this.editor.exec({ type: 'paste', html, text: element.textContent || '' }))\n const inserted = this.editor.query({ type: 'paragraphs' }).slice(startIndex)\n let headingIndex = 0\n for (const heading of Array.from(element.querySelectorAll('h1,h2,h3,h4,h5,h6'))) {\n const match = inserted.findIndex(\n (p, i) => i >= headingIndex && p.text === heading.textContent\n )\n if (match >= 0 && inserted[match].paraId) {\n requireEdit(\n this.editor.exec({\n type: 'setSelection',\n anchor: { paraId: inserted[match].paraId! },\n })\n )\n requireEdit(\n this.editor.exec({\n type: 'setParagraphStyle',\n styleId: `Heading${heading.tagName.slice(1)}`,\n })\n )\n headingIndex = match + 1\n }\n }\n const end = this.editor.query({ type: 'paragraphs' }).at(-1)?.paraId\n if (!end) throw new Error('The draft continuation paragraph is unavailable.')\n if (index < completeCount) {\n this.committed.push(blocks[index])\n this.pending = undefined\n } else this.pending = { start, end }\n }\n } catch (error) {\n // A public command can fail after paste succeeded. Rebuild the locked draft\n // on retry rather than appending the same partial block again.\n this.resetAfterFailure = true\n throw error\n } finally {\n requireEdit(this.editor.setEditingMode('viewing'))\n }\n }\n}\n","import React, { useEffect, useRef, useState } from 'react'\n\n/**\n * A ribbon button that opens a panel under the ribbon (Font, More formatting, the style gallery).\n * Pressing the trigger never takes the caret out of the document; the panel closes on Escape or a\n * press outside it. `children` may be a function that receives `close`, for panels that close\n * themselves once the user has picked something.\n */\nexport function RibbonMenu({\n label,\n icon,\n children,\n className,\n testId,\n title,\n}: {\n label: string\n /** Tooltip; defaults to `label`. */\n title?: string\n /** Trigger content: an icon, or a short text label with a `className` that widens it. */\n icon: React.ReactNode\n children: React.ReactNode | ((close: () => void) => React.ReactNode)\n className?: string\n testId?: string\n}) {\n const [open, setOpen] = useState(false)\n const element = useRef<HTMLDivElement>(null)\n useEffect(() => {\n if (!open) return\n const dismiss = (event: PointerEvent) => {\n if (!element.current?.contains(event.target as Node)) setOpen(false)\n }\n const escape = (event: KeyboardEvent) => {\n if (event.key === 'Escape') setOpen(false)\n }\n document.addEventListener('pointerdown', dismiss)\n document.addEventListener('keydown', escape)\n return () => {\n document.removeEventListener('pointerdown', dismiss)\n document.removeEventListener('keydown', escape)\n }\n }, [open])\n return (\n <div className=\"native-docx-ribbon-menu\" ref={element}>\n <button\n type=\"button\"\n className={['native-docx-ribbon-trigger', className].filter(Boolean).join(' ')}\n aria-label={label}\n title={title ?? label}\n aria-expanded={open}\n data-testid={testId}\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => setOpen((value) => !value)}\n >\n {icon}\n </button>\n {open && (\n <div\n className=\"native-docx-ribbon-popover\"\n role=\"group\"\n aria-label={label}\n onMouseDown={(event) => {\n if (!(\n event.target instanceof HTMLInputElement || event.target instanceof HTMLSelectElement\n ))\n event.preventDefault()\n }}\n >\n {typeof children === 'function' ? children(() => setOpen(false)) : children}\n </div>\n )}\n </div>\n )\n}\n","/**\n * Word's paragraph-style vocabulary for the native editor's chrome: finding a built-in style in\n * the document's own list, showing its name the way Word does, and Word's keyboard shortcuts for\n * styles and notes.\n */\n\nimport type { ParagraphStyleOption } from '@docx-editor.dev/react'\nimport type { StyleDivergence } from '@arbidocs/coedit/template'\n\n/** Word's quick picks, by the built-in style names `styles.xml` gives them. */\nexport const QUICK_STYLES = ['Normal', 'Title', 'heading 1', 'heading 2', 'heading 3'] as const\n\n/**\n * The style `name` names, matched the way Word matches built-in names (case-insensitively), with\n * the conventional id (`Heading1` for \"heading 1\") as a fallback for documents that name their\n * styles differently but keep Word's ids.\n */\nexport function findStyle(\n options: readonly ParagraphStyleOption[],\n name: string\n): ParagraphStyleOption | undefined {\n const wanted = name.toLowerCase()\n const id = name.replace(/(^|\\s)(\\w)/g, (_, _s: string, c: string) => c.toUpperCase())\n return (\n options.find((o) => o.name.toLowerCase() === wanted) ??\n options.find((o) => o.styleId.toLowerCase() === id.toLowerCase())\n )\n}\n\n/** A style's name as Word shows it: built-in names are stored lower-case (\"heading 1\"). */\nexport function styleLabel(name: string): string {\n return name === name.toLowerCase() ? name.replace(/(^|\\s)(\\w)/g, (m) => m.toUpperCase()) : name\n}\n\n/**\n * Word's shortcut for a keydown, or null. Ctrl+Alt (Cmd+Option on a Mac) with F, D or 1-3, and\n * Ctrl+Shift+N; read from `code` so a keyboard layout cannot move them.\n */\nexport function wordShortcut(\n event: Pick<KeyboardEvent, 'ctrlKey' | 'metaKey' | 'altKey' | 'shiftKey' | 'code'>\n): 'footnote' | 'endnote' | 'heading 1' | 'heading 2' | 'heading 3' | 'Normal' | null {\n const mod = event.ctrlKey || event.metaKey\n if (!mod) return null\n if (event.altKey && !event.shiftKey) {\n switch (event.code) {\n case 'KeyF':\n return 'footnote'\n case 'KeyD':\n return 'endnote'\n case 'Digit1':\n case 'Numpad1':\n return 'heading 1'\n case 'Digit2':\n case 'Numpad2':\n return 'heading 2'\n case 'Digit3':\n case 'Numpad3':\n return 'heading 3'\n }\n }\n if (event.shiftKey && !event.altKey && event.code === 'KeyN') return 'Normal'\n return null\n}\n\n/** A summary of how the document differs, for a tooltip; null when it matches. */\nexport function divergenceSummary(divergence: StyleDivergence | null): string | null {\n if (!divergence) return null\n const changed = divergence.styles\n .filter((s) => s.kind === 'changed')\n .map((s) => styleLabel(s.name))\n const missing = divergence.styles\n .filter((s) => s.kind === 'missing')\n .map((s) => styleLabel(s.name))\n const parts = [\n divergence.docDefaults ? 'default text formatting' : '',\n changed.length\n ? `${changed.length === 1 ? 'style' : 'styles'} ${changed.slice(0, 6).join(', ')}${changed.length > 6 ? '…' : ''}`\n : '',\n missing.length\n ? `${missing.length} house ${missing.length === 1 ? 'style' : 'styles'} missing`\n : '',\n ].filter(Boolean)\n return parts.length ? `Differs from the house template: ${parts.join('; ')}.` : null\n}\n","/**\n * Word's Styles group for the native editor's Home tab: a box showing the current paragraph's\n * style that opens a gallery of the document's own paragraph styles (from its `styles.xml`, so a\n * firm template's styles appear beside the built-ins), each drawn in its own face, with Normal,\n * Title and Headings 1-3 as quick picks. Applying a style writes `w:pStyle`.\n */\n\nimport React, { useMemo, useState } from 'react'\nimport { useDocxEditor, useParagraphStyle, type ParagraphStyleOption } from '@docx-editor.dev/react'\nimport { ChevronDown } from 'lucide-react'\nimport { listOptionId, useListKeyNav } from '../lib/useListKeyNav'\nimport { RibbonMenu } from './RibbonMenu'\nimport { QUICK_STYLES, divergenceSummary, findStyle, styleLabel } from './wordStyles'\nimport { useHouseTemplate } from './template/HouseTemplate'\n\n/** Show the filter once the list is longer than this. */\nconst FILTER_FROM = 8\n\nfunction previewStyle(option: ParagraphStyleOption): React.CSSProperties {\n const { fontFamily, fontSizePt, bold, italic, color } = option.preview\n return {\n fontFamily: fontFamily ? `\"${fontFamily}\", serif` : undefined,\n // In the face of the style, but within a row: 9-18pt.\n fontSize: fontSizePt ? `${Math.min(18, Math.max(9, fontSizePt))}pt` : undefined,\n fontWeight: bold ? 700 : undefined,\n fontStyle: italic ? 'italic' : undefined,\n color: color ? `#${color}` : undefined,\n }\n}\n\nfunction Gallery({ close }: { close: () => void }) {\n const { value, setValue, options, isEnabled } = useParagraphStyle()\n const editor = useDocxEditor()\n const house = useHouseTemplate()\n const changed = new Set(\n house?.basedOnTemplate\n ? house.divergence?.styles.filter((s) => s.kind === 'changed').map((s) => s.styleId)\n : []\n )\n const [query, setQuery] = useState('')\n const quick = useMemo(\n () =>\n QUICK_STYLES.map((name) => findStyle(options, name)).filter(\n (o): o is ParagraphStyleOption => !!o\n ),\n [options]\n )\n const shown = useMemo(() => {\n const q = query.trim().toLowerCase()\n return q\n ? options.filter(\n (o) => o.name.toLowerCase().includes(q) || o.styleId.toLowerCase().includes(q)\n )\n : options\n }, [options, query])\n const apply = (option: ParagraphStyleOption) => {\n setValue(option.styleId)\n close()\n editor?.surface?.focus()\n }\n const nav = useListKeyNav({\n open: true,\n items: shown,\n onPick: apply,\n onDismiss: close,\n resetKey: query,\n })\n return (\n <div className=\"native-docx-style-gallery\" data-testid=\"docx-style-gallery\">\n {quick.length > 0 && (\n <div className=\"native-docx-style-quick\" role=\"group\" aria-label=\"Quick styles\">\n {quick.map((option) => (\n <button\n key={option.styleId}\n type=\"button\"\n aria-pressed={value === option.styleId}\n disabled={!isEnabled}\n data-style-id={option.styleId}\n title={styleLabel(option.name)}\n onClick={() => apply(option)}\n >\n <span style={previewStyle(option)}>{styleLabel(option.name)}</span>\n </button>\n ))}\n </div>\n )}\n {options.length > FILTER_FROM && (\n <input\n className=\"native-docx-style-filter\"\n placeholder=\"Find a style\"\n aria-label=\"Find a style\"\n value={query}\n autoFocus\n onChange={(event) => setQuery(event.target.value)}\n onKeyDown={(event) => {\n nav.handleKeyDown(event)\n }}\n {...nav.comboboxProps}\n />\n )}\n <ul\n className=\"native-docx-style-list\"\n role=\"listbox\"\n id={nav.listboxId}\n aria-label=\"Document styles\"\n >\n {shown.map((option, index) => (\n <li\n key={option.styleId}\n id={listOptionId(nav.listboxId, index)}\n role=\"option\"\n aria-selected={value === option.styleId}\n aria-disabled={!isEnabled}\n data-active={index === nav.selectedIndex || undefined}\n data-style-id={option.styleId}\n onMouseEnter={() => nav.setSelectedIndex(index)}\n onClick={() => isEnabled && apply(option)}\n >\n <span style={previewStyle(option)}>{styleLabel(option.name)}</span>\n {changed.has(option.styleId) && (\n <span\n className=\"native-docx-style-diverged\"\n title=\"Defined differently from the house template\"\n aria-label=\"Defined differently from the house template\"\n />\n )}\n </li>\n ))}\n {shown.length === 0 && <li className=\"native-docx-style-empty\">No matching style</li>}\n </ul>\n </div>\n )\n}\n\n/** The Home tab's style box: the current paragraph style, opening the gallery. */\nexport function StyleGallery() {\n const { value, options } = useParagraphStyle()\n const current = options.find((o) => o.styleId === value)\n const name = current ? styleLabel(current.name) : 'Styles'\n const house = useHouseTemplate()\n // Only a document started from the house template has drifted from it.\n const diverged = house?.basedOnTemplate ? divergenceSummary(house.divergence) : null\n return (\n <RibbonMenu\n label=\"Styles\"\n title={diverged ? `Styles. ${diverged}` : undefined}\n className=\"native-docx-style-trigger\"\n testId=\"docx-style-trigger\"\n icon={\n <>\n <span className=\"native-docx-style-current\" data-testid=\"docx-current-style\">\n {name}\n </span>\n {diverged && (\n <span\n className=\"native-docx-style-diverged\"\n data-testid=\"docx-style-diverged\"\n aria-label={diverged}\n />\n )}\n <ChevronDown size={12} aria-hidden />\n </>\n }\n >\n {(close) => <Gallery close={close} />}\n </RibbonMenu>\n )\n}\n","/**\n * Footnotes and endnotes for the native editor's References tab, and Word's keyboard shortcuts\n * for notes and paragraph styles.\n *\n * The engine owns notes end to end: Insert footnote writes a `w:footnoteReference` at the caret\n * and its note in `footnotes.xml` (creating the part on a document that has none), moves the caret\n * into the note so the user types it straight away, numbers notes in document order, and lays\n * them out at the foot of the page, where an existing note is edited in place. What it leaves out\n * is Word's note paragraph style, so a new note is given the document's \"footnote text\" (or\n * \"endnote text\") style when it defines one.\n */\n\nimport React, { useEffect, useRef, type RefObject } from 'react'\nimport {\n DocxEditor,\n useDocxEditor,\n useEditorCommand,\n useParagraphStyle,\n} from '@docx-editor.dev/react'\nimport { NotebookText, Superscript } from 'lucide-react'\nimport { findStyle, wordShortcut } from './wordStyles'\nimport { editorPort, withDirectEditing } from './definitions/port'\nimport { useHouseTemplate } from './template/HouseTemplate'\n\ntype NoteKind = 'footnote' | 'endnote'\n\n/** Insert a note at the caret, as Word does: the reference, then the caret in the note's text. */\nfunction useInsertNote(kind: NoteKind) {\n const command = useEditorCommand(kind === 'footnote' ? 'insert.footnote' : 'insert.endnote')\n const { options } = useParagraphStyle()\n const editor = useDocxEditor()\n const insert = () => {\n // `execute` asks the engine first; the rendered `isEnabled` can trail a caret that has just\n // left a note.\n if (!command.execute()) return false\n const text = findStyle(options, `${kind} text`)\n // Formatting a note that is itself new is not a change to review: Word does not track it.\n if (text && editor)\n withDirectEditing(editor, () =>\n editor.exec({ type: 'setParagraphStyle', styleId: text.styleId })\n )\n return true\n }\n return { insert, isEnabled: command.isEnabled, disabledReason: command.disabledReason }\n}\n\nfunction NoteAction({\n kind,\n label,\n shortcut,\n icon,\n}: {\n kind: NoteKind\n label: string\n shortcut: string\n icon: React.ReactNode\n}) {\n const note = useInsertNote(kind)\n return (\n <DocxEditor.Toolbar.Action\n label={`${label} (${shortcut})`}\n icon={icon}\n disabled={!note.isEnabled}\n disabledReason={note.disabledReason ?? undefined}\n onSelect={() => void note.insert()}\n className={`native-docx-insert-${kind}`}\n />\n )\n}\n\n/** References tab: Insert footnote, Insert endnote. */\nexport function NoteButtons() {\n return (\n <>\n <NoteAction\n kind=\"footnote\"\n label=\"Insert footnote\"\n shortcut=\"Ctrl+Alt+F\"\n icon={<Superscript size={16} />}\n />\n <NoteAction\n kind=\"endnote\"\n label=\"Insert endnote\"\n shortcut=\"Ctrl+Alt+D\"\n icon={<NotebookText size={16} />}\n />\n </>\n )\n}\n\n/**\n * Binds Word's note and style shortcuts to key presses inside `scope` (the editor's page area),\n * ahead of the editor's own handling. Renders nothing; mount it inside `DocxEditor.Root`.\n */\nexport function WordShortcuts({ scope }: { scope: RefObject<HTMLElement | null> }) {\n const footnote = useInsertNote('footnote')\n const endnote = useInsertNote('endnote')\n const styles = useParagraphStyle()\n const editor = useDocxEditor()\n const levels = useHouseTemplate()?.levels\n const latest = useRef({ footnote, endnote, styles, editor, levels })\n latest.current = { footnote, endnote, styles, editor, levels }\n useEffect(() => {\n const element = scope.current\n if (!element) return\n const onKeyDown = (event: KeyboardEvent) => {\n if (outlineTab(event)) {\n event.preventDefault()\n event.stopPropagation()\n return\n }\n const action = wordShortcut(event)\n if (!action) return\n const { footnote, endnote, styles, editor } = latest.current\n if (action === 'footnote' || action === 'endnote') {\n if (!(action === 'footnote' ? footnote : endnote).insert()) return\n } else {\n const style = findStyle(styles.options, action)\n if (!style) return\n styles.setValue(style.styleId)\n }\n event.preventDefault()\n event.stopPropagation()\n editor?.surface?.focus()\n }\n /**\n * Word's Tab / Shift+Tab at the start of a clause whose numbering is linked to its style\n * (Level 2 → Level 3): the paragraph moves a level by taking the next level's style. The\n * engine's own Tab only indents, which leaves the clause number where it was.\n */\n const outlineTab = (event: KeyboardEvent) => {\n if (event.key !== 'Tab' || event.ctrlKey || event.metaKey || event.altKey) return false\n const { editor, levels, styles } = latest.current\n const current = editor?.getSelectionFormatting()?.styleId\n const link = current ? levels?.[current] : undefined\n const target = event.shiftKey ? link?.previous : link?.next\n if (!target || !editor || editorPort(editor).caret()?.offset !== 0) return false\n styles.setValue(target)\n return true\n }\n element.addEventListener('keydown', onKeyDown, true)\n return () => element.removeEventListener('keydown', onKeyDown, true)\n }, [scope])\n return null\n}\n","/**\n * Insert › Quick Parts: the house template's building blocks (execution blocks, document markings,\n * document skeletons) by category, each with a preview of its text; picking one inserts it at the\n * caret with the styles, numbering and pictures it uses.\n */\n\nimport React from 'react'\nimport { Blocks } from 'lucide-react'\nimport { RibbonMenu } from '../RibbonMenu'\nimport { useHouseTemplate } from './HouseTemplate'\n\nexport function QuickParts() {\n const house = useHouseTemplate()\n if (!house || house.blocks.length === 0) return null\n const categories = [...new Set(house.blocks.map((b) => b.category))]\n return (\n <RibbonMenu label=\"Quick Parts\" icon={<Blocks size={16} />} testId=\"docx-quick-parts\">\n {(close) => (\n <div className=\"native-docx-quick-parts\" data-testid=\"docx-quick-parts-panel\">\n {categories.map((category) => (\n <section key={category} aria-label={category}>\n <h3>{category}</h3>\n <ul>\n {house.blocks\n .filter((b) => b.category === category)\n .map((block) => (\n <li key={block.name}>\n <button\n type=\"button\"\n disabled={!house.editable}\n title={block.description || block.name}\n onClick={() => {\n close()\n house.insertBlock(block.name)\n }}\n >\n <span className=\"native-docx-quick-part-name\">{block.name}</span>\n <span className=\"native-docx-quick-part-preview\">{block.text}</span>\n </button>\n </li>\n ))}\n </ul>\n </section>\n ))}\n <p className=\"native-docx-quick-parts-source\">From {house.template.name}</p>\n </div>\n )}\n </RibbonMenu>\n )\n}\n","/**\n * Design › House template: which template new documents start from, whether this document's\n * styles still match it, and — for a workspace owner — making this document the house template.\n */\n\nimport React from 'react'\nimport { ChevronDown, Download } from 'lucide-react'\nimport { RibbonMenu } from '../RibbonMenu'\nimport { divergenceSummary } from '../wordStyles'\nimport { useHouseTemplate, type HouseTemplateSource } from './HouseTemplate'\n\nconst SOURCE: Record<HouseTemplateSource, string> = {\n workspace: \"This workspace's house template\",\n deployment: 'The house template for all workspaces',\n builtin: 'ARBI’s built-in template (no house template has been set)',\n}\n\nfunction download(bytes: Uint8Array, name: string) {\n const isTemplate = !/\\.docx$/i.test(name)\n const url = URL.createObjectURL(\n new Blob([bytes as Uint8Array<ArrayBuffer>], {\n type: isTemplate\n ? 'application/vnd.openxmlformats-officedocument.wordprocessingml.template'\n : 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',\n })\n )\n const a = document.createElement('a')\n a.href = url\n a.download = /\\.(dotx|docx)$/i.test(name) ? name : `${name}.dotx`\n a.click()\n setTimeout(() => URL.revokeObjectURL(url), 5000)\n}\n\nexport function HouseTemplatePanel() {\n const house = useHouseTemplate()\n if (!house) return null\n const summary = divergenceSummary(house.divergence)\n return (\n <RibbonMenu\n label=\"House template\"\n className=\"native-docx-style-trigger\"\n testId=\"docx-house-template\"\n icon={\n <>\n <span className=\"native-docx-style-current\">House template</span>\n <ChevronDown size={12} aria-hidden />\n </>\n }\n >\n <div className=\"native-docx-house-template\" data-testid=\"docx-house-template-panel\">\n <p>\n <strong>{house.template.name}</strong>\n <br />\n {SOURCE[house.template.source]}. New documents start from it.\n </p>\n <p data-testid=\"docx-house-template-status\">\n {house.divergence === null\n ? 'Comparing this document’s styles…'\n : !house.basedOnTemplate\n ? 'This document was not started from the house template.'\n : (summary ?? 'This document’s styles match the house template.')}\n </p>\n <div className=\"native-docx-house-template-actions\">\n <button type=\"button\" onClick={() => download(house.template.bytes, house.template.name)}>\n <Download size={14} /> Download template\n </button>\n {house.setAsHouseTemplate && (\n <button\n type=\"button\"\n data-testid=\"docx-set-house-template\"\n onClick={() => void house.setAsHouseTemplate!()}\n >\n Use this document as the house template\n </button>\n )}\n </div>\n </div>\n </RibbonMenu>\n )\n}\n","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 { DocxEditor, useChromeTranslate, type FontConfiguration } from '@docx-editor.dev/react'\nimport { collaborationModule, DOCUMENT_COLLABORATION_VERSIONS } from '@arbidocs/coedit'\nimport type { DocxCollaborationSession } from '@arbidocs/coedit'\nimport {\n createHocuspocusCollaboration,\n type HocuspocusCollaborationRoom,\n} from '@arbidocs/coedit/hocuspocus'\nimport { DocxEditorReview, reviewModule } from './review'\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 Ellipsis,\n BookA,\n ListRestart,\n} from 'lucide-react'\nimport { DefinedTermsProvider, useDefinedTerms } from './definitions/DefinedTerms'\nimport { RibbonMenu } from './RibbonMenu'\nimport { StyleGallery } from './StyleGallery'\nimport { NoteButtons, WordShortcuts } from './WordReferences'\nimport type { DefinitionSource } from '../tags/definitions'\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 { HouseTemplatePanel } from './template/HouseTemplatePanel'\nimport { DocxAuthorContext } from './structural/useTrackedOrNoted'\n\n/**\n * The editor path of a document's DOCX bytes. A version reference (`doc-…@v2`, a read-only\n * snapshot of an older version) reads that version; a plain id the current one.\n */\nexport function contentPath(documentId: string): string {\n const match = /^(doc-[A-Za-z0-9]+)@v([1-9][0-9]*)$/.exec(documentId)\n return match\n ? `/${encodeURIComponent(match[1])}/content?version=${match[2]}`\n : `/${encodeURIComponent(documentId)}/content`\n}\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 Update definitions, and typing `@@` in the body opens the term type-ahead.\n */\n definitions?: () => Promise<DefinitionSource[]>\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}\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}\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}\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, and Update definitions (when definitions are offered). */\nfunction DefinedTermButtons() {\n const terms = useDefinedTerms()\n if (!terms) return null\n return (\n <>\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 <button\n type=\"button\"\n className=\"native-docx-ribbon-trigger\"\n aria-label={terms.labels.update}\n title={terms.labels.update}\n data-testid=\"docx-update-definitions\"\n onMouseDown={(event) => event.preventDefault()}\n onClick={() => terms.update()}\n >\n <ListRestart size={16} />\n </button>\n </>\n )\n}\n\nexport function DocxRibbon({\n onSave,\n badge,\n}: {\n onSave: () => void\n /** A short state label at the end of the row, such as \"Co-edit mode\". */\n badge?: React.ReactNode\n}) {\n const [tab, setTab] = useState('Home')\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>References</option>\n <option>Review</option>\n </select>\n <DocxEditor.Toolbar t={t} preset={false} onSave={onSave}>\n <DocxEditor.Toolbar.Undo />\n <DocxEditor.Toolbar.Redo />\n <DocxEditor.Toolbar.Save />\n {tab === 'Home' && (\n <>\n <StyleGallery />\n <DocxEditor.Toolbar.Bold />\n <DocxEditor.Toolbar.Italic />\n <DocxEditor.Toolbar.Underline />\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 <RibbonMenu label=\"More formatting\" icon={<Ellipsis 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 </>\n )}\n {tab === 'Insert' && (\n <>\n <DocxEditor.Toolbar.TableInsert />\n <DocxEditor.Toolbar.ImageInsert />\n <DocxEditor.Toolbar.Link />\n <DefinedTermButtons />\n <QuickParts />\n </>\n )}\n {tab === 'Design' && <HouseTemplatePanel />}\n {tab === 'References' && <NoteButtons />}\n {tab === 'Review' && (\n <>\n <DocxEditor.Toolbar.EditingMode />\n <DocxEditor.Toolbar.Comments />\n <RibbonMenu label=\"Review options\" icon={<Ellipsis size={16} />}>\n <DocxEditor.Toolbar.Reviewers />\n </RibbonMenu>\n </>\n )}\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\nconst fixedZoomMode = { type: 'fixed' } as const\n\nexport function NativeDocxEditor({\n documentId,\n title,\n draftContent,\n initialCommentId,\n snapshot = false,\n onSaved,\n stream,\n adapter,\n}: NativeDocxEditorProps) {\n const [ready, setReady] = useState<Ready>(),\n [error, setError] = useState(''),\n [retry, setRetry] = useState(0)\n const [status, setStatus] = useState('Connecting…'),\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 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 · editing is locked'\n : current.error\n ? 'Generation stopped · draft retained'\n : 'Opening the saved Word document…'\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…')\n setDirty(false)\n dirtyRef.current = false\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 › 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 · 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 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 · edits buffered locally')\n else if (s === 'ready') {\n setError('')\n setStatus(dirtyRef.current ? 'Saving changes…' : '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…')\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 · live')\n }\n void start().catch((e) => {\n if (!cancelled) setError(e instanceof Error ? e.message : String(e))\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 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 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 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 · 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 const viewport = stageRef.current?.querySelector<HTMLElement>('.native-docx-viewport')\n if (!viewport) return\n const fit = () => {\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 const zoom = Math.max(0.1, Math.min(2.5, available / pageWidth))\n if (Math.abs(editor.getZoom() - zoom) > 0.001) editor.setZoom(zoom)\n }\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 fit()\n fitCleanup.current = () => {\n resize.disconnect()\n chrome.disconnect()\n }\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 · edits buffered locally' : 'Saving changes…'\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=\"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…\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)\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 <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 {!stream && (\n <DocxRibbon\n onSave={() => void saveVersion()}\n badge={\n // Says the document is shared live, in place of a title row above the ribbon.\n ready.room && ready.canEdit && !snapshot ? (\n <span title=\"Edits sync live with everyone who has this document open\">\n Co-edit mode\n </span>\n ) : undefined\n }\n />\n )}\n {!stream && <WordShortcuts 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 <DocxEditorReview>\n {() => (\n <DocxEditorReview.Card>\n <DocxCommentActivity />\n </DocxEditorReview.Card>\n )}\n </DocxEditorReview>\n </DocxMentions>\n <DocxEditor.HeaderFooterChrome />\n <DocxEditor.NotesChrome />\n <DocxEditor.Equation />\n <DocxEditor.HyperLink />\n <DocxEditor.ContextMenu />\n </DocxEditor.Viewport>\n <DocxEditor.PageNumber />\n </div>\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 <button onClick={() => void exportDocument()} disabled={!ready} aria-label=\"Download DOCX\">\n <Download size={14} />\n DOCX\n </button>\n {!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…' : isDraft ? 'Save note' : 'Save version'}\n </button>\n )}\n </div>\n </section>\n )\n}\n","import { createFontSource, type FontConfiguration } from '@docx-editor.dev/react'\nconst loaded = new Map<string, Promise<FontConfiguration>>()\nexport function loadDocxFonts(baseUrl = '/native-docx/fonts'): Promise<FontConfiguration> {\n let promise = loaded.get(baseUrl)\n if (!promise) {\n promise = loadFonts(baseUrl).catch((error) => {\n loaded.delete(baseUrl)\n throw error\n })\n loaded.set(baseUrl, promise)\n }\n return promise\n}\nasync function loadFonts(baseUrl: string): Promise<FontConfiguration> {\n const families = ['Liberation Serif', 'Liberation Sans', 'Liberation Mono']\n const variants = [\n { suffix: 'Regular', weight: 400, style: 'normal' },\n { suffix: 'Bold', weight: 700, style: 'normal' },\n { suffix: 'Italic', weight: 400, style: 'italic' },\n { suffix: 'BoldItalic', weight: 700, style: 'italic' },\n ] as const\n const sources = await Promise.all(\n families.flatMap((family) =>\n variants.map(async (face) => {\n const r = await fetch(\n `${baseUrl.replace(/\\/$/, '')}/${family.replace(' ', '')}-${face.suffix}.ttf`\n )\n if (!r.ok) throw new Error(`Could not load the document font ${family}.`)\n const result = createFontSource(new Uint8Array(await r.arrayBuffer()), {\n family,\n weight: face.weight,\n style: face.style,\n })\n if ('failure' in result)\n throw new Error(`Could not initialize the document font ${family}.`)\n return result.source\n })\n )\n )\n const aliases: Record<string, string> = {\n 'Times New Roman': 'Liberation Serif',\n Cambria: 'Liberation Serif',\n 'DejaVu Serif': 'Liberation Serif',\n Calibri: 'Liberation Sans',\n Aptos: 'Liberation Sans',\n Arial: 'Liberation Sans',\n Helvetica: 'Liberation Sans',\n 'Courier New': 'Liberation Mono',\n 'DejaVu Sans Mono': 'Liberation Mono',\n }\n return {\n epoch: 1,\n maxFontBytes: 12 * 1024 * 1024,\n sources,\n defaultFont: { family: 'Liberation Serif', sizeHalfPoints: 22 },\n supportedFamilies: [...families, ...Object.keys(aliases)],\n substitutions: Object.entries(aliases).flatMap(([from, to]) =>\n variants.map((face) => ({\n from: { family: from, weight: face.weight, style: face.style },\n to: { family: to, weight: face.weight, style: face.style },\n }))\n ),\n }\n}\n"]}