@opengeni/react 3.1.0 → 3.1.3-canary.38890816741001
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 +769 -22
- package/dist/accounts.js +89 -11
- package/dist/accounts.js.map +1 -1
- package/dist/approvals.d.ts +2 -1
- package/dist/artifacts-document.js +5 -3
- package/dist/artifacts-presentation.js +5 -3
- package/dist/artifacts-spreadsheet.d.ts +1 -1
- package/dist/artifacts-spreadsheet.js +5 -3
- package/dist/artifacts.d.ts +5 -1
- package/dist/artifacts.js +536 -42
- package/dist/artifacts.js.map +1 -1
- package/dist/browser-viewer-ZWR6MWJ7.js +19 -0
- package/dist/capability-catalog-row.d.ts +20 -0
- package/dist/capability-logo-fallback.d.ts +3 -0
- package/dist/chat-interactive-block-BO2IWXVK.js +14 -0
- package/dist/chunk-2DDJ6YH6.js +41 -0
- package/dist/chunk-2DDJ6YH6.js.map +1 -0
- package/dist/chunk-2HVLQ26H.js +183 -0
- package/dist/chunk-2HVLQ26H.js.map +1 -0
- package/dist/{chunk-RGALCTWO.js → chunk-2I6R3GCZ.js} +4285 -3980
- package/dist/chunk-2I6R3GCZ.js.map +1 -0
- package/dist/{chunk-D3UIAJKY.js → chunk-2SFFYIH3.js} +1179 -166
- package/dist/chunk-2SFFYIH3.js.map +1 -0
- package/dist/chunk-3PVDYTTB.js +24 -0
- package/dist/chunk-3PVDYTTB.js.map +1 -0
- package/dist/chunk-3UZCWK46.js +298 -0
- package/dist/chunk-3UZCWK46.js.map +1 -0
- package/dist/chunk-47CKUXTW.js +293 -0
- package/dist/chunk-47CKUXTW.js.map +1 -0
- package/dist/chunk-4QYP6QUI.js +109 -0
- package/dist/chunk-4QYP6QUI.js.map +1 -0
- package/dist/chunk-5EY26VZ7.js +1053 -0
- package/dist/chunk-5EY26VZ7.js.map +1 -0
- package/dist/chunk-5I4VRWBB.js +56 -0
- package/dist/chunk-5I4VRWBB.js.map +1 -0
- package/dist/chunk-5WOR7UCL.js +191 -0
- package/dist/chunk-5WOR7UCL.js.map +1 -0
- package/dist/chunk-5YJLGOM5.js +51 -0
- package/dist/chunk-5YJLGOM5.js.map +1 -0
- package/dist/chunk-6JFN3OWG.js +386 -0
- package/dist/chunk-6JFN3OWG.js.map +1 -0
- package/dist/chunk-7QJT5O4S.js +35 -0
- package/dist/chunk-7QJT5O4S.js.map +1 -0
- package/dist/chunk-A55KV72M.js +402 -0
- package/dist/chunk-A55KV72M.js.map +1 -0
- package/dist/chunk-ADWCLI4G.js +2028 -0
- package/dist/chunk-ADWCLI4G.js.map +1 -0
- package/dist/chunk-B27E3V37.js +29 -0
- package/dist/chunk-B27E3V37.js.map +1 -0
- package/dist/chunk-B7TC2A33.js +83 -0
- package/dist/chunk-B7TC2A33.js.map +1 -0
- package/dist/chunk-BLL56F7R.js +385 -0
- package/dist/chunk-BLL56F7R.js.map +1 -0
- package/dist/chunk-BOFEQC6K.js +162 -0
- package/dist/chunk-BOFEQC6K.js.map +1 -0
- package/dist/chunk-CM7LVUKC.js +35 -0
- package/dist/chunk-CM7LVUKC.js.map +1 -0
- package/dist/chunk-CORUP6JB.js +122 -0
- package/dist/chunk-CORUP6JB.js.map +1 -0
- package/dist/chunk-CSX5FFKZ.js +35 -0
- package/dist/chunk-CSX5FFKZ.js.map +1 -0
- package/dist/chunk-EGVHJKGJ.js +3125 -0
- package/dist/chunk-EGVHJKGJ.js.map +1 -0
- package/dist/{chunk-NEXLLTP4.js → chunk-G76LSA76.js} +6 -5
- package/dist/chunk-G76LSA76.js.map +1 -0
- package/dist/{chunk-PEI6RANI.js → chunk-GQMRL52F.js} +311 -75
- package/dist/chunk-GQMRL52F.js.map +1 -0
- package/dist/{chunk-ELIYWBZR.js → chunk-GUUXOISA.js} +1113 -457
- package/dist/chunk-GUUXOISA.js.map +1 -0
- package/dist/{chunk-HUIKIDM5.js → chunk-I7X2P4FU.js} +225 -116
- package/dist/chunk-I7X2P4FU.js.map +1 -0
- package/dist/chunk-IGFZFLI2.js +1390 -0
- package/dist/chunk-IGFZFLI2.js.map +1 -0
- package/dist/{chunk-4MDLEHXL.js → chunk-IMSUVYQB.js} +26 -13
- package/dist/chunk-IMSUVYQB.js.map +1 -0
- package/dist/chunk-IOYHDEP3.js +38 -0
- package/dist/chunk-IOYHDEP3.js.map +1 -0
- package/dist/chunk-IZV5FTJC.js +55 -0
- package/dist/chunk-IZV5FTJC.js.map +1 -0
- package/dist/chunk-KF33GTWN.js +343 -0
- package/dist/chunk-KF33GTWN.js.map +1 -0
- package/dist/chunk-KSGQ5ODA.js +457 -0
- package/dist/chunk-KSGQ5ODA.js.map +1 -0
- package/dist/{chunk-OAM4WAAM.js → chunk-KZC6QRNR.js} +1513 -697
- package/dist/chunk-KZC6QRNR.js.map +1 -0
- package/dist/chunk-LJUMYUBO.js +218 -0
- package/dist/chunk-LJUMYUBO.js.map +1 -0
- package/dist/chunk-LSW2OJVV.js +380 -0
- package/dist/chunk-LSW2OJVV.js.map +1 -0
- package/dist/chunk-M357MHH3.js +2 -0
- package/dist/chunk-M357MHH3.js.map +1 -0
- package/dist/chunk-MK2TQO4Y.js +24 -0
- package/dist/chunk-MK2TQO4Y.js.map +1 -0
- package/dist/chunk-N7S72EXK.js +25 -0
- package/dist/chunk-N7S72EXK.js.map +1 -0
- package/dist/{chunk-XXWH2JLC.js → chunk-NKMYZFHA.js} +616 -621
- package/dist/chunk-NKMYZFHA.js.map +1 -0
- package/dist/chunk-NX4ADH73.js +14 -0
- package/dist/chunk-NX4ADH73.js.map +1 -0
- package/dist/chunk-O7F6UJO4.js +71 -0
- package/dist/chunk-O7F6UJO4.js.map +1 -0
- package/dist/chunk-OVB5WIG5.js +14064 -0
- package/dist/chunk-OVB5WIG5.js.map +1 -0
- package/dist/chunk-OYQQJL3J.js +16 -0
- package/dist/chunk-OYQQJL3J.js.map +1 -0
- package/dist/{chunk-H5YGYNXS.js → chunk-P4BNUO57.js} +60 -17
- package/dist/chunk-P4BNUO57.js.map +1 -0
- package/dist/{chunk-JVYQRRC4.js → chunk-PEHTX3V7.js} +21 -1
- package/dist/chunk-PEHTX3V7.js.map +1 -0
- package/dist/chunk-PMV53IMM.js +26 -0
- package/dist/chunk-PMV53IMM.js.map +1 -0
- package/dist/{chunk-KCGXPP5V.js → chunk-PYEOPA4M.js} +13 -7
- package/dist/chunk-PYEOPA4M.js.map +1 -0
- package/dist/{chunk-KZ73RL76.js → chunk-QHUE7E4N.js} +8 -3
- package/dist/chunk-QHUE7E4N.js.map +1 -0
- package/dist/chunk-QV3DJVRZ.js +11 -0
- package/dist/chunk-QV3DJVRZ.js.map +1 -0
- package/dist/chunk-R5SBNG7S.js +810 -0
- package/dist/chunk-R5SBNG7S.js.map +1 -0
- package/dist/chunk-RI42H5IU.js +326 -0
- package/dist/chunk-RI42H5IU.js.map +1 -0
- package/dist/chunk-S2QH6EZ5.js +211 -0
- package/dist/chunk-S2QH6EZ5.js.map +1 -0
- package/dist/chunk-SHLZMAJN.js +304 -0
- package/dist/chunk-SHLZMAJN.js.map +1 -0
- package/dist/chunk-TGXK4BAZ.js +293 -0
- package/dist/chunk-TGXK4BAZ.js.map +1 -0
- package/dist/{chunk-5YK2ZDIG.js → chunk-TNEZNMSN.js} +4 -10
- package/dist/chunk-TNEZNMSN.js.map +1 -0
- package/dist/{chunk-22KP6LR5.js → chunk-TXS65BB2.js} +3 -1
- package/dist/{chunk-22KP6LR5.js.map → chunk-TXS65BB2.js.map} +1 -1
- package/dist/chunk-UNJPZGNK.js +63 -0
- package/dist/chunk-UNJPZGNK.js.map +1 -0
- package/dist/{chunk-MZ2G2XBA.js → chunk-V5ZUJT2T.js} +205 -45
- package/dist/chunk-V5ZUJT2T.js.map +1 -0
- package/dist/chunk-VIUEOHXY.js +394 -0
- package/dist/chunk-VIUEOHXY.js.map +1 -0
- package/dist/chunk-WIUKB3LD.js +1911 -0
- package/dist/chunk-WIUKB3LD.js.map +1 -0
- package/dist/{chunk-ICA6R6TW.js → chunk-WNN7NO2N.js} +1451 -355
- package/dist/chunk-WNN7NO2N.js.map +1 -0
- package/dist/{chunk-YJFGAFBD.js → chunk-X5UVUIMF.js} +1892 -1223
- package/dist/chunk-X5UVUIMF.js.map +1 -0
- package/dist/chunk-XDA5QJE7.js +402 -0
- package/dist/chunk-XDA5QJE7.js.map +1 -0
- package/dist/{chunk-VZTQ73XT.js → chunk-XEA5BCMA.js} +3 -1
- package/dist/{chunk-VZTQ73XT.js.map → chunk-XEA5BCMA.js.map} +1 -1
- package/dist/chunk-XHF7OYAN.js +1150 -0
- package/dist/chunk-XHF7OYAN.js.map +1 -0
- package/dist/chunk-YSRBFJMQ.js +43 -0
- package/dist/chunk-YSRBFJMQ.js.map +1 -0
- package/dist/chunk-ZOZAPAUO.js +174 -0
- package/dist/chunk-ZOZAPAUO.js.map +1 -0
- package/dist/chunk-ZQV5W7YC.js +809 -0
- package/dist/chunk-ZQV5W7YC.js.map +1 -0
- package/dist/chunk-ZUWF4NF7.js +13 -0
- package/dist/chunk-ZUWF4NF7.js.map +1 -0
- package/dist/client.d.ts +16 -7
- package/dist/clipboard.js +3 -1
- package/dist/commands/types.d.ts +2 -0
- package/dist/components/anthropic-mark.d.ts +3 -0
- package/dist/components/approval-surface.d.ts +19 -6
- package/dist/components/artifacts/artifact-chrome.d.ts +120 -0
- package/dist/components/artifacts/artifact-sandbox.d.ts +30 -0
- package/dist/components/artifacts/artifact-surface.d.ts +4 -2
- package/dist/components/artifacts/chat-interactive-block.d.ts +29 -0
- package/dist/components/artifacts/deferred-chat-media.d.ts +15 -0
- package/dist/components/artifacts/document-editor.d.ts +4 -2
- package/dist/components/artifacts/editable-artifact-ui.d.ts +2 -1
- package/dist/components/artifacts/editable-artifact-view.d.ts +48 -0
- package/dist/components/artifacts/editable-document.d.ts +1 -1
- package/dist/components/artifacts/editable-presentation.d.ts +2 -2
- package/dist/components/artifacts/editable-spreadsheet.d.ts +8 -3
- package/dist/components/artifacts/index.d.ts +9 -2
- package/dist/components/artifacts/inline-html-document.d.ts +2 -0
- package/dist/components/artifacts/latest-task-runner.d.ts +15 -0
- package/dist/components/artifacts/presentation-editor.d.ts +6 -2
- package/dist/components/artifacts/published-html-artifact-frame.d.ts +23 -3
- package/dist/components/artifacts/session-artifact-viewer.d.ts +39 -0
- package/dist/components/artifacts/site-view.d.ts +26 -0
- package/dist/components/artifacts/spreadsheet-command-queue.d.ts +20 -0
- package/dist/components/artifacts/spreadsheet-download.d.ts +7 -0
- package/dist/components/artifacts/spreadsheet-general-display.d.ts +24 -0
- package/dist/components/artifacts/spreadsheet-grid.d.ts +10 -3
- package/dist/components/artifacts/spreadsheet-resize.d.ts +50 -0
- package/dist/components/artifacts/spreadsheet-submissions.d.ts +9 -0
- package/dist/components/artifacts/visualization-assets.gen.d.ts +2 -0
- package/dist/components/browser-select-control.d.ts +16 -0
- package/dist/components/browser-viewer.d.ts +11 -2
- package/dist/components/chat-composer.d.ts +21 -3
- package/dist/components/child-session-link.d.ts +9 -0
- package/dist/components/claude-mark.d.ts +3 -0
- package/dist/components/code-editor.d.ts +1 -4
- package/dist/components/composer-transcription-control.d.ts +7 -0
- package/dist/components/composer.d.ts +34 -67
- package/dist/components/computer-viewer.d.ts +1 -1
- package/dist/components/copy-button.d.ts +3 -1
- package/dist/components/desktop-viewer.d.ts +1 -1
- package/dist/components/fleet-tile.d.ts +2 -2
- package/dist/components/grok-mark.d.ts +26 -0
- package/dist/components/human-input-form.d.ts +28 -32
- package/dist/components/human-input-surface.d.ts +7 -2
- package/dist/components/linkified-text.d.ts +18 -0
- package/dist/components/machine-input-display.d.ts +22 -1
- package/dist/components/machines/agent-status-icon.d.ts +6 -0
- package/dist/components/machines/machine-detail.d.ts +7 -1
- package/dist/components/machines/machine-status.d.ts +48 -0
- package/dist/components/markdown-table-layout.d.ts +18 -0
- package/dist/components/markdown.d.ts +37 -4
- package/dist/components/message-timeline.d.ts +86 -7
- package/dist/components/model-mark.d.ts +29 -0
- package/dist/components/model-policy-picker-menu.d.ts +9 -0
- package/dist/components/model-policy-picker.d.ts +41 -25
- package/dist/components/new-conversation.d.ts +32 -0
- package/dist/components/open-geni-chat.d.ts +73 -0
- package/dist/components/open-geni-links.d.ts +68 -0
- package/dist/components/openrouter-mark.d.ts +6 -0
- package/dist/components/opper-mark.d.ts +7 -0
- package/dist/components/preview-loading.d.ts +2 -0
- package/dist/components/provider-recovery-notice.d.ts +16 -0
- package/dist/components/queue-item-content.d.ts +9 -0
- package/dist/components/rehype-secret-refs.d.ts +23 -0
- package/dist/components/remark-soft-line-breaks.d.ts +38 -0
- package/dist/components/sandbox-files.d.ts +3 -1
- package/dist/components/sandbox-workspace.d.ts +18 -0
- package/dist/components/secret-question-field.d.ts +31 -0
- package/dist/components/secret-ref-chip.d.ts +35 -0
- package/dist/components/session-capability-frame.d.ts +37 -0
- package/dist/components/session-chrome.d.ts +57 -8
- package/dist/components/session-commands-panel.d.ts +6 -0
- package/dist/components/session-commands.d.ts +6 -0
- package/dist/components/session-connection-request.d.ts +8 -0
- package/dist/components/session-conversation.d.ts +157 -0
- package/dist/components/session-list.d.ts +39 -0
- package/dist/components/session-mcp-capability-card.d.ts +41 -0
- package/dist/components/session-proxy-scope.d.ts +35 -0
- package/dist/components/session-status.d.ts +4 -1
- package/dist/components/session-usage-limit-notice.d.ts +39 -0
- package/dist/components/timeline-anchor.d.ts +24 -0
- package/dist/components/timeline-annotation-chrome.d.ts +25 -0
- package/dist/components/timeline-annotation-layout.d.ts +42 -0
- package/dist/components/timeline-annotation-markers.d.ts +8 -0
- package/dist/components/timeline-annotation-reveal-context.d.ts +4 -0
- package/dist/components/timeline-annotation-shared.d.ts +31 -0
- package/dist/components/timeline-annotations-dialog.d.ts +3 -2
- package/dist/components/timeline-annotations.d.ts +13 -3
- package/dist/components/timeline-reading-progress.d.ts +11 -0
- package/dist/components/timeline-search.d.ts +34 -0
- package/dist/components/timeline-settlement.d.ts +16 -0
- package/dist/components/tip-follow.d.ts +16 -0
- package/dist/components/tool-action-review.d.ts +47 -0
- package/dist/components/tool-review-history.d.ts +25 -0
- package/dist/components/usage-limit-notice.d.ts +49 -0
- package/dist/components/usage-member-list.d.ts +91 -0
- package/dist/components/usage-meter.d.ts +73 -0
- package/dist/components/use-viewer-menu-dismiss.d.ts +2 -0
- package/dist/components/user-message-body.d.ts +10 -1
- package/dist/composer-messages.d.ts +74 -0
- package/dist/composer-messages.js +9 -0
- package/dist/composer-messages.js.map +1 -0
- package/dist/composer-voice-events.d.ts +8 -0
- package/dist/composer.d.ts +5 -4
- package/dist/composer.js +26 -13
- package/dist/computer-viewer-GMLDXPON.js +20 -0
- package/dist/computer-viewer-GMLDXPON.js.map +1 -0
- package/dist/connect-account-identity.d.ts +8 -0
- package/dist/connect-accounts.d.ts +15 -0
- package/dist/connect-chooser.d.ts +18 -0
- package/dist/connect-panel.d.ts +18 -0
- package/dist/connect-setup.d.ts +18 -0
- package/dist/connect.d.ts +21 -0
- package/dist/connect.js +2149 -0
- package/dist/connect.js.map +1 -0
- package/dist/connection-catalog.d.ts +38 -0
- package/dist/connection-discovery.d.ts +12 -0
- package/dist/connection-installed.d.ts +17 -0
- package/dist/connection-logo.d.ts +9 -0
- package/dist/connection-service-logo.d.ts +8 -0
- package/dist/connection-service-presentation.d.ts +13 -0
- package/dist/connection-skeleton.d.ts +5 -0
- package/dist/connection-type-picker.d.ts +6 -0
- package/dist/conversation-timeline.d.ts +5 -0
- package/dist/desktop.d.ts +7 -0
- package/dist/desktop.js +27 -0
- package/dist/desktop.js.map +1 -0
- package/dist/device-authorization.d.ts +23 -0
- package/dist/diffs.d.ts +8 -0
- package/dist/diffs.js +15 -0
- package/dist/diffs.js.map +1 -0
- package/dist/discovery-cache.d.ts +5 -0
- package/dist/editor.d.ts +7 -0
- package/dist/editor.js +22 -0
- package/dist/editor.js.map +1 -0
- package/dist/embedded-new-voice-OCRNT6U5.js +18 -0
- package/dist/embedded-new-voice-OCRNT6U5.js.map +1 -0
- package/dist/embedded-voice-RPHPYVBT.js +18 -0
- package/dist/embedded-voice-RPHPYVBT.js.map +1 -0
- package/dist/{fleet-decision-row-GGCAT4E4.js → fleet-decision-row-SI63O5V4.js} +4 -1
- package/dist/fleet-decision-row-SI63O5V4.js.map +1 -0
- package/dist/hooks/latest-question.d.ts +25 -0
- package/dist/hooks/shared-machines-list.d.ts +4 -0
- package/dist/hooks/shared-query.d.ts +113 -0
- package/dist/hooks/use-attached-browsers.d.ts +1 -1
- package/dist/hooks/use-auth-runs.d.ts +1 -4
- package/dist/hooks/use-available-models.d.ts +1 -1
- package/dist/hooks/use-browser-frame-stream.d.ts +1 -1
- package/dist/hooks/use-browser-session.d.ts +12 -1
- package/dist/hooks/use-client-config-flags.d.ts +49 -0
- package/dist/hooks/use-codex-accounts.d.ts +59 -10
- package/dist/hooks/use-composer.d.ts +24 -2
- package/dist/hooks/use-computer-frame-stream.d.ts +1 -1
- package/dist/hooks/use-computer-input-posture.d.ts +13 -0
- package/dist/hooks/use-computer-session.d.ts +4 -0
- package/dist/hooks/use-connect.d.ts +23 -0
- package/dist/hooks/use-desktop-stream.d.ts +1 -1
- package/dist/hooks/use-file-attachments.d.ts +12 -0
- package/dist/hooks/use-goal.d.ts +2 -1
- package/dist/hooks/use-last-started-turn-policy.d.ts +5 -1
- package/dist/hooks/use-new-conversation.d.ts +56 -0
- package/dist/hooks/use-new-session-draft.d.ts +74 -0
- package/dist/hooks/use-realtime-voice-models.d.ts +7 -0
- package/dist/hooks/use-sandbox-files.d.ts +4 -1
- package/dist/hooks/use-session-conversation.d.ts +49 -0
- package/dist/hooks/use-session-events.d.ts +28 -7
- package/dist/hooks/use-session-mcp-approval-policy.d.ts +2 -2
- package/dist/hooks/use-session-model-account.d.ts +48 -0
- package/dist/hooks/use-supergrok-accounts.d.ts +7 -1
- package/dist/hooks/use-terminal-stream.d.ts +11 -5
- package/dist/hooks/use-usage.d.ts +40 -0
- package/dist/hooks/use-vaults.d.ts +53 -0
- package/dist/hooks/use-voice-input.d.ts +8 -1
- package/dist/hooks/use-workspace-edit.d.ts +4 -0
- package/dist/hooks/use-workspace-sessions.d.ts +22 -5
- package/dist/human-input-model.d.ts +122 -0
- package/dist/identity-link-accounts.d.ts +11 -0
- package/dist/identity-link-consent.d.ts +18 -0
- package/dist/index.d.ts +82 -20
- package/dist/index.js +2350 -6605
- package/dist/index.js.map +1 -1
- package/dist/interaction.d.ts +1 -1
- package/dist/interaction.js +14 -24
- package/dist/interaction.js.map +1 -1
- package/dist/latest-question-R77KWSUP.js +118 -0
- package/dist/latest-question-R77KWSUP.js.map +1 -0
- package/dist/lib/clipboard.d.ts +7 -0
- package/dist/lib/error-message.d.ts +7 -0
- package/dist/lib/format.d.ts +58 -4
- package/dist/lib/host-theme.d.ts +77 -0
- package/dist/lib/interaction-errors.d.ts +3 -0
- package/dist/lib/menu-styles.d.ts +22 -0
- package/dist/lib/notify-observer.d.ts +2 -0
- package/dist/lib/pierre-diffs-loader.d.ts +20 -0
- package/dist/lib/provider-recovery.d.ts +55 -0
- package/dist/lib/scrollbars.d.ts +11 -0
- package/dist/lib/terminal-input-readiness.d.ts +11 -0
- package/dist/lib/transient-retry.d.ts +25 -0
- package/dist/lib/workbench-peers.d.ts +36 -0
- package/dist/lib/xterm-theme.d.ts +7 -5
- package/dist/machines.js +9 -5
- package/dist/markdown-table-layout-3PV2UAAH.js +113 -0
- package/dist/markdown-table-layout-3PV2UAAH.js.map +1 -0
- package/dist/mcp-connection-status.d.ts +14 -0
- package/dist/model-mark-paths.d.ts +34 -0
- package/dist/model-mark-paths.js +16 -0
- package/dist/model-mark-paths.js.map +1 -0
- package/dist/model-picker-model.d.ts +111 -0
- package/dist/model-picker-model.js +25 -0
- package/dist/model-picker-model.js.map +1 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js +17 -0
- package/dist/model-policy-picker-menu-7GJ5URPR.js.map +1 -0
- package/dist/model-policy.d.ts +30 -3
- package/dist/model-policy.js +14 -1
- package/dist/native-previews.d.ts +28 -0
- package/dist/native-previews.js +82 -0
- package/dist/native-previews.js.map +1 -0
- package/dist/new-session-draft.d.ts +7 -0
- package/dist/new-session-draft.js +639 -0
- package/dist/new-session-draft.js.map +1 -0
- package/dist/notification-text.d.ts +27 -0
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js → noto-sans-arabic-loader-XSH2KYWJ.js} +3 -1
- package/dist/{noto-sans-arabic-loader-IA2T4X2A.js.map → noto-sans-arabic-loader-XSH2KYWJ.js.map} +1 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js → noto-sans-jp-loader.generated-MR5L6V7K.js} +3 -1
- package/dist/{noto-sans-jp-loader.generated-HFGLYBR3.js.map → noto-sans-jp-loader.generated-MR5L6V7K.js.map} +1 -1
- package/dist/older-history.d.ts +3 -2
- package/dist/organization-model.d.ts +32 -0
- package/dist/organization-model.js +65 -0
- package/dist/organization-model.js.map +1 -0
- package/dist/{platform-activity-row-BJHUHXAT.js → platform-activity-row-5OCKOQWZ.js} +16 -78
- package/dist/platform-activity-row-5OCKOQWZ.js.map +1 -0
- package/dist/plugin-details.d.ts +14 -0
- package/dist/plugin-discovery.d.ts +25 -0
- package/dist/preview-loading-paint.d.ts +20 -0
- package/dist/provider.d.ts +25 -2
- package/dist/queue-presentation-model.d.ts +72 -0
- package/dist/queue-presentation-model.js +38 -0
- package/dist/queue-presentation-model.js.map +1 -0
- package/dist/{queue-surface-implementation-BSKUWHRI.js → queue-surface-implementation-GJBH7NKO.js} +65 -265
- package/dist/queue-surface-implementation-GJBH7NKO.js.map +1 -0
- package/dist/realtime/embedded-new-voice.d.ts +1 -0
- package/dist/realtime/embedded-voice.d.ts +1 -0
- package/dist/realtime/realtime-control.d.ts +4 -65
- package/dist/realtime/session-realtime.d.ts +78 -0
- package/dist/realtime.js +25 -1294
- package/dist/realtime.js.map +1 -1
- package/dist/sandbox-files-O27IPOZW.js +21 -0
- package/dist/sandbox-files-O27IPOZW.js.map +1 -0
- package/dist/sandbox-label-model.d.ts +30 -0
- package/dist/sandbox-label-model.js +20 -0
- package/dist/sandbox-label-model.js.map +1 -0
- package/dist/scrollbars.d.ts +1 -0
- package/dist/scrollbars.js +10 -0
- package/dist/scrollbars.js.map +1 -0
- package/dist/secret-reference-label.d.ts +14 -0
- package/dist/secrets-ui.d.ts +57 -0
- package/dist/session-agents-model.d.ts +10 -0
- package/dist/session-agents-model.js +25 -0
- package/dist/session-agents-model.js.map +1 -0
- package/dist/session-attention-model.d.ts +8 -0
- package/dist/session-attention-model.js +47 -0
- package/dist/session-attention-model.js.map +1 -0
- package/dist/session-auth-recommendation.d.ts +5 -0
- package/dist/session-capability-policy.d.ts +31 -0
- package/dist/session-feedback-model.d.ts +20 -0
- package/dist/session-feedback-model.js +56 -0
- package/dist/session-feedback-model.js.map +1 -0
- package/dist/session-list-model.d.ts +138 -0
- package/dist/session-list-model.js +274 -0
- package/dist/session-list-model.js.map +1 -0
- package/dist/session-realtime-7DJOIHQW.js +21 -0
- package/dist/session-realtime-7DJOIHQW.js.map +1 -0
- package/dist/session-realtime.d.ts +7 -0
- package/dist/session-realtime.js +19 -0
- package/dist/session-realtime.js.map +1 -0
- package/dist/session-status-model.d.ts +36 -0
- package/dist/session-ui.d.ts +39 -1
- package/dist/session-ui.js +126 -12
- package/dist/session-ui.js.map +1 -1
- package/dist/session.d.ts +8 -2
- package/dist/session.js +35 -20
- package/dist/site-snapshot.d.ts +14 -0
- package/dist/sites-ui.d.ts +24 -0
- package/dist/sites.d.ts +3 -0
- package/dist/sites.js +14 -0
- package/dist/sites.js.map +1 -0
- package/dist/skill-discovery.d.ts +47 -0
- package/dist/terminal.d.ts +8 -0
- package/dist/terminal.js +32 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing/session-scenarios.d.ts +10 -0
- package/dist/testing/session-scenarios.js +367 -0
- package/dist/testing/session-scenarios.js.map +1 -0
- package/dist/timeline/activity-rail.d.ts +11 -2
- package/dist/timeline/agent-identity.d.ts +30 -0
- package/dist/timeline/agent-row.d.ts +31 -0
- package/dist/timeline/allowance-exhausted-row.d.ts +24 -0
- package/dist/timeline/compaction-copy.d.ts +46 -0
- package/dist/timeline/entrance.d.ts +13 -1
- package/dist/timeline/focus-sequence.d.ts +9 -0
- package/dist/timeline/genie-copy.d.ts +3 -0
- package/dist/timeline/genie-loading.d.ts +47 -0
- package/dist/timeline/index.d.ts +10 -5
- package/dist/timeline/knowledge-receipt.d.ts +17 -0
- package/dist/timeline/message-sender.d.ts +19 -0
- package/dist/timeline/notice-presentation.d.ts +13 -0
- package/dist/timeline/parsers.d.ts +11 -0
- package/dist/timeline/patch-apply-command.d.ts +18 -0
- package/dist/timeline/platform-activity-presentation.d.ts +21 -0
- package/dist/timeline/platform-activity-row.d.ts +1 -2
- package/dist/timeline/presented-image.d.ts +11 -0
- package/dist/timeline/projection.d.ts +31 -2
- package/dist/timeline/provider-logo.d.ts +15 -0
- package/dist/timeline/question-nav-model.d.ts +23 -0
- package/dist/timeline/registry.d.ts +12 -1
- package/dist/timeline/retained-image.d.ts +18 -0
- package/dist/timeline/retained-loaders.d.ts +27 -0
- package/dist/timeline/rolling-activity.d.ts +11 -0
- package/dist/timeline/screenshot-lightbox.d.ts +23 -1
- package/dist/timeline/session-usage-limit-row.d.ts +11 -0
- package/dist/timeline/shared.d.ts +4 -1
- package/dist/timeline/startup-dispatch-details.d.ts +5 -0
- package/dist/timeline/startup-preference.d.ts +3 -0
- package/dist/timeline/startup-timings.d.ts +4 -0
- package/dist/timeline/tool-display-name.d.ts +5 -2
- package/dist/timeline/tool-presentation.d.ts +172 -0
- package/dist/timeline/turn-summary-model.d.ts +95 -0
- package/dist/timeline/turn-summary.d.ts +20 -54
- package/dist/timeline/types.d.ts +179 -7
- package/dist/timeline/work-presentation.d.ts +60 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js +166 -0
- package/dist/timeline-annotation-markers-U3G66KUD.js.map +1 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js +242 -0
- package/dist/timeline-annotation-selection-BI7QTPTZ.js.map +1 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js +274 -0
- package/dist/timeline-annotations-dialog-FOMHSDTE.js.map +1 -0
- package/dist/timeline-model.d.ts +29 -0
- package/dist/timeline-model.js +254 -0
- package/dist/timeline-model.js.map +1 -0
- package/dist/usage/allowance-copy.d.ts +25 -0
- package/dist/usage/session-usage-limit.d.ts +88 -0
- package/dist/usage/summary.d.ts +35 -0
- package/dist/usage.d.ts +17 -0
- package/dist/usage.js +1187 -0
- package/dist/usage.js.map +1 -0
- package/dist/voice-recording-owner.d.ts +7 -0
- package/package.json +107 -7
- package/src/accounts.tsx +116 -14
- package/src/approvals.ts +8 -1
- package/src/artifacts-spreadsheet.ts +1 -0
- package/src/artifacts.ts +44 -0
- package/src/assets/README.md +8 -0
- package/src/assets/gmail.ico +0 -0
- package/src/assets/outlook.ico +0 -0
- package/src/capability-catalog-row.tsx +94 -0
- package/src/capability-logo-fallback.ts +22 -0
- package/src/client.ts +20 -31
- package/src/commands/registry.ts +18 -15
- package/src/commands/types.ts +2 -0
- package/src/components/anthropic-mark.tsx +10 -0
- package/src/components/approval-surface.tsx +401 -138
- package/src/components/artifacts/artifact-chrome.tsx +413 -0
- package/src/components/artifacts/artifact-sandbox.tsx +189 -0
- package/src/components/artifacts/artifact-surface.tsx +40 -20
- package/src/components/artifacts/chat-interactive-block.tsx +260 -0
- package/src/components/artifacts/deferred-chat-media.tsx +67 -0
- package/src/components/artifacts/document-editor.tsx +141 -16
- package/src/components/artifacts/editable-artifact-ui.tsx +4 -2
- package/src/components/artifacts/editable-artifact-view.tsx +197 -0
- package/src/components/artifacts/editable-artifact-workbench.tsx +5 -2
- package/src/components/artifacts/editable-document.tsx +37 -36
- package/src/components/artifacts/editable-presentation.tsx +36 -18
- package/src/components/artifacts/editable-spreadsheet.tsx +543 -103
- package/src/components/artifacts/index.ts +45 -0
- package/src/components/artifacts/inline-html-document.ts +24 -0
- package/src/components/artifacts/latest-task-runner.ts +49 -0
- package/src/components/artifacts/presentation-editor.tsx +323 -67
- package/src/components/artifacts/published-html-artifact-frame.tsx +122 -5
- package/src/components/artifacts/session-artifact-viewer.tsx +378 -0
- package/src/components/artifacts/site-view.tsx +121 -0
- package/src/components/artifacts/spreadsheet-canvas.ts +5 -10
- package/src/components/artifacts/spreadsheet-command-queue.ts +184 -0
- package/src/components/artifacts/spreadsheet-download.tsx +109 -0
- package/src/components/artifacts/spreadsheet-general-display.ts +43 -0
- package/src/components/artifacts/spreadsheet-grid.tsx +344 -144
- package/src/components/artifacts/spreadsheet-resize.tsx +421 -0
- package/src/components/artifacts/spreadsheet-submissions.tsx +46 -0
- package/src/components/artifacts/visualization-assets/base.css +1015 -0
- package/src/components/artifacts/visualization-assets/helpers.html +349 -0
- package/src/components/artifacts/visualization-assets.gen.ts +3 -0
- package/src/components/browser-select-control.tsx +312 -0
- package/src/components/browser-viewer.tsx +778 -318
- package/src/components/chat-composer.tsx +47 -5
- package/src/components/child-session-link.tsx +36 -0
- package/src/components/claude-mark.tsx +11 -0
- package/src/components/code-editor.tsx +13 -16
- package/src/components/composer-transcription-control.tsx +128 -30
- package/src/components/composer.tsx +404 -195
- package/src/components/computer-viewer.tsx +880 -253
- package/src/components/copy-button.tsx +13 -5
- package/src/components/desktop-viewer.tsx +1 -1
- package/src/components/enrollment-consent.tsx +1 -1
- package/src/components/enrollment-device-flow.tsx +1 -1
- package/src/components/file-browser.tsx +10 -14
- package/src/components/fleet-tile.tsx +9 -18
- package/src/components/generated-video-player.tsx +4 -2
- package/src/components/grok-mark.tsx +34 -0
- package/src/components/human-input-form.tsx +590 -283
- package/src/components/human-input-surface.tsx +11 -0
- package/src/components/interaction-intervention-banner.tsx +2 -2
- package/src/components/linkified-text.tsx +79 -0
- package/src/components/machine-card.tsx +35 -78
- package/src/components/machine-dock-bar.tsx +1 -1
- package/src/components/machine-input-display.ts +197 -3
- package/src/components/machines/agent-status-icon.tsx +31 -0
- package/src/components/machines/machine-detail.tsx +200 -31
- package/src/components/machines/machine-operation-policy.tsx +1 -1
- package/src/components/machines/machine-status.ts +241 -0
- package/src/components/machines-dashboard.tsx +2 -17
- package/src/components/markdown-table-layout.ts +143 -0
- package/src/components/markdown.tsx +466 -129
- package/src/components/message-timeline.tsx +2567 -728
- package/src/components/model-mark.tsx +102 -0
- package/src/components/model-picker.tsx +15 -4
- package/src/components/model-policy-picker-menu.tsx +371 -0
- package/src/components/model-policy-picker.tsx +256 -412
- package/src/components/new-conversation.tsx +221 -0
- package/src/components/open-geni-chat.tsx +309 -0
- package/src/components/open-geni-links.tsx +179 -0
- package/src/components/openrouter-mark.tsx +13 -0
- package/src/components/opper-mark.tsx +18 -0
- package/src/components/pierre-diff.tsx +41 -16
- package/src/components/pierre-file.tsx +35 -10
- package/src/components/preview-loading.tsx +109 -0
- package/src/components/provider-recovery-notice.tsx +49 -0
- package/src/components/queue-item-content.ts +14 -0
- package/src/components/queue-surface-implementation.tsx +51 -356
- package/src/components/queue-surface-state.tsx +3 -1
- package/src/components/rehype-secret-refs.ts +98 -0
- package/src/components/remark-soft-line-breaks.ts +166 -0
- package/src/components/sandbox-files.tsx +91 -15
- package/src/components/sandbox-terminal.tsx +84 -13
- package/src/components/sandbox-workspace.tsx +147 -51
- package/src/components/secret-question-field.tsx +324 -0
- package/src/components/secret-ref-chip.tsx +185 -0
- package/src/components/session-capability-frame.tsx +197 -0
- package/src/components/session-chrome.tsx +842 -251
- package/src/components/session-commands-panel.tsx +126 -0
- package/src/components/session-commands.tsx +18 -0
- package/src/components/session-connection-request.tsx +97 -0
- package/src/components/session-conversation.tsx +876 -0
- package/src/components/session-list.tsx +257 -0
- package/src/components/session-mcp-capability-card.tsx +680 -0
- package/src/components/session-proxy-scope.tsx +153 -0
- package/src/components/session-status.tsx +26 -17
- package/src/components/session-usage-limit-notice.tsx +174 -0
- package/src/components/timeline-anchor.tsx +119 -0
- package/src/components/timeline-annotation-chrome.tsx +196 -0
- package/src/components/timeline-annotation-layout.ts +268 -0
- package/src/components/timeline-annotation-markers.tsx +185 -0
- package/src/components/timeline-annotation-reveal-context.ts +9 -0
- package/src/components/timeline-annotation-selection.tsx +106 -54
- package/src/components/timeline-annotation-shared.ts +245 -0
- package/src/components/timeline-annotations-dialog.tsx +185 -128
- package/src/components/timeline-annotations.tsx +189 -45
- package/src/components/timeline-reading-progress.ts +80 -0
- package/src/components/timeline-search.tsx +168 -0
- package/src/components/timeline-settlement.ts +60 -0
- package/src/components/tip-follow.ts +52 -0
- package/src/components/tool-action-review.tsx +650 -0
- package/src/components/tool-review-history.tsx +88 -0
- package/src/components/tooltip.tsx +38 -5
- package/src/components/usage-limit-notice.tsx +179 -0
- package/src/components/usage-member-list.tsx +792 -0
- package/src/components/usage-meter.tsx +382 -0
- package/src/components/use-viewer-menu-dismiss.ts +33 -0
- package/src/components/user-message-body.tsx +27 -2
- package/src/components/workspace-dock.tsx +18 -1
- package/src/composer-messages.ts +150 -0
- package/src/composer-voice-events.ts +12 -0
- package/src/composer.ts +6 -1
- package/src/connect-account-identity.tsx +34 -0
- package/src/connect-accounts.tsx +233 -0
- package/src/connect-chooser.tsx +336 -0
- package/src/connect-panel.tsx +99 -0
- package/src/connect-setup.tsx +355 -0
- package/src/connect.ts +60 -0
- package/src/connection-assets.d.ts +4 -0
- package/src/connection-catalog.tsx +162 -0
- package/src/connection-discovery.tsx +238 -0
- package/src/connection-installed.tsx +51 -0
- package/src/connection-logo.tsx +37 -0
- package/src/connection-service-logo.tsx +55 -0
- package/src/connection-service-presentation.ts +46 -0
- package/src/connection-skeleton.tsx +16 -0
- package/src/connection-type-picker.tsx +36 -0
- package/src/conversation-timeline.ts +92 -0
- package/src/desktop.ts +24 -0
- package/src/device-authorization.tsx +98 -0
- package/src/diffs.ts +16 -0
- package/src/discovery-cache.ts +42 -0
- package/src/editor.ts +13 -0
- package/src/hooks/internal.ts +3 -2
- package/src/hooks/latest-question.ts +164 -0
- package/src/hooks/shared-machines-list.ts +34 -1
- package/src/hooks/shared-query.ts +721 -0
- package/src/hooks/use-attached-browsers.ts +1 -1
- package/src/hooks/use-auth-runs.ts +0 -27
- package/src/hooks/use-available-models.ts +21 -15
- package/src/hooks/use-browser-frame-stream.ts +19 -2
- package/src/hooks/use-browser-session.ts +680 -205
- package/src/hooks/use-browser-sessions.ts +32 -1
- package/src/hooks/use-client-config-flags.ts +118 -0
- package/src/hooks/use-codex-accounts.ts +247 -47
- package/src/hooks/use-composer.ts +276 -47
- package/src/hooks/use-computer-frame-stream.ts +25 -7
- package/src/hooks/use-computer-input-posture.ts +94 -0
- package/src/hooks/use-computer-session.ts +409 -95
- package/src/hooks/use-connect.ts +23 -0
- package/src/hooks/use-desktop-stream.ts +19 -28
- package/src/hooks/use-file-attachments.ts +80 -4
- package/src/hooks/use-goal.ts +107 -13
- package/src/hooks/use-last-started-turn-policy.ts +46 -14
- package/src/hooks/use-machines.ts +4 -0
- package/src/hooks/use-new-conversation.ts +374 -0
- package/src/hooks/use-new-session-draft.ts +813 -0
- package/src/hooks/use-realtime-voice-models.ts +46 -0
- package/src/hooks/use-sandbox-files.ts +68 -20
- package/src/hooks/use-session-background-commands.ts +22 -11
- package/src/hooks/use-session-capabilities.ts +3 -2
- package/src/hooks/use-session-conversation.ts +150 -0
- package/src/hooks/use-session-events.ts +703 -382
- package/src/hooks/use-session-lineage.ts +20 -16
- package/src/hooks/use-session-mcp-approval-policy.ts +13 -5
- package/src/hooks/use-session-model-account.ts +174 -0
- package/src/hooks/use-session.ts +53 -21
- package/src/hooks/use-slash-commands.ts +6 -11
- package/src/hooks/use-supergrok-accounts.ts +22 -8
- package/src/hooks/use-terminal-stream.ts +153 -27
- package/src/hooks/use-transcription.ts +6 -0
- package/src/hooks/use-turn-queue.ts +2 -1
- package/src/hooks/use-usage.ts +100 -0
- package/src/hooks/use-vaults.ts +153 -0
- package/src/hooks/use-video-artifact-playback.ts +1 -1
- package/src/hooks/use-voice-input.ts +127 -19
- package/src/hooks/use-workspace-capture.ts +3 -2
- package/src/hooks/use-workspace-edit.ts +23 -5
- package/src/hooks/use-workspace-sessions.ts +97 -32
- package/src/human-input-model.ts +359 -0
- package/src/identity-link-accounts.tsx +148 -0
- package/src/identity-link-consent.tsx +192 -0
- package/src/index.ts +262 -16
- package/src/interaction.ts +1 -0
- package/src/lib/clipboard.ts +29 -0
- package/src/lib/error-message.ts +37 -0
- package/src/lib/format.ts +213 -16
- package/src/lib/host-theme.ts +529 -0
- package/src/lib/interaction-errors.ts +15 -0
- package/src/lib/menu-styles.ts +44 -0
- package/src/lib/notify-observer.ts +15 -0
- package/src/lib/pierre-diffs-loader.ts +53 -0
- package/src/lib/provider-recovery.ts +243 -0
- package/src/lib/scrollbars.ts +30 -0
- package/src/lib/terminal-input-readiness.ts +51 -0
- package/src/lib/transient-retry.ts +99 -0
- package/src/lib/workbench-peers.ts +62 -0
- package/src/lib/xterm-theme.ts +23 -21
- package/src/mcp-connection-status.ts +35 -0
- package/src/model-mark-paths.ts +53 -0
- package/src/model-picker-model.ts +330 -0
- package/src/model-policy.ts +299 -74
- package/src/native-previews.ts +100 -0
- package/src/new-session-draft.ts +22 -0
- package/src/notification-text.ts +81 -0
- package/src/older-history.ts +22 -4
- package/src/organization-model.ts +118 -0
- package/src/plugin-details.tsx +185 -0
- package/src/plugin-discovery.tsx +196 -0
- package/src/preview-loading-paint.ts +68 -0
- package/src/provider.tsx +74 -15
- package/src/queue-presentation-model.ts +464 -0
- package/src/realtime/dropdown-menu.tsx +19 -12
- package/src/realtime/embedded-new-voice.tsx +1 -0
- package/src/realtime/embedded-voice.tsx +3 -0
- package/src/realtime/realtime-control.tsx +138 -501
- package/src/realtime/session-realtime.ts +566 -0
- package/src/sandbox-label-model.ts +53 -0
- package/src/scrollbars.ts +3 -0
- package/src/secret-reference-label.ts +43 -0
- package/src/secrets-ui.tsx +59 -0
- package/src/session-agents-model.ts +33 -0
- package/src/session-attention-model.ts +62 -0
- package/src/session-auth-recommendation.ts +48 -0
- package/src/session-capability-policy.ts +196 -0
- package/src/session-context.ts +3 -4
- package/src/session-feedback-model.ts +95 -0
- package/src/session-list-model.ts +434 -0
- package/src/session-realtime.ts +18 -0
- package/src/session-status-model.ts +99 -0
- package/src/session-ui.ts +98 -1
- package/src/session.ts +17 -1
- package/src/site-snapshot.ts +74 -0
- package/src/sites-ui.tsx +348 -0
- package/src/sites.ts +3 -0
- package/src/skill-discovery.tsx +208 -0
- package/src/terminal.ts +26 -0
- package/src/testing/session-scenarios.ts +404 -0
- package/src/timeline/activity-rail.tsx +242 -101
- package/src/timeline/agent-identity.tsx +84 -0
- package/src/timeline/agent-row.tsx +231 -0
- package/src/timeline/allowance-exhausted-row.tsx +86 -0
- package/src/timeline/compaction-copy.ts +115 -0
- package/src/timeline/entrance.tsx +28 -3
- package/src/timeline/fleet-decision-projection.ts +2 -1
- package/src/timeline/fleet-decision-row.tsx +1 -0
- package/src/timeline/focus-sequence.ts +44 -0
- package/src/timeline/genie-copy.ts +19 -0
- package/src/timeline/genie-loading.tsx +143 -0
- package/src/timeline/index.ts +30 -2
- package/src/timeline/knowledge-receipt.tsx +100 -0
- package/src/timeline/message-sender.tsx +71 -0
- package/src/timeline/notice-presentation.ts +48 -0
- package/src/timeline/parsers.ts +42 -2
- package/src/timeline/patch-apply-command.tsx +135 -0
- package/src/timeline/platform-activity-presentation.ts +166 -0
- package/src/timeline/platform-activity-row.tsx +15 -90
- package/src/timeline/presented-image.ts +63 -0
- package/src/timeline/projection.ts +1746 -76
- package/src/timeline/provider-logo.tsx +53 -0
- package/src/timeline/question-nav-model.ts +28 -0
- package/src/timeline/registry.ts +26 -4
- package/src/timeline/retained-image.ts +97 -0
- package/src/timeline/retained-loaders.ts +91 -0
- package/src/timeline/rolling-activity.tsx +80 -0
- package/src/timeline/screenshot-lightbox.tsx +228 -5
- package/src/timeline/session-usage-limit-row.tsx +42 -0
- package/src/timeline/shared.tsx +42 -15
- package/src/timeline/startup-dispatch-details.tsx +36 -0
- package/src/timeline/startup-preference.ts +33 -0
- package/src/timeline/startup-timings.tsx +145 -0
- package/src/timeline/tool-display-name.ts +19 -7
- package/src/timeline/tool-presentation.ts +1316 -0
- package/src/timeline/tool-renderers.tsx +835 -1138
- package/src/timeline/turn-summary-model.ts +343 -0
- package/src/timeline/turn-summary.tsx +272 -365
- package/src/timeline/types.ts +189 -6
- package/src/timeline/work-presentation.ts +189 -0
- package/src/timeline-model.ts +143 -0
- package/src/usage/allowance-copy.ts +64 -0
- package/src/usage/session-usage-limit.ts +266 -0
- package/src/usage/summary.ts +93 -0
- package/src/usage.ts +70 -0
- package/src/voice-recording-owner.ts +22 -0
- package/styles/compiled.css +2319 -748
- package/styles/connect.css +290 -0
- package/styles/connect.d.ts +1 -0
- package/styles/effective-tokens.css +1 -0
- package/styles/index.css +309 -9
- package/styles/responsive.css +99 -7
- package/styles/session-capability.css +44 -0
- package/styles/tokens.css +134 -66
- package/dist/browser-viewer-AEFHUYZK.js +0 -14
- package/dist/chunk-4MDLEHXL.js.map +0 -1
- package/dist/chunk-5YK2ZDIG.js.map +0 -1
- package/dist/chunk-D3UIAJKY.js.map +0 -1
- package/dist/chunk-ELIYWBZR.js.map +0 -1
- package/dist/chunk-H5YGYNXS.js.map +0 -1
- package/dist/chunk-HQVCKCLG.js +0 -9458
- package/dist/chunk-HQVCKCLG.js.map +0 -1
- package/dist/chunk-HUIKIDM5.js.map +0 -1
- package/dist/chunk-ICA6R6TW.js.map +0 -1
- package/dist/chunk-JVYQRRC4.js.map +0 -1
- package/dist/chunk-KCGXPP5V.js.map +0 -1
- package/dist/chunk-KZ73RL76.js.map +0 -1
- package/dist/chunk-LAKLF4PA.js +0 -141
- package/dist/chunk-LAKLF4PA.js.map +0 -1
- package/dist/chunk-MZ2G2XBA.js.map +0 -1
- package/dist/chunk-NEXLLTP4.js.map +0 -1
- package/dist/chunk-OAM4WAAM.js.map +0 -1
- package/dist/chunk-PEI6RANI.js.map +0 -1
- package/dist/chunk-RGALCTWO.js.map +0 -1
- package/dist/chunk-W6NFJXSA.js +0 -454
- package/dist/chunk-W6NFJXSA.js.map +0 -1
- package/dist/chunk-WSK7G5LE.js +0 -170
- package/dist/chunk-WSK7G5LE.js.map +0 -1
- package/dist/chunk-X4A66EWZ.js +0 -223
- package/dist/chunk-X4A66EWZ.js.map +0 -1
- package/dist/chunk-XXWH2JLC.js.map +0 -1
- package/dist/chunk-YFKJ7VZH.js +0 -268
- package/dist/chunk-YFKJ7VZH.js.map +0 -1
- package/dist/chunk-YJFGAFBD.js.map +0 -1
- package/dist/computer-viewer-FWEZISW4.js +0 -16
- package/dist/fleet-decision-row-GGCAT4E4.js.map +0 -1
- package/dist/hooks/use-environments.d.ts +0 -41
- package/dist/hooks/use-packs.d.ts +0 -32
- package/dist/platform-activity-row-BJHUHXAT.js.map +0 -1
- package/dist/queue-surface-implementation-BSKUWHRI.js.map +0 -1
- package/dist/timeline-annotation-selection-3L7LHGG2.js +0 -187
- package/dist/timeline-annotation-selection-3L7LHGG2.js.map +0 -1
- package/dist/timeline-annotations-dialog-U7EVLR75.js +0 -196
- package/dist/timeline-annotations-dialog-U7EVLR75.js.map +0 -1
- package/src/hooks/use-environments.ts +0 -182
- package/src/hooks/use-packs.ts +0 -157
- /package/dist/{browser-viewer-AEFHUYZK.js.map → browser-viewer-ZWR6MWJ7.js.map} +0 -0
- /package/dist/{computer-viewer-FWEZISW4.js.map → chat-interactive-block-BO2IWXVK.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/artifacts/spreadsheet-grid.tsx","../src/components/artifacts/spreadsheet-command-queue.ts","../src/components/artifacts/spreadsheet-general-display.ts","../src/components/artifacts/spreadsheet-canvas.ts","../src/components/artifacts/spreadsheet-resize.tsx","../src/components/artifacts/editable-spreadsheet.tsx","../src/components/artifacts/spreadsheet-download.tsx","../src/components/artifacts/spreadsheet-submissions.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 useSpreadsheetCommandQueue,\n type SpreadsheetCommandTarget,\n} from \"./spreadsheet-command-queue\";\nimport {\n SparseSpreadsheetCellIndex,\n SpreadsheetCanvasRenderer,\n spreadsheetCanvasDevicePixelRatio,\n type SpreadsheetCanvasAxis,\n type SpreadsheetCanvasCellFormat,\n type SpreadsheetCanvasProjection,\n type SpreadsheetCanvasTheme,\n} from \"./spreadsheet-canvas\";\nimport {\n formatSpreadsheetGeneralDisplay,\n spreadsheetCellEditSource,\n} from \"./spreadsheet-general-display\";\nimport {\n SpreadsheetResizeHandle,\n useSpreadsheetResizing,\n type SpreadsheetDimensionCommit,\n} from \"./spreadsheet-resize\";\n\nexport type { SpreadsheetDimensionCommit } from \"./spreadsheet-resize\";\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;\nconst EMPTY_DIMENSIONS: readonly (readonly [number, number])[] = [];\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 onResize?: ((change: SpreadsheetDimensionCommit) => 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 resize?: ((change: SpreadsheetDimensionCommit) => void | Promise<void>) | undefined;\n /** Server-unacknowledged changes, distinct from local command acceptance. */\n pendingTransactions?: number | undefined;\n syncStatus?: string | undefined;\n syncError?: string | 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 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\", \"#545454\");\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 border border-og-primary-border bg-og-primary text-og-primary-fg px-3 py-1.5 text-og-sm font-medium hover:bg-og-primary-hover\"\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 onResize,\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 ?? spreadsheetCellEditSource(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 const resize = useCallback(\n (change: SpreadsheetDimensionCommit) => {\n if (change.axis === \"column\") worksheet.setColumnWidth(change.index, change.size);\n else worksheet.setRowHeight(change.index, change.size);\n onResize?.(change);\n },\n [onResize, 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 resize={resize}\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 resize,\n pendingTransactions = 0,\n syncStatus,\n syncError,\n onCommandError,\n onViewportChange,\n className,\n}: SpreadsheetProjectionGridProps) {\n const { revision, rowCount, columnCount } = projection;\n const editable = !readOnly && commit !== undefined;\n const commandQueue = useSpreadsheetCommandQueue({\n scopeKey: `${projection.sheetId}:${projection.generationId ?? \"none\"}`,\n enabled: editable,\n onCommandError,\n });\n const [commandFailure, setCommandFailure] = useState<{\n message: string;\n retry?: (() => void) | undefined;\n } | null>(null);\n const clearPreflightFailure = commandQueue.clearPreflightFailure;\n const clearCommandFailure = useCallback(() => {\n setCommandFailure(null);\n clearPreflightFailure();\n }, [clearPreflightFailure]);\n const resizing = useSpreadsheetResizing({\n sheetId: projection.sheetId,\n generationId: projection.generationId,\n revision: projection.dimensionRevision ?? revision,\n rowHeights: projection.rowHeights ?? EMPTY_DIMENSIONS,\n columnWidths: projection.columnWidths ?? EMPTY_DIMENSIONS,\n defaultRowHeight: projection.defaultRowHeight ?? 24,\n defaultColumnWidth: projection.defaultColumnWidth ?? 96,\n enabled: !readOnly && resize !== undefined,\n commit: resize,\n onCommandError,\n onStart: clearCommandFailure,\n });\n const dimensionRevision = `${projection.dimensionRevision ?? 0}:${resizing.previewKey}`;\n const rows = useMemo(() => {\n return buildAxis(rowCount, projection.defaultRowHeight ?? 24, resizing.rowHeights);\n }, [projection.defaultRowHeight, resizing.rowHeights, rowCount]);\n const columns = useMemo(() => {\n return buildAxis(columnCount, projection.defaultColumnWidth ?? 96, resizing.columnWidths);\n }, [columnCount, resizing.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 visibleCommandFailure =\n resizing.error ??\n commandQueue.error ??\n commandFailure ??\n (syncError ? { message: syncError, retry: undefined } : null);\n const pendingCommandCount =\n commandQueue.pendingCount + resizing.pendingCount + pendingTransactions;\n const visibleSyncStatus =\n pendingCommandCount > 0 && (!syncStatus || syncStatus === \"Saved\" || syncStatus === \"Read only\")\n ? \"Saving…\"\n : syncStatus;\n const runQueuedCommand = commandQueue.run;\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 optimisticInputsRef = useRef(\n new Map<\n string,\n {\n row: number;\n col: number;\n input: string;\n baseRevision: string | number;\n commandId: number;\n pending: boolean;\n }\n >(),\n );\n const [optimisticEpoch, setOptimisticEpoch] = useState(0);\n const refreshOptimisticInputs = useCallback(() => setOptimisticEpoch((value) => value + 1), []);\n const optimisticScope = `${projection.sheetId}:${projection.generationId ?? \"none\"}`;\n const optimisticScopeRef = useRef(optimisticScope);\n if (optimisticScopeRef.current !== optimisticScope) {\n optimisticScopeRef.current = optimisticScope;\n optimisticInputsRef.current.clear();\n }\n const projectionRef = useRef(projection);\n projectionRef.current = projection;\n const editModeRef = useRef(editMode);\n editModeRef.current = editMode;\n const canvasRendererRef = useRef<SpreadsheetCanvasRenderer | null>(null);\n if (!canvasRendererRef.current) canvasRendererRef.current = new SpreadsheetCanvasRenderer();\n const reactId = useId().replaceAll(\":\", \"\");\n const readEditInput = useCallback(\n (cell: CellCoordinate) =>\n optimisticInputsRef.current.get(`${cell.row}:${cell.col}`)?.input ??\n projectionRef.current.readCell(cell.row, cell.col)?.input ??\n \"\",\n [],\n );\n const forgetOptimisticInputs = useCallback(\n (target: SpreadsheetCommandTarget) => {\n let changed = false;\n for (const [key, entry] of optimisticInputsRef.current) {\n if (\n entry.row >= target.top &&\n entry.row <= target.bottom &&\n entry.col >= target.left &&\n entry.col <= target.right\n ) {\n optimisticInputsRef.current.delete(key);\n changed = true;\n }\n }\n if (changed) refreshOptimisticInputs();\n },\n [refreshOptimisticInputs],\n );\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 const next = {\n sheetId: projection.sheetId,\n anchor: { row: 0, col: 0 },\n focus: { row: 0, col: 0 },\n };\n optimisticInputsRef.current.clear();\n setCommandFailure(null);\n setEditMode(null);\n updateSelection(next);\n }, [projection.sheetId, selection.sheetId, updateSelection]);\n\n useEffect(() => {\n optimisticInputsRef.current.clear();\n refreshOptimisticInputs();\n }, [projection.generationId, projection.sheetId, refreshOptimisticInputs]);\n\n useClientLayoutEffect(() => {\n let changed = false;\n for (const [key, optimistic] of optimisticInputsRef.current) {\n const coverage = projection.coverage;\n const covered =\n !coverage ||\n (optimistic.row >= coverage.rowStart &&\n optimistic.row < coverage.rowEnd &&\n optimistic.col >= coverage.columnStart &&\n optimistic.col < coverage.columnEnd);\n if (\n !optimistic.pending &&\n covered &&\n (projection.readCell(optimistic.row, optimistic.col)?.input === optimistic.input ||\n revision !== optimistic.baseRevision)\n ) {\n optimisticInputsRef.current.delete(key);\n changed = true;\n }\n }\n if (changed) refreshOptimisticInputs();\n if (editMode === null) setDraft(readEditInput(selection.focus));\n }, [\n commandQueue.pendingCount,\n editMode,\n projection,\n readEditInput,\n revision,\n selection.focus,\n refreshOptimisticInputs,\n optimisticEpoch,\n ]);\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 (\n invoke: (id: number) => void | Promise<void>,\n retry: () => void,\n rollback: (id: number) => void,\n target?: SpreadsheetCommandTarget | (() => SpreadsheetCommandTarget),\n accepted?: (id: number) => void,\n ) => {\n setCommandFailure(null);\n runQueuedCommand(invoke, retry, rollback, target, accepted);\n },\n [runQueuedCommand],\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 const retryFocus = selectionRef.current.focus;\n if (\n editModeRef.current === null &&\n retryFocus.row === next.cell.row &&\n retryFocus.col === next.cell.col\n ) {\n setDraft(input);\n }\n const key = `${next.cell.row}:${next.cell.col}`;\n runCommand(\n (commandId) => {\n optimisticInputsRef.current.set(key, {\n ...next.cell,\n input,\n baseRevision: revision,\n commandId,\n pending: true,\n });\n refreshOptimisticInputs();\n return commit(next);\n },\n execute,\n (commandId) => {\n if (optimisticInputsRef.current.get(key)?.commandId !== commandId) return;\n optimisticInputsRef.current.delete(key);\n refreshOptimisticInputs();\n const current = selectionRef.current.focus;\n if (\n editModeRef.current === null &&\n current.row === next.cell.row &&\n current.col === next.cell.col\n ) {\n setDraft(readEditInput(current));\n }\n },\n { top: next.cell.row, bottom: next.cell.row, left: next.cell.col, right: next.cell.col },\n (commandId) => {\n const optimistic = optimisticInputsRef.current.get(key);\n if (optimistic?.commandId === commandId) {\n optimistic.pending = false;\n optimistic.baseRevision = projectionRef.current.revision;\n refreshOptimisticInputs();\n }\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 [\n commit,\n draft,\n editable,\n projection,\n readEditInput,\n revision,\n runCommand,\n selection.focus,\n refreshOptimisticInputs,\n ],\n );\n\n const clearSelection = useCallback(() => {\n if (!editable || !clear) return;\n const current = selection;\n const target = normalizeSelection(current);\n const execute = () =>\n runCommand(\n () => {\n forgetOptimisticInputs(target);\n return clear(current);\n },\n execute,\n () => {},\n target,\n );\n execute();\n }, [clear, editable, forgetOptimisticInputs, 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 previousSelection = selectionRef.current;\n const anchor = previousSelection.focus;\n const execute = () => {\n let prepared: ReturnType<typeof parseSpreadsheetClipboard>;\n let target: SpreadsheetCommandTarget;\n const prepare = () => {\n prepared = parseSpreadsheetClipboard(clipboardText);\n if (\n anchor.row + prepared.rows > rowCount ||\n anchor.col + prepared.columns > columnCount\n ) {\n throw new Error(\"Clipboard range does not fit in this worksheet\");\n }\n if (!commitRange && prepared.inputs.length !== 1) {\n throw new Error(\"This spreadsheet adapter does not support rectangular paste\");\n }\n target = {\n top: anchor.row,\n left: anchor.col,\n bottom: anchor.row + prepared.rows - 1,\n right: anchor.col + prepared.columns - 1,\n };\n return target;\n };\n const invoke = () => {\n const parsed = prepared;\n forgetOptimisticInputs(target);\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(\n invoke,\n execute,\n () => {\n const current = selectionRef.current;\n if (\n target &&\n current.anchor.row === anchor.row &&\n current.anchor.col === anchor.col &&\n current.focus.row === target.bottom &&\n current.focus.col === target.right\n ) {\n updateSelection(previousSelection);\n }\n },\n prepare,\n );\n };\n execute();\n },\n [\n columnCount,\n commit,\n commitRange,\n editMode,\n editable,\n ensureVisible,\n forgetOptimisticInputs,\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 = readEditInput(cell);\n initialDraftRef.current = current;\n selectDraftOnFocusRef.current = initial === undefined;\n setDraft(initial ?? current);\n setEditMode(\"cell\");\n },\n [editable, ensureVisible, readEditInput],\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(readEditInput(selection.focus));\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n }\n },\n [commitDraft, readEditInput, selection.focus],\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={\n visibleCommandFailure ? \"error\" : pendingCommandCount > 0 ? \"pending\" : \"idle\"\n }\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={visibleCommandFailure ? \"true\" : undefined}\n value={draft}\n onFocus={() => {\n if (editable) {\n const current = readEditInput(selection.focus);\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 {visibleSyncStatus ? (\n <output\n aria-label=\"Spreadsheet sync status\"\n className=\"shrink-0 px-2 text-og-xs text-og-fg-muted\"\n >\n {visibleCommandFailure ? \"Not saved\" : visibleSyncStatus}\n </output>\n ) : null}\n </div>\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {visibleCommandFailure?.message ??\n (pendingCommandCount > 0 ? \"Saving spreadsheet changes\" : \"\")}\n </div>\n {visibleCommandFailure ? (\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\">{visibleCommandFailure.message}</span>\n {visibleCommandFailure.retry ? (\n <button\n type=\"button\"\n onClick={visibleCommandFailure.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={pendingCommandCount > 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 // Centered boundary handles must not enlarge the bounded scroll\n // extent at the final row/column. Unlike hidden, clip does not\n // create another scroll container for the sticky headers.\n overflow: \"clip\",\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=\"pointer-events-none sticky top-0 z-30 grid select-none place-items-center 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 <span className=\"max-w-full overflow-hidden\">{columnName(col)}</span>\n {!readOnly && resize ? (\n <SpreadsheetResizeHandle\n axis=\"column\"\n label={`Resize column ${columnName(col)}`}\n size={width}\n {...resizing.handleProps(\"column\", col)}\n />\n ) : null}\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=\"pointer-events-none 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 {!readOnly && resize ? (\n <SpreadsheetResizeHandle\n axis=\"row\"\n label={`Resize row ${row + 1}`}\n size={height}\n {...resizing.handleProps(\"row\", row)}\n />\n ) : null}\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 // Submitted input is a transient overlay, not a calculated or saved value.\n const optimistic = editable\n ? optimisticInputsRef.current.get(`${row}:${col}`)\n : undefined;\n const display = optimistic\n ? optimistic.input\n : formatSpreadsheetGeneralDisplay(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}${display ? `, ${display}` : \"\"}${optimistic ? (optimistic.input.startsWith(\"=\") ? \", pending formula, awaiting calculation\" : \", pending edit\") : \"\"}`}\n data-og-pending-input={optimistic ? \"true\" : undefined}\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 || optimistic) && selected && !active && \"bg-og-accent/10\",\n (!canvasReady || optimistic) &&\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 && !optimistic\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n ...(optimistic\n ? {\n background: data.format.fill ?? \"var(--og-color-surface-1)\",\n zIndex: 10,\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 {display}\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\n ? \"\"\n : `, ${formatSpreadsheetGeneralDisplay(hiddenActiveValue)}`\n }`}\n />\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useRef, useState } from \"react\";\n\nexport type SpreadsheetCommandTarget = {\n top: number;\n bottom: number;\n left: number;\n right: number;\n};\n\ntype Command = {\n id: number;\n target: SpreadsheetCommandTarget | null;\n overlapped: boolean;\n covered: boolean;\n message?: string;\n retry?: () => void;\n};\n\nfunction overlaps(a: SpreadsheetCommandTarget, b: SpreadsheetCommandTarget): boolean {\n return a.top <= b.bottom && a.bottom >= b.top && a.left <= b.right && a.right >= b.left;\n}\n\nfunction contains(a: SpreadsheetCommandTarget, b: SpreadsheetCommandTarget): boolean {\n return a.top <= b.top && a.bottom >= b.bottom && a.left <= b.left && a.right >= b.right;\n}\n\n/** Keep independent failures visible without replaying over newer overlapping edits. */\nexport function useSpreadsheetCommandQueue({\n scopeKey,\n enabled,\n onCommandError,\n}: {\n scopeKey: string;\n enabled: boolean;\n onCommandError?: ((error: Error) => void) | undefined;\n}) {\n const [pendingCount, setPendingCount] = useState(0);\n const [failures, setFailures] = useState<readonly Command[]>([]);\n const commandsRef = useRef(new Map<number, Command>());\n const nextIdRef = useRef(0);\n const mountedRef = useRef(true);\n const optionsRef = useRef({ scopeKey, enabled, onCommandError });\n optionsRef.current = { scopeKey, enabled, onCommandError };\n const scopeRef = useRef({ key: scopeKey, epoch: 0 });\n if (scopeRef.current.key !== scopeKey) {\n scopeRef.current = { key: scopeKey, epoch: scopeRef.current.epoch + 1 };\n }\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n\n useEffect(() => {\n commandsRef.current.clear();\n setPendingCount(0);\n setFailures([]);\n }, [scopeKey]);\n\n const refreshFailures = useCallback(() => {\n setFailures(\n [...commandsRef.current.values()].filter(\n (command) => command.message !== undefined && !command.covered,\n ),\n );\n }, []);\n\n const clearPreflightFailure = useCallback(() => {\n let changed = false;\n for (const previous of commandsRef.current.values()) {\n if (previous.target === null && previous.message !== undefined) {\n commandsRef.current.delete(previous.id);\n changed = true;\n }\n }\n if (changed) refreshFailures();\n }, [refreshFailures]);\n\n const run = useCallback(\n (\n invoke: (id: number) => void | Promise<void>,\n retry: () => void,\n rollback: (id: number) => void,\n target?: SpreadsheetCommandTarget | (() => SpreadsheetCommandTarget),\n accepted?: (id: number) => void,\n ) => {\n if (!optionsRef.current.enabled) return;\n const scope = optionsRef.current.scopeKey;\n const epoch = scopeRef.current.epoch;\n const id = ++nextIdRef.current;\n // A preflight failure never authored a range, so the next action replaces\n // it. Authored independent failures remain until retried or superseded.\n clearPreflightFailure();\n const command: Command = { id, target: null, overlapped: false, covered: false };\n commandsRef.current.set(id, command);\n const current = () =>\n mountedRef.current &&\n optionsRef.current.scopeKey === scope &&\n scopeRef.current.epoch === epoch;\n const fail = (cause: unknown) => {\n if (!current()) return;\n rollback(id);\n if (command.covered) {\n commandsRef.current.delete(id);\n return;\n }\n const error = cause instanceof Error ? cause : new Error(String(cause));\n command.message = error.message || \"Spreadsheet change failed\";\n command.retry = () => {\n if (!current() || !optionsRef.current.enabled || command.overlapped) return;\n commandsRef.current.delete(id);\n refreshFailures();\n retry();\n };\n refreshFailures();\n optionsRef.current.onCommandError?.(error);\n };\n let result: void | Promise<void>;\n try {\n command.target = typeof target === \"function\" ? target() : (target ?? null);\n if (command.target) {\n for (const previous of commandsRef.current.values()) {\n if (\n previous.id === id ||\n !previous.target ||\n !overlaps(command.target, previous.target)\n )\n continue;\n previous.overlapped = true;\n previous.covered ||= contains(command.target, previous.target);\n if (previous.covered && previous.message !== undefined)\n commandsRef.current.delete(previous.id);\n }\n refreshFailures();\n }\n result = invoke(id);\n } catch (cause) {\n fail(cause);\n return;\n }\n const succeed = () => {\n if (!current()) return;\n commandsRef.current.delete(id);\n accepted?.(id);\n };\n if (!result || typeof result.then !== \"function\") {\n succeed();\n return;\n }\n setPendingCount((count) => count + 1);\n void Promise.resolve(result).then(\n () => {\n if (!current()) return;\n setPendingCount((count) => Math.max(0, count - 1));\n succeed();\n },\n (cause) => {\n if (!current()) return;\n setPendingCount((count) => Math.max(0, count - 1));\n fail(cause);\n },\n );\n },\n [clearPreflightFailure, refreshFailures],\n );\n\n const first = failures[0];\n return {\n run,\n clearPreflightFailure,\n pendingCount,\n error: first\n ? {\n message:\n failures.length > 1\n ? `${first.message} (${failures.length} changes not saved)`\n : first.message!,\n retry: enabled && !first.overlapped ? first.retry : undefined,\n }\n : null,\n };\n}\n","/**\n * DISPLAY-ONLY General number formatting for spreadsheet canvas and a11y\n * labels. This is not numeric arithmetic and must never feed formula-bar /\n * cell-edit `input`, stored cells, formula results, or serialized exports.\n *\n * Policy for independent review:\n * IEEE-754 cannot represent many decimal fractions exactly, so values such as\n * `110.00000000000001` and `0.1 + 0.2` leak binary residue through `String(n)`.\n * General display therefore collapses a finite number to 15 significant decimal\n * digits — the same bound spreadsheet General uses — via\n * `String(Number(value.toPrecision(15)))`.\n *\n * That mapping yields `110` / `220` / `0.3` for the noisy cases while keeping\n * exponent-scale values (`1e-20`, `1e21`) and ~15-digit legitimate precision.\n * Integers stringify without a decimal; `-0` displays as `0`; non-finite\n * numbers, dates, booleans, errors, and strings keep their existing labels.\n *\n * Do not reuse `Intl.NumberFormat({ maximumFractionDigits: 12 })` from the\n * artifact-tool renderer: 12 fraction digits rounds `1e-20` to `0` and truncates\n * high-precision values that General should still show.\n */\nexport function formatSpreadsheetGeneralDisplay(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 if (typeof value === \"number\") {\n if (Object.is(value, -0) || value === 0) return \"0\";\n if (!Number.isFinite(value)) return String(value);\n const rounded = Number(value.toPrecision(15));\n // Rounding at the finite IEEE-754 boundary can overflow. A display policy\n // must not turn a finite source into an infinity label.\n return String(Number.isFinite(rounded) ? rounded : value);\n }\n return String(value);\n}\n\n/** Exact edit/formula-bar source. Numbers stay `String(value)` with no General collapse. */\nexport function spreadsheetCellEditSource(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","import { formatSpreadsheetGeneralDisplay } from \"./spreadsheet-general-display\";\n\nconst 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 = formatSpreadsheetGeneralDisplay(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, \"#545454\");\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, \"#545454\");\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 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 type KeyboardEvent,\n type PointerEvent,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"../../lib/cn\";\n\nexport type SpreadsheetDimensionAxis = \"row\" | \"column\";\n\n/** One pixel dimension change, committed after a drag or keyboard gesture. */\nexport type SpreadsheetDimensionCommit = {\n sheetId: string;\n axis: SpreadsheetDimensionAxis;\n index: number;\n size: number;\n};\n\nconst MIN_SIZE = 8;\nconst MAX_SIZE = 4_096;\n\ntype ResizePreview = SpreadsheetDimensionCommit & {\n id: number;\n baseRevision: string | number;\n settled: boolean;\n};\n\ntype Gesture = SpreadsheetDimensionCommit & {\n startSize: number;\n startPosition: number;\n pointerId: number | null;\n};\n\ntype ResizeOptions = {\n sheetId: string;\n generationId: string | null;\n revision: string | number;\n rowHeights: readonly (readonly [number, number])[];\n columnWidths: readonly (readonly [number, number])[];\n defaultRowHeight: number;\n defaultColumnWidth: number;\n enabled: boolean;\n commit?: ((change: SpreadsheetDimensionCommit) => void | Promise<void>) | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onStart?: (() => void) | undefined;\n};\n\nfunction keyOf(change: Pick<SpreadsheetDimensionCommit, \"axis\" | \"index\">): string {\n return `${change.axis}:${change.index}`;\n}\n\nfunction boundedSize(size: number): number {\n return Math.max(MIN_SIZE, Math.min(MAX_SIZE, Math.round(size)));\n}\n\n/** Transient gesture/pending previews only; the caller owns durable dimensions. */\nexport function useSpreadsheetResizing(options: ResizeOptions) {\n const optionsRef = useRef(options);\n optionsRef.current = options;\n const [gesture, setGesture] = useState<Gesture | null>(null);\n const [pending, setPending] = useState<readonly ResizePreview[]>([]);\n const [inFlightCount, setInFlightCount] = useState(0);\n const [errors, setErrors] = useState<\n readonly { key: string; message: string; retry: () => void }[]\n >([]);\n const errorsRef = useRef(new Map<string, { key: string; message: string; retry: () => void }>());\n const activeRef = useRef<Gesture | null>(null);\n const pendingRef = useRef(new Map<string, ResizePreview>());\n const frameRef = useRef<number | null>(null);\n const nextIdRef = useRef(0);\n const scopeRef = useRef(0);\n const mountedRef = useRef(true);\n\n const clearError = useCallback(() => {\n errorsRef.current.clear();\n setErrors([]);\n }, []);\n const cancelFrame = useCallback(() => {\n if (frameRef.current !== null) globalThis.cancelAnimationFrame?.(frameRef.current);\n frameRef.current = null;\n }, []);\n const cancel = useCallback(() => {\n cancelFrame();\n activeRef.current = null;\n setGesture(null);\n }, [cancelFrame]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n scopeRef.current += 1;\n cancelFrame();\n };\n }, [cancelFrame]);\n\n useEffect(() => {\n scopeRef.current += 1;\n cancel();\n pendingRef.current.clear();\n setPending([]);\n setInFlightCount(0);\n clearError();\n }, [cancel, clearError, options.enabled, options.generationId, options.sheetId]);\n\n const authoritativeSize = useCallback((axis: SpreadsheetDimensionAxis, index: number) => {\n const current = optionsRef.current;\n const entries = axis === \"row\" ? current.rowHeights : current.columnWidths;\n return (\n entries.find(([at]) => at === index)?.[1] ??\n (axis === \"row\" ? current.defaultRowHeight : current.defaultColumnWidth)\n );\n }, []);\n\n useEffect(() => {\n let changed = false;\n for (const [key, entry] of pendingRef.current) {\n if (\n entry.settled &&\n (authoritativeSize(entry.axis, entry.index) === entry.size ||\n options.revision !== entry.baseRevision)\n ) {\n pendingRef.current.delete(key);\n changed = true;\n }\n }\n if (changed) setPending([...pendingRef.current.values()]);\n }, [authoritativeSize, options.columnWidths, options.revision, options.rowHeights, pending]);\n\n const submit = useCallback((change: SpreadsheetDimensionCommit): void => {\n const current = optionsRef.current;\n if (!current.enabled || !current.commit || change.sheetId !== current.sheetId) return;\n const scope = scopeRef.current;\n const id = ++nextIdRef.current;\n const key = keyOf(change);\n const entry: ResizePreview = { ...change, id, baseRevision: current.revision, settled: false };\n pendingRef.current.set(key, entry);\n setPending([...pendingRef.current.values()]);\n errorsRef.current.delete(key);\n setErrors([...errorsRef.current.values()]);\n current.onStart?.();\n let asynchronous = false;\n const settle = (failed: boolean, cause?: unknown) => {\n if (!mountedRef.current || scopeRef.current !== scope) return;\n if (asynchronous) setInFlightCount((count) => Math.max(0, count - 1));\n const latest = pendingRef.current.get(key);\n if (latest?.id !== id) return;\n if (failed) {\n pendingRef.current.delete(key);\n const failure = cause instanceof Error ? cause : new Error(String(cause));\n errorsRef.current.set(key, {\n key,\n message: failure.message || \"Spreadsheet resize failed\",\n retry: () => {\n if (!mountedRef.current || scopeRef.current !== scope) return;\n submit(change);\n },\n });\n setErrors([...errorsRef.current.values()]);\n optionsRef.current.onCommandError?.(failure);\n } else {\n pendingRef.current.set(key, {\n ...entry,\n baseRevision: optionsRef.current.revision,\n settled: true,\n });\n }\n setPending([...pendingRef.current.values()]);\n };\n try {\n const result = current.commit(change);\n if (result && typeof result.then === \"function\") {\n asynchronous = true;\n setInFlightCount((count) => count + 1);\n void Promise.resolve(result).then(\n () => settle(false),\n (cause) => settle(true, cause),\n );\n } else {\n settle(false);\n }\n } catch (cause) {\n settle(true, cause);\n }\n }, []);\n\n const update = useCallback((next: Gesture) => {\n activeRef.current = next;\n if (frameRef.current !== null) return;\n if (typeof globalThis.requestAnimationFrame !== \"function\") {\n setGesture(next);\n return;\n }\n frameRef.current = globalThis.requestAnimationFrame(() => {\n frameRef.current = null;\n if (mountedRef.current) setGesture(activeRef.current);\n });\n }, []);\n\n const finish = useCallback(() => {\n const active = activeRef.current;\n cancel();\n if (!active || active.size === active.startSize) return;\n submit({ sheetId: active.sheetId, axis: active.axis, index: active.index, size: active.size });\n }, [cancel, submit]);\n\n const begin = useCallback(\n (axis: SpreadsheetDimensionAxis, index: number, pointerId: number | null, position: number) => {\n const current = optionsRef.current;\n if (!current.enabled || !current.commit) return;\n const existing = pendingRef.current.get(keyOf({ axis, index }));\n const size = existing?.size ?? authoritativeSize(axis, index);\n cancel();\n const next: Gesture = {\n sheetId: current.sheetId,\n axis,\n index,\n size,\n startSize: size,\n startPosition: position,\n pointerId,\n };\n activeRef.current = next;\n setGesture(next);\n current.onStart?.();\n },\n [authoritativeSize, cancel],\n );\n\n const handleProps = useCallback(\n (axis: SpreadsheetDimensionAxis, index: number) => ({\n onPointerDown(event: PointerEvent<HTMLDivElement>) {\n if (event.button !== 0 || event.isPrimary === false) return;\n event.preventDefault();\n event.stopPropagation();\n event.currentTarget.focus({ preventScroll: true });\n begin(axis, index, event.pointerId, axis === \"column\" ? event.clientX : event.clientY);\n event.currentTarget.setPointerCapture?.(event.pointerId);\n },\n onPointerMove(event: PointerEvent<HTMLDivElement>) {\n const active = activeRef.current;\n if (\n !active ||\n active.pointerId !== event.pointerId ||\n active.axis !== axis ||\n active.index !== index\n )\n return;\n event.preventDefault();\n event.stopPropagation();\n const position = axis === \"column\" ? event.clientX : event.clientY;\n update({\n ...active,\n size: boundedSize(active.startSize + position - active.startPosition),\n });\n },\n onPointerUp(event: PointerEvent<HTMLDivElement>) {\n const active = activeRef.current;\n if (\n !active ||\n active.pointerId !== event.pointerId ||\n active.axis !== axis ||\n active.index !== index\n )\n return;\n event.preventDefault();\n event.stopPropagation();\n const position = axis === \"column\" ? event.clientX : event.clientY;\n activeRef.current = {\n ...active,\n size: boundedSize(active.startSize + position - active.startPosition),\n };\n finish();\n if (event.currentTarget.hasPointerCapture?.(event.pointerId)) {\n event.currentTarget.releasePointerCapture?.(event.pointerId);\n }\n },\n onPointerCancel(event: PointerEvent<HTMLDivElement>) {\n const active = activeRef.current;\n if (active?.pointerId === event.pointerId && active.axis === axis && active.index === index)\n cancel();\n event.stopPropagation();\n },\n onLostPointerCapture(event: PointerEvent<HTMLDivElement>) {\n const active = activeRef.current;\n if (active?.pointerId === event.pointerId && active.axis === axis && active.index === index)\n cancel();\n },\n onKeyDown(event: KeyboardEvent<HTMLDivElement>) {\n event.stopPropagation();\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancel();\n return;\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n finish();\n return;\n }\n const negative = axis === \"column\" ? \"ArrowLeft\" : \"ArrowUp\";\n const positive = axis === \"column\" ? \"ArrowRight\" : \"ArrowDown\";\n if (event.key !== negative && event.key !== positive && event.key !== \"Home\") return;\n event.preventDefault();\n if (\n activeRef.current?.pointerId !== null ||\n activeRef.current.axis !== axis ||\n activeRef.current.index !== index\n ) {\n begin(axis, index, null, 0);\n }\n const active = activeRef.current;\n if (!active) return;\n const current = optionsRef.current;\n const size =\n event.key === \"Home\"\n ? axis === \"row\"\n ? current.defaultRowHeight\n : current.defaultColumnWidth\n : active.size + (event.key === negative ? -1 : 1) * (event.shiftKey ? 1 : 8);\n update({ ...active, size: boundedSize(size) });\n },\n onKeyUp(event: KeyboardEvent<HTMLDivElement>) {\n event.stopPropagation();\n const active = activeRef.current;\n if (\n active?.axis === axis &&\n active.index === index &&\n (event.key === \"Home\" || event.key.startsWith(\"Arrow\"))\n )\n finish();\n },\n onBlur() {\n const active = activeRef.current;\n if (active?.pointerId === null && active.axis === axis && active.index === index) finish();\n },\n }),\n [begin, cancel, finish, update],\n );\n\n const pendingRows = useMemo(() => pending.filter((entry) => entry.axis === \"row\"), [pending]);\n const pendingColumns = useMemo(\n () => pending.filter((entry) => entry.axis === \"column\"),\n [pending],\n );\n const rowGesture = gesture?.axis === \"row\" ? gesture : null;\n const columnGesture = gesture?.axis === \"column\" ? gesture : null;\n const rowHeights = useMemo(\n () => previewDimensions(options.rowHeights, pendingRows, rowGesture),\n [options.rowHeights, pendingRows, rowGesture],\n );\n const columnWidths = useMemo(\n () => previewDimensions(options.columnWidths, pendingColumns, columnGesture),\n [options.columnWidths, pendingColumns, columnGesture],\n );\n const previewKey = [\n ...pending.map((entry) => `${entry.axis}:${entry.index}:${entry.size}`),\n ...(gesture ? [`${gesture.axis}:${gesture.index}:${gesture.size}`] : []),\n ].join(\";\");\n\n return {\n rowHeights,\n columnWidths,\n previewKey,\n handleProps,\n pendingCount: inFlightCount,\n error: errors[0]\n ? { message: errors[0].message, retry: options.enabled ? errors[0].retry : undefined }\n : null,\n clearError,\n };\n}\n\nfunction previewDimensions(\n entries: readonly (readonly [number, number])[],\n pending: readonly ResizePreview[],\n gesture: Gesture | null,\n): readonly (readonly [number, number])[] {\n if (!pending.length && !gesture) return entries;\n const projected = new Map(entries);\n for (const entry of pending) projected.set(entry.index, entry.size);\n if (gesture) projected.set(gesture.index, gesture.size);\n return [...projected.entries()];\n}\n\nexport function SpreadsheetResizeHandle({\n axis,\n label,\n size,\n ...handlers\n}: {\n axis: SpreadsheetDimensionAxis;\n label: string;\n size: number;\n} & ReturnType<ReturnType<typeof useSpreadsheetResizing>[\"handleProps\"]>) {\n return (\n <div\n {...handlers}\n role=\"separator\"\n tabIndex={0}\n aria-label={label}\n aria-orientation={axis === \"column\" ? \"vertical\" : \"horizontal\"}\n aria-valuemin={MIN_SIZE}\n aria-valuemax={MAX_SIZE}\n aria-valuenow={size}\n aria-valuetext={`${size} pixels`}\n data-og-resize-axis={axis}\n style={{ [axis === \"column\" ? \"right\" : \"bottom\"]: \"calc(var(--spacing) * -1)\" }}\n className={cn(\n \"pointer-events-auto absolute z-40 touch-none outline-hidden hover:bg-og-accent/20 focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\",\n axis === \"column\"\n ? \"top-0 h-full w-2 cursor-col-resize\"\n : \"left-0 h-2 w-full cursor-row-resize\",\n )}\n />\n );\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 {\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 editableArtifactAccessRevoked,\n editableArtifactStatusLabel,\n EditableArtifactMessage,\n useEditableArtifactView,\n} from \"./editable-artifact-ui\";\nimport { SparseSpreadsheetCellIndex } from \"./spreadsheet-canvas\";\nimport { SpreadsheetDownloadButton, type SpreadsheetDownload } from \"./spreadsheet-download\";\nimport {\n SpreadsheetSubmissionProvider,\n useSpreadsheetSubmissions,\n} from \"./spreadsheet-submissions\";\nimport {\n SpreadsheetProjectionGrid,\n type SpreadsheetCommit,\n type SpreadsheetDimensionCommit,\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[] = [];\nconst useClientLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n// Identity only: a replacement SDK object is a new authoring lifetime, even\n// when artifact, sheet, and generation IDs are unchanged. No model data lives here.\nconst SESSION_KEYS = new WeakMap<EditableArtifactSession, number>();\nlet nextSessionKey = 0;\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 onResize?: ((change: SpreadsheetDimensionCommit) => 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 showHeader?: boolean | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n /** Authenticated XLSX export of the current saved native head. */\n download?: SpreadsheetDownload | undefined;\n initialSheetId?: string | undefined;\n allowAddSheet?: boolean | undefined;\n};\n\ntype ProjectionState = {\n session: EditableArtifactSession;\n generationId: string | null;\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(props: EditableSpreadsheetGridProps) {\n return (\n <EditableSpreadsheetGridSession\n key={`${spreadsheetSessionKey(props.session)}:${props.sheet.sheetId}:${props.sheet.generationId ?? \"pending\"}`}\n {...props}\n />\n );\n}\n\nfunction EditableSpreadsheetGridSession({\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 onResize,\n onCommandError,\n onViewportChange,\n className,\n}: EditableSpreadsheetGridProps) {\n const authoringLifetime = useSpreadsheetAuthoringLifetime();\n const submissions = useSpreadsheetSubmissions();\n const view = useEditableArtifactView(session);\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 session,\n generationId: sheet.generationId,\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((current) =>\n current.session === session &&\n current.generationId === sheet.generationId &&\n current.query.sheetId === sheet.sheetId\n ? current\n : {\n session,\n generationId: sheet.generationId,\n query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),\n projection: null,\n error: null,\n },\n );\n activeCellRef.current = { row: 0, column: 0 };\n }, [columnCount, rowCount, session, sheet.generationId, sheet.sheetId]);\n\n useEffect(() => {\n const query = state.query;\n const matchesScope = (current: ProjectionState) =>\n current.session === session &&\n current.generationId === sheet.generationId &&\n sameViewportQuery(current.query, query);\n let active = true;\n const unsubscribe = session.subscribeSpreadsheetViewport(\n query,\n (projection) => {\n if (!active || !sameViewport(projection, query)) return;\n if (sheet.generationId !== null && projection.generationId !== sheet.generationId) {\n setState((current) =>\n matchesScope(current)\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 matchesScope(current) ? { ...current, projection, error: null } : current,\n );\n },\n {\n onError(error) {\n if (!active) return;\n setState((current) => (matchesScope(current) ? { ...current, error } : current));\n },\n },\n );\n return () => {\n active = false;\n unsubscribe();\n };\n }, [session, sheet.generationId, state.query]);\n\n const projection = useMemo(\n () =>\n projectSdkViewport(\n sheet,\n metadataRevision,\n state.query,\n state.session === session && state.generationId === sheet.generationId\n ? state.projection\n : null,\n rowCount,\n columnCount,\n ),\n [columnCount, metadataRevision, rowCount, session, sheet, state],\n );\n const generation = useMemo(() => sheetGeneration(sheet), [sheet]);\n const editable =\n !readOnly && view.writable && !view.authoringBlockedReason && generation !== null;\n const syncStatus = view.authoringBlockedReason\n ? \"Waiting for earlier edits…\"\n : view.state === \"live\"\n ? editable\n ? \"Saved\"\n : \"Read only\"\n : editableArtifactStatusLabel(view);\n const syncError =\n view.blockedPending.length > 0\n ? \"Some earlier changes could not sync.\"\n : view.lastError?.message;\n const resizable =\n editable && sheet.defaultRowHeight !== undefined && sheet.defaultColumnWidth !== undefined;\n\n const handleCommit = useCallback(\n async (commit: SpreadsheetCommit) => {\n const lifetime = requireSpreadsheetAuthoringLifetime(authoringLifetime);\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n const input = spreadsheetCellInput(commit.input, commit.kind);\n await submissions.run(() =>\n 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 );\n if (authoringLifetime.current === lifetime) onCommit?.(commit);\n },\n [authoringLifetime, generation, onCommit, session, submissions],\n );\n\n const handleClear = useCallback(\n async (selection: SpreadsheetSelection) => {\n requireSpreadsheetAuthoringLifetime(authoringLifetime);\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 submissions.run(() =>\n 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 },\n [authoringLifetime, generation, session, submissions],\n );\n\n const handleCommitRange = useCallback(\n async (commit: SpreadsheetRangeCommit) => {\n requireSpreadsheetAuthoringLifetime(authoringLifetime);\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n await submissions.run(() =>\n 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 },\n [authoringLifetime, generation, session, submissions],\n );\n const handleResize = useCallback(\n async (change: SpreadsheetDimensionCommit) => {\n const lifetime = requireSpreadsheetAuthoringLifetime(authoringLifetime);\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n await submissions.run(() =>\n session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n change.axis === \"column\"\n ? {\n kind: \"column.width.set\",\n sheet: generation,\n column: change.index,\n width: change.size === sheet.defaultColumnWidth ? null : change.size,\n }\n : {\n kind: \"row.height.set\",\n sheet: generation,\n row: change.index,\n height: change.size === sheet.defaultRowHeight ? null : change.size,\n },\n ],\n }),\n );\n if (authoringLifetime.current === lifetime) onResize?.(change);\n },\n [\n authoringLifetime,\n generation,\n onResize,\n session,\n sheet.defaultColumnWidth,\n sheet.defaultRowHeight,\n submissions,\n ],\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 ...current,\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) ? current : { ...current, query: next, error: null },\n );\n onViewportChange?.(viewport);\n },\n [columnCount, onViewportChange, rowCount, sheet.sheetId],\n );\n\n if (editableArtifactAccessRevoked(view)) {\n return (\n <EditableArtifactMessage\n title=\"Spreadsheet unavailable\"\n detail=\"You no longer have access to this artifact\"\n />\n );\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 resize={resizable ? handleResize : undefined}\n pendingTransactions={view.pendingTransactions}\n syncStatus={syncStatus}\n syncError={syncError}\n onCommandError={onCommandError}\n onViewportChange={handleViewport}\n />\n {state.error && state.session === session && state.generationId === sheet.generationId ? (\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(props: EditableSpreadsheetArtifactSurfaceProps) {\n return (\n <SpreadsheetSubmissionProvider key={spreadsheetSessionKey(props.session)}>\n <EditableSpreadsheetArtifactSurfaceSession {...props} />\n </SpreadsheetSubmissionProvider>\n );\n}\n\nfunction EditableSpreadsheetArtifactSurfaceSession({\n session,\n title = \"Workbook\",\n showHeader,\n subtitle,\n actions,\n download,\n initialSheetId,\n allowAddSheet = true,\n readOnly = false,\n ...gridProps\n}: EditableSpreadsheetArtifactSurfaceProps) {\n const authoringLifetime = useSpreadsheetAuthoringLifetime();\n const submissions = useSpreadsheetSubmissions();\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 && !view.authoringBlockedReason;\n const accessRevoked = editableArtifactAccessRevoked(view);\n\n const addSheet = useCallback(async () => {\n if (!writable || creatingSheet) return;\n const lifetime = requireSpreadsheetAuthoringLifetime(authoringLifetime);\n setCreatingSheet(true);\n setSurfaceError(null);\n try {\n const after = activeSheet ? sheetGeneration(activeSheet) : null;\n const created = await submissions.run(() =>\n session.createSpreadsheetSheet({\n name: nextAvailableSheetName(sheets),\n after,\n }),\n );\n if (authoringLifetime.current === lifetime) setActiveSheetId(created.sheetId);\n } catch (cause) {\n if (authoringLifetime.current === lifetime) setSurfaceError(asError(cause));\n } finally {\n if (authoringLifetime.current === lifetime) setCreatingSheet(false);\n }\n }, [activeSheet, authoringLifetime, creatingSheet, session, sheets, submissions, 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 <EditableWorksheetTab\n key={`${sheet.sheetId}:${sheet.generationId ?? \"pending\"}`}\n session={session}\n sheet={sheet}\n sheets={sheets}\n selected={sheet.sheetId === activeSheet?.sheetId}\n writable={writable}\n onSelect={() => setActiveSheetId(sheet.sheetId)}\n onCommandError={gridProps.onCommandError}\n />\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 showHeader={showHeader}\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={\n download ? (\n <>\n {actions}\n <SpreadsheetDownloadButton session={session} title={title} download={download} />\n </>\n ) : (\n actions\n )\n }\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 border border-og-primary-border bg-og-primary text-og-primary-fg px-3 py-1.5 text-og-sm font-medium hover:bg-og-primary-hover 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\n/** Inline authoring state only; the tab label always comes from canonical metadata. */\nfunction EditableWorksheetTab({\n session,\n sheet,\n sheets,\n selected,\n writable,\n onSelect,\n onCommandError,\n}: {\n session: EditableArtifactSession;\n sheet: EditableSpreadsheetSheetMetadata;\n sheets: readonly EditableSpreadsheetSheetMetadata[];\n selected: boolean;\n writable: boolean;\n onSelect: () => void;\n onCommandError?: ((error: Error) => void) | undefined;\n}) {\n const submissions = useSpreadsheetSubmissions();\n const [editing, setEditing] = useState(false);\n const [name, setName] = useState(sheet.name);\n const [saving, setSaving] = useState(false);\n const [accepted, setAccepted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const inputRef = useRef<HTMLInputElement>(null);\n const tabRef = useRef<HTMLButtonElement>(null);\n const busyRef = useRef(false);\n const mountedRef = useRef(true);\n const latestRef = useRef({ session, sheet, writable });\n latestRef.current = { session, sheet, writable };\n const errorId = useId();\n const canRename = writable && sheet.generationId !== null;\n const scopeRef = useRef({\n session,\n sheetId: sheet.sheetId,\n generationId: sheet.generationId,\n canRename,\n });\n if (\n scopeRef.current.session !== session ||\n scopeRef.current.sheetId !== sheet.sheetId ||\n scopeRef.current.generationId !== sheet.generationId ||\n scopeRef.current.canRename !== canRename\n ) {\n scopeRef.current = {\n session,\n sheetId: sheet.sheetId,\n generationId: sheet.generationId,\n canRename,\n };\n }\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n };\n }, []);\n useEffect(() => {\n setEditing(false);\n setSaving(false);\n setAccepted(false);\n setError(null);\n busyRef.current = false;\n }, [session, sheet.generationId, sheet.sheetId, canRename]);\n useEffect(() => {\n if (!editing) return;\n inputRef.current?.focus();\n inputRef.current?.select();\n }, [editing]);\n useEffect(() => {\n if (!accepted || !editing || sheet.name !== name) return;\n const restoreFocus =\n document.activeElement === document.body || document.activeElement === inputRef.current;\n setEditing(false);\n setSaving(false);\n setAccepted(false);\n busyRef.current = false;\n if (restoreFocus) queueMicrotask(() => tabRef.current?.focus({ preventScroll: true }));\n }, [accepted, editing, name, sheet.name]);\n\n const start = () => {\n if (!canRename || busyRef.current) return;\n onSelect();\n setName(sheet.name);\n setError(null);\n setAccepted(false);\n setEditing(true);\n };\n const cancel = () => {\n if (busyRef.current) return;\n setEditing(false);\n setError(null);\n queueMicrotask(() => tabRef.current?.focus({ preventScroll: true }));\n };\n const rename = async () => {\n if (!canRename || busyRef.current) return;\n const generation = sheetGeneration(sheet);\n if (!generation) return;\n const next = name.trim();\n if (!next || next.length > 31 || /[\\\\/?*[\\]:\\0]/u.test(next)) {\n setError(\"Use 1–31 characters without \\\\ / ? * [ ] :.\");\n return;\n }\n if (sheets.some((other) => other.sheetId !== sheet.sheetId && other.name === next)) {\n setError(\"A worksheet already has this name.\");\n return;\n }\n if (next === sheet.name) {\n cancel();\n return;\n }\n setName(next);\n setError(null);\n setSaving(true);\n busyRef.current = true;\n const scope = scopeRef.current;\n const current = () =>\n mountedRef.current && scopeRef.current === scope && latestRef.current.writable;\n try {\n await submissions.run(() =>\n session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [{ kind: \"sheet.rename\", sheet: generation, name: next }],\n }),\n );\n if (current()) setAccepted(true);\n } catch (cause) {\n if (!current()) return;\n const failure = asError(cause);\n busyRef.current = false;\n setSaving(false);\n setError(failure.message || \"Could not rename worksheet. Try again.\");\n onCommandError?.(failure);\n queueMicrotask(() => inputRef.current?.focus());\n }\n };\n\n const tab = (\n <button\n ref={tabRef}\n type=\"button\"\n role=\"tab\"\n tabIndex={editing && canRename ? -1 : undefined}\n aria-selected={selected}\n aria-keyshortcuts={canRename ? \"F2\" : undefined}\n title={canRename ? \"Double-click or press F2 to rename\" : undefined}\n onClick={onSelect}\n onDoubleClick={start}\n onKeyDown={(event) => {\n if (event.key === \"F2\") {\n event.preventDefault();\n start();\n }\n }}\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 selected\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\n return editing && canRename ? (\n <>\n <span className=\"sr-only\">{tab}</span>\n <form\n className=\"flex min-w-0 flex-wrap items-center gap-1 py-1\"\n style={{ width: \"min(18rem, 100%)\" }}\n onSubmit={(event) => {\n event.preventDefault();\n void rename();\n }}\n >\n <input\n ref={inputRef}\n aria-label=\"Worksheet name\"\n aria-invalid={error ? \"true\" : undefined}\n aria-describedby={error ? errorId : undefined}\n disabled={saving}\n value={name}\n onInput={(event) => {\n setName(event.currentTarget.value);\n setError(null);\n }}\n onKeyDown={(event) => {\n if (event.nativeEvent.isComposing || event.keyCode === 229) return;\n if (event.key === \"Escape\") {\n event.preventDefault();\n cancel();\n }\n if (event.key === \"Enter\") {\n event.preventDefault();\n void rename();\n }\n }}\n className=\"h-7 w-40 rounded-og-sm border border-og-border bg-og-surface-1 px-2 text-og-sm text-og-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50\"\n />\n {saving ? (\n <span role=\"status\" className=\"text-og-xs text-og-fg-muted\">\n Renaming…\n </span>\n ) : (\n <>\n <button\n type=\"submit\"\n className=\"rounded-og-sm px-2 py-1 text-og-xs text-og-fg outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n Save\n </button>\n <button\n type=\"button\"\n onClick={cancel}\n className=\"rounded-og-sm px-2 py-1 text-og-xs text-og-fg-muted outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n Cancel\n </button>\n </>\n )}\n {error ? (\n <span\n id={errorId}\n role=\"alert\"\n className=\"text-og-xs text-og-status-failed\"\n style={{ flexBasis: \"100%\", overflowWrap: \"anywhere\" }}\n >\n {error}\n </span>\n ) : null}\n </form>\n </>\n ) : (\n tab\n );\n}\n\nfunction spreadsheetSessionKey(session: EditableArtifactSession): number {\n let key = SESSION_KEYS.get(session);\n if (key === undefined) {\n key = ++nextSessionKey;\n SESSION_KEYS.set(session, key);\n }\n return key;\n}\n\nfunction useSpreadsheetAuthoringLifetime() {\n const lifetime = useRef<object | null>({});\n useClientLayoutEffect(() => {\n lifetime.current = {};\n return () => {\n lifetime.current = null;\n };\n }, []);\n return lifetime;\n}\n\nfunction requireSpreadsheetAuthoringLifetime(lifetime: { current: object | null }): object {\n if (!lifetime.current) throw new Error(\"Spreadsheet authoring session changed\");\n return lifetime.current;\n}\n\nfunction useSpreadsheetMetadata(session: EditableArtifactSession): {\n metadata: EditableSpreadsheetMetadataProjection | null;\n error: Error | null;\n} {\n const [state, setState] = useState<{\n session: EditableArtifactSession;\n metadata: EditableSpreadsheetMetadataProjection | null;\n error: Error | null;\n }>({ session, metadata: null, error: null });\n useEffect(() => {\n let active = true;\n const unsubscribe = session.subscribeSpreadsheetMetadata(\n {},\n (metadata) => {\n if (active) setState({ session, metadata, error: null });\n },\n {\n onError: (error) => {\n if (active)\n setState((current) =>\n current.session === session\n ? { ...current, error }\n : { session, metadata: null, error },\n );\n },\n },\n );\n return () => {\n active = false;\n unsubscribe();\n };\n }, [session]);\n return state.session === session ? state : { metadata: null, error: null };\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 // Keep the last valid bounded coverage while a resize/scroll query is replaced.\n // Never carry cells across a session, sheet, or generation boundary.\n const current =\n viewport && viewport.sheetId === sheet.sheetId && viewport.generationId === sheet.generationId\n ? viewport\n : 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: current?.revision.toString() ?? \"loading\",\n dimensionRevision: metadataRevision.toString(),\n defaultRowHeight: sheet.defaultRowHeight,\n defaultColumnWidth: sheet.defaultColumnWidth,\n rowHeights: sheet.rowHeights,\n columnWidths: sheet.columnWidths,\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 };\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","import type { EditableArtifactSession } from \"@opengeni/sdk/editable-artifacts\";\nimport { DownloadIcon, LoaderCircleIcon } from \"lucide-react\";\nimport { useEffect, useRef, useState, useSyncExternalStore } from \"react\";\n\nimport { ArtifactButton } from \"./artifact-chrome\";\nimport { useEditableArtifactView } from \"./editable-artifact-ui\";\nimport { useSpreadsheetSubmissions } from \"./spreadsheet-submissions\";\n\nexport type SpreadsheetDownload = (signal: AbortSignal) => Promise<Blob>;\n\nexport function SpreadsheetDownloadButton({\n session,\n title,\n download,\n}: {\n session: EditableArtifactSession;\n title: string;\n download: SpreadsheetDownload;\n}) {\n const view = useEditableArtifactView(session);\n const submissions = useSpreadsheetSubmissions();\n const submitting = useSyncExternalStore(\n submissions.subscribe,\n submissions.getPending,\n submissions.getPending,\n );\n const active = useRef<AbortController | null>(null);\n const [busy, setBusy] = useState(false);\n const [error, setError] = useState(false);\n const ready =\n view.state === \"live\" &&\n submitting === 0 &&\n view.pendingTransactions === 0 &&\n view.blockedPending.length === 0 &&\n !view.authoringBlockedReason;\n useEffect(() => () => active.current?.abort(), [session]);\n useEffect(() => {\n if (view.state === \"failed\" || view.state === \"closed\") {\n active.current?.abort();\n active.current = null;\n setBusy(false);\n }\n }, [view.state]);\n\n const start = async () => {\n if (active.current || !ready || submissions.getPending()) return;\n // Re-read the live view: a just-committed edit may precede React's next render.\n const current = session.getView();\n if (\n current.state !== \"live\" ||\n current.pendingTransactions ||\n current.blockedPending.length ||\n current.authoringBlockedReason\n )\n return;\n const controller = new AbortController();\n active.current = controller;\n setBusy(true);\n setError(false);\n try {\n const blob = await download(controller.signal);\n if (controller.signal.aborted) return;\n const url = URL.createObjectURL(blob);\n try {\n const anchor = document.createElement(\"a\");\n anchor.href = url;\n anchor.download = `${\n title\n .replace(/[\\\\/:*?\"<>|\\u0000-\\u001f]/g, \"_\")\n .replace(/\\.xlsx$/i, \"\")\n .trim() || \"Workbook\"\n }.xlsx`;\n anchor.rel = \"noopener\";\n anchor.click();\n } finally {\n setTimeout(() => URL.revokeObjectURL(url), 0);\n }\n } catch {\n if (!controller.signal.aborted) setError(true);\n } finally {\n if (!controller.signal.aborted) {\n active.current = null;\n setBusy(false);\n }\n }\n };\n\n return (\n <>\n {error ? (\n <span role=\"alert\" className=\"text-og-xs text-og-fg-muted\">\n Download failed. Try again.\n </span>\n ) : null}\n <ArtifactButton\n onClick={() => void start()}\n disabled={busy || !ready}\n title={ready ? \"Download workbook as XLSX\" : \"Wait for workbook changes to sync\"}\n >\n {busy ? (\n <LoaderCircleIcon className=\"animate-spin\" aria-hidden />\n ) : (\n <DownloadIcon aria-hidden />\n )}\n {busy ? \"Preparing…\" : \"Download\"}\n </ArtifactButton>\n </>\n );\n}\n","import { createContext, useContext, useState, type ReactNode } from \"react\";\n\nfunction createSubmissionQueue() {\n let pending = 0;\n const listeners = new Set<() => void>();\n const emit = () => {\n for (const listener of listeners) listener();\n };\n return {\n getPending: () => pending,\n subscribe: (listener: () => void) => {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n },\n async run<T>(invoke: () => Promise<T>): Promise<T> {\n // The SDK's causal queue and Worker authoring precede pendingTransactions.\n // Latch synchronously so a same-event blur/click cannot export an older head.\n pending++;\n emit();\n try {\n return await invoke();\n } finally {\n pending--;\n emit();\n }\n },\n };\n}\n\nconst standaloneQueue = {\n getPending: () => 0,\n subscribe: (_listener: () => void) => () => {},\n run: <T,>(invoke: () => Promise<T>) => invoke(),\n};\nconst SubmissionContext = createContext<ReturnType<typeof createSubmissionQueue> | null>(null);\n\nexport function SpreadsheetSubmissionProvider({ children }: { children: ReactNode }) {\n const [queue] = useState(createSubmissionQueue);\n return <SubmissionContext.Provider value={queue}>{children}</SubmissionContext.Provider>;\n}\n\nexport function useSpreadsheetSubmissions() {\n return useContext(SubmissionContext) ?? standaloneQueue;\n}\n"],"mappings":"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","names":["useCallback","useEffect","useMemo","useRef","useState","useCallback","useEffect","useRef","useState","useRef","useState","useCallback","useEffect","jsx","useEffect","columnName","useState","useCallback","useMemo","useRef","horizontalProjection","verticalProjection","logicalScrollLeft","logicalScrollTop","PlusIcon","useCallback","useEffect","useId","useLayoutEffect","useMemo","useRef","useState","useEffect","useRef","useState","useState","jsx","jsx","jsxs","useRef","useState","useEffect","Fragment","jsx","jsxs","useClientLayoutEffect","useEffect","useLayoutEffect","useState","useRef","projection","useMemo","useCallback","nextAvailableSheetName","PlusIcon","useId"]}
|