@opengeni/react 0.46.1 → 0.52.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +158 -14
- 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 +170 -0
- package/dist/artifacts.js.map +1 -0
- package/dist/chunk-6BBWWOOU.js +82 -0
- package/dist/chunk-6BBWWOOU.js.map +1 -0
- package/dist/{chunk-HFO4ERGQ.js → chunk-724BW4TW.js} +586 -35
- package/dist/chunk-724BW4TW.js.map +1 -0
- package/dist/chunk-7I2KB3OK.js +3895 -0
- package/dist/chunk-7I2KB3OK.js.map +1 -0
- package/dist/chunk-7WCLAEFV.js +2828 -0
- package/dist/chunk-7WCLAEFV.js.map +1 -0
- package/dist/{chunk-U3CSCMWA.js → chunk-FK6VG4LL.js} +9 -13
- package/dist/chunk-FK6VG4LL.js.map +1 -0
- package/dist/{chunk-SRFUT2ZU.js → chunk-FWS3KC3Z.js} +120 -64
- package/dist/chunk-FWS3KC3Z.js.map +1 -0
- package/dist/{chunk-EKZH6IDG.js → chunk-HDBG7XGO.js} +62 -1
- package/dist/chunk-HDBG7XGO.js.map +1 -0
- package/dist/chunk-HUIKIDM5.js +2148 -0
- package/dist/chunk-HUIKIDM5.js.map +1 -0
- package/dist/{chunk-LGVMUIRV.js → chunk-JAGDUCZQ.js} +1053 -390
- package/dist/chunk-JAGDUCZQ.js.map +1 -0
- package/dist/{chunk-LWR4MXSS.js → chunk-JR3QFY6B.js} +420 -35
- package/dist/chunk-JR3QFY6B.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-EB67J347.js → chunk-KZ73RL76.js} +111 -31
- package/dist/chunk-KZ73RL76.js.map +1 -0
- package/dist/chunk-PEI6RANI.js +3234 -0
- package/dist/chunk-PEI6RANI.js.map +1 -0
- package/dist/{chunk-3PB7MIT6.js → chunk-ROIRTM37.js} +220 -72
- package/dist/chunk-ROIRTM37.js.map +1 -0
- package/dist/chunk-VZTQ73XT.js +86 -0
- package/dist/chunk-VZTQ73XT.js.map +1 -0
- package/dist/{chunk-VCBFUSUZ.js → chunk-WSK7G5LE.js} +72 -4
- package/dist/chunk-WSK7G5LE.js.map +1 -0
- package/dist/{chunk-FGZUCXZF.js → chunk-WYA65Y3F.js} +16 -16
- package/dist/chunk-WYA65Y3F.js.map +1 -0
- package/dist/{chunk-6EDV6YFE.js → chunk-X4S56Y2H.js} +147 -35
- package/dist/chunk-X4S56Y2H.js.map +1 -0
- package/dist/client.d.ts +7 -1
- 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 +8 -0
- package/dist/components/artifacts/presentation-editor.d.ts +297 -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-viewer.d.ts +29 -0
- package/dist/components/chat-composer.d.ts +13 -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 +4 -2
- package/dist/components/composer.d.ts +29 -15
- package/dist/components/computer-viewer.d.ts +23 -0
- package/dist/components/copy-button.d.ts +2 -2
- package/dist/components/desktop-viewer.d.ts +25 -21
- 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/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 +5 -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 +5 -5
- package/dist/components/markdown.d.ts +1 -1
- package/dist/components/message-timeline.d.ts +22 -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 +5 -5
- package/dist/components/sandbox-terminal.d.ts +50 -4
- package/dist/components/sandbox-workspace.d.ts +30 -10
- 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 +3 -1
- package/dist/composer.d.ts +11 -11
- package/dist/composer.js +7 -7
- package/dist/hooks/internal.d.ts +7 -1
- package/dist/hooks/use-attached-browsers.d.ts +21 -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-frame-stream.d.ts +28 -0
- package/dist/hooks/use-browser-identities.d.ts +26 -0
- package/dist/hooks/use-browser-session.d.ts +28 -0
- package/dist/hooks/use-browser-sessions.d.ts +32 -0
- package/dist/hooks/use-codex-accounts.d.ts +3 -3
- 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 +28 -0
- package/dist/hooks/use-computer-sessions.d.ts +28 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-environments.d.ts +11 -5
- 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-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 +10 -3
- 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 +25 -4
- package/dist/hooks/use-sandbox-git.d.ts +13 -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-slash-commands.d.ts +1 -1
- package/dist/hooks/use-terminal-stream.d.ts +8 -2
- package/dist/hooks/use-transcription.d.ts +2 -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 +6 -4
- 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 +158 -154
- package/dist/index.js +1718 -908
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +23 -0
- package/dist/interaction.js +36 -0
- package/dist/interaction.js.map +1 -0
- package/dist/interactive-workbench-viewers-KHNOHWQE.js +13 -0
- package/dist/interactive-workbench-viewers-KHNOHWQE.js.map +1 -0
- package/dist/lib/composer-responsive-context.d.ts +9 -0
- package/dist/lib/relay-wire.d.ts +4 -0
- package/dist/lib/sandbox-liveness.d.ts +9 -0
- package/dist/lib/terminal-capability.d.ts +5 -0
- package/dist/lib/use-portal-token-style.d.ts +14 -3
- package/dist/lib/xterm-theme.d.ts +1 -1
- package/dist/machines.d.ts +30 -30
- package/dist/machines.js +3 -3
- package/dist/provider.d.ts +4 -4
- package/dist/{queue-surface-implementation-J4XJFKRW.js → queue-surface-implementation-2KVJTYXH.js} +117 -64
- 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 +15 -6
- package/dist/realtime.d.ts +4 -4
- package/dist/realtime.js +30 -33
- package/dist/realtime.js.map +1 -1
- package/dist/session-context.d.ts +19 -1
- package/dist/session-ui.d.ts +14 -14
- package/dist/session-ui.js +6 -5
- package/dist/session.d.ts +28 -28
- package/dist/session.js +5 -5
- package/dist/timeline/activity-rail.d.ts +6 -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 +6 -3
- package/dist/timeline/projection.d.ts +3 -3
- package/dist/timeline/registry.d.ts +10 -1
- 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 +42 -2
- 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/dist/voice-recording-store.d.ts +8 -2
- package/package.json +52 -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 +86 -0
- package/src/client.ts +90 -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 +99 -0
- package/src/components/artifacts/presentation-editor.tsx +3148 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +799 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +2129 -0
- package/src/components/browser-viewer.tsx +1592 -0
- package/src/components/chat-composer.tsx +25 -2
- package/src/components/code-editor.tsx +90 -31
- package/src/components/command-palette.tsx +1 -1
- package/src/components/composer-transcription-control.tsx +51 -22
- package/src/components/composer.tsx +49 -23
- package/src/components/computer-viewer.tsx +1139 -0
- package/src/components/copy-button.tsx +1 -1
- package/src/components/desktop-viewer.tsx +103 -75
- package/src/components/file-browser.tsx +39 -17
- package/src/components/generated-video-player.tsx +89 -0
- package/src/components/human-input-form.tsx +2 -2
- package/src/components/interactive-workbench-viewers.ts +2 -0
- package/src/components/machine-card.tsx +1 -1
- package/src/components/machine-input-display.ts +3 -0
- package/src/components/machines/machine-detail.tsx +39 -15
- package/src/components/machines-dashboard.tsx +7 -6
- package/src/components/message-timeline.tsx +327 -37
- package/src/components/model-picker.tsx +2 -2
- package/src/components/model-policy-picker.tsx +16 -15
- package/src/components/queue-surface-implementation.tsx +135 -75
- package/src/components/queue-surface-state.tsx +2 -2
- package/src/components/sandbox-files.tsx +142 -62
- package/src/components/sandbox-terminal.tsx +119 -35
- package/src/components/sandbox-workspace.tsx +394 -228
- package/src/components/session-chrome.tsx +67 -27
- 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/tooltip.tsx +13 -16
- package/src/components/user-message-body.tsx +1 -1
- package/src/components/workbench-changes.tsx +192 -35
- package/src/components/workspace-dock.tsx +13 -5
- package/src/composer.ts +3 -0
- package/src/hooks/internal.ts +132 -38
- package/src/hooks/use-attached-browsers.ts +152 -0
- package/src/hooks/use-browser-frame-stream.ts +316 -0
- package/src/hooks/use-browser-identities.ts +225 -0
- package/src/hooks/use-browser-session.ts +476 -0
- package/src/hooks/use-browser-sessions.ts +281 -0
- package/src/hooks/use-codex-accounts.ts +4 -4
- package/src/hooks/use-composer.ts +769 -24
- package/src/hooks/use-computer-frame-stream.ts +311 -0
- package/src/hooks/use-computer-session.ts +442 -0
- package/src/hooks/use-computer-sessions.ts +245 -0
- package/src/hooks/use-environments.ts +24 -5
- package/src/hooks/use-file-attachments.ts +70 -32
- package/src/hooks/use-goal.ts +17 -5
- package/src/hooks/use-machine-chip.ts +5 -3
- package/src/hooks/use-machines.ts +79 -3
- package/src/hooks/use-packs.ts +51 -0
- package/src/hooks/use-sandbox-files.ts +382 -88
- package/src/hooks/use-sandbox-git.ts +208 -46
- package/src/hooks/use-sandbox-terminal.ts +3 -2
- package/src/hooks/use-session-capabilities.ts +94 -70
- package/src/hooks/use-session-events.ts +18 -4
- package/src/hooks/use-terminal-stream.ts +102 -23
- package/src/hooks/use-transcription.ts +4 -14
- package/src/hooks/use-turn-queue.ts +17 -5
- package/src/hooks/use-video-artifact-playback.ts +28 -0
- package/src/hooks/use-voice-input.ts +163 -19
- package/src/hooks/use-windowed-sections.ts +9 -7
- package/src/hooks/use-workspace-edit.ts +2 -1
- package/src/index.ts +21 -6
- package/src/interaction.ts +71 -0
- package/src/lib/composer-responsive-context.ts +15 -0
- package/src/lib/relay-wire.ts +4 -0
- package/src/lib/sandbox-liveness.ts +11 -0
- package/src/lib/terminal-capability.ts +10 -0
- package/src/lib/use-portal-token-style.ts +60 -15
- package/src/provider.tsx +52 -7
- package/src/realtime/dropdown-menu.tsx +15 -19
- package/src/realtime/realtime-control.tsx +16 -5
- package/src/session-context.ts +90 -0
- package/src/timeline/activity-rail.tsx +31 -6
- package/src/timeline/index.ts +4 -1
- package/src/timeline/parsers.ts +46 -20
- package/src/timeline/projection.ts +233 -13
- package/src/timeline/registry.ts +19 -0
- package/src/timeline/screenshot-lightbox.tsx +30 -9
- package/src/timeline/shared.tsx +59 -11
- package/src/timeline/tool-renderers.tsx +421 -24
- package/src/timeline/turn-summary.tsx +2 -2
- package/src/timeline/types.ts +58 -2
- package/src/voice-recording-store.ts +15 -0
- package/styles/compiled.css +5298 -0
- package/styles/compiled.d.ts +2 -0
- package/styles/effective-tokens.css +27 -0
- package/styles/index.css +18 -0
- package/styles/responsive.css +208 -0
- package/styles/responsive.d.ts +2 -0
- package/styles/tokens.css +50 -17
- package/dist/chunk-3PB7MIT6.js.map +0 -1
- package/dist/chunk-6EDV6YFE.js.map +0 -1
- package/dist/chunk-EB67J347.js.map +0 -1
- package/dist/chunk-EKZH6IDG.js.map +0 -1
- package/dist/chunk-FGZUCXZF.js.map +0 -1
- package/dist/chunk-HFO4ERGQ.js.map +0 -1
- package/dist/chunk-JB5725BI.js +0 -48
- package/dist/chunk-JB5725BI.js.map +0 -1
- package/dist/chunk-LGVMUIRV.js.map +0 -1
- package/dist/chunk-LWR4MXSS.js.map +0 -1
- package/dist/chunk-SRFUT2ZU.js.map +0 -1
- package/dist/chunk-U3CSCMWA.js.map +0 -1
- package/dist/chunk-VCBFUSUZ.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-J4XJFKRW.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/artifacts/spreadsheet-grid.tsx","../src/components/artifacts/spreadsheet-canvas.ts","../src/components/artifacts/editable-spreadsheet.tsx"],"sourcesContent":["import type { Workbook, WorkbookChange, Worksheet } from \"@opengeni/artifact-tool/reference\";\nimport { PlusIcon } from \"lucide-react\";\nimport {\n type ClipboardEvent as ReactClipboardEvent,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { ArtifactSurface } from \"./artifact-surface\";\nimport {\n SparseSpreadsheetCellIndex,\n SpreadsheetCanvasRenderer,\n spreadsheetCanvasDevicePixelRatio,\n type SpreadsheetCanvasAxis,\n type SpreadsheetCanvasCellFormat,\n type SpreadsheetCanvasProjection,\n type SpreadsheetCanvasTheme,\n} from \"./spreadsheet-canvas\";\n\nconst MAX_ROWS = 1_048_576;\nconst MAX_COLUMNS = 16_384;\nconst ROW_HEADER_WIDTH = 48;\nconst COLUMN_HEADER_HEIGHT = 28;\nconst FALLBACK_VIEWPORT_WIDTH = 880;\nconst FALLBACK_VIEWPORT_HEIGHT = 480;\n// Firefox collapses oversized layout boxes rather than merely clamping them.\n// Keep the native scroll surface comfortably below every supported engine's\n// limit, then project that bounded physical range over the full logical sheet.\nconst MAX_PHYSICAL_SCROLL_SPAN = 8_000_000;\n// Purely proportional compression can assign short rows after tall overrides\n// to the same browser scroll pixel. Every compressed axis therefore reserves\n// physical address space per item as well as a proportional share.\nconst MIN_PHYSICAL_ITEM_SPAN = 4;\nconst MAX_MOUNTED_AXIS_ITEMS = 512;\nconst MAX_MOUNTED_GRID_CELLS = 2_048;\nconst MAX_CLIPBOARD_INPUT_BYTES = 4 * 1024 * 1024;\nconst MAX_CLIPBOARD_CELLS = 65_536;\n\ntype CellCoordinate = { row: number; col: number };\n\nexport type SpreadsheetSelection = {\n sheetId: string;\n anchor: CellCoordinate;\n focus: CellCoordinate;\n};\n\nexport type SpreadsheetCommit = {\n sheetId: string;\n cell: CellCoordinate;\n input: string;\n kind: \"formula\" | \"value\";\n};\n\n/** Row-major rectangular input submitted as one durable spreadsheet command. */\nexport type SpreadsheetRangeCommit = {\n sheetId: string;\n anchor: CellCoordinate;\n rows: number;\n columns: number;\n inputs: readonly string[];\n};\n\n/** End-exclusive logical windows emitted at most once per animation frame. */\nexport type SpreadsheetViewport = {\n sheetId: string;\n rowStart: number;\n rowEnd: number;\n columnStart: number;\n columnEnd: number;\n overscanRowStart: number;\n overscanRowEnd: number;\n overscanColumnStart: number;\n overscanColumnEnd: number;\n logicalScrollLeft: number;\n logicalScrollTop: number;\n viewportWidth: number;\n viewportHeight: number;\n};\n\nexport type SpreadsheetGridProps = {\n workbook: Workbook;\n worksheet: Worksheet;\n readOnly?: boolean | undefined;\n /** Addressable rows in the interactive projection. Grows to include used data. */\n rowCount?: number | undefined;\n /** Addressable columns in the interactive projection. Grows to include used data. */\n columnCount?: number | undefined;\n overscanRows?: number | undefined;\n overscanColumns?: number | undefined;\n onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;\n onCommit?: ((commit: SpreadsheetCommit) => void) | undefined;\n onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;\n className?: string | undefined;\n};\n\nexport type SpreadsheetProjectionCell = {\n value: unknown;\n input: string;\n format: SpreadsheetCanvasCellFormat;\n};\n\n/**\n * Synchronous, bounded view state consumed by the React editor. Durable model\n * ownership stays with the caller (legacy Workbook, SDK Worker, or another\n * projection adapter); edits return through `commit` / `clear` ports.\n */\nexport type SpreadsheetGridProjection = SpreadsheetCanvasProjection & {\n sheetName: string;\n rowCount: number;\n columnCount: number;\n defaultRowHeight?: number | undefined;\n defaultColumnWidth?: number | undefined;\n rowHeights?: readonly (readonly [number, number])[] | undefined;\n columnWidths?: readonly (readonly [number, number])[] | undefined;\n dimensionRevision?: string | number | undefined;\n usedRange?: { row: number; col: number; rowCount: number; colCount: number } | null | undefined;\n readCell: (row: number, column: number) => SpreadsheetProjectionCell | null;\n};\n\nexport type SpreadsheetProjectionGridProps = {\n projection: SpreadsheetGridProjection;\n readOnly?: boolean | undefined;\n overscanRows?: number | undefined;\n overscanColumns?: number | undefined;\n onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;\n commit?: ((commit: SpreadsheetCommit) => void | Promise<void>) | undefined;\n commitRange?: ((commit: SpreadsheetRangeCommit) => void | Promise<void>) | undefined;\n clear?: ((selection: SpreadsheetSelection) => void | Promise<void>) | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;\n className?: string | undefined;\n};\n\nexport type SpreadsheetArtifactSurfaceProps = Omit<SpreadsheetGridProps, \"worksheet\"> & {\n title?: string | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n initialSheetId?: string | undefined;\n allowAddSheet?: boolean | undefined;\n};\n\ntype AxisGeometry = {\n count: number;\n defaultSize: number;\n overrides: readonly AxisOverride[];\n total: number;\n};\n\ntype AxisOverride = {\n index: number;\n size: number;\n start: number;\n end: number;\n cumulativeDelta: number;\n};\n\ntype ViewportState = {\n width: number;\n height: number;\n scrollLeft: number;\n scrollTop: number;\n devicePixelRatio: number;\n};\n\ntype SelectingState = {\n pointerId: number;\n anchor: CellCoordinate;\n};\n\ntype ScrollProjection = {\n axis: AxisGeometry;\n mode: \"identity\" | \"indexed\";\n physicalTotal: number;\n logicalMax: number;\n physicalMax: number;\n baseItemSpan: number;\n proportionalSpan: number;\n rawMax: number;\n};\n\ntype WorkbookViewState = {\n revision: number;\n dimensionRevision: number;\n};\n\nconst useClientLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nfunction boundedInteger(value: number | undefined, fallback: number, max: number): number {\n if (value === undefined) return fallback;\n if (!Number.isFinite(value)) return fallback;\n return Math.min(max, Math.max(1, Math.floor(value)));\n}\n\nfunction buildAxis(\n count: number,\n defaultSize: number,\n entries: Iterable<readonly [number, number]>,\n): AxisGeometry {\n const normalizedDefault = Number.isFinite(defaultSize) && defaultSize > 0 ? defaultSize : 1;\n const sorted = [...entries]\n .filter(\n ([index, size]) =>\n Number.isInteger(index) && index >= 0 && index < count && Number.isFinite(size) && size > 0,\n )\n .sort(([left], [right]) => left - right);\n const overrides: AxisOverride[] = [];\n let cumulativeDelta = 0;\n for (const [index, size] of sorted) {\n // A Map-backed source is unique. Last-write-wins also makes this robust to\n // custom adapters that repeat an index.\n const previous = overrides.at(-1);\n if (previous?.index === index) {\n cumulativeDelta -= previous.size - normalizedDefault;\n overrides.pop();\n }\n if (size === normalizedDefault) continue;\n const start = index * normalizedDefault + cumulativeDelta;\n cumulativeDelta += size - normalizedDefault;\n overrides.push({\n index,\n size,\n start,\n end: start + size,\n cumulativeDelta,\n });\n }\n return {\n count,\n defaultSize: normalizedDefault,\n overrides,\n total: count * normalizedDefault + cumulativeDelta,\n };\n}\n\nfunction lowerBoundOverrideIndex(axis: AxisGeometry, index: number): number {\n let low = 0;\n let high = axis.overrides.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (axis.overrides[middle]!.index < index) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction axisOffsetAt(axis: AxisGeometry, index: number): number {\n if (index <= 0) return 0;\n if (index >= axis.count) return axis.total;\n const insertion = lowerBoundOverrideIndex(axis, index);\n const delta = insertion > 0 ? axis.overrides[insertion - 1]!.cumulativeDelta : 0;\n return index * axis.defaultSize + delta;\n}\n\nfunction axisSizeAt(axis: AxisGeometry, index: number): number {\n const candidate = axis.overrides[lowerBoundOverrideIndex(axis, index)];\n return candidate?.index === index ? candidate.size : axis.defaultSize;\n}\n\nfunction upperBoundOverrideStart(axis: AxisGeometry, offset: number): number {\n let low = 0;\n let high = axis.overrides.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (axis.overrides[middle]!.start <= offset) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction indexAtOffset(axis: AxisGeometry, offset: number): number {\n if (axis.count <= 1) return 0;\n const target = Math.max(0, Math.min(axis.total - 1, offset));\n const previousIndex = upperBoundOverrideStart(axis, target) - 1;\n if (previousIndex < 0) {\n return Math.min(\n (axis.overrides[0]?.index ?? axis.count) - 1,\n Math.floor(target / axis.defaultSize),\n );\n }\n const previous = axis.overrides[previousIndex]!;\n if (target < previous.end) return previous.index;\n const nextOverrideIndex = axis.overrides[previousIndex + 1]?.index ?? axis.count;\n return Math.min(\n axis.count - 1,\n nextOverrideIndex - 1,\n previous.index + 1 + Math.floor((target - previous.end) / axis.defaultSize),\n );\n}\n\nfunction visibleInterval(\n axis: AxisGeometry,\n startOffset: number,\n viewportSize: number,\n overscan: number,\n): { start: number; end: number } {\n const start = Math.max(0, indexAtOffset(axis, startOffset) - overscan);\n const end = Math.min(\n axis.count,\n indexAtOffset(axis, startOffset + Math.max(1, viewportSize)) + overscan + 1,\n );\n return { start, end };\n}\n\nfunction boundVisibleWindows(\n rows: { start: number; end: number },\n columns: { start: number; end: number },\n focus: CellCoordinate,\n): {\n rows: { start: number; end: number };\n columns: { start: number; end: number };\n} {\n let rowCount = Math.min(MAX_MOUNTED_AXIS_ITEMS, rows.end - rows.start);\n let columnCount = Math.min(MAX_MOUNTED_AXIS_ITEMS, columns.end - columns.start);\n if (rowCount * columnCount > MAX_MOUNTED_GRID_CELLS) {\n const balancedLimit = Math.floor(Math.sqrt(MAX_MOUNTED_GRID_CELLS));\n if (rowCount > balancedLimit && columnCount > balancedLimit) {\n rowCount = balancedLimit;\n columnCount = balancedLimit;\n } else if (rowCount >= columnCount) {\n rowCount = Math.max(1, Math.floor(MAX_MOUNTED_GRID_CELLS / columnCount));\n } else {\n columnCount = Math.max(1, Math.floor(MAX_MOUNTED_GRID_CELLS / rowCount));\n }\n }\n return {\n rows: centeredInterval(rows, rowCount, focus.row),\n columns: centeredInterval(columns, columnCount, focus.col),\n };\n}\n\nfunction centeredInterval(\n interval: { start: number; end: number },\n count: number,\n focus: number,\n): { start: number; end: number } {\n if (count >= interval.end - interval.start) return interval;\n if (focus < interval.start || focus >= interval.end) {\n return { start: interval.start, end: interval.start + count };\n }\n const start = Math.max(\n interval.start,\n Math.min(interval.end - count, focus - Math.floor(count / 2)),\n );\n return { start, end: start + count };\n}\n\nfunction indexesBetween(start: number, end: number): number[] {\n return Array.from({ length: end - start }, (_, index) => start + index);\n}\n\nfunction rawBoundaryAt(projection: ScrollProjection, index: number): number {\n if (index <= 0) return 0;\n if (index >= projection.axis.count) {\n return projection.axis.count * projection.baseItemSpan + projection.proportionalSpan;\n }\n return (\n index * projection.baseItemSpan +\n (axisOffsetAt(projection.axis, index) / projection.axis.total) * projection.proportionalSpan\n );\n}\n\nfunction rawOffsetAtLogical(projection: ScrollProjection, offset: number): number {\n if (offset <= 0) return 0;\n if (offset >= projection.axis.total) {\n return rawBoundaryAt(projection, projection.axis.count);\n }\n const index = indexAtOffset(projection.axis, offset);\n const logicalStart = axisOffsetAt(projection.axis, index);\n const logicalSize = axisSizeAt(projection.axis, index);\n const fraction = Math.max(0, Math.min(1, (offset - logicalStart) / logicalSize));\n const rawStart = rawBoundaryAt(projection, index);\n const rawEnd = rawBoundaryAt(projection, index + 1);\n return rawStart + fraction * (rawEnd - rawStart);\n}\n\nfunction logicalOffsetAtRaw(projection: ScrollProjection, rawOffset: number): number {\n const target = Math.max(0, Math.min(projection.rawMax, rawOffset));\n let low = 0;\n let high = projection.axis.count;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (rawBoundaryAt(projection, middle) <= target) low = middle;\n else high = middle - 1;\n }\n const index = Math.min(projection.axis.count - 1, low);\n const rawStart = rawBoundaryAt(projection, index);\n const rawEnd = rawBoundaryAt(projection, index + 1);\n const fraction = rawEnd === rawStart ? 0 : (target - rawStart) / (rawEnd - rawStart);\n return Math.min(\n projection.logicalMax,\n axisOffsetAt(projection.axis, index) + fraction * axisSizeAt(projection.axis, index),\n );\n}\n\nfunction buildScrollProjection(\n axis: AxisGeometry,\n headerSize: number,\n viewportSize: number,\n): ScrollProjection {\n const logicalTotal = headerSize + axis.total;\n const physicalTotal = Math.min(logicalTotal, MAX_PHYSICAL_SCROLL_SPAN);\n const logicalMax = Math.max(0, logicalTotal - viewportSize);\n const physicalMax = Math.max(0, physicalTotal - viewportSize);\n const mode = physicalTotal === logicalTotal ? \"identity\" : \"indexed\";\n const physicalAxisCapacity = Math.max(0, physicalTotal - headerSize);\n const baseItemSpan =\n mode === \"indexed\" ? Math.min(MIN_PHYSICAL_ITEM_SPAN, physicalAxisCapacity / axis.count) : 0;\n const projection: ScrollProjection = {\n axis,\n mode,\n physicalTotal,\n logicalMax,\n physicalMax,\n baseItemSpan,\n proportionalSpan: Math.max(0, physicalAxisCapacity - baseItemSpan * axis.count),\n rawMax: 0,\n };\n projection.rawMax = rawOffsetAtLogical(projection, logicalMax);\n return projection;\n}\n\nfunction clampPhysicalScroll(offset: number, projection: ScrollProjection): number {\n return Math.max(0, Math.min(projection.physicalMax, offset));\n}\n\nfunction physicalToLogicalScroll(offset: number, projection: ScrollProjection): number {\n if (projection.logicalMax === 0 || projection.physicalMax === 0) return 0;\n if (projection.mode === \"indexed\") {\n return logicalOffsetAtRaw(\n projection,\n (clampPhysicalScroll(offset, projection) / projection.physicalMax) * projection.rawMax,\n );\n }\n return (clampPhysicalScroll(offset, projection) / projection.physicalMax) * projection.logicalMax;\n}\n\nfunction logicalToPhysicalScroll(offset: number, projection: ScrollProjection): number {\n if (projection.logicalMax === 0 || projection.physicalMax === 0) return 0;\n const logical = Math.max(0, Math.min(projection.logicalMax, offset));\n if (projection.mode === \"indexed\") {\n return (rawOffsetAtLogical(projection, logical) / projection.rawMax) * projection.physicalMax;\n }\n return (logical / projection.logicalMax) * projection.physicalMax;\n}\n\nfunction columnName(index: number): string {\n let value = index + 1;\n let result = \"\";\n while (value > 0) {\n const remainder = (value - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n value = Math.floor((value - 1) / 26);\n }\n return result;\n}\n\nfunction cellName(cell: CellCoordinate): string {\n return `${columnName(cell.col)}${cell.row + 1}`;\n}\n\nfunction normalizeSelection(selection: SpreadsheetSelection) {\n return {\n top: Math.min(selection.anchor.row, selection.focus.row),\n bottom: Math.max(selection.anchor.row, selection.focus.row),\n left: Math.min(selection.anchor.col, selection.focus.col),\n right: Math.max(selection.anchor.col, selection.focus.col),\n };\n}\n\nfunction selectionName(selection: SpreadsheetSelection): string {\n const normalized = normalizeSelection(selection);\n const first = cellName({ row: normalized.top, col: normalized.left });\n const last = cellName({ row: normalized.bottom, col: normalized.right });\n return first === last ? first : `${first}:${last}`;\n}\n\nfunction isCellSelected(selection: SpreadsheetSelection, row: number, col: number): boolean {\n const normalized = normalizeSelection(selection);\n return (\n row >= normalized.top &&\n row <= normalized.bottom &&\n col >= normalized.left &&\n col <= normalized.right\n );\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toLocaleDateString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n\nfunction parseCellInput(input: string): string | number | boolean | null {\n if (input === \"\") return null;\n const normalized = input.trim();\n if (/^(?:true|false)$/i.test(normalized)) return normalized.toLowerCase() === \"true\";\n if (/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(normalized)) {\n const number = Number(normalized);\n if (Number.isFinite(number)) return number;\n }\n return input;\n}\n\ntype ParsedSpreadsheetClipboard = Readonly<{\n rows: number;\n columns: number;\n inputs: readonly string[];\n}>;\n\n/** Bounded RFC-4180-style TSV parser for Excel/Sheets `text/plain` clipboard data. */\nfunction parseSpreadsheetClipboard(input: string): ParsedSpreadsheetClipboard {\n if (new TextEncoder().encode(input).byteLength > MAX_CLIPBOARD_INPUT_BYTES) {\n throw new Error(\"Clipboard data is too large to paste\");\n }\n const records: string[][] = [[]];\n let field = \"\";\n let quoted = false;\n let endedWithRecordSeparator = false;\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index]!;\n if (quoted) {\n if (character === '\"') {\n if (input[index + 1] === '\"') {\n field += '\"';\n index += 1;\n } else {\n quoted = false;\n }\n } else {\n field += character;\n }\n endedWithRecordSeparator = false;\n continue;\n }\n if (character === '\"' && field.length === 0) {\n quoted = true;\n endedWithRecordSeparator = false;\n } else if (character === \"\\t\") {\n records.at(-1)!.push(field);\n field = \"\";\n endedWithRecordSeparator = false;\n } else if (character === \"\\r\" || character === \"\\n\") {\n records.at(-1)!.push(field);\n field = \"\";\n records.push([]);\n if (character === \"\\r\" && input[index + 1] === \"\\n\") index += 1;\n endedWithRecordSeparator = true;\n } else {\n field += character;\n endedWithRecordSeparator = false;\n }\n }\n if (quoted) throw new Error(\"Clipboard data contains an unterminated quoted cell\");\n if (endedWithRecordSeparator) records.pop();\n else records.at(-1)!.push(field);\n if (records.length === 0) records.push([\"\"]);\n const columns = Math.max(1, ...records.map((record) => record.length));\n const cellCount = records.length * columns;\n if (cellCount > MAX_CLIPBOARD_CELLS) {\n throw new Error(\"Clipboard range is too large to paste\");\n }\n const inputs = records.flatMap((record) => [\n ...record,\n ...Array.from({ length: columns - record.length }, () => \"\"),\n ]);\n return Object.freeze({ rows: records.length, columns, inputs: Object.freeze(inputs) });\n}\n\nfunction escapeSpreadsheetClipboardField(input: string): string {\n return /[\"\\t\\r\\n]/u.test(input) ? `\"${input.replaceAll('\"', '\"\"')}\"` : input;\n}\n\nfunction cellStyle(format: SpreadsheetCanvasCellFormat): CSSProperties {\n return {\n background: format.fill,\n color: format.font?.color,\n fontFamily: format.font?.name,\n fontSize: format.font?.size,\n fontWeight: format.font?.bold ? 600 : undefined,\n fontStyle: format.font?.italic ? \"italic\" : undefined,\n textDecoration: format.font?.underline ? \"underline\" : undefined,\n textAlign: format.horizontalAlignment,\n justifyContent:\n format.horizontalAlignment === \"center\"\n ? \"center\"\n : format.horizontalAlignment === \"right\"\n ? \"flex-end\"\n : \"flex-start\",\n alignItems:\n format.verticalAlignment === \"top\"\n ? \"flex-start\"\n : format.verticalAlignment === \"bottom\"\n ? \"flex-end\"\n : \"center\",\n whiteSpace: format.wrapText ? \"normal\" : \"nowrap\",\n };\n}\n\nfunction canvasAxis(axis: AxisGeometry): SpreadsheetCanvasAxis {\n return {\n count: axis.count,\n total: axis.total,\n offsetAt: (index) => axisOffsetAt(axis, index),\n sizeAt: (index) => axisSizeAt(axis, index),\n indexAtOffset: (offset) => indexAtOffset(axis, offset),\n };\n}\n\nfunction computedToken(style: CSSStyleDeclaration, name: string, fallback: string): string {\n return style.getPropertyValue(name).trim() || fallback;\n}\n\nfunction computedPixels(style: CSSStyleDeclaration, name: string, fallback: number): number {\n const value = Number.parseFloat(style.getPropertyValue(name));\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction spreadsheetCanvasTheme(element: HTMLElement): SpreadsheetCanvasTheme {\n const style = getComputedStyle(element);\n const background =\n style.backgroundColor || computedToken(style, \"--og-color-surface-1\", \"#ffffff\");\n const headerBackground = computedToken(style, \"--og-color-surface-2\", \"#f3f4f6\");\n const border = computedToken(style, \"--og-color-border\", \"#d1d5db\");\n const foreground = style.color || computedToken(style, \"--og-color-fg\", \"#111827\");\n const mutedForeground = computedToken(style, \"--og-color-fg-muted\", \"#6b7280\");\n const accent = computedToken(style, \"--og-color-accent\", \"#3b82f6\");\n const error = computedToken(style, \"--og-color-status-failed\", \"#dc2626\");\n const fontFamily =\n style.fontFamily ||\n computedToken(\n style,\n \"--og-font-sans\",\n 'Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n );\n const fontSize =\n Number.parseFloat(style.fontSize) || computedPixels(style, \"--og-font-size-sm\", 12);\n const headerFontSize = computedPixels(style, \"--og-font-size-xs\", 11);\n return {\n background,\n headerBackground,\n border,\n foreground,\n mutedForeground,\n accent,\n error,\n fontFamily,\n fontSize,\n headerFontSize,\n signature: [\n background,\n headerBackground,\n border,\n foreground,\n mutedForeground,\n accent,\n error,\n fontFamily,\n fontSize,\n headerFontSize,\n ].join(\"\\u001f\"),\n };\n}\n\nfunction useWorkbookViewState(workbook: Workbook): WorkbookViewState {\n const [view, setView] = useState<WorkbookViewState>(() => ({\n revision: workbook.revision,\n dimensionRevision: 0,\n }));\n\n useEffect(() => {\n setView((current) =>\n current.revision === workbook.revision\n ? current\n : { revision: workbook.revision, dimensionRevision: current.dimensionRevision + 1 },\n );\n return workbook.onChange((change: WorkbookChange) => {\n setView((current) => ({\n revision: change.revision,\n dimensionRevision:\n change.reason === \"dimension\" || change.reason === \"structure\"\n ? current.dimensionRevision + 1\n : current.dimensionRevision,\n }));\n });\n }, [workbook]);\n\n return view;\n}\n\nfunction nextAvailableSheetName(workbook: Workbook): string {\n let index = workbook.worksheets.items.length + 1;\n while (workbook.worksheets.items.some((sheet) => sheet.name === `Sheet${index}`)) index += 1;\n return `Sheet${index}`;\n}\n\n/** A reusable workbook shell with first-class sheet switching. */\nexport function SpreadsheetArtifactSurface({\n workbook,\n title = \"Workbook\",\n subtitle,\n actions,\n initialSheetId,\n allowAddSheet = true,\n readOnly = false,\n ...gridProps\n}: SpreadsheetArtifactSurfaceProps) {\n const { revision } = useWorkbookViewState(workbook);\n const availableSheets = workbook.worksheets.items;\n const initial =\n (initialSheetId ? availableSheets.find((sheet) => sheet.id === initialSheetId) : undefined) ??\n (() => {\n try {\n return workbook.worksheets.getActiveWorksheet();\n } catch {\n return availableSheets[0];\n }\n })();\n const [activeSheetId, setActiveSheetId] = useState<string | null>(initial?.id ?? null);\n const activeSheet =\n availableSheets.find((sheet) => sheet.id === activeSheetId) ?? availableSheets[0] ?? null;\n\n useEffect(() => {\n if (!activeSheet && activeSheetId !== null) setActiveSheetId(null);\n else if (activeSheet && activeSheet.id !== activeSheetId) setActiveSheetId(activeSheet.id);\n }, [activeSheet, activeSheetId, revision]);\n\n const selectSheet = useCallback(\n (sheet: Worksheet) => {\n workbook.worksheets.setActiveWorksheet(sheet);\n setActiveSheetId(sheet.id);\n },\n [workbook],\n );\n\n const addSheet = useCallback(() => {\n const sheet = workbook.worksheets.add(nextAvailableSheetName(workbook));\n selectSheet(sheet);\n }, [selectSheet, workbook]);\n\n const footer = (\n <div\n className=\"flex min-h-9 items-center gap-1 overflow-x-auto px-2\"\n role=\"tablist\"\n aria-label=\"Worksheets\"\n >\n {availableSheets.map((sheet) => (\n <button\n key={sheet.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={sheet.id === activeSheet?.id}\n onClick={() => selectSheet(sheet)}\n className={cn(\n \"h-7 shrink-0 rounded-og-sm px-2.5 text-og-sm transition-colors\",\n sheet.id === activeSheet?.id\n ? \"bg-og-surface-3 font-medium text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg\",\n )}\n >\n {sheet.name}\n </button>\n ))}\n {!readOnly && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={addSheet}\n aria-label=\"Add worksheet\"\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg [&>svg]:size-3.5\"\n >\n <PlusIcon />\n </button>\n ) : null}\n </div>\n );\n\n return (\n <ArtifactSurface\n modality=\"spreadsheet\"\n title={title}\n subtitle={\n subtitle ??\n (activeSheet\n ? `${availableSheets.length} sheet${availableSheets.length === 1 ? \"\" : \"s\"}`\n : \"Empty workbook\")\n }\n actions={actions}\n footer={footer}\n >\n {activeSheet ? (\n <SpreadsheetGrid\n key={activeSheet.id}\n {...gridProps}\n workbook={workbook}\n worksheet={activeSheet}\n readOnly={readOnly}\n />\n ) : (\n <div\n className=\"grid h-full place-items-center bg-og-bg p-6 text-center\"\n style={{ minHeight: 224 }}\n >\n <div>\n <p className=\"text-og-base font-medium text-og-fg\">This workbook has no worksheets.</p>\n {!readOnly && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={addSheet}\n className=\"mt-3 rounded-og-sm bg-og-accent-deep px-3 py-1.5 text-og-sm font-medium text-og-accent-fg\"\n >\n Add worksheet\n </button>\n ) : null}\n </div>\n </div>\n )}\n </ArtifactSurface>\n );\n}\n\nexport function SpreadsheetGrid({\n workbook,\n worksheet,\n readOnly = false,\n rowCount: requestedRowCount,\n columnCount: requestedColumnCount,\n overscanRows = 3,\n overscanColumns = 2,\n onSelectionChange,\n onCommit,\n onViewportChange,\n className,\n}: SpreadsheetGridProps) {\n const { revision, dimensionRevision } = useWorkbookViewState(workbook);\n const boundedProjection = requestedRowCount !== undefined || requestedColumnCount !== undefined;\n const usedRange = useMemo(() => {\n void revision;\n return boundedProjection ? worksheet.usedRangeAddress() : null;\n }, [boundedProjection, revision, worksheet]);\n const rowCount = boundedInteger(\n Math.max(\n requestedRowCount ?? MAX_ROWS,\n (usedRange?.row ?? 0) + (usedRange?.rowCount ?? 0) + 32,\n ),\n MAX_ROWS,\n MAX_ROWS,\n );\n const columnCount = boundedInteger(\n Math.max(\n requestedColumnCount ?? MAX_COLUMNS,\n (usedRange?.col ?? 0) + (usedRange?.colCount ?? 0) + 8,\n ),\n MAX_COLUMNS,\n MAX_COLUMNS,\n );\n const rowHeights = useMemo(() => {\n void dimensionRevision;\n return [...worksheet.rowHeightEntries()] as const;\n }, [dimensionRevision, worksheet]);\n const columnWidths = useMemo(() => {\n void dimensionRevision;\n return [...worksheet.columnWidthEntries()] as const;\n }, [dimensionRevision, worksheet]);\n const projection = useMemo<SpreadsheetGridProjection>(() => {\n void dimensionRevision;\n const cells = new SparseSpreadsheetCellIndex(\n (function* projectedCells() {\n for (const { row, col, data } of worksheet.cellEntries()) {\n yield {\n row,\n col,\n value: data.value,\n formula: data.formula,\n format: data.format,\n };\n }\n })(),\n );\n return {\n sheetId: worksheet.id,\n sheetName: worksheet.name,\n generationId: worksheet.id,\n revision,\n dimensionRevision,\n rowCount,\n columnCount,\n defaultRowHeight: worksheet.defaultRowHeight,\n defaultColumnWidth: worksheet.defaultColumnWidth,\n rowHeights,\n columnWidths,\n usedRange,\n cells,\n valueAt: (cell) =>\n cell.formula ? workbook.valueAt(worksheet, { row: cell.row, col: cell.col }) : cell.value,\n readCell: (row, col) => {\n const data = worksheet.cellData(row, col);\n return {\n value: data.formula ? workbook.valueAt(worksheet, { row, col }) : data.value,\n input: data.formula ?? displayValue(data.value),\n format: data.format,\n };\n },\n };\n }, [\n columnCount,\n columnWidths,\n dimensionRevision,\n revision,\n rowCount,\n rowHeights,\n usedRange,\n workbook,\n worksheet,\n ]);\n const commit = useCallback(\n (next: SpreadsheetCommit) => {\n const target = worksheet.getCell(next.cell.row, next.cell.col);\n if (next.kind === \"formula\") target.formulas = [[next.input]];\n else target.values = [[parseCellInput(next.input)]];\n onCommit?.(next);\n },\n [onCommit, worksheet],\n );\n const commitRange = useCallback(\n (next: SpreadsheetRangeCommit) => {\n if (next.rows * next.columns !== next.inputs.length) {\n throw new Error(\"Spreadsheet paste shape is invalid\");\n }\n workbook.transact(() => {\n for (let index = 0; index < next.inputs.length; index += 1) {\n const input = next.inputs[index]!;\n const row = next.anchor.row + Math.floor(index / next.columns);\n const col = next.anchor.col + (index % next.columns);\n worksheet.setCell(\n row,\n col,\n input.startsWith(\"=\")\n ? { formula: input, value: null }\n : { formula: null, value: parseCellInput(input) },\n \"content\",\n );\n }\n });\n },\n [workbook, worksheet],\n );\n const clear = useCallback(\n (next: SpreadsheetSelection) => {\n const normalized = normalizeSelection(next);\n worksheet\n .getRangeByIndexes(\n normalized.top,\n normalized.left,\n normalized.bottom - normalized.top + 1,\n normalized.right - normalized.left + 1,\n )\n .clear({ applyTo: \"contents\" });\n },\n [worksheet],\n );\n\n return (\n <SpreadsheetProjectionGrid\n projection={projection}\n readOnly={readOnly}\n overscanRows={overscanRows}\n overscanColumns={overscanColumns}\n onSelectionChange={onSelectionChange}\n commit={commit}\n commitRange={commitRange}\n clear={clear}\n onViewportChange={onViewportChange}\n className={className}\n />\n );\n}\n\n/**\n * Two-axis virtualized, accessible spreadsheet projection. The caller owns\n * durable model state; React owns only viewport, selection, and edit state.\n */\nexport function SpreadsheetProjectionGrid({\n projection,\n readOnly = false,\n overscanRows = 3,\n overscanColumns = 2,\n onSelectionChange,\n commit,\n commitRange,\n clear,\n onCommandError,\n onViewportChange,\n className,\n}: SpreadsheetProjectionGridProps) {\n const { revision, rowCount, columnCount } = projection;\n const dimensionRevision = projection.dimensionRevision ?? 0;\n const editable = !readOnly && commit !== undefined;\n const rows = useMemo(() => {\n void dimensionRevision;\n return buildAxis(rowCount, projection.defaultRowHeight ?? 24, projection.rowHeights ?? []);\n }, [dimensionRevision, projection.defaultRowHeight, projection.rowHeights, rowCount]);\n const columns = useMemo(() => {\n void dimensionRevision;\n return buildAxis(\n columnCount,\n projection.defaultColumnWidth ?? 96,\n projection.columnWidths ?? [],\n );\n }, [columnCount, dimensionRevision, projection.columnWidths, projection.defaultColumnWidth]);\n const canvasRows = useMemo(() => canvasAxis(rows), [rows]);\n const canvasColumns = useMemo(() => canvasAxis(columns), [columns]);\n const [selection, setSelection] = useState<SpreadsheetSelection>(() => ({\n sheetId: projection.sheetId,\n anchor: { row: 0, col: 0 },\n focus: { row: 0, col: 0 },\n }));\n const [editMode, setEditMode] = useState<\"cell\" | \"formula\" | null>(null);\n const [draft, setDraft] = useState(\n () => projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\",\n );\n const [pendingCommands, setPendingCommands] = useState(0);\n const [commandFailure, setCommandFailure] = useState<{\n message: string;\n retry?: (() => void) | undefined;\n } | null>(null);\n const [viewport, setViewport] = useState<ViewportState>({\n width: FALLBACK_VIEWPORT_WIDTH,\n height: FALLBACK_VIEWPORT_HEIGHT,\n scrollLeft: 0,\n scrollTop: 0,\n devicePixelRatio: 1,\n });\n const [canvasReady, setCanvasReady] = useState(false);\n const [canvasEpoch, setCanvasEpoch] = useState(0);\n const viewportRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const editorRef = useRef<HTMLInputElement>(null);\n const selectionRef = useRef(selection);\n const selectingRef = useRef<SelectingState | null>(null);\n const committingRef = useRef(false);\n const composingRef = useRef(false);\n const commitAfterCompositionRef = useRef(false);\n const selectDraftOnFocusRef = useRef(true);\n const initialDraftRef = useRef(draft);\n const optimisticInputRef = useRef<{\n sheetId: string;\n row: number;\n col: number;\n input: string;\n baseRevision: string | number;\n } | null>(null);\n const mountedRef = useRef(true);\n const commandScopeRef = useRef(0);\n const latestCommandRef = useRef(0);\n const canvasRendererRef = useRef<SpreadsheetCanvasRenderer | null>(null);\n if (!canvasRendererRef.current) canvasRendererRef.current = new SpreadsheetCanvasRenderer();\n const reactId = useId().replaceAll(\":\", \"\");\n\n const updateSelection = useCallback(\n (next: SpreadsheetSelection) => {\n selectionRef.current = next;\n setSelection(next);\n onSelectionChange?.(next);\n },\n [onSelectionChange],\n );\n\n useEffect(() => {\n if (selection.sheetId === projection.sheetId) return;\n commandScopeRef.current += 1;\n latestCommandRef.current += 1;\n const next = {\n sheetId: projection.sheetId,\n anchor: { row: 0, col: 0 },\n focus: { row: 0, col: 0 },\n };\n optimisticInputRef.current = null;\n setPendingCommands(0);\n setCommandFailure(null);\n setEditMode(null);\n updateSelection(next);\n }, [projection.sheetId, selection.sheetId, updateSelection]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n commandScopeRef.current += 1;\n latestCommandRef.current += 1;\n };\n }, []);\n\n useEffect(() => {\n if (editMode !== null) return;\n const optimistic = optimisticInputRef.current;\n if (\n optimistic?.sheetId === projection.sheetId &&\n optimistic.row === selection.focus.row &&\n optimistic.col === selection.focus.col &&\n optimistic.baseRevision === revision\n ) {\n setDraft(optimistic.input);\n return;\n }\n if (optimistic && optimistic.baseRevision !== revision) optimisticInputRef.current = null;\n setDraft(projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\");\n }, [editMode, projection, revision, selection.focus.col, selection.focus.row]);\n\n useClientLayoutEffect(() => {\n const element = viewportRef.current;\n if (!element) return;\n const measure = () => {\n setViewport((current) => ({\n ...current,\n width: element.clientWidth || FALLBACK_VIEWPORT_WIDTH,\n height: element.clientHeight || FALLBACK_VIEWPORT_HEIGHT,\n devicePixelRatio: spreadsheetCanvasDevicePixelRatio(globalThis.devicePixelRatio || 1),\n }));\n };\n measure();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n observer?.observe(element);\n globalThis.addEventListener?.(\"resize\", measure);\n return () => {\n observer?.disconnect();\n globalThis.removeEventListener?.(\"resize\", measure);\n };\n }, []);\n\n useEffect(() => {\n return () => canvasRendererRef.current?.dispose();\n }, []);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n let active = true;\n void document.fonts?.ready.then(() => {\n if (active) setCanvasEpoch((value) => value + 1);\n });\n if (typeof MutationObserver === \"undefined\") {\n return () => {\n active = false;\n };\n }\n const observer = new MutationObserver(() => setCanvasEpoch((value) => value + 1));\n let ancestor: HTMLElement | null = viewportRef.current;\n while (ancestor) {\n observer.observe(ancestor, {\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"data-og-theme\", \"data-og-density\"],\n });\n ancestor = ancestor.parentElement;\n }\n return () => {\n active = false;\n observer.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (editMode !== \"cell\") return;\n const editor = editorRef.current;\n editor?.focus();\n if (!editor) return;\n if (selectDraftOnFocusRef.current) editor.select();\n else editor.setSelectionRange(editor.value.length, editor.value.length);\n }, [editMode]);\n\n const ensureVisible = useCallback(\n (cell: CellCoordinate) => {\n const element = viewportRef.current;\n if (!element) return;\n const viewportWidth = element.clientWidth || FALLBACK_VIEWPORT_WIDTH;\n const viewportHeight = element.clientHeight || FALLBACK_VIEWPORT_HEIGHT;\n const horizontalProjection = buildScrollProjection(columns, ROW_HEADER_WIDTH, viewportWidth);\n const verticalProjection = buildScrollProjection(rows, COLUMN_HEADER_HEIGHT, viewportHeight);\n const left = ROW_HEADER_WIDTH + axisOffsetAt(columns, cell.col);\n const right = left + axisSizeAt(columns, cell.col);\n const top = COLUMN_HEADER_HEIGHT + axisOffsetAt(rows, cell.row);\n const bottom = top + axisSizeAt(rows, cell.row);\n const logicalScrollLeft = physicalToLogicalScroll(element.scrollLeft, horizontalProjection);\n const logicalScrollTop = physicalToLogicalScroll(element.scrollTop, verticalProjection);\n const viewportLeft = logicalScrollLeft + ROW_HEADER_WIDTH;\n const viewportRight = logicalScrollLeft + viewportWidth;\n const viewportTop = logicalScrollTop + COLUMN_HEADER_HEIGHT;\n const viewportBottom = logicalScrollTop + viewportHeight;\n if (left < viewportLeft) {\n element.scrollLeft = logicalToPhysicalScroll(\n Math.max(0, left - ROW_HEADER_WIDTH),\n horizontalProjection,\n );\n } else if (right > viewportRight) {\n element.scrollLeft = logicalToPhysicalScroll(right - viewportWidth, horizontalProjection);\n }\n if (top < viewportTop) {\n element.scrollTop = logicalToPhysicalScroll(\n Math.max(0, top - COLUMN_HEADER_HEIGHT),\n verticalProjection,\n );\n } else if (bottom > viewportBottom) {\n element.scrollTop = logicalToPhysicalScroll(bottom - viewportHeight, verticalProjection);\n }\n },\n [columns, rows],\n );\n\n const moveSelection = useCallback(\n (rowDelta: number, colDelta: number, extend: boolean) => {\n const focus = {\n row: Math.max(0, Math.min(rowCount - 1, selection.focus.row + rowDelta)),\n col: Math.max(0, Math.min(columnCount - 1, selection.focus.col + colDelta)),\n };\n const next = {\n sheetId: projection.sheetId,\n anchor: extend ? selection.anchor : focus,\n focus,\n };\n updateSelection(next);\n ensureVisible(focus);\n },\n [columnCount, ensureVisible, projection.sheetId, rowCount, selection, updateSelection],\n );\n\n const runCommand = useCallback(\n (invoke: () => void | Promise<void>, retry: () => void, rollback: () => void) => {\n const commandId = latestCommandRef.current + 1;\n latestCommandRef.current = commandId;\n const scope = commandScopeRef.current;\n setCommandFailure(null);\n const fail = (cause: unknown) => {\n if (\n !mountedRef.current ||\n commandScopeRef.current !== scope ||\n latestCommandRef.current !== commandId\n ) {\n return;\n }\n const error = cause instanceof Error ? cause : new Error(String(cause));\n rollback();\n setCommandFailure({ message: error.message || \"Spreadsheet change failed\", retry });\n onCommandError?.(error);\n };\n let result: void | Promise<void>;\n try {\n result = invoke();\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 [onCommandError],\n );\n\n const reportCommandFailure = useCallback(\n (cause: unknown) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setCommandFailure({ message: error.message || \"Spreadsheet action failed\" });\n onCommandError?.(error);\n },\n [onCommandError],\n );\n\n const commitDraft = useCallback(\n (input = draft) => {\n if (committingRef.current) return;\n committingRef.current = true;\n if (!editable || !commit) {\n setEditMode(null);\n queueMicrotask(() => {\n committingRef.current = false;\n });\n return;\n }\n if (input === initialDraftRef.current) {\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n return;\n }\n const next = {\n sheetId: projection.sheetId,\n cell: { ...selection.focus },\n input,\n kind: input.startsWith(\"=\") ? \"formula\" : \"value\",\n } satisfies SpreadsheetCommit;\n const execute = () => {\n optimisticInputRef.current = {\n sheetId: projection.sheetId,\n row: selection.focus.row,\n col: selection.focus.col,\n input,\n baseRevision: revision,\n };\n setDraft(input);\n runCommand(\n () => commit(next),\n execute,\n () => {\n optimisticInputRef.current = null;\n const current = selectionRef.current.focus;\n setDraft(projection.readCell(current.row, current.col)?.input ?? \"\");\n },\n );\n };\n execute();\n initialDraftRef.current = input;\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n },\n [commit, draft, editable, projection, revision, runCommand, selection.focus],\n );\n\n const clearSelection = useCallback(() => {\n if (!editable || !clear) return;\n const current = selection;\n const execute = () =>\n runCommand(\n () => clear(current),\n execute,\n () => {},\n );\n execute();\n }, [clear, editable, runCommand, selection]);\n\n const pasteClipboard = useCallback(\n (event: ReactClipboardEvent<HTMLDivElement>) => {\n if (!editable || editMode !== null) return;\n const clipboardText = event.clipboardData.getData(\"text/plain\");\n if (!clipboardText && !event.clipboardData.types.includes(\"text/plain\")) return;\n event.preventDefault();\n const execute = () => {\n const previousSelection = selectionRef.current;\n const invoke = () => {\n const parsed = parseSpreadsheetClipboard(clipboardText);\n const anchor = previousSelection.focus;\n if (anchor.row + parsed.rows > rowCount || anchor.col + parsed.columns > columnCount) {\n throw new Error(\"Clipboard range does not fit in this worksheet\");\n }\n if (!commitRange && parsed.inputs.length !== 1) {\n throw new Error(\"This spreadsheet adapter does not support rectangular paste\");\n }\n const bottomRight = {\n row: anchor.row + parsed.rows - 1,\n col: anchor.col + parsed.columns - 1,\n };\n updateSelection({\n sheetId: projection.sheetId,\n anchor: { ...anchor },\n focus: bottomRight,\n });\n ensureVisible(bottomRight);\n if (commitRange) {\n return commitRange({\n sheetId: projection.sheetId,\n anchor: { ...anchor },\n rows: parsed.rows,\n columns: parsed.columns,\n inputs: parsed.inputs,\n });\n }\n const input = parsed.inputs[0]!;\n return commit!({\n sheetId: projection.sheetId,\n cell: { ...anchor },\n input,\n kind: input.startsWith(\"=\") ? \"formula\" : \"value\",\n });\n };\n runCommand(invoke, execute, () => updateSelection(previousSelection));\n };\n execute();\n },\n [\n columnCount,\n commit,\n commitRange,\n editMode,\n editable,\n ensureVisible,\n projection.sheetId,\n rowCount,\n runCommand,\n updateSelection,\n ],\n );\n\n const copySelection = useCallback(\n (event: ReactClipboardEvent<HTMLDivElement>) => {\n if (editMode !== null) return;\n const selected = normalizeSelection(selectionRef.current);\n const rowsToCopy = selected.bottom - selected.top + 1;\n const columnsToCopy = selected.right - selected.left + 1;\n if (rowsToCopy * columnsToCopy > MAX_CLIPBOARD_CELLS) {\n event.preventDefault();\n reportCommandFailure(new Error(\"Selected range is too large to copy\"));\n return;\n }\n const coverage = projection.coverage;\n if (\n coverage &&\n (selected.top < coverage.rowStart ||\n selected.bottom >= coverage.rowEnd ||\n selected.left < coverage.columnStart ||\n selected.right >= coverage.columnEnd)\n ) {\n event.preventDefault();\n reportCommandFailure(new Error(\"Selected cells are still loading; copy again when ready\"));\n return;\n }\n const output: string[] = [];\n for (let row = selected.top; row <= selected.bottom; row += 1) {\n const fields: string[] = [];\n for (let col = selected.left; col <= selected.right; col += 1) {\n fields.push(escapeSpreadsheetClipboardField(projection.readCell(row, col)?.input ?? \"\"));\n }\n output.push(fields.join(\"\\t\"));\n }\n event.clipboardData.setData(\"text/plain\", output.join(\"\\r\\n\"));\n event.preventDefault();\n setCommandFailure(null);\n },\n [editMode, projection, reportCommandFailure],\n );\n\n const beginEditing = useCallback(\n (initial?: string, cell: CellCoordinate = selectionRef.current.focus) => {\n if (!editable) return;\n ensureVisible(cell);\n const current = projection.readCell(cell.row, cell.col)?.input ?? \"\";\n initialDraftRef.current = current;\n selectDraftOnFocusRef.current = initial === undefined;\n setDraft(initial ?? current);\n setEditMode(\"cell\");\n },\n [editable, ensureVisible, projection],\n );\n\n const onGridKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (editMode !== null) return;\n if (event.nativeEvent.isComposing || event.nativeEvent.keyCode === 229) return;\n switch (event.key) {\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection(-1, 0, event.shiftKey);\n return;\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection(1, 0, event.shiftKey);\n return;\n case \"ArrowLeft\":\n event.preventDefault();\n moveSelection(0, -1, event.shiftKey);\n return;\n case \"ArrowRight\":\n event.preventDefault();\n moveSelection(0, 1, event.shiftKey);\n return;\n case \"Tab\":\n event.preventDefault();\n moveSelection(0, event.shiftKey ? -1 : 1, false);\n return;\n case \"Enter\":\n case \"F2\":\n event.preventDefault();\n beginEditing();\n return;\n case \"Backspace\":\n case \"Delete\":\n event.preventDefault();\n clearSelection();\n return;\n case \"Home\": {\n event.preventDefault();\n const target =\n event.metaKey || event.ctrlKey\n ? { row: 0, col: 0 }\n : { row: selection.focus.row, col: 0 };\n updateSelection({ sheetId: projection.sheetId, anchor: target, focus: target });\n ensureVisible(target);\n return;\n }\n case \"End\": {\n event.preventDefault();\n const used = projection.usedRange;\n const target =\n event.metaKey || event.ctrlKey\n ? {\n row: Math.min(rowCount - 1, (used?.row ?? 0) + (used?.rowCount ?? 1) - 1),\n col: Math.min(columnCount - 1, (used?.col ?? 0) + (used?.colCount ?? 1) - 1),\n }\n : { row: selection.focus.row, col: columnCount - 1 };\n updateSelection({ sheetId: projection.sheetId, anchor: target, focus: target });\n ensureVisible(target);\n return;\n }\n }\n if (editable && !event.metaKey && !event.ctrlKey && !event.altKey && event.key.length === 1) {\n event.preventDefault();\n beginEditing(event.key);\n }\n },\n [\n beginEditing,\n clearSelection,\n columnCount,\n editMode,\n ensureVisible,\n moveSelection,\n editable,\n rowCount,\n selection.focus.row,\n updateSelection,\n projection.sheetId,\n projection.usedRange,\n ],\n );\n\n const onEditorKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (composingRef.current || event.nativeEvent.isComposing) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n commitDraft();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n committingRef.current = true;\n setDraft(projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\");\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n }\n },\n [commitDraft, projection, selection.focus.col, selection.focus.row],\n );\n\n const onEditorCompositionStart = useCallback(() => {\n composingRef.current = true;\n }, []);\n\n const onEditorCompositionEnd = useCallback(\n (input: string) => {\n composingRef.current = false;\n if (!commitAfterCompositionRef.current) return;\n commitAfterCompositionRef.current = false;\n commitDraft(input);\n },\n [commitDraft],\n );\n\n const commitEditorOnBlur = useCallback(\n (mode: \"cell\" | \"formula\", input: string) => {\n if (editMode !== mode) return;\n if (composingRef.current) {\n commitAfterCompositionRef.current = true;\n return;\n }\n commitDraft(input);\n },\n [commitDraft, editMode],\n );\n\n const selectCell = useCallback(\n (cell: CellCoordinate, extend: boolean) => {\n const current = selectionRef.current;\n const next = {\n sheetId: projection.sheetId,\n anchor: extend ? current.anchor : cell,\n focus: cell,\n };\n updateSelection(next);\n setEditMode(null);\n viewportRef.current?.focus();\n },\n [projection.sheetId, updateSelection],\n );\n\n const hitTestCell = useCallback(\n (clientX: number, clientY: number): CellCoordinate | null => {\n const element = viewportRef.current;\n if (!element) return null;\n const bounds = element.getBoundingClientRect();\n const viewportX = clientX - bounds.left;\n const viewportY = clientY - bounds.top;\n const viewportWidth = element.clientWidth || FALLBACK_VIEWPORT_WIDTH;\n const viewportHeight = element.clientHeight || FALLBACK_VIEWPORT_HEIGHT;\n if (\n viewportX < ROW_HEADER_WIDTH ||\n viewportY < COLUMN_HEADER_HEIGHT ||\n viewportX >= viewportWidth ||\n viewportY >= viewportHeight\n ) {\n return null;\n }\n const horizontalProjection = buildScrollProjection(columns, ROW_HEADER_WIDTH, viewportWidth);\n const verticalProjection = buildScrollProjection(rows, COLUMN_HEADER_HEIGHT, viewportHeight);\n const logicalX =\n physicalToLogicalScroll(element.scrollLeft, horizontalProjection) +\n viewportX -\n ROW_HEADER_WIDTH;\n const logicalY =\n physicalToLogicalScroll(element.scrollTop, verticalProjection) +\n viewportY -\n COLUMN_HEADER_HEIGHT;\n if (logicalX < 0 || logicalY < 0 || logicalX >= columns.total || logicalY >= rows.total) {\n return null;\n }\n return {\n row: Math.min(rowCount - 1, indexAtOffset(rows, logicalY)),\n col: Math.min(columnCount - 1, indexAtOffset(columns, logicalX)),\n };\n },\n [columnCount, columns, rowCount, rows],\n );\n\n const onGridPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return;\n const cell = hitTestCell(event.clientX, event.clientY);\n if (!cell) return;\n event.preventDefault();\n const current = selectionRef.current;\n const anchor = event.shiftKey ? current.anchor : cell;\n selectingRef.current = { pointerId: event.pointerId, anchor };\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n // Synthetic test DOMs and old WebKit builds may not expose pointer capture.\n }\n updateSelection({ sheetId: projection.sheetId, anchor, focus: cell });\n setEditMode(null);\n event.currentTarget.focus();\n },\n [hitTestCell, projection.sheetId, updateSelection],\n );\n\n const onGridPointerMove = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n const selecting = selectingRef.current;\n if (!selecting || selecting.pointerId !== event.pointerId) return;\n const cell = hitTestCell(event.clientX, event.clientY);\n if (!cell) return;\n const current = selectionRef.current;\n if (current.focus.row === cell.row && current.focus.col === cell.col) return;\n updateSelection({ sheetId: projection.sheetId, anchor: selecting.anchor, focus: cell });\n },\n [hitTestCell, projection.sheetId, updateSelection],\n );\n\n const stopPointerSelection = useCallback((pointerId?: number) => {\n if (pointerId !== undefined && selectingRef.current?.pointerId !== pointerId) return;\n selectingRef.current = null;\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const stopSelecting = () => stopPointerSelection();\n window.addEventListener(\"pointerup\", stopSelecting);\n return () => window.removeEventListener(\"pointerup\", stopSelecting);\n }, [stopPointerSelection]);\n\n const horizontalProjection = buildScrollProjection(columns, ROW_HEADER_WIDTH, viewport.width);\n const verticalProjection = buildScrollProjection(rows, COLUMN_HEADER_HEIGHT, viewport.height);\n const physicalScrollLeft = clampPhysicalScroll(viewport.scrollLeft, horizontalProjection);\n const physicalScrollTop = clampPhysicalScroll(viewport.scrollTop, verticalProjection);\n const logicalScrollLeft = physicalToLogicalScroll(viewport.scrollLeft, horizontalProjection);\n const logicalScrollTop = physicalToLogicalScroll(viewport.scrollTop, verticalProjection);\n const visibleRowWindow = visibleInterval(\n rows,\n logicalScrollTop,\n Math.max(1, viewport.height - COLUMN_HEADER_HEIGHT),\n 0,\n );\n const visibleColumnWindow = visibleInterval(\n columns,\n logicalScrollLeft,\n Math.max(1, viewport.width - ROW_HEADER_WIDTH),\n 0,\n );\n const projectedRowWindow = visibleInterval(\n rows,\n logicalScrollTop,\n Math.max(1, viewport.height - COLUMN_HEADER_HEIGHT),\n Math.max(0, overscanRows),\n );\n const projectedColumnWindow = visibleInterval(\n columns,\n logicalScrollLeft,\n Math.max(1, viewport.width - ROW_HEADER_WIDTH),\n Math.max(0, overscanColumns),\n );\n const { rows: rowWindow, columns: columnWindow } = boundVisibleWindows(\n projectedRowWindow,\n projectedColumnWindow,\n selection.focus,\n );\n const visibleRows = indexesBetween(rowWindow.start, rowWindow.end);\n const visibleColumns = indexesBetween(columnWindow.start, columnWindow.end);\n const rowLayout = visibleRows.map((row) => ({\n row,\n top: physicalScrollTop + COLUMN_HEADER_HEIGHT + axisOffsetAt(rows, row) - logicalScrollTop,\n height: axisSizeAt(rows, row),\n }));\n const columnLayout = visibleColumns.map((col) => ({\n col,\n left: physicalScrollLeft + ROW_HEADER_WIDTH + axisOffsetAt(columns, col) - logicalScrollLeft,\n width: axisSizeAt(columns, col),\n }));\n const activeCellVisible =\n selection.focus.row >= rowWindow.start &&\n selection.focus.row < rowWindow.end &&\n selection.focus.col >= columnWindow.start &&\n selection.focus.col < columnWindow.end;\n const activeCellId = `${reactId}-cell-${selection.focus.row}-${selection.focus.col}`;\n const hiddenActiveValue = activeCellVisible\n ? null\n : projection.readCell(selection.focus.row, selection.focus.col)?.value;\n\n useEffect(() => {\n if (!onViewportChange) return;\n const next: SpreadsheetViewport = {\n sheetId: projection.sheetId,\n rowStart: visibleRowWindow.start,\n rowEnd: visibleRowWindow.end,\n columnStart: visibleColumnWindow.start,\n columnEnd: visibleColumnWindow.end,\n overscanRowStart: projectedRowWindow.start,\n overscanRowEnd: projectedRowWindow.end,\n overscanColumnStart: projectedColumnWindow.start,\n overscanColumnEnd: projectedColumnWindow.end,\n logicalScrollLeft,\n logicalScrollTop,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n };\n let active = true;\n const notify = () => {\n if (active) onViewportChange(next);\n };\n if (typeof globalThis.requestAnimationFrame === \"function\") {\n const frame = globalThis.requestAnimationFrame(notify);\n return () => {\n active = false;\n globalThis.cancelAnimationFrame?.(frame);\n };\n }\n queueMicrotask(notify);\n return () => {\n active = false;\n };\n }, [\n logicalScrollLeft,\n logicalScrollTop,\n onViewportChange,\n projectedColumnWindow.end,\n projectedColumnWindow.start,\n projectedRowWindow.end,\n projectedRowWindow.start,\n viewport.height,\n viewport.width,\n visibleColumnWindow.end,\n visibleColumnWindow.start,\n visibleRowWindow.end,\n visibleRowWindow.start,\n projection.sheetId,\n ]);\n\n useClientLayoutEffect(() => {\n void canvasEpoch;\n const canvas = canvasRef.current;\n const viewportElement = viewportRef.current;\n const renderer = canvasRendererRef.current;\n if (!canvas || !viewportElement || !renderer) return;\n const normalized = normalizeSelection(selection);\n const theme = spreadsheetCanvasTheme(viewportElement);\n const paintStartedAt = performance.now();\n const stats = renderer.paint({\n canvas,\n projection,\n rows: canvasRows,\n columns: canvasColumns,\n selection: {\n ...normalized,\n focusRow: selection.focus.row,\n focusColumn: selection.focus.col,\n },\n logicalScrollLeft,\n logicalScrollTop,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n rowHeaderWidth: ROW_HEADER_WIDTH,\n columnHeaderHeight: COLUMN_HEADER_HEIGHT,\n dimensionRevision,\n devicePixelRatio: viewport.devicePixelRatio,\n theme,\n });\n const paintDurationMs = performance.now() - paintStartedAt;\n if (!stats) {\n if (canvasReady) setCanvasReady(false);\n return;\n }\n canvas.dataset.ogTileCacheSize = String(stats.cacheSize);\n canvas.dataset.ogPaintedTiles = String(stats.paintedTiles);\n canvas.dataset.ogReusedTiles = String(stats.reusedTiles);\n canvas.dataset.ogUncachedTiles = String(stats.uncachedTiles);\n canvas.dataset.ogDevicePixelRatio = String(stats.devicePixelRatio);\n canvas.dataset.ogLogicalScrollLeft = String(logicalScrollLeft);\n canvas.dataset.ogLogicalScrollTop = String(logicalScrollTop);\n canvas.dataset.ogPaintDurationMs = String(paintDurationMs);\n if (!canvasReady) setCanvasReady(true);\n }, [\n canvasColumns,\n canvasEpoch,\n canvasReady,\n canvasRows,\n dimensionRevision,\n logicalScrollLeft,\n logicalScrollTop,\n projection,\n revision,\n selection,\n viewport.devicePixelRatio,\n viewport.height,\n viewport.width,\n ]);\n\n return (\n <div\n className={cn(\"relative flex h-full min-w-0 flex-col bg-og-bg\", className)}\n data-og-command-state={commandFailure ? \"error\" : pendingCommands > 0 ? \"pending\" : \"idle\"}\n style={{ minHeight: 256 }}\n >\n <div className=\"flex min-h-9 shrink-0 items-center border-b border-og-border bg-og-surface-1\">\n <output\n aria-label=\"Selected range\"\n className=\"shrink-0 border-r border-og-border px-2 font-mono text-og-xs text-og-fg-muted\"\n style={{ width: 96 }}\n >\n {selectionName(selection)}\n </output>\n <span aria-hidden className=\"px-2 font-og-mono text-og-sm italic text-og-fg-subtle\">\n fx\n </span>\n <input\n aria-label=\"Formula or value\"\n readOnly={!editable}\n aria-invalid={commandFailure ? \"true\" : undefined}\n value={draft}\n onFocus={() => {\n if (editable) {\n const current =\n projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\";\n initialDraftRef.current = current;\n setDraft(current);\n setEditMode(\"formula\");\n }\n }}\n onInput={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={onEditorKeyDown}\n onCompositionStart={onEditorCompositionStart}\n onCompositionEnd={(event) => onEditorCompositionEnd(event.currentTarget.value)}\n onBlur={(event) => commitEditorOnBlur(\"formula\", event.currentTarget.value)}\n className=\"h-8 min-w-0 flex-1 bg-transparent px-1 font-mono text-og-sm text-og-fg outline-hidden placeholder:text-og-fg-subtle\"\n />\n </div>\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {commandFailure?.message ?? (pendingCommands > 0 ? \"Saving spreadsheet changes\" : \"\")}\n </div>\n {commandFailure ? (\n <div\n role=\"alert\"\n className=\"absolute bottom-2 left-2 z-50 flex 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 {commandFailure.retry ? (\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 ) : null}\n </div>\n ) : null}\n\n <div\n ref={viewportRef}\n role=\"grid\"\n tabIndex={0}\n aria-label={`${projection.sheetName} spreadsheet`}\n aria-rowcount={rowCount}\n aria-colcount={columnCount}\n aria-multiselectable=\"true\"\n aria-readonly={!editable}\n aria-busy={pendingCommands > 0 ? \"true\" : undefined}\n aria-activedescendant={activeCellId}\n onKeyDown={onGridKeyDown}\n onCopy={copySelection}\n onPaste={pasteClipboard}\n onCompositionEnd={(event) => {\n if (editMode === null && editable && event.data) beginEditing(event.data);\n }}\n onPointerDown={onGridPointerDown}\n onPointerMove={onGridPointerMove}\n onPointerUp={(event) => stopPointerSelection(event.pointerId)}\n onPointerCancel={(event) => stopPointerSelection(event.pointerId)}\n onDoubleClick={(event) => {\n const cell = hitTestCell(event.clientX, event.clientY);\n if (!cell) return;\n selectCell(cell, event.shiftKey);\n beginEditing(undefined, cell);\n }}\n onScroll={(event) => {\n const element = event.currentTarget;\n setViewport((current) => ({\n ...current,\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop,\n }));\n }}\n className=\"relative min-h-0 min-w-0 flex-1 overflow-auto overscroll-contain bg-og-surface-1 text-og-sm outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\"\n >\n <div\n role=\"rowgroup\"\n className=\"relative\"\n style={{\n width: horizontalProjection.physicalTotal,\n height: verticalProjection.physicalTotal,\n }}\n >\n <canvas\n ref={canvasRef}\n aria-hidden=\"true\"\n data-og-spreadsheet-canvas=\"retained-tiles\"\n className=\"pointer-events-none absolute z-0 block\"\n style={{\n left: physicalScrollLeft,\n top: physicalScrollTop,\n width: viewport.width,\n height: viewport.height,\n }}\n />\n <div\n aria-hidden\n className=\"sticky left-0 top-0 z-40 border-b border-r border-og-border bg-og-surface-2\"\n style={{\n width: ROW_HEADER_WIDTH,\n height: COLUMN_HEADER_HEIGHT,\n ...(canvasReady\n ? { background: \"transparent\", borderColor: \"transparent\" }\n : undefined),\n }}\n />\n\n <div role=\"row\" className=\"contents\">\n {columnLayout.map(({ col, left, width }) => (\n <div\n key={`header-${col}`}\n role=\"columnheader\"\n aria-colindex={col + 1}\n className=\"sticky top-0 z-30 grid select-none place-items-center overflow-hidden border-b border-r border-og-border bg-og-surface-2 text-og-xs font-medium text-og-fg-muted\"\n style={{\n position: \"absolute\",\n left,\n top: physicalScrollTop,\n width,\n height: COLUMN_HEADER_HEIGHT,\n ...(canvasReady\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n }}\n >\n {columnName(col)}\n </div>\n ))}\n </div>\n\n {rowLayout.map(({ row, top, height }) => {\n return (\n <div\n key={`row-${row}`}\n role=\"row\"\n aria-rowindex={row + 1}\n className=\"absolute left-0\"\n style={{\n top,\n width: horizontalProjection.physicalTotal,\n height,\n }}\n >\n <div\n role=\"rowheader\"\n className=\"sticky left-0 z-20 grid h-full select-none place-items-center border-b border-r border-og-border bg-og-surface-2 text-og-xs text-og-fg-muted\"\n style={{\n width: ROW_HEADER_WIDTH,\n ...(canvasReady\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n }}\n >\n {row + 1}\n </div>\n\n {columnLayout.map(({ col, left, width }) => {\n const active = selection.focus.row === row && selection.focus.col === col;\n const selected = isCellSelected(selection, row, col);\n const data = projection.readCell(row, col) ?? {\n value: null,\n input: \"\",\n format: {},\n };\n const value = data.value;\n const address = cellName({ row, col });\n const error = typeof value === \"string\" && value.startsWith(\"#\");\n return (\n <div\n key={col}\n id={`${reactId}-cell-${row}-${col}`}\n role=\"gridcell\"\n aria-colindex={col + 1}\n aria-selected={selected}\n aria-label={`${address}${value === null ? \"\" : `, ${displayValue(value)}`}`}\n data-og-cell={address}\n className={cn(\n \"pointer-events-none absolute top-0 flex h-full min-w-0 overflow-hidden border-b border-r border-og-border px-1.5 text-og-fg\",\n !canvasReady && selected && !active && \"bg-og-accent/10\",\n !canvasReady &&\n active &&\n \"z-10 bg-og-accent/10 ring-2 ring-inset ring-og-accent\",\n !canvasReady && error && \"text-og-status-failed\",\n )}\n style={{\n left,\n width,\n ...cellStyle(data.format),\n ...(canvasReady\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n }}\n >\n {active && editMode === \"cell\" ? (\n <input\n ref={editorRef}\n aria-label={`Edit ${address}`}\n value={draft}\n onInput={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={onEditorKeyDown}\n onCompositionStart={onEditorCompositionStart}\n onCompositionEnd={(event) =>\n onEditorCompositionEnd(event.currentTarget.value)\n }\n onBlur={(event) => commitEditorOnBlur(\"cell\", event.currentTarget.value)}\n onPointerDown={(event) => event.stopPropagation()}\n className=\"pointer-events-auto absolute inset-0 size-full bg-og-surface-1 px-1.5 font-mono text-og-sm text-og-fg outline-hidden ring-2 ring-inset ring-og-accent\"\n />\n ) : (\n <span className=\"block min-w-0 overflow-hidden text-ellipsis\">\n {displayValue(value)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n })}\n\n {!activeCellVisible ? (\n <div role=\"row\" aria-rowindex={selection.focus.row + 1} className=\"sr-only\">\n <div\n id={activeCellId}\n role=\"gridcell\"\n aria-colindex={selection.focus.col + 1}\n aria-selected=\"true\"\n aria-label={`${cellName(selection.focus)}${\n hiddenActiveValue == null ? \"\" : `, ${displayValue(hiddenActiveValue)}`\n }`}\n />\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","const TILE_SIZE = 256;\nconst MAX_CACHE_PHYSICAL_PIXELS = 32_000_000;\nconst MAX_CACHE_TILES = 96;\nconst MAX_DEVICE_PIXEL_RATIO = 4;\nconst MAX_AXIS_MARKS_PER_PAINT = 8_192;\nconst MAX_CANVAS_EDGE = 8_192;\nconst MAX_CANVAS_PIXELS = 16_000_000;\nconst MAX_TILES_PER_PAINT = 512;\n\nexport type SpreadsheetCanvasCellFormat = {\n fill?: string | undefined;\n font?:\n | {\n name?: string | undefined;\n size?: number | undefined;\n bold?: boolean | undefined;\n italic?: boolean | undefined;\n underline?: boolean | undefined;\n color?: string | undefined;\n }\n | undefined;\n horizontalAlignment?: \"left\" | \"center\" | \"right\" | \"justify\" | undefined;\n verticalAlignment?: \"top\" | \"center\" | \"bottom\" | undefined;\n wrapText?: boolean | undefined;\n};\n\n/** One sparse, already-authorized cell projected into the renderer. */\nexport type SpreadsheetCanvasCell = {\n row: number;\n col: number;\n value: unknown;\n formula?: string | null | undefined;\n format: SpreadsheetCanvasCellFormat;\n};\n\nexport type SpreadsheetCanvasCoverage = {\n rowStart: number;\n rowEnd: number;\n columnStart: number;\n columnEnd: number;\n};\n\n/**\n * A bounded value projection. `coverage` is end-exclusive; omitting it means\n * the source can answer for the entire sheet. A session-backed adapter can\n * replace this object as viewport subscriptions advance without making the\n * React layer or renderer own the canonical workbook model.\n */\nexport type SpreadsheetCanvasProjection = {\n sheetId: string;\n generationId: string | null;\n revision: string | number;\n coverage?: SpreadsheetCanvasCoverage | undefined;\n cells: SpreadsheetCanvasCellSource;\n valueAt: (cell: SpreadsheetCanvasCell) => unknown;\n};\n\nexport type SpreadsheetCanvasCellSource = {\n forEachInRange: (\n rowStart: number,\n rowEnd: number,\n columnStart: number,\n columnEnd: number,\n visit: (cell: SpreadsheetCanvasCell) => void,\n ) => void;\n};\n\nexport type SpreadsheetCanvasAxis = {\n count: number;\n total: number;\n offsetAt: (index: number) => number;\n sizeAt: (index: number) => number;\n indexAtOffset: (offset: number) => number;\n};\n\nexport type SpreadsheetCanvasSelection = {\n top: number;\n bottom: number;\n left: number;\n right: number;\n focusRow: number;\n focusColumn: number;\n};\n\nexport type SpreadsheetCanvasTheme = {\n background: string;\n headerBackground: string;\n border: string;\n foreground: string;\n mutedForeground: string;\n accent: string;\n error: string;\n fontFamily: string;\n fontSize: number;\n headerFontSize: number;\n signature: string;\n};\n\nexport type SpreadsheetCanvasPaint = {\n canvas: HTMLCanvasElement;\n projection: SpreadsheetCanvasProjection;\n rows: SpreadsheetCanvasAxis;\n columns: SpreadsheetCanvasAxis;\n selection: SpreadsheetCanvasSelection;\n logicalScrollLeft: number;\n logicalScrollTop: number;\n viewportWidth: number;\n viewportHeight: number;\n rowHeaderWidth: number;\n columnHeaderHeight: number;\n dimensionRevision: string | number;\n devicePixelRatio: number;\n theme: SpreadsheetCanvasTheme;\n};\n\nexport type SpreadsheetCanvasPaintStats = {\n cacheSize: number;\n paintedTiles: number;\n reusedTiles: number;\n uncachedTiles: number;\n devicePixelRatio: number;\n};\n\ntype IndexedRow = {\n row: number;\n cells: SpreadsheetCanvasCell[];\n};\n\ntype Tile = {\n canvas: HTMLCanvasElement;\n lastUsed: number;\n};\n\n/**\n * A row-major sparse index over stored worksheet cells. Empty cells never enter\n * this structure, so a tile query costs O(log k + v), where v is the number of\n * stored cells intersecting that tile.\n */\nexport class SparseSpreadsheetCellIndex {\n readonly size: number;\n private readonly rows: IndexedRow[];\n\n constructor(entries: Iterable<SpreadsheetCanvasCell>) {\n const sorted = [...entries].sort((left, right) => left.row - right.row || left.col - right.col);\n this.size = sorted.length;\n this.rows = [];\n for (const entry of sorted) {\n const previous = this.rows.at(-1);\n if (previous?.row === entry.row) previous.cells.push(entry);\n else this.rows.push({ row: entry.row, cells: [entry] });\n }\n }\n\n forEachInRange(\n rowStart: number,\n rowEnd: number,\n columnStart: number,\n columnEnd: number,\n visit: (cell: SpreadsheetCanvasCell) => void,\n ): void {\n let rowIndex = lowerBound(this.rows, rowStart, (row) => row.row);\n while (rowIndex < this.rows.length) {\n const row = this.rows[rowIndex]!;\n if (row.row >= rowEnd) break;\n let cellIndex = lowerBound(row.cells, columnStart, (cell) => cell.col);\n while (cellIndex < row.cells.length) {\n const cell = row.cells[cellIndex]!;\n if (cell.col >= columnEnd) break;\n visit(cell);\n cellIndex += 1;\n }\n rowIndex += 1;\n }\n }\n}\n\nfunction lowerBound<T>(\n values: readonly T[],\n target: number,\n valueAt: (value: T) => number,\n): number {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (valueAt(values[middle]!) < target) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction coverageContains(\n coverage: SpreadsheetCanvasCoverage | undefined,\n query: SpreadsheetCanvasCoverage,\n): boolean {\n return (\n coverage === undefined ||\n (coverage.rowStart <= query.rowStart &&\n coverage.rowEnd >= query.rowEnd &&\n coverage.columnStart <= query.columnStart &&\n coverage.columnEnd >= query.columnEnd)\n );\n}\n\nfunction intersectCoverage(\n query: SpreadsheetCanvasCoverage,\n coverage: SpreadsheetCanvasCoverage | undefined,\n): SpreadsheetCanvasCoverage | null {\n if (coverage === undefined) return query;\n const intersection = {\n rowStart: Math.max(query.rowStart, coverage.rowStart),\n rowEnd: Math.min(query.rowEnd, coverage.rowEnd),\n columnStart: Math.max(query.columnStart, coverage.columnStart),\n columnEnd: Math.min(query.columnEnd, coverage.columnEnd),\n };\n return intersection.rowStart < intersection.rowEnd &&\n intersection.columnStart < intersection.columnEnd\n ? intersection\n : null;\n}\n\nexport function spreadsheetCanvasDevicePixelRatio(value: number): number {\n if (!Number.isFinite(value) || value <= 0) return 1;\n return Math.max(1, Math.min(MAX_DEVICE_PIXEL_RATIO, value));\n}\n\n/** Caps backing-store allocation while retaining the full CSS viewport. */\nexport function spreadsheetCanvasBackingScale(\n width: number,\n height: number,\n devicePixelRatio: number,\n): number {\n const safeWidth = finiteExtent(width);\n const safeHeight = finiteExtent(height);\n const requested = spreadsheetCanvasDevicePixelRatio(devicePixelRatio);\n return Math.max(\n Number.EPSILON,\n Math.min(\n requested,\n MAX_CANVAS_EDGE / safeWidth,\n MAX_CANVAS_EDGE / safeHeight,\n Math.sqrt(MAX_CANVAS_PIXELS / (safeWidth * safeHeight)),\n ),\n );\n}\n\n/** Retained 2D tile renderer. Dynamic selection and headers are painted above cached body tiles. */\nexport class SpreadsheetCanvasRenderer {\n private readonly tiles = new Map<string, Tile>();\n private generation = \"\";\n private clock = 0;\n\n dispose(): void {\n this.tiles.clear();\n this.generation = \"\";\n }\n\n paint(input: SpreadsheetCanvasPaint): SpreadsheetCanvasPaintStats | null {\n const context = safeCanvasContext(input.canvas);\n if (!context) return null;\n\n const width = finiteExtent(input.viewportWidth);\n const height = finiteExtent(input.viewportHeight);\n const dpr = spreadsheetCanvasBackingScale(width, height, input.devicePixelRatio);\n const pixelWidth = Math.max(1, Math.min(MAX_CANVAS_EDGE, Math.round(width * dpr)));\n const pixelHeight = Math.max(1, Math.min(MAX_CANVAS_EDGE, Math.round(height * dpr)));\n if (input.canvas.width !== pixelWidth) input.canvas.width = pixelWidth;\n if (input.canvas.height !== pixelHeight) input.canvas.height = pixelHeight;\n input.canvas.style.width = `${width}px`;\n input.canvas.style.height = `${height}px`;\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.clearRect(0, 0, width, height);\n\n const generation = [\n input.projection.sheetId,\n input.projection.generationId ?? \"<none>\",\n input.projection.revision,\n input.dimensionRevision,\n dpr,\n input.theme.signature,\n ].join(\"/\");\n if (generation !== this.generation) {\n this.tiles.clear();\n this.generation = generation;\n }\n\n setFill(context, input.theme.background, \"#ffffff\");\n context.fillRect(0, 0, width, height);\n\n const bodyLeft = input.rowHeaderWidth;\n const bodyTop = input.columnHeaderHeight;\n const visibleLeft = clamp(input.logicalScrollLeft, 0, input.columns.total);\n const visibleTop = clamp(input.logicalScrollTop, 0, input.rows.total);\n const visibleRight = clamp(\n input.logicalScrollLeft + width - bodyLeft,\n visibleLeft,\n input.columns.total,\n );\n const visibleBottom = clamp(\n input.logicalScrollTop + height - bodyTop,\n visibleTop,\n input.rows.total,\n );\n let paintedTiles = 0;\n let reusedTiles = 0;\n let uncachedTiles = 0;\n\n context.save();\n context.beginPath();\n context.rect(bodyLeft, bodyTop, Math.max(0, width - bodyLeft), Math.max(0, height - bodyTop));\n context.clip();\n const firstTileColumn = Math.floor(visibleLeft / TILE_SIZE);\n const lastTileColumn = Math.floor(\n Math.max(visibleLeft, visibleRight - Number.EPSILON) / TILE_SIZE,\n );\n const firstTileRow = Math.floor(visibleTop / TILE_SIZE);\n const lastTileRow = Math.floor(\n Math.max(visibleTop, visibleBottom - Number.EPSILON) / TILE_SIZE,\n );\n let visitedTiles = 0;\n tileLoop: for (let tileRow = firstTileRow; tileRow <= lastTileRow; tileRow += 1) {\n for (let tileColumn = firstTileColumn; tileColumn <= lastTileColumn; tileColumn += 1) {\n if (visitedTiles >= MAX_TILES_PER_PAINT) break tileLoop;\n visitedTiles += 1;\n const key = `${tileColumn}:${tileRow}`;\n let tile = this.tiles.get(key);\n if (!tile) {\n const painted = this.paintTile(input, tileColumn, tileRow, dpr);\n tile = {\n canvas: painted.canvas,\n lastUsed: ++this.clock,\n };\n if (painted.cacheable) this.tiles.set(key, tile);\n else uncachedTiles += 1;\n paintedTiles += 1;\n } else {\n tile.lastUsed = ++this.clock;\n reusedTiles += 1;\n }\n const logicalX = tileColumn * TILE_SIZE;\n const logicalY = tileRow * TILE_SIZE;\n context.drawImage(\n tile.canvas,\n bodyLeft + logicalX - input.logicalScrollLeft,\n bodyTop + logicalY - input.logicalScrollTop,\n TILE_SIZE,\n TILE_SIZE,\n );\n }\n }\n\n paintSelection(context, input);\n paintVisibleGrid(context, input, visibleLeft, visibleTop, visibleRight, visibleBottom);\n context.restore();\n paintHeaders(\n context,\n input,\n width,\n height,\n visibleLeft,\n visibleTop,\n visibleRight,\n visibleBottom,\n );\n\n this.evictTiles(dpr);\n return {\n cacheSize: this.tiles.size,\n paintedTiles,\n reusedTiles,\n uncachedTiles,\n devicePixelRatio: dpr,\n };\n }\n\n private paintTile(\n input: SpreadsheetCanvasPaint,\n tileColumn: number,\n tileRow: number,\n dpr: number,\n ): { canvas: HTMLCanvasElement; cacheable: boolean } {\n const tile = input.canvas.ownerDocument.createElement(\"canvas\");\n tile.width = Math.max(1, Math.round(TILE_SIZE * dpr));\n tile.height = Math.max(1, Math.round(TILE_SIZE * dpr));\n const context = safeCanvasContext(tile);\n if (!context) return { canvas: tile, cacheable: false };\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n setFill(context, input.theme.background, \"#ffffff\");\n context.fillRect(0, 0, TILE_SIZE, TILE_SIZE);\n\n const tileLeft = tileColumn * TILE_SIZE;\n const tileTop = tileRow * TILE_SIZE;\n const tileRight = Math.min(input.columns.total, tileLeft + TILE_SIZE);\n const tileBottom = Math.min(input.rows.total, tileTop + TILE_SIZE);\n const firstColumn = input.columns.indexAtOffset(tileLeft);\n const lastColumn = input.columns.indexAtOffset(Math.max(tileLeft, tileRight - Number.EPSILON));\n const firstRow = input.rows.indexAtOffset(tileTop);\n const lastRow = input.rows.indexAtOffset(Math.max(tileTop, tileBottom - Number.EPSILON));\n const query = {\n rowStart: firstRow,\n rowEnd: Math.min(input.rows.count, lastRow + 1),\n columnStart: firstColumn,\n columnEnd: Math.min(input.columns.count, lastColumn + 1),\n };\n const coveredQuery = intersectCoverage(query, input.projection.coverage);\n const cacheable = coverageContains(input.projection.coverage, query);\n const cells: SpreadsheetCanvasCell[] = [];\n if (coveredQuery) {\n input.projection.cells.forEachInRange(\n coveredQuery.rowStart,\n coveredQuery.rowEnd,\n coveredQuery.columnStart,\n coveredQuery.columnEnd,\n (cell) => cells.push(cell),\n );\n }\n\n for (const cell of cells) {\n const fill = cell.format.fill;\n if (!fill) continue;\n const x = input.columns.offsetAt(cell.col) - tileLeft;\n const y = input.rows.offsetAt(cell.row) - tileTop;\n const width = input.columns.sizeAt(cell.col);\n const height = input.rows.sizeAt(cell.row);\n setFill(context, fill, input.theme.background);\n context.fillRect(x, y, width, height);\n }\n\n paintTileGrid(context, input, tileLeft, tileTop, tileRight, tileBottom);\n\n for (const cell of cells) {\n const value = input.projection.valueAt(cell);\n const text = displayValue(value);\n if (!text) continue;\n paintCellText(context, input, cell, text, tileLeft, tileTop);\n }\n\n return { canvas: tile, cacheable };\n }\n\n private evictTiles(dpr: number): void {\n const pixelsPerTile = Math.max(1, Math.round(TILE_SIZE * dpr)) ** 2;\n const maximum = Math.max(\n 4,\n Math.min(MAX_CACHE_TILES, Math.floor(MAX_CACHE_PHYSICAL_PIXELS / pixelsPerTile)),\n );\n if (this.tiles.size <= maximum) return;\n const oldest = [...this.tiles.entries()].sort(\n (left, right) => left[1].lastUsed - right[1].lastUsed,\n );\n for (let index = 0; index < oldest.length - maximum; index += 1) {\n this.tiles.delete(oldest[index]![0]);\n }\n }\n}\n\nfunction finiteExtent(value: number): number {\n if (!Number.isFinite(value) || value <= 0) return 1;\n return Math.max(1, Math.floor(value));\n}\n\nfunction safeCanvasContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D | null {\n try {\n return canvas.getContext(\"2d\", { alpha: false });\n } catch {\n return null;\n }\n}\n\nfunction setFill(context: CanvasRenderingContext2D, value: string, fallback: string): void {\n context.fillStyle = fallback;\n try {\n context.fillStyle = value;\n } catch {\n // Invalid workbook colors behave like invalid CSS declarations: ignore them.\n }\n}\n\nfunction setStroke(context: CanvasRenderingContext2D, value: string, fallback: string): void {\n context.strokeStyle = fallback;\n try {\n context.strokeStyle = value;\n } catch {\n // Invalid workbook colors behave like invalid CSS declarations: ignore them.\n }\n}\n\nfunction paintTileGrid(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n tileLeft: number,\n tileTop: number,\n tileRight: number,\n tileBottom: number,\n): void {\n setFill(context, input.theme.border, \"#d1d5db\");\n visitAxisBoundaries(input.columns, tileLeft, tileRight, (offset) => {\n context.fillRect(offset - tileLeft - 1, 0, 1, TILE_SIZE);\n });\n visitAxisBoundaries(input.rows, tileTop, tileBottom, (offset) => {\n context.fillRect(0, offset - tileTop - 1, TILE_SIZE, 1);\n });\n}\n\nfunction paintVisibleGrid(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n visibleLeft: number,\n visibleTop: number,\n visibleRight: number,\n visibleBottom: number,\n): void {\n setFill(context, input.theme.border, \"#d1d5db\");\n visitAxisBoundaries(input.columns, visibleLeft, visibleRight, (offset) => {\n const x = input.rowHeaderWidth + offset - input.logicalScrollLeft;\n context.fillRect(x - 1, input.columnHeaderHeight, 1, input.viewportHeight);\n });\n visitAxisBoundaries(input.rows, visibleTop, visibleBottom, (offset) => {\n const y = input.columnHeaderHeight + offset - input.logicalScrollTop;\n context.fillRect(input.rowHeaderWidth, y - 1, input.viewportWidth, 1);\n });\n}\n\nfunction visitAxisBoundaries(\n axis: SpreadsheetCanvasAxis,\n start: number,\n end: number,\n visit: (offset: number) => void,\n): void {\n if (axis.count <= 0 || end < start) return;\n let index = axis.indexAtOffset(start);\n let visits = 0;\n while (index < axis.count && visits < MAX_AXIS_MARKS_PER_PAINT) {\n const boundary = axis.offsetAt(index + 1);\n if (boundary > end + 1) break;\n if (boundary >= start) visit(boundary);\n index += 1;\n visits += 1;\n }\n}\n\nfunction paintSelection(context: CanvasRenderingContext2D, input: SpreadsheetCanvasPaint): void {\n const { selection } = input;\n const left =\n input.rowHeaderWidth + input.columns.offsetAt(selection.left) - input.logicalScrollLeft;\n const right =\n input.rowHeaderWidth + input.columns.offsetAt(selection.right + 1) - input.logicalScrollLeft;\n const top =\n input.columnHeaderHeight + input.rows.offsetAt(selection.top) - input.logicalScrollTop;\n const bottom =\n input.columnHeaderHeight + input.rows.offsetAt(selection.bottom + 1) - input.logicalScrollTop;\n context.save();\n setFill(context, input.theme.accent, \"#3b82f6\");\n context.globalAlpha = 0.1;\n context.fillRect(left, top, right - left, bottom - top);\n context.restore();\n\n const activeLeft =\n input.rowHeaderWidth + input.columns.offsetAt(selection.focusColumn) - input.logicalScrollLeft;\n const activeTop =\n input.columnHeaderHeight + input.rows.offsetAt(selection.focusRow) - input.logicalScrollTop;\n const activeWidth = input.columns.sizeAt(selection.focusColumn);\n const activeHeight = input.rows.sizeAt(selection.focusRow);\n context.save();\n setStroke(context, input.theme.accent, \"#3b82f6\");\n context.lineWidth = 2;\n context.strokeRect(\n activeLeft + 1,\n activeTop + 1,\n Math.max(0, activeWidth - 2),\n Math.max(0, activeHeight - 2),\n );\n context.restore();\n}\n\nfunction paintHeaders(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n width: number,\n height: number,\n visibleLeft: number,\n visibleTop: number,\n visibleRight: number,\n visibleBottom: number,\n): void {\n setFill(context, input.theme.headerBackground, \"#f3f4f6\");\n context.fillRect(0, 0, width, input.columnHeaderHeight);\n context.fillRect(0, input.columnHeaderHeight, input.rowHeaderWidth, height);\n setFill(context, input.theme.border, \"#d1d5db\");\n context.fillRect(0, input.columnHeaderHeight - 1, width, 1);\n context.fillRect(input.rowHeaderWidth - 1, 0, 1, height);\n\n context.save();\n context.beginPath();\n context.rect(\n input.rowHeaderWidth,\n 0,\n Math.max(0, width - input.rowHeaderWidth),\n input.columnHeaderHeight,\n );\n context.clip();\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.font = `600 ${input.theme.headerFontSize}px ${input.theme.fontFamily}`;\n context.textAlign = \"center\";\n context.textBaseline = \"middle\";\n visitAxisItems(input.columns, visibleLeft, visibleRight, (column, offset, size) => {\n const x = input.rowHeaderWidth + offset - input.logicalScrollLeft;\n setFill(context, input.theme.border, \"#d1d5db\");\n context.fillRect(x + size - 1, 0, 1, input.columnHeaderHeight);\n if (size >= 8) {\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.fillText(columnName(column), x + size / 2, input.columnHeaderHeight / 2);\n }\n });\n context.restore();\n\n context.save();\n context.beginPath();\n context.rect(\n 0,\n input.columnHeaderHeight,\n input.rowHeaderWidth,\n Math.max(0, height - input.columnHeaderHeight),\n );\n context.clip();\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.font = `400 ${input.theme.headerFontSize}px ${input.theme.fontFamily}`;\n context.textAlign = \"center\";\n context.textBaseline = \"middle\";\n visitAxisItems(input.rows, visibleTop, visibleBottom, (row, offset, size) => {\n const y = input.columnHeaderHeight + offset - input.logicalScrollTop;\n setFill(context, input.theme.border, \"#d1d5db\");\n context.fillRect(0, y + size - 1, input.rowHeaderWidth, 1);\n if (size >= 8) {\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.fillText(String(row + 1), input.rowHeaderWidth / 2, y + size / 2);\n }\n });\n context.restore();\n}\n\nfunction visitAxisItems(\n axis: SpreadsheetCanvasAxis,\n start: number,\n end: number,\n visit: (index: number, offset: number, size: number) => void,\n): void {\n if (axis.count <= 0 || end < start) return;\n let index = axis.indexAtOffset(start);\n let visits = 0;\n while (index < axis.count && visits < MAX_AXIS_MARKS_PER_PAINT) {\n const offset = axis.offsetAt(index);\n if (offset > end) break;\n visit(index, offset, axis.sizeAt(index));\n index += 1;\n visits += 1;\n }\n}\n\nfunction paintCellText(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n cell: SpreadsheetCanvasCell,\n text: string,\n tileLeft: number,\n tileTop: number,\n): void {\n const format = cell.format;\n const x = input.columns.offsetAt(cell.col) - tileLeft;\n const y = input.rows.offsetAt(cell.row) - tileTop;\n const width = input.columns.sizeAt(cell.col);\n const height = input.rows.sizeAt(cell.row);\n if (width <= 2 || height <= 2) return;\n const fontSize = finitePositive(format.font?.size, input.theme.fontSize);\n const fontFamily = format.font?.name || input.theme.fontFamily;\n const weight = format.font?.bold ? 600 : 400;\n const italic = format.font?.italic ? \"italic \" : \"\";\n context.save();\n context.beginPath();\n context.rect(x + 1, y + 1, Math.max(0, width - 2), Math.max(0, height - 2));\n context.clip();\n context.font = `${italic}${weight} ${fontSize}px ${fontFamily}`;\n setFill(\n context,\n format.font?.color ?? (text.startsWith(\"#\") ? input.theme.error : input.theme.foreground),\n input.theme.foreground,\n );\n const alignment = format.horizontalAlignment;\n context.textAlign = alignment === \"center\" ? \"center\" : alignment === \"right\" ? \"right\" : \"left\";\n context.textBaseline = \"alphabetic\";\n const padding = 6;\n const textX =\n alignment === \"center\"\n ? x + width / 2\n : alignment === \"right\"\n ? x + width - padding\n : x + padding;\n const lineHeight = fontSize * 1.5;\n const availableWidth = Math.max(0, width - padding * 2);\n const lines = format.wrapText\n ? wrapText(context, text, availableWidth, Math.max(1, Math.floor(height / lineHeight)))\n : [ellipsize(context, text.replaceAll(/\\r?\\n/g, \" \"), availableWidth)];\n const blockHeight = lines.length * lineHeight;\n const vertical = format.verticalAlignment;\n const firstBaseline =\n vertical === \"top\"\n ? y + Math.min(height, padding + fontSize)\n : vertical === \"bottom\"\n ? y + height - padding - blockHeight + fontSize\n : y + (height - blockHeight) / 2 + fontSize;\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index]!;\n const baseline = firstBaseline + index * lineHeight;\n context.fillText(line, textX, baseline);\n if (format.font?.underline && line) {\n const metrics = context.measureText(line);\n const textWidth = metrics.width;\n const startX =\n alignment === \"center\"\n ? textX - textWidth / 2\n : alignment === \"right\"\n ? textX - textWidth\n : textX;\n setFill(context, format.font.color ?? input.theme.foreground, input.theme.foreground);\n context.fillRect(startX, baseline + 1, textWidth, Math.max(1, fontSize / 14));\n }\n }\n context.restore();\n}\n\nfunction wrapText(\n context: CanvasRenderingContext2D,\n input: string,\n maximumWidth: number,\n maximumLines: number,\n): string[] {\n if (maximumWidth <= 0) return [\"\"];\n const output: string[] = [];\n for (const paragraph of input.split(/\\r?\\n/)) {\n const words = paragraph.split(/\\s+/).filter(Boolean);\n if (words.length === 0) output.push(\"\");\n let line = \"\";\n for (const word of words) {\n const next = line ? `${line} ${word}` : word;\n if (!line || context.measureText(next).width <= maximumWidth) line = next;\n else {\n output.push(ellipsize(context, line, maximumWidth));\n line = word;\n }\n if (output.length >= maximumLines) break;\n }\n if (output.length < maximumLines && line) output.push(ellipsize(context, line, maximumWidth));\n if (output.length >= maximumLines) break;\n }\n return output.slice(0, maximumLines);\n}\n\nfunction ellipsize(context: CanvasRenderingContext2D, input: string, maximumWidth: number): string {\n if (!input || maximumWidth <= 0) return \"\";\n if (context.measureText(input).width <= maximumWidth) return input;\n const suffix = \"…\";\n const suffixWidth = context.measureText(suffix).width;\n if (suffixWidth > maximumWidth) return \"\";\n let low = 0;\n let high = input.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (context.measureText(`${input.slice(0, middle)}${suffix}`).width <= maximumWidth)\n low = middle;\n else high = middle - 1;\n }\n return `${input.slice(0, low)}${suffix}`;\n}\n\nfunction finitePositive(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toLocaleDateString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n\nfunction columnName(index: number): string {\n let value = index + 1;\n let result = \"\";\n while (value > 0) {\n const remainder = (value - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n value = Math.floor((value - 1) / 26);\n }\n return result;\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.max(minimum, Math.min(maximum, value));\n}\n","import {\n SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n editableArtifactStableId,\n spreadsheetSheetId,\n type EditableArtifactSession,\n type EditableSpreadsheetCellValue,\n type EditableSpreadsheetMetadataProjection,\n type EditableSpreadsheetSheetMetadata,\n type EditableSpreadsheetViewportProjection,\n type EditableSpreadsheetViewportQuery,\n type SpreadsheetCellInput,\n type SpreadsheetSheetGeneration,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { PlusIcon } from \"lucide-react\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { ArtifactSurface } from \"./artifact-surface\";\nimport {\n editableArtifactAccessRevoked,\n editableArtifactStatusLabel,\n EditableArtifactMessage,\n useEditableArtifactView,\n} from \"./editable-artifact-ui\";\nimport { SparseSpreadsheetCellIndex } from \"./spreadsheet-canvas\";\nimport {\n SpreadsheetProjectionGrid,\n type SpreadsheetCommit,\n type SpreadsheetGridProjection,\n type SpreadsheetRangeCommit,\n type SpreadsheetSelection,\n type SpreadsheetViewport,\n} from \"./spreadsheet-grid\";\n\nconst EXCEL_MAX_ROWS = 1_048_576;\nconst EXCEL_MAX_COLUMNS = 16_384;\nconst INITIAL_VIEWPORT_ROWS = 64;\nconst INITIAL_VIEWPORT_COLUMNS = 32;\nconst MAX_INTERACTIVE_QUERY_CELLS = 65_536;\nconst MAX_INTERACTIVE_QUERY_BYTES = 8 * 1024 * 1024;\nconst EMPTY_FORMAT = Object.freeze({});\nconst EMPTY_SHEETS: readonly EditableSpreadsheetSheetMetadata[] = [];\n\nexport type EditableSpreadsheetGridProps = {\n session: EditableArtifactSession;\n sheet: EditableSpreadsheetSheetMetadata;\n metadataRevision: bigint;\n readOnly?: boolean | undefined;\n rowCount?: number | undefined;\n columnCount?: number | undefined;\n overscanRows?: number | undefined;\n overscanColumns?: number | undefined;\n onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;\n onCommit?: ((commit: SpreadsheetCommit) => void) | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;\n className?: string | undefined;\n};\n\nexport type EditableSpreadsheetArtifactSurfaceProps = Omit<\n EditableSpreadsheetGridProps,\n \"metadataRevision\" | \"sheet\"\n> & {\n title?: string | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n initialSheetId?: string | undefined;\n allowAddSheet?: boolean | undefined;\n};\n\ntype ProjectionState = {\n query: EditableSpreadsheetViewportQuery;\n projection: EditableSpreadsheetViewportProjection | null;\n error: Error | null;\n};\n\n/**\n * Durable spreadsheet editor over one SDK session. Canonical state remains in\n * the dedicated Worker; React receives one bounded immutable viewport only.\n */\nexport function EditableSpreadsheetGrid({\n session,\n sheet,\n metadataRevision,\n readOnly = false,\n rowCount: requestedRowCount,\n columnCount: requestedColumnCount,\n overscanRows = 3,\n overscanColumns = 2,\n onSelectionChange,\n onCommit,\n onCommandError,\n onViewportChange,\n className,\n}: EditableSpreadsheetGridProps) {\n const rowCount = boundedSheetCount(requestedRowCount, EXCEL_MAX_ROWS, sheet.usedBounds?.endRow);\n const columnCount = boundedSheetCount(\n requestedColumnCount,\n EXCEL_MAX_COLUMNS,\n sheet.usedBounds?.endColumn,\n );\n const [state, setState] = useState<ProjectionState>(() => ({\n query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),\n projection: null,\n error: null,\n }));\n const activeCellRef = useRef({ row: 0, column: 0 });\n\n useEffect(() => {\n setState({\n query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),\n projection: null,\n error: null,\n });\n activeCellRef.current = { row: 0, column: 0 };\n }, [columnCount, rowCount, session, sheet.sheetId]);\n\n useEffect(() => {\n const query = state.query;\n return session.subscribeSpreadsheetViewport(\n query,\n (projection) => {\n if (!sameViewport(projection, query)) return;\n if (sheet.generationId !== null && projection.generationId !== sheet.generationId) {\n setState((current) =>\n sameViewportQuery(current.query, query)\n ? {\n ...current,\n projection: null,\n error: new Error(\"Spreadsheet generation changed; refreshing metadata\"),\n }\n : current,\n );\n return;\n }\n setState((current) =>\n sameViewportQuery(current.query, query) ? { query, projection, error: null } : current,\n );\n },\n {\n onError(error) {\n setState((current) =>\n sameViewportQuery(current.query, query) ? { ...current, error } : current,\n );\n },\n },\n );\n }, [session, sheet.generationId, state.query]);\n\n const projection = useMemo(\n () =>\n projectSdkViewport(\n sheet,\n metadataRevision,\n state.query,\n state.projection,\n rowCount,\n columnCount,\n ),\n [columnCount, metadataRevision, rowCount, sheet, state.projection, state.query],\n );\n const generation = useMemo(() => sheetGeneration(sheet), [sheet]);\n const editable = !readOnly && generation !== null;\n\n const handleCommit = useCallback(\n async (commit: SpreadsheetCommit) => {\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n const input = spreadsheetCellInput(commit.input, commit.kind);\n await session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"cells.set\",\n sheet: generation,\n anchor: { row: commit.cell.row, column: commit.cell.col },\n rows: 1,\n columns: 1,\n cells: [input],\n },\n ],\n });\n onCommit?.(commit);\n },\n [generation, onCommit, session],\n );\n\n const handleClear = useCallback(\n async (selection: SpreadsheetSelection) => {\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n const top = Math.min(selection.anchor.row, selection.focus.row);\n const bottom = Math.max(selection.anchor.row, selection.focus.row);\n const left = Math.min(selection.anchor.col, selection.focus.col);\n const right = Math.max(selection.anchor.col, selection.focus.col);\n await session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"range.clear\",\n sheet: generation,\n range: {\n start: { row: top, column: left },\n end: { row: bottom, column: right },\n },\n },\n ],\n });\n },\n [generation, session],\n );\n\n const handleCommitRange = useCallback(\n async (commit: SpreadsheetRangeCommit) => {\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n await session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"cells.set\",\n sheet: generation,\n anchor: { row: commit.anchor.row, column: commit.anchor.col },\n rows: commit.rows,\n columns: commit.columns,\n cells: commit.inputs.map((input) =>\n spreadsheetCellInput(input, input.startsWith(\"=\") ? \"formula\" : \"value\"),\n ),\n },\n ],\n });\n },\n [generation, session],\n );\n\n const handleSelection = useCallback(\n (selection: SpreadsheetSelection) => {\n activeCellRef.current = {\n row: selection.focus.row,\n column: selection.focus.col,\n };\n setState((current) => {\n if (queryContains(current.query, selection.focus.row, selection.focus.col)) return current;\n return {\n query: boundedViewportQuery(\n sheet.sheetId,\n selection.focus.row,\n selection.focus.row + 1,\n selection.focus.col,\n selection.focus.col + 1,\n rowCount,\n columnCount,\n activeCellRef.current,\n ),\n projection: current.projection,\n error: null,\n };\n });\n onSelectionChange?.(selection);\n },\n [columnCount, onSelectionChange, rowCount, sheet.sheetId],\n );\n\n const handleViewport = useCallback(\n (viewport: SpreadsheetViewport) => {\n const next = boundedViewportQuery(\n sheet.sheetId,\n viewport.overscanRowStart,\n viewport.overscanRowEnd,\n viewport.overscanColumnStart,\n viewport.overscanColumnEnd,\n rowCount,\n columnCount,\n activeCellRef.current,\n );\n setState((current) =>\n sameViewportQuery(current.query, next)\n ? current\n : { query: next, projection: current.projection, error: null },\n );\n onViewportChange?.(viewport);\n },\n [columnCount, onViewportChange, rowCount, sheet.sheetId],\n );\n\n return (\n <div className={cn(\"relative h-full min-h-0\", className)}>\n <SpreadsheetProjectionGrid\n projection={projection}\n readOnly={!editable}\n overscanRows={overscanRows}\n overscanColumns={overscanColumns}\n onSelectionChange={handleSelection}\n commit={editable ? handleCommit : undefined}\n commitRange={editable ? handleCommitRange : undefined}\n clear={editable ? handleClear : undefined}\n onCommandError={onCommandError}\n onViewportChange={handleViewport}\n />\n {state.error ? (\n <output\n role=\"status\"\n className=\"pointer-events-none absolute bottom-2 left-2 z-50 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: \"min(28rem, calc(100% - 1rem))\" }}\n >\n {state.error.message}\n </output>\n ) : null}\n </div>\n );\n}\n\n/** Artifact chrome, sheet navigation, and one Worker-backed spreadsheet grid. */\nexport function EditableSpreadsheetArtifactSurface({\n session,\n title = \"Workbook\",\n subtitle,\n actions,\n initialSheetId,\n allowAddSheet = true,\n readOnly = false,\n ...gridProps\n}: EditableSpreadsheetArtifactSurfaceProps) {\n const { metadata, error: metadataError } = useSpreadsheetMetadata(session);\n const view = useEditableArtifactView(session);\n const [activeSheetId, setActiveSheetId] = useState<string | null>(initialSheetId ?? null);\n const [creatingSheet, setCreatingSheet] = useState(false);\n const [surfaceError, setSurfaceError] = useState<Error | null>(null);\n const sheets = metadata?.sheets ?? EMPTY_SHEETS;\n const activeSheet =\n sheets.find((sheet) => sheet.sheetId === activeSheetId) ??\n (initialSheetId ? sheets.find((sheet) => sheet.sheetId === initialSheetId) : undefined) ??\n sheets[0] ??\n null;\n const writable = !readOnly && view.writable;\n const accessRevoked = editableArtifactAccessRevoked(view);\n\n const addSheet = useCallback(async () => {\n if (!writable || creatingSheet) return;\n setCreatingSheet(true);\n setSurfaceError(null);\n try {\n const after = activeSheet ? sheetGeneration(activeSheet) : null;\n const created = await session.createSpreadsheetSheet({\n name: nextAvailableSheetName(sheets),\n after,\n });\n setActiveSheetId(created.sheetId);\n } catch (cause) {\n setSurfaceError(asError(cause));\n } finally {\n setCreatingSheet(false);\n }\n }, [activeSheet, creatingSheet, session, sheets, writable]);\n\n const footer = (\n <div\n className=\"flex min-h-9 items-center gap-1 overflow-x-auto px-2\"\n role=\"tablist\"\n aria-label=\"Worksheets\"\n >\n {sheets.map((sheet) => (\n <button\n key={`${sheet.sheetId}:${sheet.generationId ?? \"pending\"}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={sheet.sheetId === activeSheet?.sheetId}\n onClick={() => setActiveSheetId(sheet.sheetId)}\n className={cn(\n \"h-7 shrink-0 rounded-og-sm px-2.5 text-og-sm outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent\",\n sheet.sheetId === activeSheet?.sheetId\n ? \"bg-og-surface-3 font-medium text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg\",\n )}\n >\n {sheet.name}\n </button>\n ))}\n {writable && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={() => void addSheet()}\n disabled={creatingSheet}\n aria-label={creatingSheet ? \"Adding worksheet\" : \"Add worksheet\"}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted outline-hidden hover:bg-og-surface-3 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50 [&>svg]:size-3.5\"\n >\n <PlusIcon />\n </button>\n ) : null}\n </div>\n );\n const error = surfaceError ?? metadataError;\n\n return (\n <ArtifactSurface\n modality=\"spreadsheet\"\n title={title}\n subtitle={\n subtitle ??\n (accessRevoked\n ? editableArtifactStatusLabel(view)\n : metadata\n ? `${sheets.length} sheet${sheets.length === 1 ? \"\" : \"s\"}`\n : editableArtifactStatusLabel(view))\n }\n actions={actions}\n footer={accessRevoked ? undefined : footer}\n busy={!accessRevoked && !metadata && !error}\n >\n {accessRevoked ? (\n <EditableArtifactMessage\n title=\"Access changed\"\n detail={editableArtifactStatusLabel(view)}\n />\n ) : activeSheet && metadata ? (\n <EditableSpreadsheetGrid\n key={`${activeSheet.sheetId}:${activeSheet.generationId ?? \"pending\"}`}\n {...gridProps}\n session={session}\n sheet={activeSheet}\n metadataRevision={metadata.revision}\n readOnly={!writable}\n />\n ) : error ? (\n <EditableArtifactMessage title=\"Could not open this workbook\" detail={error.message} />\n ) : metadata ? (\n <div className=\"grid h-full place-items-center bg-og-bg p-6 text-center\">\n <div>\n <p className=\"text-og-base font-medium text-og-fg\">This workbook has no worksheets.</p>\n {writable && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={() => void addSheet()}\n disabled={creatingSheet}\n className=\"mt-3 rounded-og-sm bg-og-accent-deep px-3 py-1.5 text-og-sm font-medium text-og-accent-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50\"\n >\n {creatingSheet ? \"Adding…\" : \"Add worksheet\"}\n </button>\n ) : null}\n </div>\n </div>\n ) : (\n <EditableArtifactMessage\n title=\"Opening workbook\"\n detail={editableArtifactStatusLabel(view)}\n />\n )}\n </ArtifactSurface>\n );\n}\n\nfunction useSpreadsheetMetadata(session: EditableArtifactSession): {\n metadata: EditableSpreadsheetMetadataProjection | null;\n error: Error | null;\n} {\n const [state, setState] = useState<{\n metadata: EditableSpreadsheetMetadataProjection | null;\n error: Error | null;\n }>({ metadata: null, error: null });\n useEffect(\n () =>\n session.subscribeSpreadsheetMetadata({}, (metadata) => setState({ metadata, error: null }), {\n onError: (error) => setState((current) => ({ ...current, error })),\n }),\n [session],\n );\n return state;\n}\n\nfunction projectSdkViewport(\n sheet: EditableSpreadsheetSheetMetadata,\n metadataRevision: bigint,\n query: EditableSpreadsheetViewportQuery,\n viewport: EditableSpreadsheetViewportProjection | null,\n rowCount: number,\n columnCount: number,\n): SpreadsheetGridProjection {\n const current = viewport && sameViewport(viewport, query) ? viewport : null;\n const projectedCells = (current?.cells ?? []).map((cell) => ({\n row: cell.row,\n col: cell.column,\n value: projectedCellValue(cell.value),\n formula: cell.formula,\n format: EMPTY_FORMAT,\n }));\n const cells = new SparseSpreadsheetCellIndex(projectedCells);\n const byCoordinate = new Map(\n projectedCells.map((cell) => [`${cell.row}:${cell.col}`, cell] as const),\n );\n const used = sheet.usedBounds;\n return {\n sheetId: sheet.sheetId,\n sheetName: sheet.name,\n generationId: current?.generationId ?? sheet.generationId,\n revision: `${metadataRevision}:${current?.revision ?? \"loading\"}`,\n dimensionRevision: metadataRevision.toString(),\n rowCount,\n columnCount,\n usedRange: used\n ? {\n row: used.startRow,\n col: used.startColumn,\n rowCount: used.endRow - used.startRow + 1,\n colCount: used.endColumn - used.startColumn + 1,\n }\n : null,\n coverage: current\n ? {\n rowStart: current.startRow,\n rowEnd: current.startRow + current.rowCount,\n columnStart: current.startColumn,\n columnEnd: current.startColumn + current.columnCount,\n }\n : {\n rowStart: query.startRow,\n rowEnd: query.startRow,\n columnStart: query.startColumn,\n columnEnd: query.startColumn,\n },\n cells,\n valueAt: (cell) => cell.value,\n readCell: (row, column) => {\n const cell = byCoordinate.get(`${row}:${column}`);\n return cell\n ? {\n value: cell.value,\n input: cell.formula ?? displayValue(cell.value),\n format: cell.format,\n }\n : null;\n },\n };\n}\n\nfunction initialViewportQuery(\n sheetId: string,\n rowCount: number,\n columnCount: number,\n): EditableSpreadsheetViewportQuery {\n return {\n sheetId,\n startRow: 0,\n startColumn: 0,\n rowCount: Math.min(rowCount, INITIAL_VIEWPORT_ROWS),\n columnCount: Math.min(columnCount, INITIAL_VIEWPORT_COLUMNS),\n maxCells: MAX_INTERACTIVE_QUERY_CELLS,\n maxBytes: MAX_INTERACTIVE_QUERY_BYTES,\n };\n}\n\nfunction boundedViewportQuery(\n sheetId: string,\n desiredRowStart: number,\n desiredRowEnd: number,\n desiredColumnStart: number,\n desiredColumnEnd: number,\n totalRows: number,\n totalColumns: number,\n focus: { row: number; column: number },\n): EditableSpreadsheetViewportQuery {\n let rowStart = clampInteger(desiredRowStart, 0, totalRows - 1);\n let rowEnd = clampInteger(desiredRowEnd, rowStart + 1, totalRows);\n let columnStart = clampInteger(desiredColumnStart, 0, totalColumns - 1);\n let columnEnd = clampInteger(desiredColumnEnd, columnStart + 1, totalColumns);\n const desiredRows = rowEnd - rowStart;\n const desiredColumns = columnEnd - columnStart;\n if (desiredRows * desiredColumns > MAX_INTERACTIVE_QUERY_CELLS) {\n const columns = Math.min(\n desiredColumns,\n Math.max(1, Math.floor(Math.sqrt(MAX_INTERACTIVE_QUERY_CELLS * 2))),\n );\n const rows = Math.max(1, Math.floor(MAX_INTERACTIVE_QUERY_CELLS / columns));\n columnStart = clampWindowStart(columnStart, columnEnd, focus.column, columns, totalColumns);\n columnEnd = Math.min(totalColumns, columnStart + columns);\n rowStart = clampWindowStart(rowStart, rowEnd, focus.row, rows, totalRows);\n rowEnd = Math.min(totalRows, rowStart + rows);\n }\n return {\n sheetId,\n startRow: rowStart,\n startColumn: columnStart,\n rowCount: rowEnd - rowStart,\n columnCount: columnEnd - columnStart,\n maxCells: MAX_INTERACTIVE_QUERY_CELLS,\n maxBytes: MAX_INTERACTIVE_QUERY_BYTES,\n };\n}\n\nfunction clampWindowStart(\n desiredStart: number,\n desiredEnd: number,\n focus: number,\n size: number,\n total: number,\n): number {\n if (desiredEnd - desiredStart <= size) return Math.min(desiredStart, Math.max(0, total - size));\n const centered = focus - Math.floor(size / 2);\n return Math.max(desiredStart, Math.min(desiredEnd - size, centered));\n}\n\nfunction queryContains(\n query: EditableSpreadsheetViewportQuery,\n row: number,\n column: number,\n): boolean {\n return (\n row >= query.startRow &&\n row < query.startRow + query.rowCount &&\n column >= query.startColumn &&\n column < query.startColumn + query.columnCount\n );\n}\n\nfunction sameViewport(\n projection: EditableSpreadsheetViewportProjection,\n query: EditableSpreadsheetViewportQuery,\n): boolean {\n return (\n projection.sheetId === query.sheetId &&\n projection.startRow === query.startRow &&\n projection.startColumn === query.startColumn &&\n projection.rowCount === query.rowCount &&\n projection.columnCount === query.columnCount\n );\n}\n\nfunction sameViewportQuery(\n left: EditableSpreadsheetViewportQuery,\n right: EditableSpreadsheetViewportQuery,\n): boolean {\n return (\n left.sheetId === right.sheetId &&\n left.startRow === right.startRow &&\n left.startColumn === right.startColumn &&\n left.rowCount === right.rowCount &&\n left.columnCount === right.columnCount &&\n left.maxCells === right.maxCells &&\n left.maxBytes === right.maxBytes\n );\n}\n\nfunction sheetGeneration(\n sheet: EditableSpreadsheetSheetMetadata,\n): SpreadsheetSheetGeneration | null {\n if (sheet.generationId === null) return null;\n return {\n kind: \"generation\",\n sheetId: spreadsheetSheetId(sheet.sheetId),\n creationOperationId: editableArtifactStableId(sheet.generationId),\n };\n}\n\nfunction spreadsheetCellInput(\n input: string,\n kind: SpreadsheetCommit[\"kind\"],\n): SpreadsheetCellInput {\n if (kind === \"formula\") return { formula: input, cached: null };\n if (input === \"\") return null;\n const normalized = input.trim();\n if (/^(?:true|false)$/i.test(normalized)) return normalized.toLowerCase() === \"true\";\n if (/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(normalized)) {\n const value = Number(normalized);\n if (Number.isFinite(value)) return value;\n }\n return input;\n}\n\nfunction projectedCellValue(value: EditableSpreadsheetCellValue): unknown {\n switch (value.kind) {\n case \"empty\":\n return null;\n case \"boolean\":\n case \"number\":\n case \"text\":\n return value.value;\n case \"date\":\n return new Date(value.value);\n case \"error\":\n return spreadsheetErrorText(value.value);\n }\n}\n\nfunction spreadsheetErrorText(\n value: Extract<EditableSpreadsheetCellValue, { kind: \"error\" }>[\"value\"],\n): string {\n if (typeof value === \"object\") return value.custom;\n return {\n null: \"#NULL!\",\n divide_by_zero: \"#DIV/0!\",\n value: \"#VALUE!\",\n reference: \"#REF!\",\n name: \"#NAME?\",\n number: \"#NUM!\",\n not_available: \"#N/A\",\n spill: \"#SPILL!\",\n calculation: \"#CALC!\",\n }[value];\n}\n\nfunction boundedSheetCount(\n requested: number | undefined,\n maximum: number,\n usedEnd: number | undefined,\n): number {\n const requestedCount =\n requested === undefined || !Number.isFinite(requested)\n ? maximum\n : Math.max(1, Math.min(maximum, Math.floor(requested)));\n const usedCount =\n usedEnd === undefined || !Number.isSafeInteger(usedEnd)\n ? 1\n : Math.max(1, Math.min(maximum, usedEnd + 1));\n return Math.max(requestedCount, usedCount);\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toISOString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n\nfunction nextAvailableSheetName(sheets: readonly EditableSpreadsheetSheetMetadata[]): string {\n let index = sheets.length + 1;\n while (sheets.some((sheet) => sheet.name === `Sheet${index}`)) index += 1;\n return `Sheet${index}`;\n}\n\nfunction clampInteger(value: number, minimum: number, maximum: number): number {\n if (!Number.isFinite(value)) return minimum;\n return Math.min(maximum, Math.max(minimum, Math.floor(value)));\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(\"Spreadsheet change failed\");\n}\n"],"mappings":"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","names":["columnName","displayValue","horizontalProjection","verticalProjection","logicalScrollLeft","logicalScrollTop","PlusIcon","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","useRef","useEffect","projection","useMemo","useCallback","nextAvailableSheetName","PlusIcon","displayValue"]}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
|
+
usePortalTokenSource,
|
|
2
3
|
usePortalTokenStyle
|
|
3
|
-
} from "./chunk-
|
|
4
|
+
} from "./chunk-VZTQ73XT.js";
|
|
4
5
|
import {
|
|
5
6
|
cn
|
|
6
7
|
} from "./chunk-22KP6LR5.js";
|
|
7
8
|
|
|
8
9
|
// src/components/tooltip.tsx
|
|
9
10
|
import { Tooltip as TooltipPrimitive } from "radix-ui";
|
|
10
|
-
import {
|
|
11
|
-
createContext,
|
|
12
|
-
useContext,
|
|
13
|
-
useRef
|
|
14
|
-
} from "react";
|
|
11
|
+
import { createContext, useContext } from "react";
|
|
15
12
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
16
13
|
var TooltipSourceContext = createContext(null);
|
|
17
14
|
function TooltipProvider({
|
|
@@ -21,8 +18,8 @@ function TooltipProvider({
|
|
|
21
18
|
return /* @__PURE__ */ jsx(TooltipPrimitive.Provider, { delayDuration, ...props });
|
|
22
19
|
}
|
|
23
20
|
function Tooltip({ children, ...props }) {
|
|
24
|
-
const
|
|
25
|
-
return /* @__PURE__ */ jsx(TooltipSourceContext.Provider, { value:
|
|
21
|
+
const source = usePortalTokenSource();
|
|
22
|
+
return /* @__PURE__ */ jsx(TooltipSourceContext.Provider, { value: source, children: /* @__PURE__ */ jsx(TooltipPrimitive.Root, { "data-slot": "tooltip", ...props, children }) });
|
|
26
23
|
}
|
|
27
24
|
function TooltipTrigger({
|
|
28
25
|
asChild = true,
|
|
@@ -35,7 +32,7 @@ function TooltipTrigger({
|
|
|
35
32
|
"data-slot": "tooltip-trigger",
|
|
36
33
|
asChild,
|
|
37
34
|
ref: (node) => {
|
|
38
|
-
|
|
35
|
+
sourceRef?.ref(node);
|
|
39
36
|
},
|
|
40
37
|
...props
|
|
41
38
|
}
|
|
@@ -52,9 +49,8 @@ function TooltipContent({
|
|
|
52
49
|
style,
|
|
53
50
|
...props
|
|
54
51
|
}) {
|
|
55
|
-
const
|
|
56
|
-
const
|
|
57
|
-
const portalStyle = usePortalTokenStyle(sourceRef ?? fallbackRef);
|
|
52
|
+
const source = useContext(TooltipSourceContext);
|
|
53
|
+
const portalStyle = usePortalTokenStyle(source?.source ?? null);
|
|
58
54
|
return /* @__PURE__ */ jsx(TooltipPrimitive.Portal, { children: /* @__PURE__ */ jsxs(
|
|
59
55
|
TooltipPrimitive.Content,
|
|
60
56
|
{
|
|
@@ -91,4 +87,4 @@ export {
|
|
|
91
87
|
TooltipTrigger,
|
|
92
88
|
TooltipContent
|
|
93
89
|
};
|
|
94
|
-
//# sourceMappingURL=chunk-
|
|
90
|
+
//# sourceMappingURL=chunk-FK6VG4LL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/tooltip.tsx"],"sourcesContent":["/**\n * Token-styled Radix tooltip — SDK counterpart to apps/web `components/ui/tooltip`.\n * Portals copy `--og-*` tokens so embeds keep the host theme outside `.og-root`.\n *\n * Background/foreground are applied as inline styles (not only Tailwind\n * utilities): `.og-root` sets `color: var(--og-color-fg)` after utilities in the\n * consumer CSS cascade, which would otherwise paint light-on-light inverted\n * tips and look like a blank white bubble.\n */\nimport { Tooltip as TooltipPrimitive } from \"radix-ui\";\nimport { createContext, useContext, type ComponentProps, type CSSProperties } from \"react\";\n\nimport { cn } from \"../lib/cn\";\nimport { usePortalTokenSource, usePortalTokenStyle } from \"../lib/use-portal-token-style\";\n\ntype TooltipSourceContextValue = {\n source: HTMLElement | null;\n ref: (node: HTMLElement | null) => void;\n};\n\nconst TooltipSourceContext = createContext<TooltipSourceContextValue | null>(null);\n\nfunction TooltipProvider({\n delayDuration = 300,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider delayDuration={delayDuration} {...props} />;\n}\n\nfunction Tooltip({ children, ...props }: ComponentProps<typeof TooltipPrimitive.Root>) {\n const source = usePortalTokenSource<HTMLElement>();\n return (\n <TooltipSourceContext.Provider value={source}>\n <TooltipPrimitive.Root data-slot=\"tooltip\" {...props}>\n {children}\n </TooltipPrimitive.Root>\n </TooltipSourceContext.Provider>\n );\n}\n\nfunction TooltipTrigger({\n asChild = true,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Trigger>) {\n const sourceRef = useContext(TooltipSourceContext);\n return (\n <TooltipPrimitive.Trigger\n data-slot=\"tooltip-trigger\"\n asChild={asChild}\n ref={(node) => {\n sourceRef?.ref(node);\n }}\n {...props}\n />\n );\n}\n\nconst tooltipSurfaceStyle: CSSProperties = {\n backgroundColor: \"var(--og-color-fg)\",\n color: \"var(--og-color-bg)\",\n};\n\nfunction TooltipContent({\n className,\n sideOffset = 6,\n children,\n style,\n ...props\n}: ComponentProps<typeof TooltipPrimitive.Content>) {\n const source = useContext(TooltipSourceContext);\n const portalStyle = usePortalTokenStyle(source?.source ?? null);\n\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n sideOffset={sideOffset}\n className={cn(\n \"og-root z-50 w-fit max-w-xs origin-[var(--radix-tooltip-content-transform-origin)]\",\n \"rounded-og-md px-2.5 py-1.5 text-og-xs leading-4 text-balance shadow-og-md\",\n \"animate-og-enter data-[state=closed]:opacity-0 data-[state=closed]:transition-opacity\",\n className,\n )}\n style={{ ...portalStyle, ...tooltipSurfaceStyle, ...style }}\n {...props}\n >\n {children}\n <TooltipPrimitive.Arrow\n className=\"z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]\"\n style={{\n backgroundColor: \"var(--og-color-fg)\",\n fill: \"var(--og-color-fg)\",\n }}\n />\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n );\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger };\n"],"mappings":";;;;;;;;;AASA,SAAS,WAAW,wBAAwB;AAC5C,SAAS,eAAe,kBAA2D;AAgB1E,cAgDH,YAhDG;AANT,IAAM,uBAAuB,cAAgD,IAAI;AAEjF,SAAS,gBAAgB;AAAA,EACvB,gBAAgB;AAAA,EAChB,GAAG;AACL,GAAqD;AACnD,SAAO,oBAAC,iBAAiB,UAAjB,EAA0B,eAA+B,GAAG,OAAO;AAC7E;AAEA,SAAS,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAiD;AACrF,QAAM,SAAS,qBAAkC;AACjD,SACE,oBAAC,qBAAqB,UAArB,EAA8B,OAAO,QACpC,8BAAC,iBAAiB,MAAjB,EAAsB,aAAU,WAAW,GAAG,OAC5C,UACH,GACF;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB,UAAU;AAAA,EACV,GAAG;AACL,GAAoD;AAClD,QAAM,YAAY,WAAW,oBAAoB;AACjD,SACE;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,KAAK,CAAC,SAAS;AACb,mBAAW,IAAI,IAAI;AAAA,MACrB;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,IAAM,sBAAqC;AAAA,EACzC,iBAAiB;AAAA,EACjB,OAAO;AACT;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA,aAAa;AAAA,EACb;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAoD;AAClD,QAAM,SAAS,WAAW,oBAAoB;AAC9C,QAAM,cAAc,oBAAoB,QAAQ,UAAU,IAAI;AAE9D,SACE,oBAAC,iBAAiB,QAAjB,EACC;AAAA,IAAC,iBAAiB;AAAA,IAAjB;AAAA,MACC,aAAU;AAAA,MACV;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MACA,OAAO,EAAE,GAAG,aAAa,GAAG,qBAAqB,GAAG,MAAM;AAAA,MACzD,GAAG;AAAA,MAEH;AAAA;AAAA,QACD;AAAA,UAAC,iBAAiB;AAAA,UAAjB;AAAA,YACC,WAAU;AAAA,YACV,OAAO;AAAA,cACL,iBAAiB;AAAA,cACjB,MAAM;AAAA,YACR;AAAA;AAAA,QACF;AAAA;AAAA;AAAA,EACF,GACF;AAEJ;","names":[]}
|