@opengeni/react 0.48.0 → 0.57.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +138 -2
- package/dist/artifacts-document.d.ts +3 -0
- package/dist/artifacts-document.js +17 -0
- package/dist/artifacts-document.js.map +1 -0
- package/dist/artifacts-presentation.d.ts +3 -0
- package/dist/artifacts-presentation.js +17 -0
- package/dist/artifacts-presentation.js.map +1 -0
- package/dist/artifacts-spreadsheet.d.ts +3 -0
- package/dist/artifacts-spreadsheet.js +17 -0
- package/dist/artifacts-spreadsheet.js.map +1 -0
- package/dist/artifacts.d.ts +2 -0
- package/dist/artifacts.js +199 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/{chunk-NJ7M2B6Z.js → chunk-5UQPNLIO.js} +16 -8
- package/dist/{chunk-NJ7M2B6Z.js.map → chunk-5UQPNLIO.js.map} +1 -1
- package/dist/{chunk-LHLYWG5R.js → chunk-6KLX2RH5.js} +461 -38
- package/dist/chunk-6KLX2RH5.js.map +1 -0
- package/dist/chunk-7WCLAEFV.js +2828 -0
- package/dist/chunk-7WCLAEFV.js.map +1 -0
- package/dist/{chunk-I4MPFDRP.js → chunk-B6WPZSTT.js} +104 -104
- package/dist/{chunk-I4MPFDRP.js.map → chunk-B6WPZSTT.js.map} +1 -1
- package/dist/{chunk-EKZH6IDG.js → chunk-C5ZPSSS5.js} +111 -1
- package/dist/chunk-C5ZPSSS5.js.map +1 -0
- package/dist/{chunk-OL6QVXGF.js → chunk-HA46CYQK.js} +152 -8
- package/dist/chunk-HA46CYQK.js.map +1 -0
- package/dist/chunk-HUIKIDM5.js +2148 -0
- package/dist/chunk-HUIKIDM5.js.map +1 -0
- package/dist/{chunk-FWXGSNXT.js → chunk-IGC6A2ZI.js} +585 -34
- package/dist/chunk-IGC6A2ZI.js.map +1 -0
- package/dist/chunk-JVYQRRC4.js +53 -0
- package/dist/chunk-JVYQRRC4.js.map +1 -0
- package/dist/chunk-KCGXPP5V.js +157 -0
- package/dist/chunk-KCGXPP5V.js.map +1 -0
- package/dist/chunk-LLOLUHVG.js +5937 -0
- package/dist/chunk-LLOLUHVG.js.map +1 -0
- package/dist/{chunk-WYA65Y3F.js → chunk-MKPIAGVL.js} +13 -3
- package/dist/chunk-MKPIAGVL.js.map +1 -0
- package/dist/chunk-PEI6RANI.js +3234 -0
- package/dist/chunk-PEI6RANI.js.map +1 -0
- package/dist/chunk-R3AZOAB5.js +933 -0
- package/dist/chunk-R3AZOAB5.js.map +1 -0
- package/dist/{chunk-O4VXOBGF.js → chunk-WSK7G5LE.js} +70 -2
- package/dist/chunk-WSK7G5LE.js.map +1 -0
- package/dist/{chunk-23EJ676W.js → chunk-XBZWOM2K.js} +9 -4
- package/dist/chunk-XBZWOM2K.js.map +1 -0
- package/dist/{chunk-XCNTXWBB.js → chunk-Y7OEDUJ5.js} +856 -338
- package/dist/chunk-Y7OEDUJ5.js.map +1 -0
- package/dist/client.d.ts +10 -2
- package/dist/clipboard.d.ts +1 -0
- package/dist/clipboard.js +7 -0
- package/dist/clipboard.js.map +1 -0
- package/dist/commands/index.d.ts +3 -3
- package/dist/commands/registry.d.ts +1 -1
- package/dist/commands/types.d.ts +1 -1
- package/dist/components/approval-surface.d.ts +2 -2
- package/dist/components/artifacts/artifact-surface.d.ts +18 -0
- package/dist/components/artifacts/document-editor.d.ts +172 -0
- package/dist/components/artifacts/editable-artifact-ui.d.ts +13 -0
- package/dist/components/artifacts/editable-artifact-workbench.d.ts +49 -0
- package/dist/components/artifacts/editable-document.d.ts +24 -0
- package/dist/components/artifacts/editable-presentation.d.ts +24 -0
- package/dist/components/artifacts/editable-spreadsheet.d.ts +32 -0
- package/dist/components/artifacts/index.d.ts +9 -0
- package/dist/components/artifacts/presentation-editor.d.ts +297 -0
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +14 -0
- package/dist/components/artifacts/spreadsheet-canvas.d.ts +120 -0
- package/dist/components/artifacts/spreadsheet-grid.d.ts +113 -0
- package/dist/components/browser-input.d.ts +7 -0
- package/dist/components/browser-viewer.d.ts +30 -0
- package/dist/components/chat-composer.d.ts +8 -8
- package/dist/components/code-editor.d.ts +25 -3
- package/dist/components/command-palette.d.ts +2 -2
- package/dist/components/composer-transcription-control.d.ts +2 -2
- package/dist/components/composer.d.ts +17 -17
- package/dist/components/computer-viewer.d.ts +24 -0
- package/dist/components/copy-button.d.ts +2 -2
- package/dist/components/desktop-viewer.d.ts +50 -22
- package/dist/components/diff-view.d.ts +1 -1
- package/dist/components/enrollment-consent.d.ts +1 -1
- package/dist/components/enrollment-device-flow.d.ts +1 -1
- package/dist/components/file-browser.d.ts +2 -2
- package/dist/components/fleet-tile.d.ts +1 -1
- package/dist/components/generated-video-player.d.ts +10 -0
- package/dist/components/human-input-form.d.ts +1 -1
- package/dist/components/human-input-surface.d.ts +2 -2
- package/dist/components/interaction-intervention-banner.d.ts +11 -0
- package/dist/components/interactive-workbench-viewers.d.ts +2 -0
- package/dist/components/machine-card.d.ts +2 -2
- package/dist/components/machine-dock-bar.d.ts +3 -3
- package/dist/components/machine-health-pill.d.ts +2 -2
- package/dist/components/machine-input-display.d.ts +1 -1
- package/dist/components/machine-metrics.d.ts +2 -2
- package/dist/components/machine-status-pill.d.ts +4 -4
- package/dist/components/machines/health.d.ts +1 -1
- package/dist/components/machines/machine-detail.d.ts +3 -3
- package/dist/components/machines/metric-history-chart.d.ts +1 -1
- package/dist/components/machines/metric-sparkline.d.ts +2 -2
- package/dist/components/machines/series.d.ts +2 -2
- package/dist/components/machines-dashboard.d.ts +2 -2
- package/dist/components/markdown.d.ts +1 -1
- package/dist/components/message-timeline.d.ts +12 -5
- package/dist/components/model-picker.d.ts +2 -2
- package/dist/components/model-policy-picker.d.ts +7 -7
- package/dist/components/pierre-diff.d.ts +1 -1
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/queue-draft-policy.d.ts +1 -1
- package/dist/components/queue-surface-implementation.d.ts +3 -3
- package/dist/components/queue-surface-state.d.ts +4 -4
- package/dist/components/queue-surface.d.ts +5 -5
- package/dist/components/sandbox-files.d.ts +3 -3
- package/dist/components/sandbox-terminal.d.ts +24 -4
- package/dist/components/sandbox-workspace.d.ts +28 -9
- package/dist/components/session-chrome.d.ts +4 -4
- package/dist/components/session-status.d.ts +2 -2
- package/dist/components/timeline-annotation-selection.d.ts +9 -0
- package/dist/components/timeline-annotations-dialog.d.ts +16 -0
- package/dist/components/timeline-annotations.d.ts +13 -0
- package/dist/components/tooltip.d.ts +4 -4
- package/dist/components/user-message-body.d.ts +2 -2
- package/dist/components/workbench-changes.d.ts +2 -2
- package/dist/components/workspace-dock.d.ts +1 -1
- package/dist/composer.d.ts +11 -11
- package/dist/composer.js +7 -7
- package/dist/hooks/internal.d.ts +1 -1
- package/dist/hooks/use-attached-browsers.d.ts +21 -0
- package/dist/hooks/use-auth-runs.d.ts +32 -0
- package/dist/hooks/use-available-models.d.ts +2 -2
- package/dist/hooks/use-billing-usage.d.ts +1 -1
- package/dist/hooks/use-browser-downloads.d.ts +25 -0
- package/dist/hooks/use-browser-frame-stream.d.ts +28 -0
- package/dist/hooks/use-browser-identities.d.ts +30 -0
- package/dist/hooks/use-browser-session.d.ts +29 -0
- package/dist/hooks/use-browser-sessions.d.ts +32 -0
- package/dist/hooks/use-channels.d.ts +26 -0
- package/dist/hooks/use-codex-accounts.d.ts +2 -2
- package/dist/hooks/use-composer.d.ts +36 -9
- package/dist/hooks/use-computer-frame-stream.d.ts +24 -0
- package/dist/hooks/use-computer-session.d.ts +29 -0
- package/dist/hooks/use-computer-sessions.d.ts +28 -0
- package/dist/hooks/use-desktop-stream.d.ts +5 -1
- package/dist/hooks/use-environments.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +1 -1
- package/dist/hooks/use-goal.d.ts +2 -2
- package/dist/hooks/use-human-input.d.ts +2 -2
- package/dist/hooks/use-interaction-interventions.d.ts +27 -0
- package/dist/hooks/use-interaction-invalidation.d.ts +19 -0
- package/dist/hooks/use-last-started-turn-policy.d.ts +2 -2
- package/dist/hooks/use-machine-chip.d.ts +2 -2
- package/dist/hooks/use-machines.d.ts +4 -4
- package/dist/hooks/use-network-routes.d.ts +25 -0
- package/dist/hooks/use-packs.d.ts +7 -2
- package/dist/hooks/use-rigs.d.ts +1 -1
- package/dist/hooks/use-sandbox-files.d.ts +6 -4
- package/dist/hooks/use-sandbox-git.d.ts +6 -5
- package/dist/hooks/use-sandbox-terminal.d.ts +1 -1
- package/dist/hooks/use-scheduled-tasks.d.ts +1 -1
- package/dist/hooks/use-session-capabilities.d.ts +5 -4
- package/dist/hooks/use-session-control.d.ts +1 -1
- package/dist/hooks/use-session-events.d.ts +2 -2
- package/dist/hooks/use-session-lineage.d.ts +1 -1
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session.d.ts +2 -2
- package/dist/hooks/use-site-auth-connections.d.ts +25 -0
- package/dist/hooks/use-slash-commands.d.ts +1 -1
- package/dist/hooks/use-supergrok-accounts.d.ts +26 -0
- package/dist/hooks/use-terminal-stream.d.ts +11 -2
- package/dist/hooks/use-turn-queue.d.ts +2 -2
- package/dist/hooks/use-video-artifact-playback.d.ts +9 -0
- package/dist/hooks/use-voice-input.d.ts +1 -1
- package/dist/hooks/use-workspace-capture.d.ts +1 -1
- package/dist/hooks/use-workspace-edit.d.ts +1 -1
- package/dist/hooks/use-workspace-sessions.d.ts +1 -1
- package/dist/hooks/use-workspaces.d.ts +1 -1
- package/dist/index.d.ts +162 -155
- package/dist/index.js +1822 -1703
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +33 -0
- package/dist/interaction.js +550 -0
- package/dist/interaction.js.map +1 -0
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +15 -0
- package/dist/interactive-workbench-viewers-TOHBXJEE.js.map +1 -0
- package/dist/lib/host-platform.d.ts +5 -0
- package/dist/lib/relay-wire.d.ts +24 -1
- package/dist/lib/sandbox-liveness.d.ts +9 -0
- package/dist/lib/terminal-capability.d.ts +5 -0
- package/dist/lib/xterm-theme.d.ts +1 -1
- package/dist/machines.d.ts +30 -30
- package/dist/machines.js +2 -2
- package/dist/model-policy.d.ts +1 -1
- package/dist/model-policy.js +1 -1
- package/dist/provider.d.ts +6 -5
- package/dist/{queue-surface-implementation-U5JFG7HT.js → queue-surface-implementation-2KVJTYXH.js} +100 -48
- package/dist/queue-surface-implementation-2KVJTYXH.js.map +1 -0
- package/dist/realtime/dropdown-menu.d.ts +8 -8
- package/dist/realtime/realtime-control.d.ts +8 -8
- package/dist/realtime.d.ts +4 -4
- package/dist/realtime.js +38 -11
- package/dist/realtime.js.map +1 -1
- package/dist/session-context.d.ts +28 -2
- package/dist/session-ui.d.ts +14 -14
- package/dist/session-ui.js +5 -4
- package/dist/session.d.ts +28 -28
- package/dist/session.js +10 -10
- package/dist/timeline/activity-rail.d.ts +5 -3
- package/dist/timeline/disclosure-context.d.ts +1 -1
- package/dist/timeline/fleet-decision-projection.d.ts +1 -1
- package/dist/timeline/fleet-decision-row.d.ts +3 -3
- package/dist/timeline/index.d.ts +19 -19
- package/dist/timeline/parsers.d.ts +4 -1
- package/dist/timeline/projection.d.ts +3 -3
- package/dist/timeline/registry.d.ts +8 -2
- package/dist/timeline/screenshot-lightbox.d.ts +2 -2
- package/dist/timeline/shared.d.ts +21 -10
- package/dist/timeline/tool-diff.d.ts +2 -2
- package/dist/timeline/tool-renderers.d.ts +1 -1
- package/dist/timeline/turn-summary.d.ts +3 -3
- package/dist/timeline/types.d.ts +44 -3
- package/dist/timeline-annotation-selection-3L7LHGG2.js +187 -0
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +1 -0
- package/dist/timeline-annotations-dialog-U7EVLR75.js +196 -0
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +1 -0
- package/package.json +36 -7
- package/src/artifacts-document.ts +31 -0
- package/src/artifacts-presentation.ts +36 -0
- package/src/artifacts-spreadsheet.ts +21 -0
- package/src/artifacts.ts +89 -0
- package/src/client.ts +157 -1
- package/src/clipboard.ts +2 -0
- package/src/components/artifacts/artifact-surface.tsx +93 -0
- package/src/components/artifacts/document-editor.tsx +2255 -0
- package/src/components/artifacts/editable-artifact-ui.tsx +89 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +203 -0
- package/src/components/artifacts/editable-document.tsx +657 -0
- package/src/components/artifacts/editable-presentation.tsx +1020 -0
- package/src/components/artifacts/editable-spreadsheet.tsx +733 -0
- package/src/components/artifacts/index.ts +104 -0
- package/src/components/artifacts/presentation-editor.tsx +3148 -0
- package/src/components/artifacts/published-html-artifact-frame.tsx +38 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +799 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +2129 -0
- package/src/components/browser-input.ts +65 -0
- package/src/components/browser-viewer.tsx +2702 -0
- package/src/components/chat-composer.tsx +13 -0
- package/src/components/code-editor.tsx +89 -30
- package/src/components/composer-transcription-control.tsx +10 -6
- package/src/components/computer-viewer.tsx +1636 -0
- package/src/components/desktop-viewer.tsx +215 -74
- package/src/components/generated-video-player.tsx +89 -0
- package/src/components/interaction-intervention-banner.tsx +99 -0
- package/src/components/interactive-workbench-viewers.ts +2 -0
- package/src/components/machine-input-display.ts +3 -0
- package/src/components/machines/machine-detail.tsx +1 -1
- package/src/components/message-timeline.tsx +289 -32
- package/src/components/model-policy-picker.tsx +15 -0
- package/src/components/queue-surface-implementation.tsx +116 -60
- package/src/components/sandbox-files.tsx +2 -2
- package/src/components/sandbox-terminal.tsx +128 -46
- package/src/components/sandbox-workspace.tsx +256 -90
- package/src/components/session-chrome.tsx +53 -13
- package/src/components/timeline-annotation-selection.tsx +221 -0
- package/src/components/timeline-annotations-dialog.tsx +213 -0
- package/src/components/timeline-annotations.tsx +84 -0
- package/src/components/workbench-changes.tsx +188 -31
- package/src/components/workspace-dock.tsx +59 -5
- package/src/hooks/use-attached-browsers.ts +154 -0
- package/src/hooks/use-auth-runs.ts +278 -0
- package/src/hooks/use-browser-downloads.ts +218 -0
- package/src/hooks/use-browser-frame-stream.ts +425 -0
- package/src/hooks/use-browser-identities.ts +266 -0
- package/src/hooks/use-browser-session.ts +543 -0
- package/src/hooks/use-browser-sessions.ts +286 -0
- package/src/hooks/use-channels.ts +99 -0
- package/src/hooks/use-composer.ts +769 -24
- package/src/hooks/use-computer-frame-stream.ts +434 -0
- package/src/hooks/use-computer-session.ts +462 -0
- package/src/hooks/use-computer-sessions.ts +251 -0
- package/src/hooks/use-desktop-stream.ts +39 -7
- package/src/hooks/use-interaction-interventions.ts +242 -0
- package/src/hooks/use-interaction-invalidation.ts +66 -0
- package/src/hooks/use-machine-chip.ts +15 -3
- package/src/hooks/use-machines.ts +33 -3
- package/src/hooks/use-network-routes.ts +214 -0
- package/src/hooks/use-packs.ts +51 -0
- package/src/hooks/use-sandbox-files.ts +98 -55
- package/src/hooks/use-sandbox-git.ts +93 -38
- package/src/hooks/use-sandbox-terminal.ts +3 -2
- package/src/hooks/use-session-capabilities.ts +59 -46
- package/src/hooks/use-site-auth-connections.ts +226 -0
- package/src/hooks/use-supergrok-accounts.ts +81 -0
- package/src/hooks/use-terminal-stream.ts +359 -47
- package/src/hooks/use-video-artifact-playback.ts +28 -0
- package/src/hooks/use-workspace-edit.ts +2 -1
- package/src/index.ts +18 -0
- package/src/interaction.ts +101 -0
- package/src/lib/host-platform.ts +10 -0
- package/src/lib/relay-wire.ts +47 -4
- package/src/lib/sandbox-liveness.ts +11 -0
- package/src/lib/terminal-capability.ts +10 -0
- package/src/model-policy.ts +19 -4
- package/src/provider.tsx +133 -1
- package/src/realtime/realtime-control.tsx +34 -6
- package/src/session-context.ts +156 -1
- package/src/timeline/activity-rail.tsx +25 -3
- package/src/timeline/index.ts +3 -0
- package/src/timeline/parsers.ts +14 -1
- package/src/timeline/projection.ts +269 -14
- package/src/timeline/registry.ts +13 -1
- package/src/timeline/screenshot-lightbox.tsx +19 -9
- package/src/timeline/shared.tsx +56 -8
- package/src/timeline/tool-renderers.tsx +303 -50
- package/src/timeline/types.ts +57 -3
- package/styles/compiled.css +312 -21
- package/styles/index.css +15 -0
- package/styles/responsive.css +13 -1
- package/dist/chunk-23EJ676W.js.map +0 -1
- package/dist/chunk-EKZH6IDG.js.map +0 -1
- package/dist/chunk-FWXGSNXT.js.map +0 -1
- package/dist/chunk-LHLYWG5R.js.map +0 -1
- package/dist/chunk-O4VXOBGF.js.map +0 -1
- package/dist/chunk-OL6QVXGF.js.map +0 -1
- package/dist/chunk-WYA65Y3F.js.map +0 -1
- package/dist/chunk-XCNTXWBB.js.map +0 -1
- package/dist/fleet-decision-projection-SLNZMS42.js +0 -241
- package/dist/fleet-decision-projection-SLNZMS42.js.map +0 -1
- package/dist/queue-surface-implementation-U5JFG7HT.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/artifacts/document-editor.tsx","../src/components/artifacts/editable-document.tsx"],"sourcesContent":["import type {\n Document as ReferenceDocument,\n DocumentTextStyle as ReferenceDocumentTextStyle,\n} from \"@opengeni/artifact-tool/reference\";\nimport {\n BoldIcon,\n Columns2Icon,\n ItalicIcon,\n MessageSquareTextIcon,\n PilcrowIcon,\n Rows3Icon,\n UnderlineIcon,\n} from \"lucide-react\";\nimport {\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type MouseEvent as ReactMouseEvent,\n type ReactNode,\n type UIEvent as ReactUIEvent,\n memo,\n useCallback,\n useEffect,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { ArtifactSurface } from \"./artifact-surface\";\n\nexport type DocumentLayoutMode = \"paginated\" | \"continuous\";\n\nexport type DocumentSelection = {\n blockId: string;\n start: number;\n end: number;\n};\n\nexport type DocumentCommit =\n | {\n kind: \"text\";\n blockId: string;\n text: string;\n revision: string | number;\n }\n | {\n kind: \"format\";\n blockId: string;\n range: { start: number; end: number };\n style: Partial<ReferenceDocumentTextStyle>;\n revision: string | number;\n }\n | {\n kind: \"insert-paragraph\";\n blockId: string;\n revision: string | number;\n };\n\nexport type DocumentCommitHandler =\n | ((commit: DocumentCommit) => void)\n | ((commit: DocumentCommit) => Promise<void>);\n\nexport type DocumentProjectionPageGeometry = Readonly<{\n widthPt: number;\n heightPt: number;\n marginTopPt: number;\n marginRightPt: number;\n marginBottomPt: number;\n marginLeftPt: number;\n headerPt?: number;\n footerPt?: number;\n gutterPt?: number;\n}>;\n\nexport type DocumentProjectionTextStyle = Readonly<{\n fontFamily?: string;\n fontSizePt?: number;\n color?: string;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n strike?: boolean;\n}>;\n\nexport type DocumentProjectionParagraphStyle = Readonly<{\n headingLevel?: 1 | 2 | 3 | 4 | 5 | 6;\n alignment?: \"left\" | \"center\" | \"right\" | \"justify\";\n spaceBeforePt?: number;\n spaceAfterPt?: number;\n lineHeight?: number;\n keepNext?: boolean;\n pageBreakBefore?: boolean;\n list?: Readonly<{\n kind: \"bullet\" | \"number\";\n level?: number;\n instanceId?: string;\n }>;\n}>;\n\nexport type DocumentProjectionTextRun = Readonly<{\n text: string;\n style?: DocumentProjectionTextStyle;\n}>;\n\nexport type DocumentProjectionParagraph = Readonly<{\n kind: \"paragraph\";\n id: string;\n runs: readonly DocumentProjectionTextRun[];\n style?: DocumentProjectionParagraphStyle;\n}>;\n\nexport type DocumentProjectionTable = Readonly<{\n kind: \"table\";\n id: string;\n rows: readonly (readonly (readonly DocumentProjectionTextRun[])[])[];\n style?: Readonly<{\n widthPt?: number;\n columnWidthsPt?: readonly number[];\n headerRows?: number;\n cellPaddingPt?: number;\n borderColor?: string;\n headerFill?: string;\n allowRowSplit?: boolean;\n }>;\n}>;\n\nexport type DocumentProjectionPageBreak = Readonly<{\n kind: \"pageBreak\";\n id: string;\n}>;\n\nexport type DocumentProjectionBlock =\n | DocumentProjectionParagraph\n | DocumentProjectionTable\n | DocumentProjectionPageBreak;\n\nexport type DocumentProjectionSection = Readonly<{\n id: string;\n startBlockIndex: number;\n page: DocumentProjectionPageGeometry;\n titlePage?: boolean;\n headerBlockCounts?: readonly [number, number, number];\n footerBlockCounts?: readonly [number, number, number];\n}>;\n\nexport type DocumentProjectionComment = Readonly<{\n id: string;\n blockId: string;\n start: number;\n end: number;\n resolved: boolean;\n replies: readonly Readonly<{ author: string; text: string; createdAt: string }>[];\n}>;\n\nexport type DocumentProjectionChange = Readonly<{\n id: string;\n blockId: string;\n kind: \"insert\" | \"delete\";\n start: number;\n end: number;\n author: string;\n createdAt: string;\n}>;\n\n/** Immutable render/edit projection; canonical document state stays with the host. */\nexport type DocumentEditorProjection = Readonly<{\n revision: string | number;\n page: DocumentProjectionPageGeometry;\n blocks: readonly DocumentProjectionBlock[];\n sections?: readonly DocumentProjectionSection[];\n comments?: readonly DocumentProjectionComment[];\n changes?: readonly DocumentProjectionChange[];\n}>;\n\nexport type DocumentEditorProps = {\n document: ReferenceDocument;\n /** Controlled projection mode. Omit to let the editor own the toggle. */\n layout?: DocumentLayoutMode | undefined;\n defaultLayout?: DocumentLayoutMode | undefined;\n onLayoutChange?: ((layout: DocumentLayoutMode) => void) | undefined;\n onSelectionChange?: ((selection: DocumentSelection) => void) | undefined;\n onCommit?: DocumentCommitHandler | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n readOnly?: boolean | undefined;\n ariaLabel?: string | undefined;\n viewportHeight?: number | undefined;\n overscanPages?: number | undefined;\n className?: string | undefined;\n};\n\nexport type DocumentProjectionEditorProps = Omit<\n DocumentEditorProps,\n \"document\" | \"onSelectionChange\" | \"onCommit\"\n> & {\n projection: DocumentEditorProjection;\n commit?: DocumentCommitHandler | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onSelectionChange?: ((selection: DocumentSelection) => void) | undefined;\n};\n\nexport type DocumentProjectionArtifactSurfaceProps = Omit<\n DocumentProjectionEditorProps,\n \"ariaLabel\" | \"className\"\n> & {\n title: string;\n subtitle?: ReactNode | undefined;\n busy?: boolean | undefined;\n className?: string | undefined;\n editorClassName?: string | undefined;\n};\n\nexport type DocumentArtifactSurfaceProps = Omit<DocumentEditorProps, \"ariaLabel\" | \"className\"> & {\n title: string;\n subtitle?: ReactNode | undefined;\n busy?: boolean | undefined;\n className?: string | undefined;\n editorClassName?: string | undefined;\n};\n\ntype DocumentViewTextRun = {\n readonly text: string;\n readonly style: DocumentProjectionTextStyle;\n};\n\ntype DocumentViewParagraph = {\n readonly kind: \"paragraph\";\n readonly id: string;\n readonly runs: readonly DocumentViewTextRun[];\n readonly style: DocumentProjectionParagraphStyle;\n text: string;\n format(format: { start: number; end: number; style: Partial<DocumentProjectionTextStyle> }): void;\n};\n\ntype DocumentViewTable = {\n readonly kind: \"table\";\n readonly id: string;\n readonly rows: readonly (readonly (readonly DocumentViewTextRun[])[])[];\n readonly style: NonNullable<DocumentProjectionTable[\"style\"]>;\n};\n\ntype DocumentViewPageBreak = {\n readonly kind: \"pageBreak\";\n readonly id: string;\n};\n\ntype DocumentViewBlock = DocumentViewParagraph | DocumentViewTable | DocumentViewPageBreak;\n\ntype DocumentViewComment = DocumentProjectionComment;\ntype DocumentViewChange = DocumentProjectionChange;\n\ntype DocumentViewModel = {\n readonly revision: number;\n readonly page: DocumentProjectionPageGeometry;\n readonly blocks: {\n readonly items: readonly DocumentViewBlock[];\n addParagraph(text?: string): DocumentViewParagraph;\n };\n readonly sections: {\n readonly items: readonly DocumentProjectionSection[];\n };\n readonly comments: {\n readonly items: readonly DocumentViewComment[];\n };\n readonly changes: {\n readonly items: readonly DocumentViewChange[];\n };\n resolve(id: string): unknown;\n};\n\ntype ProjectedBlock = {\n block: Exclude<DocumentViewBlock, DocumentViewPageBreak>;\n height: number;\n listOrdinal?: number | undefined;\n};\n\ntype ProjectedPage = {\n key: string;\n blocks: ProjectedBlock[];\n height: number;\n minimumHeight: number;\n page: DocumentProjectionPageGeometry;\n};\n\ntype RenderedPage = ProjectedPage & {\n naturalHeight: number;\n renderScale: number;\n};\n\ntype PageAxis = {\n offsets: Float64Array;\n total: number;\n};\n\ntype PageScrollAnchor = {\n axis: PageAxis;\n key: string;\n offset: number;\n scrollTop: number;\n};\n\nconst POINT_TO_CSS_PIXEL = 4 / 3;\nconst DEFAULT_VIEWPORT_HEIGHT = 640;\nconst RESPONSIVE_CONTINUOUS_LAYOUT_WIDTH = 640;\nconst PAGINATED_GAP = 24;\nconst CONTINUOUS_GAP = 1;\nconst MAX_PLAIN_TEXT_TRANSFER = 1_000_000;\nconst MAX_PROJECTION_BLOCKS = 100_000;\nconst MAX_PROJECTION_TABLE_CELLS = 1_000_000;\nconst MAX_PROJECTION_ANNOTATIONS = 100_000;\nconst MAX_PROJECTION_TEXT = 1_000_000;\nconst EMPTY_COMMENTS: readonly DocumentViewComment[] = [];\nconst EMPTY_CHANGES: readonly DocumentViewChange[] = [];\n\n/** Compatibility adapter for the public authoring model. */\nexport function DocumentEditor(props: DocumentEditorProps) {\n return <DocumentEditorCore {...props} document={asDocumentView(props.document)} />;\n}\n\n/** Projection-first document editor with one async command boundary. */\nexport function DocumentProjectionEditor({\n projection,\n commit,\n onCommandError,\n onSelectionChange,\n readOnly = false,\n ...props\n}: DocumentProjectionEditorProps) {\n const view = useMemo(() => documentViewFromProjection(projection), [projection]);\n return (\n <DocumentEditorCore\n {...props}\n document={view.document}\n revisionToken={projection.revision}\n readOnly={readOnly || !commit}\n onCommandError={onCommandError}\n blockIdForView={(blockId) => view.externalIdByInternal.get(blockId) ?? blockId}\n onSelectionChange={(selection) =>\n onSelectionChange?.({\n ...selection,\n blockId: view.externalIdByInternal.get(selection.blockId) ?? selection.blockId,\n })\n }\n onCommit={(command) => commit?.(mapDocumentCommit(command, view.externalIdByInternal))}\n />\n );\n}\n\ntype DocumentEditorCoreProps = Omit<DocumentEditorProps, \"document\"> & {\n document: DocumentViewModel;\n revisionToken?: string | number | undefined;\n blockIdForView?: ((blockId: string) => string) | undefined;\n};\n\nfunction DocumentEditorCore({\n document,\n revisionToken,\n layout: controlledLayout,\n defaultLayout,\n onLayoutChange,\n onSelectionChange,\n onCommit,\n onCommandError,\n blockIdForView = identity,\n readOnly = false,\n ariaLabel = \"Document editor\",\n viewportHeight = DEFAULT_VIEWPORT_HEIGHT,\n overscanPages = 1,\n className,\n}: DocumentEditorCoreProps) {\n const [uncontrolledLayout, setUncontrolledLayout] = useState<DocumentLayoutMode>(\n defaultLayout ?? \"paginated\",\n );\n const [scrollTop, setScrollTop] = useState(0);\n const [measuredViewport, setMeasuredViewport] = useState({ width: 0, height: 0 });\n const [localRevision, setLocalRevision] = useState(document.revision);\n const [measuredPageHeights, setMeasuredPageHeights] = useState<ReadonlyMap<string, number>>(\n () => new Map(),\n );\n const [selectedBlockId, setSelectedBlockId] = useState<string | null>(null);\n const [hasTextSelection, setHasTextSelection] = useState(false);\n const selectionRef = useRef<DocumentSelection | null>(null);\n const [openThreadId, setOpenThreadId] = useState<string | null>(null);\n const [pendingCommands, setPendingCommands] = useState(0);\n const [commandFailure, setCommandFailure] = useState<{\n message: string;\n retry: () => void;\n } | null>(null);\n const editorNodes = useRef(new Map<string, HTMLElement>());\n const viewportRef = useRef<HTMLDivElement | null>(null);\n const pendingScrollTop = useRef(0);\n const scrollFrame = useRef<number | null>(null);\n const pendingMeasurementAnchor = useRef<PageScrollAnchor | null>(null);\n const responsiveLayoutInitialized = useRef(false);\n const measuredPageHeightsRef = useRef<ReadonlyMap<string, number>>(new Map());\n const mountedRef = useRef(true);\n const commandScopeRef = useRef(0);\n const commandVersionsRef = useRef(new Map<string, number>());\n const layout = controlledLayout ?? uncontrolledLayout;\n const documentRevision = revisionToken ?? document.revision;\n const pageGap = layout === \"paginated\" ? PAGINATED_GAP : CONTINUOUS_GAP;\n\n // localRevision intentionally participates in this projection. The public\n // reference model is synchronous; hosts can still replace/rerender the same\n // document after remote changes without the editor owning persistence state.\n const basePages = useMemo(\n () => projectPages(document, layout),\n // The revision values intentionally invalidate projections over the mutable public model.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n [document, documentRevision, layout, localRevision],\n );\n const naturalPages = useMemo(\n () =>\n basePages.map((page) => ({\n ...page,\n // Estimates seed unmounted pages only. Once mounted, intrinsic content\n // may correct the page in either direction while preserving paper size.\n height: measuredPageHeights.has(page.key)\n ? Math.max(page.minimumHeight, measuredPageHeights.get(page.key) ?? page.height)\n : page.height,\n })),\n [basePages, measuredPageHeights],\n );\n const pages = useMemo<RenderedPage[]>(\n () =>\n naturalPages.map((page) => {\n const renderScale =\n layout === \"paginated\"\n ? responsiveDocumentPageScale(page.page, measuredViewport.width)\n : 1;\n return {\n ...page,\n naturalHeight: page.height,\n renderScale,\n height: page.height * renderScale,\n minimumHeight: page.minimumHeight * renderScale,\n };\n }),\n [layout, measuredViewport.width, naturalPages],\n );\n const annotations = useMemo(\n () => indexAnnotations(document),\n // The revision values intentionally invalidate indexes over the mutable public model.\n // oxlint-disable-next-line react-hooks/exhaustive-deps\n [document, documentRevision, localRevision],\n );\n const axis = useMemo(() => buildPageAxis(pages, pageGap), [pages, pageGap]);\n const pagesRef = useRef(pages);\n const axisRef = useRef(axis);\n pagesRef.current = pages;\n axisRef.current = axis;\n const blockPageIndex = useMemo(() => {\n const index = new Map<string, number>();\n pages.forEach((page, pageIndex) => {\n for (const { block } of page.blocks) index.set(block.id, pageIndex);\n });\n return index;\n }, [pages]);\n const activePage = selectedBlockId ? (blockPageIndex.get(selectedBlockId) ?? -1) : -1;\n const mountedIndexes = useMemo(\n () =>\n visiblePageIndexes(\n axis,\n pages.length,\n scrollTop,\n Math.max(1, measuredViewport.height || viewportHeight),\n Math.max(0, Math.floor(overscanPages)),\n activePage,\n ),\n [\n activePage,\n axis,\n measuredViewport.height,\n overscanPages,\n pages.length,\n scrollTop,\n viewportHeight,\n ],\n );\n\n useLayoutEffect(() => {\n const element = viewportRef.current;\n if (!element) return;\n const measure = () => {\n const width = element.clientWidth;\n const height = element.clientHeight;\n if (width <= 0 && height <= 0) return;\n setMeasuredViewport((current) =>\n current.width === width && current.height === height ? current : { width, height },\n );\n };\n measure();\n const observer = globalThis.ResizeObserver ? new globalThis.ResizeObserver(measure) : null;\n observer?.observe(element);\n globalThis.addEventListener?.(\"resize\", measure);\n return () => {\n observer?.disconnect();\n globalThis.removeEventListener?.(\"resize\", measure);\n };\n }, []);\n\n useLayoutEffect(() => {\n if (\n responsiveLayoutInitialized.current ||\n controlledLayout !== undefined ||\n defaultLayout !== undefined ||\n measuredViewport.width <= 0\n ) {\n return;\n }\n responsiveLayoutInitialized.current = true;\n if (measuredViewport.width < RESPONSIVE_CONTINUOUS_LAYOUT_WIDTH) {\n setUncontrolledLayout(\"continuous\");\n onLayoutChange?.(\"continuous\");\n }\n }, [controlledLayout, defaultLayout, measuredViewport.width, onLayoutChange]);\n\n useEffect(() => {\n commandScopeRef.current += 1;\n commandVersionsRef.current.clear();\n selectionRef.current = null;\n setSelectedBlockId(null);\n setHasTextSelection(false);\n setOpenThreadId(null);\n setLocalRevision(document.revision);\n setPendingCommands(0);\n setCommandFailure(null);\n }, [document, revisionToken]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n if (scrollFrame.current !== null && globalThis.cancelAnimationFrame) {\n globalThis.cancelAnimationFrame(scrollFrame.current);\n }\n };\n }, []);\n\n const handleScroll = useCallback((event: ReactUIEvent<HTMLElement>) => {\n pendingScrollTop.current = event.currentTarget.scrollTop;\n if (scrollFrame.current !== null) return;\n if (!globalThis.requestAnimationFrame) {\n scrollFrame.current = -1;\n queueMicrotask(() => {\n scrollFrame.current = null;\n setScrollTop(pendingScrollTop.current);\n });\n return;\n }\n scrollFrame.current = globalThis.requestAnimationFrame(() => {\n scrollFrame.current = null;\n setScrollTop(pendingScrollTop.current);\n });\n }, []);\n\n const clearSelection = useCallback(() => {\n selectionRef.current = null;\n setSelectedBlockId(null);\n setHasTextSelection(false);\n }, []);\n\n const recordPageHeight = useCallback((key: string, height: number) => {\n if (!Number.isFinite(height) || height <= 0) return;\n const rounded = Math.ceil(height);\n const current = measuredPageHeightsRef.current;\n if (Math.abs((current.get(key) ?? 0) - rounded) <= 1) return;\n\n const currentPages = pagesRef.current;\n if (!currentPages.some((page) => page.key === key)) return;\n const viewport = viewportRef.current;\n // Absolute positioning prevents useful native scroll anchoring. Retain the\n // visible page and its intra-page offset across the upcoming axis change.\n if (viewport && pendingMeasurementAnchor.current === null) {\n const currentAxis = axisRef.current;\n const anchorIndex = pageAtOffset(currentAxis, currentPages.length, viewport.scrollTop);\n const anchorPage = currentPages[anchorIndex];\n if (anchorPage) {\n pendingMeasurementAnchor.current = {\n axis: currentAxis,\n key: anchorPage.key,\n offset: viewport.scrollTop - currentAxis.offsets[anchorIndex]!,\n scrollTop: viewport.scrollTop,\n };\n }\n }\n\n // Page keys include layout, section, position, and the first stable block\n // id. Prune measurements that no longer belong to the current projection\n // here instead of clearing them in an effect: a passive reset can run after\n // a newly mounted page's layout-effect measurement and erase that report.\n const next = new Map<string, number>();\n for (const page of currentPages) {\n const measured = current.get(page.key);\n if (measured !== undefined) next.set(page.key, measured);\n }\n next.set(key, rounded);\n measuredPageHeightsRef.current = next;\n setMeasuredPageHeights(next);\n }, []);\n\n useLayoutEffect(() => {\n const anchor = pendingMeasurementAnchor.current;\n if (!anchor || anchor.axis === axis) return;\n pendingMeasurementAnchor.current = null;\n const viewport = viewportRef.current;\n if (!viewport || Math.abs(viewport.scrollTop - anchor.scrollTop) > 1) return;\n const anchorIndex = pages.findIndex((page) => page.key === anchor.key);\n if (anchorIndex < 0) return;\n const nextScrollTop = Math.max(0, axis.offsets[anchorIndex]! + anchor.offset);\n if (Math.abs(viewport.scrollTop - nextScrollTop) > 0.5) {\n viewport.scrollTop = nextScrollTop;\n }\n const correctedScrollTop = viewport.scrollTop;\n pendingScrollTop.current = correctedScrollTop;\n setScrollTop((current) =>\n Math.abs(current - correctedScrollTop) > 0.5 ? correctedScrollTop : current,\n );\n }, [axis, pages]);\n\n const publishSelection = useCallback(\n (next: DocumentSelection) => {\n selectionRef.current = next;\n setSelectedBlockId((current) => (current === next.blockId ? current : next.blockId));\n const nextHasTextSelection = next.end > next.start;\n setHasTextSelection((current) =>\n current === nextHasTextSelection ? current : nextHasTextSelection,\n );\n onSelectionChange?.(next);\n },\n [onSelectionChange],\n );\n\n const readDomSelection = useCallback(\n (blockId: string): DocumentSelection => {\n const node = editorNodes.current.get(blockId);\n const offsets = node ? selectionOffsets(node) : null;\n const next = {\n blockId,\n start: offsets?.start ?? 0,\n end: offsets?.end ?? 0,\n };\n publishSelection(next);\n return next;\n },\n [publishSelection],\n );\n\n const runCommit = useCallback(\n (command: DocumentCommit) => {\n if (!onCommit) return;\n const scope = commandScopeRef.current;\n const submit = () => {\n const key = command.blockId;\n const version = (commandVersionsRef.current.get(key) ?? 0) + 1;\n commandVersionsRef.current.set(key, version);\n setCommandFailure(null);\n const fail = (cause: unknown) => {\n if (\n !mountedRef.current ||\n commandScopeRef.current !== scope ||\n commandVersionsRef.current.get(key) !== version\n ) {\n return;\n }\n const error = asDocumentError(cause);\n setCommandFailure({ message: error.message, retry: submit });\n onCommandError?.(error);\n };\n let result: void | Promise<void>;\n try {\n result = onCommit(command);\n } catch (cause) {\n fail(cause);\n return;\n }\n if (!result || typeof result.then !== \"function\") return;\n setPendingCommands((current) => current + 1);\n void Promise.resolve(result).then(\n () => {\n if (!mountedRef.current || commandScopeRef.current !== scope) return;\n setPendingCommands((current) => Math.max(0, current - 1));\n },\n (cause) => {\n if (!mountedRef.current || commandScopeRef.current !== scope) return;\n setPendingCommands((current) => Math.max(0, current - 1));\n fail(cause);\n },\n );\n };\n submit();\n },\n [onCommandError, onCommit],\n );\n\n const commitText = useCallback(\n (paragraph: DocumentViewParagraph, text: string) => {\n if (readOnly || paragraph.text === text) return;\n paragraph.text = text;\n runCommit({\n kind: \"text\",\n blockId: paragraph.id,\n text,\n revision: revisionToken ?? document.revision,\n });\n },\n [document, readOnly, revisionToken, runCommit],\n );\n\n const applyFormat = useCallback(\n (property: \"bold\" | \"italic\" | \"underline\") => {\n const selection = selectionRef.current;\n if (readOnly || !selection) return;\n let block: unknown;\n try {\n block = document.resolve(selection.blockId);\n } catch {\n clearSelection();\n return;\n }\n if (!isDocumentParagraph(block)) return;\n const node = editorNodes.current.get(block.id);\n if (node) commitText(block, node.textContent ?? \"\");\n const current = selectionOffsets(node) ?? selection;\n const start = Math.max(0, Math.min(current.start, block.text.length));\n const end = Math.max(start, Math.min(current.end, block.text.length));\n if (end <= start) return;\n const effectiveEnd = end;\n const effectiveStart = start;\n const style = toggledTextStyle(block, effectiveStart, effectiveEnd, property);\n block.format({ start: effectiveStart, end: effectiveEnd, style });\n runCommit({\n kind: \"format\",\n blockId: block.id,\n range: { start: effectiveStart, end: effectiveEnd },\n style,\n revision: revisionToken ?? document.revision,\n });\n queueMicrotask(() => restoreSelection(editorNodes.current.get(block.id), start, end));\n },\n [clearSelection, commitText, document, readOnly, revisionToken, runCommit],\n );\n\n const handleEditorKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLElement>, paragraph: DocumentViewParagraph) => {\n const modifier = event.metaKey || event.ctrlKey;\n if (!modifier) return;\n const key = event.key.toLowerCase();\n if (key !== \"b\" && key !== \"i\" && key !== \"u\") return;\n event.preventDefault();\n const current = readDomSelection(paragraph.id);\n selectionRef.current = current;\n const property = key === \"b\" ? \"bold\" : key === \"i\" ? \"italic\" : \"underline\";\n const start = current.start;\n const end = current.end;\n if (end <= start || readOnly) return;\n const effectiveStart = start;\n const effectiveEnd = end;\n const style = toggledTextStyle(paragraph, effectiveStart, effectiveEnd, property);\n paragraph.format({ start: effectiveStart, end: effectiveEnd, style });\n runCommit({\n kind: \"format\",\n blockId: paragraph.id,\n range: { start: effectiveStart, end: effectiveEnd },\n style,\n revision: revisionToken ?? document.revision,\n });\n queueMicrotask(() => restoreSelection(editorNodes.current.get(paragraph.id), start, end));\n },\n [document, readDomSelection, readOnly, revisionToken, runCommit],\n );\n\n const changeLayout = (next: DocumentLayoutMode) => {\n if (controlledLayout === undefined) setUncontrolledLayout(next);\n onLayoutChange?.(next);\n };\n\n const addFirstParagraph = () => {\n if (readOnly) return;\n const paragraph = document.blocks.addParagraph(\"\");\n setLocalRevision(document.revision);\n publishSelection({ blockId: paragraph.id, start: 0, end: 0 });\n runCommit({\n kind: \"insert-paragraph\",\n blockId: paragraph.id,\n revision: revisionToken ?? document.revision,\n });\n };\n\n return (\n <div\n data-og-document-editor=\"\"\n data-og-document-layout={layout}\n data-og-command-state={commandFailure ? \"error\" : pendingCommands > 0 ? \"pending\" : \"idle\"}\n aria-busy={pendingCommands > 0 ? \"true\" : undefined}\n className={cn(\"flex h-full min-h-0 min-w-0 flex-col bg-og-surface-2\", className)}\n >\n <div\n role=\"toolbar\"\n aria-label=\"Document formatting\"\n className=\"flex min-h-10 shrink-0 items-center gap-1 border-b border-og-border bg-og-surface-1 px-2\"\n >\n <ToolbarButton\n label=\"Bold\"\n shortcut=\"⌘B\"\n disabled={readOnly || !selectedBlockId || !hasTextSelection}\n onPress={() => applyFormat(\"bold\")}\n >\n <BoldIcon className=\"size-4\" />\n </ToolbarButton>\n <ToolbarButton\n label=\"Italic\"\n shortcut=\"⌘I\"\n disabled={readOnly || !selectedBlockId || !hasTextSelection}\n onPress={() => applyFormat(\"italic\")}\n >\n <ItalicIcon className=\"size-4\" />\n </ToolbarButton>\n <ToolbarButton\n label=\"Underline\"\n shortcut=\"⌘U\"\n disabled={readOnly || !selectedBlockId || !hasTextSelection}\n onPress={() => applyFormat(\"underline\")}\n >\n <UnderlineIcon className=\"size-4\" />\n </ToolbarButton>\n <span aria-hidden className=\"mx-1 h-5 w-px bg-og-border\" />\n <ToolbarButton\n label=\"Continuous layout\"\n pressed={layout === \"continuous\"}\n onPress={() => changeLayout(\"continuous\")}\n >\n <Rows3Icon className=\"size-4\" />\n </ToolbarButton>\n <ToolbarButton\n label=\"Paginated layout\"\n pressed={layout === \"paginated\"}\n onPress={() => changeLayout(\"paginated\")}\n >\n <Columns2Icon className=\"size-4\" />\n </ToolbarButton>\n <span className=\"ml-auto truncate text-og-xs text-og-fg-muted\">\n {commandFailure\n ? \"Change not saved\"\n : pendingCommands > 0\n ? \"Saving…\"\n : readOnly\n ? \"Read only\"\n : \"Editing\"}{\" \"}\n · {document.blocks.items.length.toLocaleString()} blocks\n </span>\n </div>\n\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {commandFailure?.message ?? (pendingCommands > 0 ? \"Saving document changes\" : \"\")}\n </div>\n\n <div\n ref={viewportRef}\n role=\"document\"\n aria-label={ariaLabel}\n aria-readonly={readOnly}\n tabIndex={-1}\n onPointerDown={(event) => {\n const target = event.target;\n if (target instanceof Element && !target.closest(\"[data-og-paragraph]\")) {\n clearSelection();\n }\n }}\n onScroll={handleScroll}\n className={cn(\n \"relative min-h-0 min-w-0 flex-1 overflow-auto overscroll-contain outline-hidden [overflow-anchor:none]\",\n layout === \"paginated\" ? \"bg-og-surface-3\" : \"bg-og-surface-1\",\n )}\n style={{ height: Math.max(1, viewportHeight) }}\n >\n {commandFailure ? (\n <div\n role=\"alert\"\n className=\"absolute left-2 top-2 z-30 flex w-fit items-center gap-2 rounded-og-sm border border-og-status-failed/30 bg-og-surface-1/95 px-2 py-1 text-og-xs text-og-status-failed shadow-og-sm\"\n style={{ maxWidth: \"calc(100% - 1rem)\" }}\n >\n <span className=\"truncate\">{commandFailure.message}</span>\n <button\n type=\"button\"\n onClick={commandFailure.retry}\n className=\"shrink-0 rounded-og-xs px-1.5 py-0.5 font-medium outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n Retry\n </button>\n </div>\n ) : null}\n {pages.length === 0 ? (\n <div className=\"grid h-full place-items-center p-8 text-center\">\n <div>\n <PilcrowIcon aria-hidden className=\"mx-auto mb-3 size-7 text-og-fg-subtle\" />\n <p className=\"text-og-sm text-og-fg-muted\">This document is empty.</p>\n {!readOnly ? (\n <button\n type=\"button\"\n onClick={addFirstParagraph}\n className=\"mt-3 rounded-og-md border border-og-border bg-og-surface-1 px-3 py-1.5 text-og-sm text-og-fg hover:bg-og-surface-2 focus-visible:outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n Start writing\n </button>\n ) : null}\n </div>\n </div>\n ) : (\n <div className=\"relative min-w-full\" style={{ height: axis.total }}>\n {mountedIndexes.map((pageIndex) => {\n const page = pages[pageIndex]!;\n const top = axis.offsets[pageIndex]!;\n return (\n <article\n key={page.key}\n aria-label={`${layout === \"paginated\" ? \"Page\" : \"Section\"} ${pageIndex + 1} of ${pages.length}`}\n aria-posinset={pageIndex + 1}\n aria-setsize={pages.length}\n data-og-document-page={pageIndex + 1}\n data-og-page-width-pt={page.page.widthPt}\n data-og-page-height-pt={page.page.heightPt}\n className={cn(\n \"absolute overflow-hidden\",\n layout === \"paginated\"\n ? \"left-1/2 -translate-x-1/2 border shadow-og-sm\"\n : \"left-0 right-0 border-b border-og-border bg-og-surface-1 text-og-fg\",\n )}\n style={{\n top,\n color: layout === \"paginated\" ? \"#171717\" : undefined,\n backgroundColor: layout === \"paginated\" ? \"#fff\" : undefined,\n borderColor: layout === \"paginated\" ? \"#0000001a\" : undefined,\n width:\n layout === \"paginated\"\n ? page.page.widthPt * POINT_TO_CSS_PIXEL * page.renderScale\n : undefined,\n height: page.height,\n }}\n >\n <MeasuredPageBody\n pageKey={page.key}\n measureToken={documentRevision}\n onHeight={recordPageHeight}\n className={cn(\n layout === \"paginated\" ? \"absolute left-0 top-0 overflow-hidden\" : \"mx-auto\",\n )}\n style={{\n ...pageContentStyle(page.page, layout),\n maxWidth: layout === \"continuous\" ? \"68rem\" : undefined,\n ...(layout === \"paginated\"\n ? {\n width: page.page.widthPt * POINT_TO_CSS_PIXEL,\n minHeight: page.naturalHeight,\n transform: `scale(${page.renderScale})`,\n transformOrigin: \"top left\",\n }\n : {}),\n }}\n >\n {page.blocks.map(({ block, listOrdinal }) => (\n <DocumentBlockView\n key={block.id}\n block={block}\n viewBlockId={blockIdForView(block.id)}\n comments={annotations.comments.get(block.id) ?? EMPTY_COMMENTS}\n changes={annotations.changes.get(block.id) ?? EMPTY_CHANGES}\n projectionRevision={localRevision}\n listOrdinal={listOrdinal}\n readOnly={readOnly}\n selected={selectedBlockId === block.id}\n openThreadId={openThreadId}\n registerEditor={(node) => {\n if (node) editorNodes.current.set(block.id, node);\n else editorNodes.current.delete(block.id);\n }}\n onThreadToggle={(threadId) =>\n setOpenThreadId((current) => (current === threadId ? null : threadId))\n }\n onInput={(paragraph, text) => commitText(paragraph, text)}\n onBlur={() => setLocalRevision(document.revision)}\n onSelection={(paragraph) => readDomSelection(paragraph.id)}\n onKeyDown={handleEditorKeyDown}\n />\n ))}\n </MeasuredPageBody>\n </article>\n );\n })}\n </div>\n )}\n </div>\n </div>\n );\n}\n\n/** Artifact chrome plus the reusable document editor. */\nexport function DocumentArtifactSurface({\n document,\n title,\n subtitle,\n busy,\n className,\n editorClassName,\n ...editorProps\n}: DocumentArtifactSurfaceProps) {\n return (\n <ArtifactSurface\n modality=\"document\"\n title={title}\n subtitle={subtitle}\n busy={busy}\n className={className}\n >\n <DocumentEditor\n {...editorProps}\n document={document}\n ariaLabel={`${title} document`}\n className={editorClassName}\n />\n </ArtifactSurface>\n );\n}\n\n/** Artifact chrome over the projection-first document editor. */\nexport function DocumentProjectionArtifactSurface({\n projection,\n title,\n subtitle,\n busy,\n className,\n editorClassName,\n ...editorProps\n}: DocumentProjectionArtifactSurfaceProps) {\n return (\n <ArtifactSurface\n modality=\"document\"\n title={title}\n subtitle={subtitle}\n busy={busy}\n className={className}\n >\n <DocumentProjectionEditor\n {...editorProps}\n projection={projection}\n ariaLabel={`${title} document`}\n className={editorClassName}\n />\n </ArtifactSurface>\n );\n}\n\nfunction MeasuredPageBody({\n pageKey,\n measureToken,\n onHeight,\n className,\n style,\n children,\n}: {\n pageKey: string;\n measureToken: string | number;\n onHeight: (key: string, height: number) => void;\n className: string;\n style: CSSProperties;\n children: ReactNode;\n}) {\n const nodeRef = useRef<HTMLDivElement | null>(null);\n useLayoutEffect(() => {\n const node = nodeRef.current;\n if (!node) return;\n const report = () => onHeight(pageKey, Math.max(node.clientHeight, node.scrollHeight));\n report();\n if (!globalThis.ResizeObserver) return;\n const observer = new globalThis.ResizeObserver(report);\n observer.observe(node);\n return () => observer.disconnect();\n }, [measureToken, onHeight, pageKey]);\n return (\n <div ref={nodeRef} className={className} style={style}>\n {children}\n </div>\n );\n}\n\nfunction DocumentBlockView({\n block,\n viewBlockId,\n comments,\n changes,\n projectionRevision,\n listOrdinal,\n readOnly,\n selected,\n openThreadId,\n registerEditor,\n onThreadToggle,\n onInput,\n onBlur,\n onSelection,\n onKeyDown,\n}: {\n block: Exclude<DocumentViewBlock, DocumentViewPageBreak>;\n viewBlockId: string;\n comments: readonly DocumentViewComment[];\n changes: readonly DocumentViewChange[];\n projectionRevision: number;\n listOrdinal?: number | undefined;\n readOnly: boolean;\n selected: boolean;\n openThreadId: string | null;\n registerEditor: (node: HTMLElement | null) => void;\n onThreadToggle: (threadId: string) => void;\n onInput: (paragraph: DocumentViewParagraph, text: string) => void;\n onBlur: () => void;\n onSelection: (paragraph: DocumentViewParagraph) => void;\n onKeyDown: (event: ReactKeyboardEvent<HTMLElement>, paragraph: DocumentViewParagraph) => void;\n}) {\n if (isDocumentTable(block)) {\n return <DocumentTableView table={block} viewBlockId={viewBlockId} />;\n }\n\n const unresolved = comments.filter((thread) => !thread.resolved);\n const commentPanelOpen = comments.some((thread) => thread.id === openThreadId);\n const paragraphStyle = toParagraphStyle(block);\n const segments = annotateRuns(block, unresolved, changes);\n const marker = block.style.list\n ? block.style.list.kind === \"number\"\n ? `${listOrdinal ?? 1}.`\n : \"•\"\n : null;\n\n return (\n <div\n data-og-document-block={viewBlockId}\n data-og-block-kind=\"paragraph\"\n className={cn(\n \"group relative flex min-h-7 min-w-0 gap-2 rounded-sm px-1 transition-colors\",\n selected && \"bg-og-accent-soft ring-1 ring-inset ring-og-accent\",\n )}\n >\n {marker ? (\n <span\n aria-hidden\n className=\"w-7 shrink-0 select-none text-right opacity-70\"\n style={{\n paddingLeft: `${(block.style.list?.level ?? 0) * 12}px`,\n paddingTop: \"0.1em\",\n }}\n >\n {marker}\n </span>\n ) : null}\n <ParagraphLeaf\n key={`${block.id}:${projectionRevision}`}\n paragraph={block}\n viewBlockId={viewBlockId}\n segments={segments}\n paragraphStyle={paragraphStyle}\n listOrdinal={listOrdinal}\n readOnly={readOnly}\n registerEditor={registerEditor}\n onInput={onInput}\n onBlur={onBlur}\n onSelection={onSelection}\n onKeyDown={onKeyDown}\n />\n\n {comments.length > 0 || changes.length > 0 ? (\n <div className=\"relative flex w-7 shrink-0 flex-col items-center gap-1 pt-0.5\">\n {comments.length > 0 ? (\n <button\n type=\"button\"\n aria-label={\n unresolved.length > 0\n ? `${unresolved.length} unresolved ${unresolved.length === 1 ? \"comment\" : \"comments\"}`\n : `${comments.length} resolved ${comments.length === 1 ? \"comment\" : \"comments\"}`\n }\n aria-expanded={commentPanelOpen}\n onClick={() => onThreadToggle((unresolved[0] ?? comments[0])!.id)}\n className={cn(\n \"grid size-6 place-items-center rounded-full focus-visible:outline-hidden focus-visible:ring-2\",\n unresolved.length > 0\n ? \"bg-og-accent-soft text-og-status-waiting hover:bg-og-surface-3 focus-visible:ring-og-status-waiting\"\n : \"bg-og-surface-3 text-og-fg-muted hover:text-og-fg focus-visible:ring-og-accent\",\n )}\n >\n <MessageSquareTextIcon className=\"size-3.5\" />\n </button>\n ) : null}\n {changes.length > 0 ? (\n <span\n role=\"img\"\n aria-label={`${changes.length} tracked ${changes.length === 1 ? \"change\" : \"changes\"}`}\n className=\"mt-1 h-4 w-1 rounded-full bg-og-status-idle\"\n />\n ) : null}\n {commentPanelOpen ? (\n <aside\n aria-label=\"Comment thread\"\n className=\"absolute right-0 top-8 z-20 w-64 rounded-og-md border border-og-border bg-og-surface-1 p-3 text-og-xs text-og-fg shadow-og-lg\"\n >\n <div className=\"mb-2 font-medium\">\n {comments.length === 1 ? \"Comment\" : `${comments.length} comments`}\n </div>\n <ol className=\"max-h-72 space-y-3 overflow-y-auto\">\n {comments.map((thread) => (\n <li key={thread.id} className=\"space-y-2\">\n <div className=\"text-og-fg-muted\">{thread.resolved ? \"Resolved\" : \"Open\"}</div>\n {thread.replies.map((reply, index) => (\n // Reply position is stable within the append-only comment thread.\n // oxlint-disable-next-line react/no-array-index-key\n <div key={`${reply.createdAt}:${index}`}>\n <div className=\"text-og-fg-muted\">{reply.author}</div>\n <div className=\"whitespace-pre-wrap\">{reply.text}</div>\n </div>\n ))}\n </li>\n ))}\n </ol>\n </aside>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\ntype ParagraphLeafProps = {\n paragraph: DocumentViewParagraph;\n viewBlockId: string;\n segments: ReturnType<typeof annotateRuns>;\n paragraphStyle: CSSProperties;\n listOrdinal?: number | undefined;\n readOnly: boolean;\n registerEditor: (node: HTMLElement | null) => void;\n onInput: (paragraph: DocumentViewParagraph, text: string) => void;\n onBlur: () => void;\n onSelection: (paragraph: DocumentViewParagraph) => void;\n onKeyDown: (event: ReactKeyboardEvent<HTMLElement>, paragraph: DocumentViewParagraph) => void;\n};\n\n/**\n * The active contentEditable leaf is memo-frozen while focused. Browser input\n * and IME therefore own its DOM until blur; host rerenders caused by onCommit\n * cannot reconcile run spans underneath the live caret. The revision key on\n * the caller remounts a normalized model projection after blur.\n */\nconst ParagraphLeaf = memo(\n function ParagraphLeaf({\n paragraph,\n viewBlockId,\n segments,\n paragraphStyle,\n listOrdinal,\n readOnly,\n registerEditor,\n onInput,\n onBlur,\n onSelection,\n onKeyDown,\n }: ParagraphLeafProps) {\n const composing = useRef(false);\n const Tag = headingTag(paragraph.style.headingLevel);\n const label =\n paragraph.style.list?.kind === \"number\"\n ? `Numbered list item ${listOrdinal ?? 1}`\n : paragraph.style.list?.kind === \"bullet\"\n ? \"Bullet list item\"\n : paragraph.style.headingLevel\n ? `Heading ${paragraph.style.headingLevel}`\n : \"Paragraph\";\n\n return (\n <Tag\n ref={registerEditor}\n contentEditable={!readOnly}\n suppressContentEditableWarning\n tabIndex={readOnly ? 0 : undefined}\n role={!readOnly && !paragraph.style.headingLevel ? \"textbox\" : undefined}\n aria-label={label}\n aria-multiline={!readOnly || undefined}\n aria-readonly={readOnly}\n spellCheck={!readOnly}\n data-og-paragraph={viewBlockId}\n onFocus={() => onSelection(paragraph)}\n onSelect={() => onSelection(paragraph)}\n onKeyUp={() => onSelection(paragraph)}\n onMouseUp={() => onSelection(paragraph)}\n onCompositionStart={() => {\n composing.current = true;\n }}\n onCompositionEnd={(event) => {\n composing.current = false;\n onInput(paragraph, event.currentTarget.textContent ?? \"\");\n onSelection(paragraph);\n }}\n onPaste={(event) => {\n if (readOnly) return;\n // contentEditable otherwise accepts HTML-only clipboard payloads,\n // including live images/links. The artifact surface is a plain-text\n // editing boundary; always suppress the browser's rich insertion.\n event.preventDefault();\n const text = event.clipboardData.getData(\"text/plain\").slice(0, MAX_PLAIN_TEXT_TRANSFER);\n if (!text) return;\n insertPlainText(event.currentTarget, text);\n onInput(paragraph, event.currentTarget.textContent ?? \"\");\n onSelection(paragraph);\n }}\n onDragOver={(event) => {\n if (!readOnly) event.preventDefault();\n }}\n onDrop={(event) => {\n if (!readOnly) event.preventDefault();\n }}\n onKeyDown={(event) => {\n onKeyDown(event, paragraph);\n if (event.defaultPrevented || readOnly) return;\n if (event.key === \"Enter\" && !event.metaKey && !event.ctrlKey && !event.altKey) {\n event.preventDefault();\n insertPlainText(event.currentTarget, \"\\n\");\n onInput(paragraph, event.currentTarget.textContent ?? \"\");\n onSelection(paragraph);\n }\n }}\n onInput={(event) => {\n if (!composing.current && !(event.nativeEvent as InputEvent).isComposing) {\n onInput(paragraph, event.currentTarget.textContent ?? \"\");\n }\n }}\n onBlur={onBlur}\n className={cn(\n \"min-w-0 flex-1 whitespace-pre-wrap break-words rounded-sm outline-hidden\",\n !readOnly && \"cursor-text focus-visible:ring-2 focus-visible:ring-og-accent\",\n )}\n style={paragraphStyle}\n >\n {segments.map((segment, index) => (\n <span\n // Segment boundaries are derived from immutable offsets, so index\n // is stable until this paragraph is intentionally edited.\n // oxlint-disable-next-line react/no-array-index-key\n key={`${segment.start}:${index}`}\n data-og-commented={segment.commented || undefined}\n data-og-change={segment.changeKind}\n style={segment.style}\n >\n {segment.text}\n </span>\n ))}\n </Tag>\n );\n },\n (previous, next) => {\n if (next.readOnly || previous.viewBlockId !== next.viewBlockId) return false;\n const active = globalThis.document?.activeElement;\n return active instanceof HTMLElement && active.dataset.ogParagraph === next.viewBlockId;\n },\n);\n\nfunction DocumentTableView({\n table,\n viewBlockId,\n}: {\n table: DocumentViewTable;\n viewBlockId: string;\n}) {\n const columnWidths = table.style.columnWidthsPt;\n return (\n <div\n data-og-document-block={viewBlockId}\n data-og-block-kind=\"table\"\n className=\"overflow-x-auto py-2\"\n >\n <table\n className=\"w-full border-collapse text-left\"\n style={{\n fontSize: \"0.92em\",\n width: table.style.widthPt ? `${table.style.widthPt}pt` : undefined,\n }}\n >\n {columnWidths ? (\n <colgroup>\n {columnWidths.map((width, index) => (\n // Column position is its identity in the document table model.\n // oxlint-disable-next-line react/no-array-index-key\n <col key={index} style={{ width: `${width}pt` }} />\n ))}\n </colgroup>\n ) : null}\n <tbody>\n {table.rows.map((row, rowIndex) => (\n // Row position is its identity in the document table model.\n // oxlint-disable-next-line react/no-array-index-key\n <tr key={rowIndex}>\n {row.map((cell, columnIndex) => {\n const header = rowIndex < (table.style.headerRows ?? 0);\n const Cell = header ? \"th\" : \"td\";\n return (\n <Cell\n // Column position is its identity in the document table model.\n // oxlint-disable-next-line react/no-array-index-key\n key={columnIndex}\n scope={header ? \"col\" : undefined}\n className={cn(\"border align-middle\", header && \"font-semibold\")}\n style={{\n borderColor: table.style.borderColor ?? \"#d1d5db\",\n background: header ? (table.style.headerFill ?? \"#f3f4f6\") : undefined,\n padding: `${table.style.cellPaddingPt ?? 6}pt`,\n }}\n >\n {cell.map((run, index) => (\n // Run position is stable within the immutable cell projection.\n // oxlint-disable-next-line react/no-array-index-key\n <span key={index} style={toRunStyle(run.style)}>\n {run.text}\n </span>\n ))}\n </Cell>\n );\n })}\n </tr>\n ))}\n </tbody>\n </table>\n </div>\n );\n}\n\nfunction ToolbarButton({\n label,\n shortcut,\n pressed,\n disabled,\n onPress,\n children,\n}: {\n label: string;\n shortcut?: string | undefined;\n pressed?: boolean | undefined;\n disabled?: boolean | undefined;\n onPress: () => void;\n children: ReactNode;\n}) {\n return (\n <button\n type=\"button\"\n aria-label={label}\n aria-pressed={pressed}\n title={shortcut ? `${label} (${shortcut})` : label}\n disabled={disabled}\n onMouseDown={(event: ReactMouseEvent<HTMLButtonElement>) => event.preventDefault()}\n onClick={onPress}\n className={cn(\n \"grid size-7 place-items-center rounded-og-sm text-og-fg-muted outline-hidden transition-colors hover:bg-og-surface-3 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent disabled:pointer-events-none disabled:opacity-40\",\n pressed && \"bg-og-surface-3 text-og-fg\",\n )}\n >\n {children}\n </button>\n );\n}\n\nfunction projectPages(document: DocumentViewModel, layout: DocumentLayoutMode): ProjectedPage[] {\n const pages: ProjectedPage[] = [];\n const sections = document.sections.items;\n let sectionIndex = 0;\n let pageGeometry = sections[0]?.page ?? document.page;\n let blocks: ProjectedBlock[] = [];\n let used = 0;\n let pageIndex = 0;\n let numberOrdinal = 0;\n\n const flush = (force = false) => {\n if (blocks.length === 0 && !force) return;\n const physicalPageHeight = pageGeometry.heightPt * POINT_TO_CSS_PIXEL;\n const pageVerticalChrome =\n (pageGeometry.marginTopPt + pageGeometry.marginBottomPt) * POINT_TO_CSS_PIXEL;\n pages.push({\n key: `${layout}:${sections[sectionIndex]?.id ?? \"default\"}:${pageIndex++}:${blocks[0]?.block.id ?? \"blank\"}`,\n blocks,\n height:\n layout === \"paginated\"\n ? Math.max(physicalPageHeight, used + pageVerticalChrome)\n : Math.max(1, used + 48),\n minimumHeight: layout === \"paginated\" ? physicalPageHeight : 1,\n page: { ...pageGeometry },\n });\n blocks = [];\n used = 0;\n };\n\n for (let blockIndex = 0; blockIndex < document.blocks.items.length; blockIndex += 1) {\n while (\n sectionIndex + 1 < sections.length &&\n sections[sectionIndex + 1]!.startBlockIndex <= blockIndex\n ) {\n flush();\n sectionIndex += 1;\n pageGeometry = sections[sectionIndex]!.page;\n }\n const block = document.blocks.items[blockIndex]!;\n if (isDocumentPageBreak(block)) {\n flush(true);\n numberOrdinal = 0;\n continue;\n }\n if (isDocumentParagraph(block) && block.style.pageBreakBefore) flush();\n const height = estimateBlockHeight(block);\n const physicalPageHeight = pageGeometry.heightPt * POINT_TO_CSS_PIXEL;\n const usableHeight = Math.max(\n 120,\n physicalPageHeight -\n (pageGeometry.marginTopPt + pageGeometry.marginBottomPt) * POINT_TO_CSS_PIXEL,\n );\n const targetHeight = layout === \"paginated\" ? usableHeight : Math.max(560, usableHeight);\n if (blocks.length > 0 && used + height > targetHeight) flush();\n if (isDocumentParagraph(block) && block.style.list?.kind === \"number\") {\n numberOrdinal += 1;\n } else {\n numberOrdinal = 0;\n }\n blocks.push({\n block,\n height,\n listOrdinal:\n isDocumentParagraph(block) && block.style.list?.kind === \"number\"\n ? numberOrdinal\n : undefined,\n });\n used += height;\n }\n flush();\n return pages;\n}\n\nfunction indexAnnotations(document: DocumentViewModel): {\n comments: Map<string, DocumentViewComment[]>;\n changes: Map<string, DocumentViewChange[]>;\n} {\n const comments = new Map<string, DocumentViewComment[]>();\n const changes = new Map<string, DocumentViewChange[]>();\n for (const thread of document.comments.items) {\n const items = comments.get(thread.blockId);\n if (items) items.push(thread);\n else comments.set(thread.blockId, [thread]);\n }\n for (const change of document.changes.items) {\n const items = changes.get(change.blockId);\n if (items) items.push(change);\n else changes.set(change.blockId, [change]);\n }\n return { comments, changes };\n}\n\nfunction estimateBlockHeight(block: Exclude<DocumentViewBlock, DocumentViewPageBreak>): number {\n if (isDocumentTable(block)) {\n return Math.max(48, block.rows.length * 38 + 16);\n }\n const fontSize = block.runs.reduce(\n (largest, run) => Math.max(largest, run.style.fontSizePt ?? 11),\n block.style.headingLevel ? Math.max(14, 26 - block.style.headingLevel * 2) : 11,\n );\n const lineHeight = fontSize * POINT_TO_CSS_PIXEL * (block.style.lineHeight ?? 1.35);\n const lines = Math.max(\n 1,\n block.text\n .split(\"\\n\")\n .reduce((total, line) => total + Math.max(1, Math.ceil(line.length / 72)), 0),\n );\n return Math.max(\n 28,\n lines * lineHeight +\n ((block.style.spaceBeforePt ?? 2) + (block.style.spaceAfterPt ?? 6)) * POINT_TO_CSS_PIXEL,\n );\n}\n\nfunction buildPageAxis(pages: ProjectedPage[], gap: number): PageAxis {\n const offsets = new Float64Array(pages.length + 1);\n for (let index = 0; index < pages.length; index += 1) {\n offsets[index + 1] = offsets[index]! + pages[index]!.height + gap;\n }\n return { offsets, total: Math.max(1, (offsets[pages.length] ?? 0) - gap) };\n}\n\nfunction pageAtOffset(axis: PageAxis, count: number, offset: number): number {\n if (count <= 1) return 0;\n let low = 0;\n let high = count;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (axis.offsets[middle + 1]! <= offset) low = middle + 1;\n else high = middle;\n }\n return Math.max(0, Math.min(count - 1, low));\n}\n\nfunction visiblePageIndexes(\n axis: PageAxis,\n count: number,\n scrollTop: number,\n viewportHeight: number,\n overscan: number,\n required: number,\n): number[] {\n if (count === 0) return [];\n const start = Math.max(0, pageAtOffset(axis, count, scrollTop) - overscan);\n const end = Math.min(count, pageAtOffset(axis, count, scrollTop + viewportHeight) + overscan + 1);\n const indexes = Array.from({ length: end - start }, (_, index) => start + index);\n if (required >= 0 && (required < start || required >= end)) indexes.push(required);\n return indexes.sort((left, right) => left - right);\n}\n\nfunction responsiveDocumentPageScale(\n page: DocumentProjectionPageGeometry,\n viewportWidth: number,\n): number {\n if (viewportWidth <= 0) return 1;\n const naturalWidth = page.widthPt * POINT_TO_CSS_PIXEL;\n return Math.min(1, Math.max(0.1, (viewportWidth - 32) / naturalWidth));\n}\n\nfunction pageContentStyle(\n page: DocumentProjectionPageGeometry,\n layout: DocumentLayoutMode,\n): CSSProperties {\n if (layout === \"continuous\") {\n return {\n padding: \"24px clamp(24px, 8vw, 96px)\",\n };\n }\n return {\n paddingTop: `${page.marginTopPt * POINT_TO_CSS_PIXEL}px`,\n paddingRight: `${page.marginRightPt * POINT_TO_CSS_PIXEL}px`,\n paddingBottom: `${page.marginBottomPt * POINT_TO_CSS_PIXEL}px`,\n paddingLeft: `${page.marginLeftPt * POINT_TO_CSS_PIXEL}px`,\n };\n}\n\nfunction headingTag(level: number | undefined): \"p\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" {\n if (!level) return \"p\";\n return `h${Math.max(1, Math.min(6, level))}` as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n}\n\nfunction toParagraphStyle(paragraph: DocumentViewParagraph): CSSProperties {\n const firstRun = paragraph.runs[0];\n return {\n textAlign: paragraph.style.alignment,\n marginTop: `${paragraph.style.spaceBeforePt ?? 0}pt`,\n marginBottom: `${paragraph.style.spaceAfterPt ?? 0}pt`,\n lineHeight: paragraph.style.lineHeight ?? 1.35,\n breakBefore: paragraph.style.pageBreakBefore ? \"page\" : undefined,\n fontFamily: firstRun?.style.fontFamily,\n fontSize: firstRun?.style.fontSizePt ? `${firstRun.style.fontSizePt}pt` : undefined,\n fontWeight: paragraph.style.headingLevel ? 650 : undefined,\n };\n}\n\nfunction toRunStyle(style: DocumentProjectionTextStyle): CSSProperties {\n return {\n fontFamily: style.fontFamily,\n fontSize: style.fontSizePt ? `${style.fontSizePt}pt` : undefined,\n color: style.color,\n fontWeight: style.bold ? 700 : undefined,\n fontStyle: style.italic ? \"italic\" : undefined,\n textDecoration:\n [style.underline ? \"underline\" : \"\", style.strike ? \"line-through\" : \"\"]\n .filter(Boolean)\n .join(\" \") || undefined,\n };\n}\n\nfunction annotateRuns(\n paragraph: DocumentViewParagraph,\n comments: ReadonlyArray<{ start: number; end: number }>,\n changes: ReadonlyArray<{\n start: number;\n end: number;\n kind: \"insert\" | \"delete\";\n }>,\n) {\n const segments: Array<{\n text: string;\n start: number;\n style: CSSProperties;\n commented: boolean;\n changeKind?: \"insert\" | \"delete\" | undefined;\n }> = [];\n let runStart = 0;\n for (const run of paragraph.runs) {\n const runEnd = runStart + run.text.length;\n const boundaries = new Set([runStart, runEnd]);\n for (const annotation of [...comments, ...changes]) {\n if (annotation.start > runStart && annotation.start < runEnd)\n boundaries.add(annotation.start);\n if (annotation.end > runStart && annotation.end < runEnd) boundaries.add(annotation.end);\n }\n const ordered = [...boundaries].sort((left, right) => left - right);\n for (let index = 0; index < ordered.length - 1; index += 1) {\n const start = ordered[index]!;\n const end = ordered[index + 1]!;\n const commented = comments.some((comment) => comment.start < end && comment.end > start);\n const change = changes.find((item) => item.start < end && item.end > start);\n const baseStyle = toRunStyle(run.style);\n segments.push({\n text: run.text.slice(start - runStart, end - runStart),\n start,\n commented,\n changeKind: change?.kind,\n style: {\n ...baseStyle,\n backgroundColor: commented\n ? \"color-mix(in oklch, var(--og-color-status-waiting) 18%, transparent)\"\n : undefined,\n textDecoration:\n change?.kind === \"delete\"\n ? \"line-through\"\n : change?.kind === \"insert\"\n ? \"underline\"\n : baseStyle.textDecoration,\n textDecorationColor:\n change?.kind === \"delete\"\n ? \"var(--og-color-status-failed)\"\n : change?.kind === \"insert\"\n ? \"var(--og-color-status-idle)\"\n : undefined,\n },\n });\n }\n runStart = runEnd;\n }\n if (segments.length === 0) {\n segments.push({ text: \"\", start: 0, style: {}, commented: false });\n }\n return segments;\n}\n\nfunction selectionOffsets(root: HTMLElement | undefined): { start: number; end: number } | null {\n if (!root) return null;\n const selection = globalThis.getSelection?.();\n if (!selection || selection.rangeCount === 0) return null;\n const range = selection.getRangeAt(0);\n if (!root.contains(range.startContainer) || !root.contains(range.endContainer)) return null;\n const beforeStart = range.cloneRange();\n beforeStart.selectNodeContents(root);\n beforeStart.setEnd(range.startContainer, range.startOffset);\n const beforeEnd = range.cloneRange();\n beforeEnd.selectNodeContents(root);\n beforeEnd.setEnd(range.endContainer, range.endOffset);\n return {\n start: beforeStart.toString().length,\n end: beforeEnd.toString().length,\n };\n}\n\nfunction insertPlainText(root: HTMLElement, text: string): void {\n const selection = globalThis.getSelection?.();\n if (!selection || selection.rangeCount === 0) return;\n const range = selection.getRangeAt(0);\n if (!root.contains(range.startContainer) || !root.contains(range.endContainer)) return;\n range.deleteContents();\n const node = globalThis.document.createTextNode(text);\n range.insertNode(node);\n range.setStartAfter(node);\n range.collapse(true);\n selection.removeAllRanges();\n selection.addRange(range);\n}\n\nfunction restoreSelection(\n root: HTMLElement | undefined,\n requestedStart: number,\n requestedEnd: number,\n): void {\n if (!root || !globalThis.getSelection) return;\n const textLength = root.textContent?.length ?? 0;\n const start = Math.max(0, Math.min(requestedStart, textLength));\n const end = Math.max(start, Math.min(requestedEnd, textLength));\n const startPoint = textPointAt(root, start);\n const endPoint = textPointAt(root, end);\n if (!startPoint || !endPoint) return;\n const range = document.createRange();\n range.setStart(startPoint.node, startPoint.offset);\n range.setEnd(endPoint.node, endPoint.offset);\n const domSelection = globalThis.getSelection();\n domSelection?.removeAllRanges();\n domSelection?.addRange(range);\n}\n\nfunction textPointAt(root: HTMLElement, target: number): { node: Node; offset: number } | null {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT);\n let remaining = target;\n let node = walker.nextNode();\n while (node) {\n const length = node.textContent?.length ?? 0;\n if (remaining <= length) return { node, offset: remaining };\n remaining -= length;\n node = walker.nextNode();\n }\n return { node: root, offset: root.childNodes.length };\n}\n\nfunction toggledTextStyle(\n paragraph: DocumentViewParagraph,\n start: number,\n end: number,\n property: \"bold\" | \"italic\" | \"underline\",\n): Partial<DocumentProjectionTextStyle> {\n let allEnabled = end > start;\n let offset = 0;\n for (const run of paragraph.runs) {\n const runEnd = offset + run.text.length;\n if (runEnd > start && offset < end && run.style[property] !== true) {\n allEnabled = false;\n break;\n }\n offset = runEnd;\n }\n return { [property]: !allEnabled };\n}\n\ntype DocumentProjectionView = {\n document: DocumentViewModel;\n externalIdByInternal: Map<string, string>;\n};\n\nfunction documentViewFromProjection(projection: DocumentEditorProjection): DocumentProjectionView {\n if (projection.blocks.length > MAX_PROJECTION_BLOCKS) {\n throw new Error(`Document projection exceeds ${MAX_PROJECTION_BLOCKS} blocks`);\n }\n if (\n (projection.comments?.length ?? 0) > MAX_PROJECTION_ANNOTATIONS ||\n (projection.changes?.length ?? 0) > MAX_PROJECTION_ANNOTATIONS\n ) {\n throw new Error(`Document projection exceeds ${MAX_PROJECTION_ANNOTATIONS} annotations`);\n }\n const sections = [...(projection.sections ?? [])].sort(\n (left, right) => left.startBlockIndex - right.startBlockIndex,\n );\n if (\n sections.some(\n (section, index) =>\n section.startBlockIndex < 0 ||\n (index > 0 && section.startBlockIndex <= sections[index - 1]!.startBlockIndex),\n )\n ) {\n throw new Error(\"Document projection sections must have unique increasing block indexes\");\n }\n const firstPage = sections[0]?.startBlockIndex === 0 ? sections[0].page : projection.page;\n validateProjectionPage(firstPage);\n const externalIdByInternal = new Map<string, string>();\n const paragraphByExternal = new Map<string, DocumentViewParagraph>();\n const objects = new Map<string, unknown>();\n const blocks: DocumentViewBlock[] = [];\n const documentSections: DocumentProjectionSection[] = [];\n const comments: DocumentViewComment[] = [];\n const changes: DocumentViewChange[] = [];\n const seenIds = new Set<string>();\n const remember = (internalId: string, externalId: string, value: unknown) => {\n if (!externalId || seenIds.has(externalId)) {\n throw new Error(`Document projection contains an invalid or duplicate id: ${externalId}`);\n }\n seenIds.add(externalId);\n externalIdByInternal.set(internalId, externalId);\n objects.set(internalId, value);\n };\n\n let revision = 0;\n let localParagraphId = 0;\n const changed = () => {\n revision += 1;\n };\n const document: DocumentViewModel = {\n get revision() {\n return revision;\n },\n page: copyDocumentPage(firstPage),\n blocks: {\n items: blocks,\n addParagraph(text = \"\") {\n let id: string;\n do {\n localParagraphId += 1;\n id = `projection-paragraph-${localParagraphId}`;\n } while (objects.has(id));\n const paragraph = new ProjectionParagraphView(id, [{ text, style: {} }], {}, changed);\n blocks.push(paragraph);\n objects.set(id, paragraph);\n changed();\n return paragraph;\n },\n },\n sections: { items: documentSections },\n comments: { items: comments },\n changes: { items: changes },\n resolve(id) {\n const value = objects.get(id);\n if (!value) throw new Error(`Unknown document object id: ${id}`);\n return value;\n },\n };\n\n let sectionIndex = sections[0]?.startBlockIndex === 0 ? 1 : 0;\n if (sections[0]?.startBlockIndex === 0) {\n const projectedSection = sections[0]!;\n validateProjectionPage(projectedSection.page);\n const section = {\n ...projectedSection,\n page: copyDocumentPage(projectedSection.page),\n };\n documentSections.push(section);\n remember(section.id, projectedSection.id, section);\n } else {\n documentSections.push({\n id: \"projection-default-section\",\n startBlockIndex: 0,\n page: copyDocumentPage(firstPage),\n });\n }\n for (let blockIndex = 0; blockIndex < projection.blocks.length; blockIndex += 1) {\n while (sections[sectionIndex]?.startBlockIndex === blockIndex) {\n const projectedSection = sections[sectionIndex]!;\n validateProjectionPage(projectedSection.page);\n const section = {\n ...projectedSection,\n page: copyDocumentPage(projectedSection.page),\n };\n documentSections.push(section);\n remember(section.id, projectedSection.id, section);\n sectionIndex += 1;\n }\n const projectedBlock = projection.blocks[blockIndex]!;\n if (projectedBlock.kind === \"paragraph\") {\n const paragraph = new ProjectionParagraphView(\n projectedBlock.id,\n projectedBlock.runs.length > 0\n ? projectedBlock.runs.map((run) => ({\n text: run.text.slice(0, MAX_PROJECTION_TEXT),\n style: { ...(run.style ?? {}) },\n }))\n : [{ text: \"\", style: {} }],\n { ...(projectedBlock.style ?? {}) },\n changed,\n );\n blocks.push(paragraph);\n remember(paragraph.id, projectedBlock.id, paragraph);\n paragraphByExternal.set(projectedBlock.id, paragraph);\n } else if (projectedBlock.kind === \"table\") {\n const columns = projectedBlock.rows.reduce(\n (maximum, row) => Math.max(maximum, row.length),\n 0,\n );\n if (\n projectedBlock.rows.length === 0 ||\n columns === 0 ||\n projectedBlock.rows.some((row) => row.length !== columns)\n ) {\n throw new Error(`Document table ${projectedBlock.id} must be a non-empty rectangle`);\n }\n if (projectedBlock.rows.length * columns > MAX_PROJECTION_TABLE_CELLS) {\n throw new Error(`Document table ${projectedBlock.id} exceeds the projected cell limit`);\n }\n const table: DocumentViewTable = {\n kind: \"table\",\n id: projectedBlock.id,\n rows: projectedBlock.rows.map((row) =>\n row.map((cell) =>\n cell.length > 0\n ? cell.map((run) => ({\n text: run.text.slice(0, MAX_PROJECTION_TEXT),\n style: { ...(run.style ?? {}) },\n }))\n : [{ text: \"\", style: {} }],\n ),\n ),\n style: { ...(projectedBlock.style ?? {}) },\n };\n blocks.push(table);\n remember(table.id, projectedBlock.id, table);\n } else {\n const pageBreak: DocumentViewPageBreak = {\n kind: \"pageBreak\",\n id: projectedBlock.id,\n };\n blocks.push(pageBreak);\n remember(pageBreak.id, projectedBlock.id, pageBreak);\n }\n }\n while (sections[sectionIndex]?.startBlockIndex === projection.blocks.length) {\n const projectedSection = sections[sectionIndex]!;\n validateProjectionPage(projectedSection.page);\n const section = {\n ...projectedSection,\n page: copyDocumentPage(projectedSection.page),\n };\n documentSections.push(section);\n remember(section.id, projectedSection.id, section);\n sectionIndex += 1;\n }\n if (sectionIndex < sections.length) {\n throw new Error(\"Document projection section starts beyond the projected blocks\");\n }\n\n for (const projected of projection.comments ?? []) {\n const paragraph = paragraphByExternal.get(projected.blockId);\n const first = projected.replies[0];\n if (!paragraph || !first) continue;\n if (\n !Number.isSafeInteger(projected.start) ||\n !Number.isSafeInteger(projected.end) ||\n projected.start < 0 ||\n projected.end < projected.start ||\n projected.end > paragraph.text.length\n ) {\n throw new Error(`Document comment ${projected.id} has an invalid range`);\n }\n const thread: DocumentViewComment = {\n ...projected,\n replies: projected.replies.map((reply) => ({ ...reply })),\n };\n comments.push(thread);\n remember(thread.id, projected.id, thread);\n }\n for (const projected of projection.changes ?? []) {\n const paragraph = paragraphByExternal.get(projected.blockId);\n if (!paragraph) continue;\n if (\n !Number.isSafeInteger(projected.start) ||\n !Number.isSafeInteger(projected.end) ||\n projected.start < 0 ||\n projected.end <= projected.start ||\n projected.end > paragraph.text.length\n ) {\n throw new Error(`Document tracked change ${projected.id} has an invalid range`);\n }\n const change: DocumentViewChange = { ...projected };\n changes.push(change);\n remember(change.id, projected.id, change);\n }\n return { document, externalIdByInternal };\n}\n\nfunction copyDocumentPage(page: DocumentProjectionPageGeometry): DocumentProjectionPageGeometry {\n return {\n widthPt: page.widthPt,\n heightPt: page.heightPt,\n marginTopPt: page.marginTopPt,\n marginRightPt: page.marginRightPt,\n marginBottomPt: page.marginBottomPt,\n marginLeftPt: page.marginLeftPt,\n ...(page.headerPt === undefined ? {} : { headerPt: page.headerPt }),\n ...(page.footerPt === undefined ? {} : { footerPt: page.footerPt }),\n ...(page.gutterPt === undefined ? {} : { gutterPt: page.gutterPt }),\n };\n}\n\nclass ProjectionParagraphView implements DocumentViewParagraph {\n readonly kind = \"paragraph\" as const;\n private runStorage: DocumentViewTextRun[];\n readonly style: DocumentProjectionParagraphStyle;\n\n constructor(\n readonly id: string,\n runs: readonly DocumentViewTextRun[],\n style: DocumentProjectionParagraphStyle,\n private readonly changed: () => void,\n ) {\n this.runStorage = normalizeProjectionRuns(runs);\n this.style = { ...style, ...(style.list ? { list: { ...style.list } } : {}) };\n }\n\n get runs(): readonly DocumentViewTextRun[] {\n return this.runStorage;\n }\n\n get text(): string {\n return this.runStorage.map((run) => run.text).join(\"\");\n }\n\n set text(value: string) {\n const current = this.text;\n if (current === value) return;\n let start = 0;\n while (start < current.length && start < value.length && current[start] === value[start]) {\n start += 1;\n }\n let currentEnd = current.length;\n let valueEnd = value.length;\n while (\n currentEnd > start &&\n valueEnd > start &&\n current[currentEnd - 1] === value[valueEnd - 1]\n ) {\n currentEnd -= 1;\n valueEnd -= 1;\n }\n const inheritedStyle = projectionStyleAt(this.runStorage, start);\n this.runStorage = normalizeProjectionRuns([\n ...sliceProjectionRuns(this.runStorage, 0, start),\n ...(valueEnd > start ? [{ text: value.slice(start, valueEnd), style: inheritedStyle }] : []),\n ...sliceProjectionRuns(this.runStorage, currentEnd, current.length),\n ]);\n this.changed();\n }\n\n format({\n start,\n end,\n style,\n }: {\n start: number;\n end: number;\n style: Partial<DocumentProjectionTextStyle>;\n }): void {\n const textLength = this.text.length;\n if (start < 0 || end <= start || end > textLength || Object.keys(style).length === 0) return;\n this.runStorage = normalizeProjectionRuns([\n ...sliceProjectionRuns(this.runStorage, 0, start),\n ...sliceProjectionRuns(this.runStorage, start, end).map((run) => ({\n text: run.text,\n style: { ...run.style, ...style },\n })),\n ...sliceProjectionRuns(this.runStorage, end, textLength),\n ]);\n this.changed();\n }\n}\n\nfunction sliceProjectionRuns(\n runs: readonly DocumentViewTextRun[],\n start: number,\n end: number,\n): DocumentViewTextRun[] {\n if (end <= start) return [];\n const result: DocumentViewTextRun[] = [];\n let offset = 0;\n for (const run of runs) {\n const runEnd = offset + run.text.length;\n const overlapStart = Math.max(start, offset);\n const overlapEnd = Math.min(end, runEnd);\n if (overlapEnd > overlapStart) {\n result.push({\n text: run.text.slice(overlapStart - offset, overlapEnd - offset),\n style: { ...run.style },\n });\n }\n offset = runEnd;\n if (offset >= end) break;\n }\n return result;\n}\n\nfunction normalizeProjectionRuns(runs: readonly DocumentViewTextRun[]): DocumentViewTextRun[] {\n const normalized: DocumentViewTextRun[] = [];\n for (const run of runs) {\n if (!run.text && runs.length > 1) continue;\n const style = { ...run.style };\n const previous = normalized.at(-1);\n if (previous && sameProjectionStyle(previous.style, style)) {\n normalized[normalized.length - 1] = { text: previous.text + run.text, style };\n } else {\n normalized.push({ text: run.text, style });\n }\n }\n return normalized.length > 0 ? normalized : [{ text: \"\", style: {} }];\n}\n\nfunction projectionStyleAt(\n runs: readonly DocumentViewTextRun[],\n offset: number,\n): DocumentProjectionTextStyle {\n let cursor = 0;\n for (const run of runs) {\n const end = cursor + run.text.length;\n if (offset <= end) return { ...run.style };\n cursor = end;\n }\n return { ...(runs.at(-1)?.style ?? {}) };\n}\n\nfunction sameProjectionStyle(\n left: DocumentProjectionTextStyle,\n right: DocumentProjectionTextStyle,\n): boolean {\n return (\n left.fontFamily === right.fontFamily &&\n left.fontSizePt === right.fontSizePt &&\n left.color === right.color &&\n left.bold === right.bold &&\n left.italic === right.italic &&\n left.underline === right.underline &&\n left.strike === right.strike\n );\n}\n\nfunction validateProjectionPage(page: DocumentProjectionPageGeometry): void {\n const values = [\n page.widthPt,\n page.heightPt,\n page.marginTopPt,\n page.marginRightPt,\n page.marginBottomPt,\n page.marginLeftPt,\n ];\n if (\n values.some((value) => !Number.isFinite(value) || value < 0) ||\n page.widthPt <= 0 ||\n page.heightPt <= 0 ||\n page.marginLeftPt + page.marginRightPt >= page.widthPt ||\n page.marginTopPt + page.marginBottomPt >= page.heightPt\n ) {\n throw new Error(\"Document projection contains invalid page geometry\");\n }\n}\n\nfunction isDocumentParagraph(value: unknown): value is DocumentViewParagraph {\n return isDocumentBlockKind(value, \"paragraph\");\n}\n\nfunction isDocumentTable(value: unknown): value is DocumentViewTable {\n return isDocumentBlockKind(value, \"table\");\n}\n\nfunction isDocumentPageBreak(value: unknown): value is DocumentViewPageBreak {\n return isDocumentBlockKind(value, \"pageBreak\");\n}\n\nfunction isDocumentBlockKind<K extends DocumentViewBlock[\"kind\"]>(\n value: unknown,\n kind: K,\n): value is Extract<DocumentViewBlock, { kind: K }> {\n return typeof value === \"object\" && value !== null && \"kind\" in value && value.kind === kind;\n}\n\nfunction asDocumentView(document: ReferenceDocument): DocumentViewModel {\n return document as unknown as DocumentViewModel;\n}\n\nfunction mapDocumentCommit(\n command: DocumentCommit,\n externalIdByInternal: ReadonlyMap<string, string>,\n): DocumentCommit {\n return {\n ...command,\n blockId: externalIdByInternal.get(command.blockId) ?? command.blockId,\n };\n}\n\nfunction identity(value: string): string {\n return value;\n}\n\nfunction asDocumentError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(\"Document change failed\");\n}\n","import {\n DOCUMENT_ARTIFACT_COMMAND_VERSION,\n type DocumentArtifactCommand,\n type DocumentArtifactPageGeometryProjection,\n type DocumentArtifactProjection,\n type DocumentArtifactProjectionItem,\n type DocumentArtifactQuery,\n type DocumentArtifactTextStylePatch,\n type EditableArtifactSession,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { type ReactNode, useCallback, useEffect, useRef, useState } from \"react\";\n\nimport {\n DocumentProjectionArtifactSurface,\n type DocumentCommit,\n type DocumentCommitHandler,\n type DocumentEditorProjection,\n type DocumentProjectionArtifactSurfaceProps,\n type DocumentProjectionPageGeometry,\n} from \"./document-editor\";\nimport { ArtifactSurface } from \"./artifact-surface\";\nimport {\n asEditableArtifactError,\n editableArtifactAccessRevoked,\n editableArtifactProjectionKey,\n editableArtifactStatusLabel,\n EditableArtifactMessage,\n useEditableArtifactView,\n} from \"./editable-artifact-ui\";\n\nconst DOCUMENT_PAGE_ITEMS = 512;\nconst DOCUMENT_MAX_BLOCKS = 4_096;\nconst DOCUMENT_MAX_SECTIONS = 1_024;\nconst DOCUMENT_MAX_REVIEW_ITEMS = 4_096;\nconst DOCUMENT_MAX_TEXT_UTF16 = 1_000_000;\nconst DOCUMENT_MAX_TABLE_CELLS = 100_000;\nconst DOCUMENT_MAX_QUERY_PAGES = 64;\nconst DOCUMENT_COMPOSITION_ATTEMPTS = 3;\n\nexport type EditableDocumentArtifactSurfaceProps = Omit<\n DocumentProjectionArtifactSurfaceProps,\n \"projection\" | \"commit\" | \"readOnly\" | \"busy\" | \"subtitle\"\n> & {\n session: EditableArtifactSession;\n subtitle?: ReactNode | undefined;\n readOnly?: boolean | undefined;\n /** Called only after the durable SDK command has been accepted locally. */\n onCommit?: DocumentCommitHandler | undefined;\n};\n\ntype DocumentProjectionState = {\n session: EditableArtifactSession;\n projection: DocumentEditorProjection | null;\n loading: boolean;\n error: Error | null;\n};\n\ntype DocumentCommandState = {\n session: EditableArtifactSession;\n tail: Promise<void>;\n paragraphText: Map<string, string>;\n localParagraphIds: Set<string>;\n optimisticParagraphIds: Map<string, string>;\n};\n\n/**\n * Durable document editor over the public SDK session. Canonical state and\n * speculative replay remain Worker-owned; React receives bounded projections.\n */\nexport function EditableDocumentArtifactSurface({\n session,\n title,\n subtitle,\n readOnly = false,\n onCommit,\n onCommandError,\n ...surfaceProps\n}: EditableDocumentArtifactSurfaceProps) {\n const view = useEditableArtifactView(session);\n const invalidator = editableArtifactProjectionKey(view);\n const [retryEpoch, setRetryEpoch] = useState(0);\n const [state, setState] = useState<DocumentProjectionState>({\n session,\n projection: null,\n loading: true,\n error: null,\n });\n const loadGeneration = useRef(0);\n const commandStateRef = useRef<DocumentCommandState | null>(null);\n if (commandStateRef.current?.session !== session) {\n commandStateRef.current = {\n session,\n tail: Promise.resolve(),\n paragraphText: new Map(),\n localParagraphIds: new Set(),\n optimisticParagraphIds: new Map(),\n };\n }\n const commandState = commandStateRef.current;\n\n useEffect(() => {\n const generation = ++loadGeneration.current;\n let cancelled = false;\n setState((current) =>\n current.session === session\n ? { ...current, loading: true, error: null }\n : { session, projection: null, loading: true, error: null },\n );\n void composeDocumentEditorProjection(session).then(\n (projection) => {\n if (\n cancelled ||\n generation !== loadGeneration.current ||\n commandStateRef.current !== commandState\n ) {\n return;\n }\n const nextParagraphText = paragraphTextById(projection);\n for (const [localId, canonicalId] of commandState.optimisticParagraphIds) {\n if (nextParagraphText.has(canonicalId)) continue;\n const optimisticText =\n commandState.paragraphText.get(canonicalId) ?? commandState.paragraphText.get(localId);\n if (optimisticText !== undefined) nextParagraphText.set(canonicalId, optimisticText);\n }\n commandState.paragraphText = nextParagraphText;\n setState({ session, projection, loading: false, error: null });\n },\n (cause) => {\n if (\n cancelled ||\n generation !== loadGeneration.current ||\n commandStateRef.current !== commandState\n ) {\n return;\n }\n setState({\n session,\n projection: null,\n loading: false,\n error: asEditableArtifactError(cause, \"Could not open this document\"),\n });\n },\n );\n return () => {\n cancelled = true;\n };\n }, [commandState, invalidator, retryEpoch, session]);\n\n const refresh = useCallback(() => setRetryEpoch((value) => value + 1), []);\n const writable = !readOnly && view.writable;\n const applyCommit = useCallback(\n (commit: DocumentCommit): Promise<void> => {\n const projection = state.session === session ? state.projection : null;\n if (!projection) return Promise.reject(new Error(\"Document projection is not ready\"));\n if (!writable) return Promise.reject(new Error(\"This document is read only\"));\n if (String(commit.revision) !== String(projection.revision)) {\n return Promise.reject(\n new Error(\"The document changed; retry this edit on the latest version\"),\n );\n }\n\n const execute = async () => {\n if (commandStateRef.current !== commandState) {\n throw new Error(\"The document session changed before this edit could be saved\");\n }\n\n const allocateLocalParagraph = async (localId: string): Promise<string> => {\n const allocated = commandState.optimisticParagraphIds.get(localId);\n if (allocated !== undefined) return allocated;\n if (!commandState.localParagraphIds.has(localId)) {\n throw new Error(\"The edited paragraph is no longer available\");\n }\n const created = await session.createDocumentParagraph();\n if (commandStateRef.current !== commandState) {\n throw new Error(\"The document session changed before this edit could be saved\");\n }\n commandState.optimisticParagraphIds.set(localId, created.paragraphId);\n commandState.paragraphText.set(created.paragraphId, \"\");\n return created.paragraphId;\n };\n\n if (commit.kind === \"insert-paragraph\") {\n commandState.localParagraphIds.add(commit.blockId);\n await allocateLocalParagraph(commit.blockId);\n notifyDocumentCommit(onCommit, onCommandError, commit);\n refresh();\n return;\n }\n\n const targetId = commandState.localParagraphIds.has(commit.blockId)\n ? await allocateLocalParagraph(commit.blockId)\n : commit.blockId;\n let command: DocumentArtifactCommand | null = null;\n let rollbackText: (() => void) | null = null;\n if (commit.kind === \"text\") {\n const before = commandState.paragraphText.get(targetId);\n if (before === undefined) {\n throw new Error(\"The edited paragraph is no longer available\");\n }\n const edit = minimalUtf16TextEdit(before, commit.text);\n if (!edit) return;\n commandState.paragraphText.set(targetId, commit.text);\n rollbackText = () => {\n if (commandState.paragraphText.get(targetId) === commit.text) {\n commandState.paragraphText.set(targetId, before);\n }\n };\n command = {\n kind: \"paragraph.edit\",\n id: targetId,\n range: edit.range,\n replacement: edit.replacement,\n style: null,\n };\n } else if (commit.kind === \"format\") {\n command = {\n kind: \"paragraph.format\",\n id: targetId,\n range: commit.range,\n style: documentTextStylePatch(commit.style),\n };\n }\n if (!command) throw new Error(\"Unsupported document edit\");\n\n try {\n await session.applyDocumentCommands({\n version: DOCUMENT_ARTIFACT_COMMAND_VERSION,\n commands: [command],\n });\n if (commandStateRef.current !== commandState) return;\n notifyDocumentCommit(onCommit, onCommandError, commit);\n refresh();\n } catch (cause) {\n rollbackText?.();\n throw cause;\n }\n };\n\n // A rejected edit must not poison later user input. Each operation still\n // runs serially, but starts after the prior operation settles.\n const operation = commandState.tail.then(execute, execute);\n commandState.tail = operation;\n void operation.then(\n () => {\n if (commandState.tail === operation) commandState.tail = Promise.resolve();\n },\n () => {\n if (commandState.tail === operation) commandState.tail = Promise.resolve();\n },\n );\n return operation;\n },\n [commandState, onCommandError, onCommit, refresh, session, state, writable],\n );\n\n const projection = state.session === session ? state.projection : null;\n const status = editableArtifactStatusLabel(view);\n const accessRevoked = editableArtifactAccessRevoked(view);\n return projection && !accessRevoked ? (\n <DocumentProjectionArtifactSurface\n {...surfaceProps}\n title={title}\n subtitle={\n subtitle ??\n `${projection.blocks.length} block${projection.blocks.length === 1 ? \"\" : \"s\"}${writable ? \"\" : \" · Read only\"}`\n }\n projection={projection}\n commit={writable ? applyCommit : undefined}\n readOnly={!writable}\n busy={state.loading}\n onCommandError={onCommandError}\n />\n ) : (\n <ArtifactSurface\n modality=\"document\"\n title={title}\n subtitle={subtitle ?? status}\n busy={!accessRevoked && !state.error}\n className={surfaceProps.className}\n >\n <EditableArtifactMessage\n title={\n accessRevoked\n ? \"Access changed\"\n : state.error\n ? \"Could not open this document\"\n : \"Opening document\"\n }\n detail={accessRevoked ? status : (state.error?.message ?? status)}\n retry={!accessRevoked && state.error ? refresh : undefined}\n />\n </ArtifactSurface>\n );\n}\n\n/** Deterministically composes summary/body/sections/review at one Worker revision. */\nexport async function composeDocumentEditorProjection(\n session: EditableArtifactSession,\n): Promise<DocumentEditorProjection> {\n if (session.modality !== \"document\") throw new Error(\"Expected a document artifact session\");\n let lastRevisionError: Error | null = null;\n for (let attempt = 0; attempt < DOCUMENT_COMPOSITION_ATTEMPTS; attempt += 1) {\n try {\n return await composeDocumentAttempt(session);\n } catch (cause) {\n const error = asEditableArtifactError(cause, \"Could not project this document\");\n if (!isRevisionDrift(error) || attempt === DOCUMENT_COMPOSITION_ATTEMPTS - 1) throw error;\n lastRevisionError = error;\n }\n }\n throw lastRevisionError ?? new Error(\"Document changed while it was opening\");\n}\n\nasync function composeDocumentAttempt(\n session: EditableArtifactSession,\n): Promise<DocumentEditorProjection> {\n const summaryPage = await session.queryDocument({ kind: \"summary\" });\n const summary = summaryItem(summaryPage);\n const revision = summaryPage.revision;\n if (summary.revision !== revision) throw new Error(\"Document projection revision drifted\");\n if (summary.blockCount > DOCUMENT_MAX_BLOCKS) {\n throw new Error(`Document exceeds the interactive limit of ${DOCUMENT_MAX_BLOCKS} blocks`);\n }\n if (summary.sectionCount > DOCUMENT_MAX_SECTIONS) {\n throw new Error(`Document exceeds the interactive limit of ${DOCUMENT_MAX_SECTIONS} sections`);\n }\n if (summary.commentCount + summary.trackedChangeCount > DOCUMENT_MAX_REVIEW_ITEMS) {\n throw new Error(\n `Document exceeds the interactive limit of ${DOCUMENT_MAX_REVIEW_ITEMS} review items`,\n );\n }\n\n const body = await collectDocumentPages(\n session,\n \"body\",\n revision,\n DOCUMENT_MAX_BLOCKS,\n DOCUMENT_MAX_TEXT_UTF16,\n DOCUMENT_MAX_TABLE_CELLS,\n (cursor, limits) => ({ kind: \"body\", startBlock: cursor, limits }),\n );\n const sections = await collectDocumentPages(\n session,\n \"sections\",\n revision,\n DOCUMENT_MAX_SECTIONS,\n DOCUMENT_MAX_TEXT_UTF16 - body.text,\n DOCUMENT_MAX_TABLE_CELLS - body.cells,\n (cursor, limits) => ({ kind: \"sections\", startSection: cursor, limits }),\n );\n const review = await collectDocumentPages(\n session,\n \"review\",\n revision,\n DOCUMENT_MAX_REVIEW_ITEMS,\n DOCUMENT_MAX_TEXT_UTF16 - body.text - sections.text,\n DOCUMENT_MAX_TABLE_CELLS - body.cells - sections.cells,\n (cursor, limits) => ({ kind: \"review\", startItem: cursor, limits }),\n );\n\n if (body.items.length !== summary.blockCount) {\n throw new Error(\"Document body changed while it was opening\");\n }\n if (sections.items.length !== summary.sectionCount) {\n throw new Error(\"Document sections changed while they were opening\");\n }\n if (review.items.length !== summary.commentCount + summary.trackedChangeCount) {\n throw new Error(\"Document review state changed while it was opening\");\n }\n const totalText = body.text + sections.text + review.text;\n const totalCells = body.cells + sections.cells + review.cells;\n if (totalText > DOCUMENT_MAX_TEXT_UTF16) {\n throw new Error(\n `Document exceeds the interactive limit of ${DOCUMENT_MAX_TEXT_UTF16} UTF-16 text units`,\n );\n }\n if (totalCells > DOCUMENT_MAX_TABLE_CELLS) {\n throw new Error(\n `Document exceeds the interactive limit of ${DOCUMENT_MAX_TABLE_CELLS} table cells`,\n );\n }\n\n return Object.freeze({\n revision: revision.toString(),\n page: projectDocumentPage(summary.page),\n blocks: Object.freeze(body.items.map(projectDocumentBlock)),\n sections: Object.freeze(sections.items.map(projectDocumentSection)),\n comments: Object.freeze(\n review.items.filter(isProjectionKind(\"comment\")).map((item) => ({\n id: item.id,\n blockId: item.paragraphId,\n start: item.range.start,\n end: item.range.end,\n resolved: item.resolved,\n replies: item.replies.map((reply) => ({ ...reply })),\n })),\n ),\n changes: Object.freeze(\n review.items.filter(isProjectionKind(\"tracked-change\")).map((item) => ({\n id: item.id,\n blockId: item.paragraphId,\n kind: item.changeKind,\n start: item.range.start,\n end: item.range.end,\n author: item.author,\n createdAt: item.createdAt,\n })),\n ),\n });\n}\n\ntype DocumentPageCollection = {\n items: DocumentArtifactProjectionItem[];\n text: number;\n cells: number;\n};\n\nasync function collectDocumentPages(\n session: EditableArtifactSession,\n label: \"body\" | \"sections\" | \"review\",\n revision: bigint,\n maxItems: number,\n maxText: number,\n maxCells: number,\n query: (\n cursor: number,\n limits: { maxItems: number; maxTextUtf16: number; maxTableCells: number },\n ) => DocumentArtifactQuery,\n): Promise<DocumentPageCollection> {\n const output: DocumentPageCollection = { items: [], text: 0, cells: 0 };\n let cursor = 0;\n for (let pageIndex = 0; pageIndex < DOCUMENT_MAX_QUERY_PAGES; pageIndex += 1) {\n if (output.items.length >= maxItems && cursor > 0) {\n throw new Error(`Document ${label} exceeds its interactive item limit`);\n }\n const page = await session.queryDocument(\n query(cursor, {\n maxItems: Math.min(DOCUMENT_PAGE_ITEMS, Math.max(1, maxItems - output.items.length)),\n maxTextUtf16: Math.max(1, maxText - output.text),\n maxTableCells: Math.max(1, maxCells - output.cells),\n }),\n );\n assertDocumentRevision(page, revision);\n assertDocumentPageKinds(label, page.items);\n if (output.items.length + page.items.length > maxItems) {\n throw new Error(`Document ${label} exceeds its interactive item limit`);\n }\n output.items.push(...page.items);\n output.text += page.projectedTextUtf16;\n output.cells += page.projectedTableCells;\n if (output.text > maxText || output.cells > maxCells) {\n throw new Error(`Document ${label} exceeds its interactive content limit`);\n }\n if (page.nextCursor === null) return output;\n if (page.nextCursor <= cursor || page.items.length === 0) {\n throw new Error(`Document ${label} pagination did not advance`);\n }\n cursor = page.nextCursor;\n }\n throw new Error(`Document ${label} exceeds ${DOCUMENT_MAX_QUERY_PAGES} query pages`);\n}\n\nfunction summaryItem(\n projection: DocumentArtifactProjection,\n): Extract<DocumentArtifactProjectionItem, { kind: \"summary\" }> {\n if (\n projection.items.length !== 1 ||\n projection.items[0]?.kind !== \"summary\" ||\n projection.nextCursor !== null ||\n projection.truncated\n ) {\n throw new Error(\"Document summary projection is malformed\");\n }\n return projection.items[0];\n}\n\nfunction assertDocumentRevision(page: DocumentArtifactProjection, revision: bigint): void {\n if (page.revision !== revision) throw new Error(\"Document projection revision drifted\");\n}\n\nfunction assertDocumentPageKinds(\n label: \"body\" | \"sections\" | \"review\",\n items: readonly DocumentArtifactProjectionItem[],\n): void {\n const valid =\n label === \"body\"\n ? new Set([\"paragraph\", \"table\", \"page-break\"])\n : label === \"sections\"\n ? new Set([\"section\"])\n : new Set([\"comment\", \"tracked-change\"]);\n if (items.some((item) => !valid.has(item.kind))) {\n throw new Error(`Document ${label} projection contains an unexpected item`);\n }\n}\n\nfunction projectDocumentBlock(\n item: DocumentArtifactProjectionItem,\n): DocumentEditorProjection[\"blocks\"][number] {\n if (item.kind === \"paragraph\") {\n const { headingLevel, list, ...paragraphStyle } = item.style;\n return {\n kind: \"paragraph\",\n id: item.id,\n runs: item.runs.map((run) => ({ text: run.text, style: { ...run.style } })),\n style: {\n ...paragraphStyle,\n ...(headingLevel === undefined ? {} : { headingLevel: documentHeadingLevel(headingLevel) }),\n ...(list\n ? {\n list: {\n kind: list.kind,\n ...(list.level === null ? {} : { level: list.level }),\n ...(list.instanceId === null ? {} : { instanceId: list.instanceId }),\n },\n }\n : {}),\n },\n };\n }\n if (item.kind === \"table\") {\n return {\n kind: \"table\",\n id: item.id,\n rows: item.rows.map((row) =>\n row.map((cell) => cell.map((run) => ({ text: run.text, style: { ...run.style } }))),\n ),\n style: { ...item.style },\n };\n }\n if (item.kind === \"page-break\") return { kind: \"pageBreak\", id: item.id };\n throw new Error(\"Document body projection contains an unexpected item\");\n}\n\nfunction documentHeadingLevel(value: number): 1 | 2 | 3 | 4 | 5 | 6 {\n if (value < 1 || value > 6 || !Number.isInteger(value)) {\n throw new Error(\"Document projection contains an invalid heading level\");\n }\n return value as 1 | 2 | 3 | 4 | 5 | 6;\n}\n\nfunction projectDocumentSection(item: DocumentArtifactProjectionItem) {\n if (item.kind !== \"section\") {\n throw new Error(\"Document section projection contains an unexpected item\");\n }\n return {\n id: item.id,\n startBlockIndex: item.startBlockIndex,\n page: projectDocumentPage(item.page),\n titlePage: item.titlePage,\n headerBlockCounts: item.headerBlockCounts,\n footerBlockCounts: item.footerBlockCounts,\n };\n}\n\nfunction projectDocumentPage(\n page: DocumentArtifactPageGeometryProjection,\n): DocumentProjectionPageGeometry {\n const points = (value: bigint) => Number(value) / 1_000;\n return {\n widthPt: points(page.widthMillipoints),\n heightPt: points(page.heightMillipoints),\n marginTopPt: points(page.marginTopMillipoints),\n marginRightPt: points(page.marginRightMillipoints),\n marginBottomPt: points(page.marginBottomMillipoints),\n marginLeftPt: points(page.marginLeftMillipoints),\n headerPt: points(page.headerMillipoints),\n footerPt: points(page.footerMillipoints),\n gutterPt: points(page.gutterMillipoints),\n };\n}\n\nfunction isProjectionKind<K extends DocumentArtifactProjectionItem[\"kind\"]>(kind: K) {\n return (\n item: DocumentArtifactProjectionItem,\n ): item is Extract<DocumentArtifactProjectionItem, { kind: K }> => item.kind === kind;\n}\n\nfunction paragraphTextById(projection: DocumentEditorProjection): Map<string, string> {\n return new Map(\n projection.blocks\n .filter((block) => block.kind === \"paragraph\")\n .map((paragraph) => [paragraph.id, paragraph.runs.map((run) => run.text).join(\"\")] as const),\n );\n}\n\nexport function minimalUtf16TextEdit(\n before: string,\n after: string,\n): { range: { start: number; end: number }; replacement: string } | null {\n if (before === after) return null;\n let start = 0;\n const maximumStart = Math.min(before.length, after.length);\n while (start < maximumStart && before.charCodeAt(start) === after.charCodeAt(start)) start += 1;\n while (start > 0 && (splitsSurrogate(before, start) || splitsSurrogate(after, start))) start -= 1;\n\n let suffix = 0;\n while (\n suffix < before.length - start &&\n suffix < after.length - start &&\n before.charCodeAt(before.length - suffix - 1) === after.charCodeAt(after.length - suffix - 1)\n ) {\n suffix += 1;\n }\n while (\n suffix > 0 &&\n (splitsSurrogate(before, before.length - suffix) ||\n splitsSurrogate(after, after.length - suffix))\n ) {\n suffix -= 1;\n }\n return {\n range: { start, end: before.length - suffix },\n replacement: after.slice(start, after.length - suffix),\n };\n}\n\nfunction splitsSurrogate(value: string, index: number): boolean {\n if (index <= 0 || index >= value.length) return false;\n const left = value.charCodeAt(index - 1);\n const right = value.charCodeAt(index);\n return left >= 0xd800 && left <= 0xdbff && right >= 0xdc00 && right <= 0xdfff;\n}\n\nfunction documentTextStylePatch(\n style: Extract<DocumentCommit, { kind: \"format\" }>[\"style\"],\n): DocumentArtifactTextStylePatch {\n return {\n ...(style.fontFamily === undefined ? {} : { fontFamily: style.fontFamily }),\n ...(style.fontSizePt === undefined ? {} : { fontSizePt: style.fontSizePt }),\n ...(style.color === undefined ? {} : { color: style.color }),\n ...(style.bold === undefined ? {} : { bold: style.bold }),\n ...(style.italic === undefined ? {} : { italic: style.italic }),\n ...(style.underline === undefined ? {} : { underline: style.underline }),\n ...(style.strike === undefined ? {} : { strike: style.strike }),\n };\n}\n\nfunction isRevisionDrift(error: Error): boolean {\n return error.message.includes(\"changed while\") || error.message.includes(\"revision drifted\");\n}\n\nfunction notifyDocumentCommit(\n observer: DocumentCommitHandler | undefined,\n onError: ((error: Error) => void) | undefined,\n commit: DocumentCommit,\n): void {\n try {\n const result = observer?.(commit);\n if (result && typeof result.then === \"function\") {\n void Promise.resolve(result).catch((cause) =>\n onError?.(asEditableArtifactError(cause, \"Document commit observer failed\")),\n );\n }\n } catch (cause) {\n onError?.(asEditableArtifactError(cause, \"Document commit observer failed\"));\n }\n}\n"],"mappings":"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","names":["document","ParagraphLeaf","useCallback","useEffect","useRef","useState","jsx","useState","useRef","useEffect","projection","useCallback"]}
|