@opengeni/react 1.0.1 → 2.3.0-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -10
- package/dist/artifacts-spreadsheet.js +1 -1
- package/dist/artifacts.js +1 -1
- package/dist/browser-viewer-GXUICIAG.js +14 -0
- package/dist/{chunk-R3AZOAB5.js → chunk-4MDLEHXL.js} +9 -115
- package/dist/chunk-4MDLEHXL.js.map +1 -0
- package/dist/chunk-5YK2ZDIG.js +116 -0
- package/dist/chunk-5YK2ZDIG.js.map +1 -0
- package/dist/chunk-H5YGYNXS.js +329 -0
- package/dist/chunk-H5YGYNXS.js.map +1 -0
- package/dist/{chunk-7WCLAEFV.js → chunk-ICA6R6TW.js} +2 -2
- package/dist/{chunk-7WCLAEFV.js.map → chunk-ICA6R6TW.js.map} +1 -1
- package/dist/{chunk-IGC6A2ZI.js → chunk-JOAVA2TW.js} +589 -217
- package/dist/chunk-JOAVA2TW.js.map +1 -0
- package/dist/{chunk-Y7OEDUJ5.js → chunk-LS4POUTY.js} +1057 -426
- package/dist/chunk-LS4POUTY.js.map +1 -0
- package/dist/{chunk-5UQPNLIO.js → chunk-LTCHJ4MS.js} +9 -9
- package/dist/chunk-LTCHJ4MS.js.map +1 -0
- package/dist/{chunk-C5ZPSSS5.js → chunk-NEXLLTP4.js} +2 -1
- package/dist/{chunk-C5ZPSSS5.js.map → chunk-NEXLLTP4.js.map} +1 -1
- package/dist/chunk-QGBJ6GHG.js +2300 -0
- package/dist/chunk-QGBJ6GHG.js.map +1 -0
- package/dist/{chunk-6KLX2RH5.js → chunk-RSXJN73N.js} +365 -21
- package/dist/chunk-RSXJN73N.js.map +1 -0
- package/dist/{chunk-B6WPZSTT.js → chunk-SE4W4WQ3.js} +78 -16
- package/dist/chunk-SE4W4WQ3.js.map +1 -0
- package/dist/{chunk-MKPIAGVL.js → chunk-W6NFJXSA.js} +8 -19
- package/dist/chunk-W6NFJXSA.js.map +1 -0
- package/dist/{chunk-XBZWOM2K.js → chunk-X4A66EWZ.js} +8 -3
- package/dist/chunk-X4A66EWZ.js.map +1 -0
- package/dist/chunk-X4JAFD5R.js +3907 -0
- package/dist/chunk-X4JAFD5R.js.map +1 -0
- package/dist/{chunk-HA46CYQK.js → chunk-XXWH2JLC.js} +792 -206
- package/dist/chunk-XXWH2JLC.js.map +1 -0
- package/dist/client.d.ts +2 -2
- package/dist/components/browser-viewer.d.ts +7 -1
- package/dist/components/computer-viewer.d.ts +4 -1
- package/dist/components/enrollment-consent.d.ts +6 -3
- package/dist/components/file-browser.d.ts +7 -1
- package/dist/components/human-input-form.d.ts +1 -1
- package/dist/components/human-input-surface.d.ts +1 -1
- package/dist/components/machine-card.d.ts +4 -1
- package/dist/components/machines/machine-detail.d.ts +4 -1
- package/dist/components/machines/machine-operation-policy.d.ts +11 -0
- package/dist/components/machines-dashboard.d.ts +3 -1
- package/dist/components/markdown.d.ts +20 -1
- package/dist/components/message-timeline.d.ts +1 -1
- package/dist/components/model-policy-picker.d.ts +2 -0
- package/dist/components/pierre-file.d.ts +1 -1
- package/dist/components/sandbox-files.d.ts +8 -2
- package/dist/components/sandbox-workspace.d.ts +33 -3
- package/dist/components/session-chrome.d.ts +15 -3
- package/dist/components/workspace-dock.d.ts +6 -2
- package/dist/composer.js +5 -5
- package/dist/computer-viewer-ZOP4Q7A7.js +16 -0
- package/dist/computer-viewer-ZOP4Q7A7.js.map +1 -0
- package/dist/hooks/channel-cache.d.ts +23 -0
- package/dist/hooks/shared-machines-list.d.ts +14 -0
- package/dist/hooks/use-attached-browsers.d.ts +2 -1
- package/dist/hooks/use-channels.d.ts +1 -0
- package/dist/hooks/use-composer.d.ts +37 -9
- package/dist/hooks/use-machine-chip.d.ts +3 -3
- package/dist/hooks/use-machines.d.ts +19 -1
- package/dist/hooks/use-sandbox-files.d.ts +1 -0
- package/dist/hooks/use-session-background-commands.d.ts +14 -0
- package/dist/hooks/use-turn-queue.d.ts +12 -0
- package/dist/hooks/use-workspace-sessions.d.ts +1 -0
- package/dist/index.d.ts +7 -5
- package/dist/index.js +1096 -623
- package/dist/index.js.map +1 -1
- package/dist/interaction.js +29 -181
- package/dist/interaction.js.map +1 -1
- package/dist/lib/interaction-errors.d.ts +3 -0
- package/dist/machines.d.ts +4 -2
- package/dist/machines.js +10 -2
- package/dist/model-policy.d.ts +1 -1
- package/dist/model-policy.js +1 -1
- package/dist/platform-activity-row-BJHUHXAT.js +169 -0
- package/dist/platform-activity-row-BJHUHXAT.js.map +1 -0
- package/dist/{queue-surface-implementation-2KVJTYXH.js → queue-surface-implementation-BSKUWHRI.js} +76 -16
- package/dist/queue-surface-implementation-BSKUWHRI.js.map +1 -0
- package/dist/realtime/realtime-control.d.ts +6 -3
- package/dist/realtime.js +36 -14
- package/dist/realtime.js.map +1 -1
- package/dist/session-ui.d.ts +1 -1
- package/dist/session-ui.js +6 -2
- package/dist/session.d.ts +2 -2
- package/dist/session.js +4 -4
- package/dist/timeline/index.d.ts +1 -1
- package/dist/timeline/platform-activity-row.d.ts +15 -0
- package/dist/timeline/screenshot-lightbox.d.ts +1 -1
- package/dist/timeline/shared.d.ts +4 -2
- package/dist/timeline/types.d.ts +50 -5
- package/dist/types/machines.d.ts +2 -2
- package/package.json +3 -3
- package/src/client.ts +12 -1
- package/src/components/artifacts/editable-spreadsheet.tsx +1 -1
- package/src/components/browser-viewer.tsx +361 -58
- package/src/components/chat-composer.tsx +1 -1
- package/src/components/composer.tsx +6 -6
- package/src/components/computer-viewer.tsx +368 -115
- package/src/components/enrollment-consent.tsx +64 -6
- package/src/components/file-browser.tsx +117 -2
- package/src/components/human-input-form.tsx +103 -59
- package/src/components/human-input-surface.tsx +1 -1
- package/src/components/machine-card.tsx +111 -0
- package/src/components/machine-input-display.ts +15 -0
- package/src/components/machines/machine-detail.tsx +47 -0
- package/src/components/machines/machine-operation-policy.tsx +179 -0
- package/src/components/machines-dashboard.tsx +6 -0
- package/src/components/markdown.tsx +174 -20
- package/src/components/message-timeline.tsx +215 -18
- package/src/components/model-policy-picker.tsx +9 -17
- package/src/components/pierre-file.tsx +1 -1
- package/src/components/queue-surface-implementation.tsx +82 -16
- package/src/components/sandbox-files.tsx +135 -19
- package/src/components/sandbox-workspace.tsx +204 -92
- package/src/components/session-chrome.tsx +415 -208
- package/src/components/session-status.tsx +1 -1
- package/src/components/user-message-body.tsx +168 -48
- package/src/components/workspace-dock.tsx +141 -175
- package/src/hooks/channel-cache.ts +104 -0
- package/src/hooks/shared-machines-list.ts +239 -0
- package/src/hooks/use-attached-browsers.ts +5 -1
- package/src/hooks/use-browser-frame-stream.ts +6 -1
- package/src/hooks/use-browser-session.ts +6 -4
- package/src/hooks/use-browser-sessions.ts +7 -1
- package/src/hooks/use-channels.ts +32 -10
- package/src/hooks/use-composer.ts +760 -291
- package/src/hooks/use-computer-frame-stream.ts +14 -9
- package/src/hooks/use-computer-session.ts +16 -14
- package/src/hooks/use-computer-sessions.ts +8 -1
- package/src/hooks/use-last-started-turn-policy.ts +1 -1
- package/src/hooks/use-machine-chip.ts +23 -6
- package/src/hooks/use-machines.ts +104 -6
- package/src/hooks/use-sandbox-files.ts +195 -140
- package/src/hooks/use-sandbox-git.ts +58 -29
- package/src/hooks/use-session-background-commands.ts +56 -0
- package/src/hooks/use-session-capabilities.ts +18 -0
- package/src/hooks/use-turn-queue.ts +111 -12
- package/src/hooks/use-workspace-sessions.ts +5 -1
- package/src/index.ts +26 -4
- package/src/lib/interaction-errors.ts +18 -0
- package/src/machines.ts +9 -1
- package/src/model-policy.ts +10 -2
- package/src/realtime/realtime-control.tsx +53 -17
- package/src/session-context.ts +1 -0
- package/src/session-ui.ts +6 -1
- package/src/session.ts +9 -1
- package/src/timeline/activity-rail.tsx +20 -75
- package/src/timeline/index.ts +4 -0
- package/src/timeline/platform-activity-row.tsx +201 -0
- package/src/timeline/projection.ts +529 -25
- package/src/timeline/screenshot-lightbox.tsx +48 -14
- package/src/timeline/shared.tsx +8 -2
- package/src/timeline/tool-renderers.tsx +104 -6
- package/src/timeline/turn-summary.tsx +6 -1
- package/src/timeline/types.ts +77 -2
- package/src/types/machines.ts +10 -0
- package/styles/compiled.css +115 -104
- package/dist/chunk-5UQPNLIO.js.map +0 -1
- package/dist/chunk-6KLX2RH5.js.map +0 -1
- package/dist/chunk-B6WPZSTT.js.map +0 -1
- package/dist/chunk-HA46CYQK.js.map +0 -1
- package/dist/chunk-IGC6A2ZI.js.map +0 -1
- package/dist/chunk-LLOLUHVG.js +0 -5937
- package/dist/chunk-LLOLUHVG.js.map +0 -1
- package/dist/chunk-MKPIAGVL.js.map +0 -1
- package/dist/chunk-R3AZOAB5.js.map +0 -1
- package/dist/chunk-XBZWOM2K.js.map +0 -1
- package/dist/chunk-Y7OEDUJ5.js.map +0 -1
- package/dist/interactive-workbench-viewers-TOHBXJEE.js +0 -15
- package/dist/queue-surface-implementation-2KVJTYXH.js.map +0 -1
- /package/dist/{interactive-workbench-viewers-TOHBXJEE.js.map → browser-viewer-GXUICIAG.js.map} +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/components/artifacts/spreadsheet-grid.tsx","../src/components/artifacts/spreadsheet-canvas.ts","../src/components/artifacts/editable-spreadsheet.tsx"],"sourcesContent":["import type { Workbook, WorkbookChange, Worksheet } from \"@opengeni/artifact-tool/reference\";\nimport { PlusIcon } from \"lucide-react\";\nimport {\n type ClipboardEvent as ReactClipboardEvent,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { ArtifactSurface } from \"./artifact-surface\";\nimport {\n SparseSpreadsheetCellIndex,\n SpreadsheetCanvasRenderer,\n spreadsheetCanvasDevicePixelRatio,\n type SpreadsheetCanvasAxis,\n type SpreadsheetCanvasCellFormat,\n type SpreadsheetCanvasProjection,\n type SpreadsheetCanvasTheme,\n} from \"./spreadsheet-canvas\";\n\nconst MAX_ROWS = 1_048_576;\nconst MAX_COLUMNS = 16_384;\nconst ROW_HEADER_WIDTH = 48;\nconst COLUMN_HEADER_HEIGHT = 28;\nconst FALLBACK_VIEWPORT_WIDTH = 880;\nconst FALLBACK_VIEWPORT_HEIGHT = 480;\n// Firefox collapses oversized layout boxes rather than merely clamping them.\n// Keep the native scroll surface comfortably below every supported engine's\n// limit, then project that bounded physical range over the full logical sheet.\nconst MAX_PHYSICAL_SCROLL_SPAN = 8_000_000;\n// Purely proportional compression can assign short rows after tall overrides\n// to the same browser scroll pixel. Every compressed axis therefore reserves\n// physical address space per item as well as a proportional share.\nconst MIN_PHYSICAL_ITEM_SPAN = 4;\nconst MAX_MOUNTED_AXIS_ITEMS = 512;\nconst MAX_MOUNTED_GRID_CELLS = 2_048;\nconst MAX_CLIPBOARD_INPUT_BYTES = 4 * 1024 * 1024;\nconst MAX_CLIPBOARD_CELLS = 65_536;\n\ntype CellCoordinate = { row: number; col: number };\n\nexport type SpreadsheetSelection = {\n sheetId: string;\n anchor: CellCoordinate;\n focus: CellCoordinate;\n};\n\nexport type SpreadsheetCommit = {\n sheetId: string;\n cell: CellCoordinate;\n input: string;\n kind: \"formula\" | \"value\";\n};\n\n/** Row-major rectangular input submitted as one durable spreadsheet command. */\nexport type SpreadsheetRangeCommit = {\n sheetId: string;\n anchor: CellCoordinate;\n rows: number;\n columns: number;\n inputs: readonly string[];\n};\n\n/** End-exclusive logical windows emitted at most once per animation frame. */\nexport type SpreadsheetViewport = {\n sheetId: string;\n rowStart: number;\n rowEnd: number;\n columnStart: number;\n columnEnd: number;\n overscanRowStart: number;\n overscanRowEnd: number;\n overscanColumnStart: number;\n overscanColumnEnd: number;\n logicalScrollLeft: number;\n logicalScrollTop: number;\n viewportWidth: number;\n viewportHeight: number;\n};\n\nexport type SpreadsheetGridProps = {\n workbook: Workbook;\n worksheet: Worksheet;\n readOnly?: boolean | undefined;\n /** Addressable rows in the interactive projection. Grows to include used data. */\n rowCount?: number | undefined;\n /** Addressable columns in the interactive projection. Grows to include used data. */\n columnCount?: number | undefined;\n overscanRows?: number | undefined;\n overscanColumns?: number | undefined;\n onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;\n onCommit?: ((commit: SpreadsheetCommit) => void) | undefined;\n onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;\n className?: string | undefined;\n};\n\nexport type SpreadsheetProjectionCell = {\n value: unknown;\n input: string;\n format: SpreadsheetCanvasCellFormat;\n};\n\n/**\n * Synchronous, bounded view state consumed by the React editor. Durable model\n * ownership stays with the caller (legacy Workbook, SDK Worker, or another\n * projection adapter); edits return through `commit` / `clear` ports.\n */\nexport type SpreadsheetGridProjection = SpreadsheetCanvasProjection & {\n sheetName: string;\n rowCount: number;\n columnCount: number;\n defaultRowHeight?: number | undefined;\n defaultColumnWidth?: number | undefined;\n rowHeights?: readonly (readonly [number, number])[] | undefined;\n columnWidths?: readonly (readonly [number, number])[] | undefined;\n dimensionRevision?: string | number | undefined;\n usedRange?: { row: number; col: number; rowCount: number; colCount: number } | null | undefined;\n readCell: (row: number, column: number) => SpreadsheetProjectionCell | null;\n};\n\nexport type SpreadsheetProjectionGridProps = {\n projection: SpreadsheetGridProjection;\n readOnly?: boolean | undefined;\n overscanRows?: number | undefined;\n overscanColumns?: number | undefined;\n onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;\n commit?: ((commit: SpreadsheetCommit) => void | Promise<void>) | undefined;\n commitRange?: ((commit: SpreadsheetRangeCommit) => void | Promise<void>) | undefined;\n clear?: ((selection: SpreadsheetSelection) => void | Promise<void>) | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;\n className?: string | undefined;\n};\n\nexport type SpreadsheetArtifactSurfaceProps = Omit<SpreadsheetGridProps, \"worksheet\"> & {\n title?: string | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n initialSheetId?: string | undefined;\n allowAddSheet?: boolean | undefined;\n};\n\ntype AxisGeometry = {\n count: number;\n defaultSize: number;\n overrides: readonly AxisOverride[];\n total: number;\n};\n\ntype AxisOverride = {\n index: number;\n size: number;\n start: number;\n end: number;\n cumulativeDelta: number;\n};\n\ntype ViewportState = {\n width: number;\n height: number;\n scrollLeft: number;\n scrollTop: number;\n devicePixelRatio: number;\n};\n\ntype SelectingState = {\n pointerId: number;\n anchor: CellCoordinate;\n};\n\ntype ScrollProjection = {\n axis: AxisGeometry;\n mode: \"identity\" | \"indexed\";\n physicalTotal: number;\n logicalMax: number;\n physicalMax: number;\n baseItemSpan: number;\n proportionalSpan: number;\n rawMax: number;\n};\n\ntype WorkbookViewState = {\n revision: number;\n dimensionRevision: number;\n};\n\nconst useClientLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nfunction boundedInteger(value: number | undefined, fallback: number, max: number): number {\n if (value === undefined) return fallback;\n if (!Number.isFinite(value)) return fallback;\n return Math.min(max, Math.max(1, Math.floor(value)));\n}\n\nfunction buildAxis(\n count: number,\n defaultSize: number,\n entries: Iterable<readonly [number, number]>,\n): AxisGeometry {\n const normalizedDefault = Number.isFinite(defaultSize) && defaultSize > 0 ? defaultSize : 1;\n const sorted = [...entries]\n .filter(\n ([index, size]) =>\n Number.isInteger(index) && index >= 0 && index < count && Number.isFinite(size) && size > 0,\n )\n .sort(([left], [right]) => left - right);\n const overrides: AxisOverride[] = [];\n let cumulativeDelta = 0;\n for (const [index, size] of sorted) {\n // A Map-backed source is unique. Last-write-wins also makes this robust to\n // custom adapters that repeat an index.\n const previous = overrides.at(-1);\n if (previous?.index === index) {\n cumulativeDelta -= previous.size - normalizedDefault;\n overrides.pop();\n }\n if (size === normalizedDefault) continue;\n const start = index * normalizedDefault + cumulativeDelta;\n cumulativeDelta += size - normalizedDefault;\n overrides.push({\n index,\n size,\n start,\n end: start + size,\n cumulativeDelta,\n });\n }\n return {\n count,\n defaultSize: normalizedDefault,\n overrides,\n total: count * normalizedDefault + cumulativeDelta,\n };\n}\n\nfunction lowerBoundOverrideIndex(axis: AxisGeometry, index: number): number {\n let low = 0;\n let high = axis.overrides.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (axis.overrides[middle]!.index < index) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction axisOffsetAt(axis: AxisGeometry, index: number): number {\n if (index <= 0) return 0;\n if (index >= axis.count) return axis.total;\n const insertion = lowerBoundOverrideIndex(axis, index);\n const delta = insertion > 0 ? axis.overrides[insertion - 1]!.cumulativeDelta : 0;\n return index * axis.defaultSize + delta;\n}\n\nfunction axisSizeAt(axis: AxisGeometry, index: number): number {\n const candidate = axis.overrides[lowerBoundOverrideIndex(axis, index)];\n return candidate?.index === index ? candidate.size : axis.defaultSize;\n}\n\nfunction upperBoundOverrideStart(axis: AxisGeometry, offset: number): number {\n let low = 0;\n let high = axis.overrides.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (axis.overrides[middle]!.start <= offset) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction indexAtOffset(axis: AxisGeometry, offset: number): number {\n if (axis.count <= 1) return 0;\n const target = Math.max(0, Math.min(axis.total - 1, offset));\n const previousIndex = upperBoundOverrideStart(axis, target) - 1;\n if (previousIndex < 0) {\n return Math.min(\n (axis.overrides[0]?.index ?? axis.count) - 1,\n Math.floor(target / axis.defaultSize),\n );\n }\n const previous = axis.overrides[previousIndex]!;\n if (target < previous.end) return previous.index;\n const nextOverrideIndex = axis.overrides[previousIndex + 1]?.index ?? axis.count;\n return Math.min(\n axis.count - 1,\n nextOverrideIndex - 1,\n previous.index + 1 + Math.floor((target - previous.end) / axis.defaultSize),\n );\n}\n\nfunction visibleInterval(\n axis: AxisGeometry,\n startOffset: number,\n viewportSize: number,\n overscan: number,\n): { start: number; end: number } {\n const start = Math.max(0, indexAtOffset(axis, startOffset) - overscan);\n const end = Math.min(\n axis.count,\n indexAtOffset(axis, startOffset + Math.max(1, viewportSize)) + overscan + 1,\n );\n return { start, end };\n}\n\nfunction boundVisibleWindows(\n rows: { start: number; end: number },\n columns: { start: number; end: number },\n focus: CellCoordinate,\n): {\n rows: { start: number; end: number };\n columns: { start: number; end: number };\n} {\n let rowCount = Math.min(MAX_MOUNTED_AXIS_ITEMS, rows.end - rows.start);\n let columnCount = Math.min(MAX_MOUNTED_AXIS_ITEMS, columns.end - columns.start);\n if (rowCount * columnCount > MAX_MOUNTED_GRID_CELLS) {\n const balancedLimit = Math.floor(Math.sqrt(MAX_MOUNTED_GRID_CELLS));\n if (rowCount > balancedLimit && columnCount > balancedLimit) {\n rowCount = balancedLimit;\n columnCount = balancedLimit;\n } else if (rowCount >= columnCount) {\n rowCount = Math.max(1, Math.floor(MAX_MOUNTED_GRID_CELLS / columnCount));\n } else {\n columnCount = Math.max(1, Math.floor(MAX_MOUNTED_GRID_CELLS / rowCount));\n }\n }\n return {\n rows: centeredInterval(rows, rowCount, focus.row),\n columns: centeredInterval(columns, columnCount, focus.col),\n };\n}\n\nfunction centeredInterval(\n interval: { start: number; end: number },\n count: number,\n focus: number,\n): { start: number; end: number } {\n if (count >= interval.end - interval.start) return interval;\n if (focus < interval.start || focus >= interval.end) {\n return { start: interval.start, end: interval.start + count };\n }\n const start = Math.max(\n interval.start,\n Math.min(interval.end - count, focus - Math.floor(count / 2)),\n );\n return { start, end: start + count };\n}\n\nfunction indexesBetween(start: number, end: number): number[] {\n return Array.from({ length: end - start }, (_, index) => start + index);\n}\n\nfunction rawBoundaryAt(projection: ScrollProjection, index: number): number {\n if (index <= 0) return 0;\n if (index >= projection.axis.count) {\n return projection.axis.count * projection.baseItemSpan + projection.proportionalSpan;\n }\n return (\n index * projection.baseItemSpan +\n (axisOffsetAt(projection.axis, index) / projection.axis.total) * projection.proportionalSpan\n );\n}\n\nfunction rawOffsetAtLogical(projection: ScrollProjection, offset: number): number {\n if (offset <= 0) return 0;\n if (offset >= projection.axis.total) {\n return rawBoundaryAt(projection, projection.axis.count);\n }\n const index = indexAtOffset(projection.axis, offset);\n const logicalStart = axisOffsetAt(projection.axis, index);\n const logicalSize = axisSizeAt(projection.axis, index);\n const fraction = Math.max(0, Math.min(1, (offset - logicalStart) / logicalSize));\n const rawStart = rawBoundaryAt(projection, index);\n const rawEnd = rawBoundaryAt(projection, index + 1);\n return rawStart + fraction * (rawEnd - rawStart);\n}\n\nfunction logicalOffsetAtRaw(projection: ScrollProjection, rawOffset: number): number {\n const target = Math.max(0, Math.min(projection.rawMax, rawOffset));\n let low = 0;\n let high = projection.axis.count;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (rawBoundaryAt(projection, middle) <= target) low = middle;\n else high = middle - 1;\n }\n const index = Math.min(projection.axis.count - 1, low);\n const rawStart = rawBoundaryAt(projection, index);\n const rawEnd = rawBoundaryAt(projection, index + 1);\n const fraction = rawEnd === rawStart ? 0 : (target - rawStart) / (rawEnd - rawStart);\n return Math.min(\n projection.logicalMax,\n axisOffsetAt(projection.axis, index) + fraction * axisSizeAt(projection.axis, index),\n );\n}\n\nfunction buildScrollProjection(\n axis: AxisGeometry,\n headerSize: number,\n viewportSize: number,\n): ScrollProjection {\n const logicalTotal = headerSize + axis.total;\n const physicalTotal = Math.min(logicalTotal, MAX_PHYSICAL_SCROLL_SPAN);\n const logicalMax = Math.max(0, logicalTotal - viewportSize);\n const physicalMax = Math.max(0, physicalTotal - viewportSize);\n const mode = physicalTotal === logicalTotal ? \"identity\" : \"indexed\";\n const physicalAxisCapacity = Math.max(0, physicalTotal - headerSize);\n const baseItemSpan =\n mode === \"indexed\" ? Math.min(MIN_PHYSICAL_ITEM_SPAN, physicalAxisCapacity / axis.count) : 0;\n const projection: ScrollProjection = {\n axis,\n mode,\n physicalTotal,\n logicalMax,\n physicalMax,\n baseItemSpan,\n proportionalSpan: Math.max(0, physicalAxisCapacity - baseItemSpan * axis.count),\n rawMax: 0,\n };\n projection.rawMax = rawOffsetAtLogical(projection, logicalMax);\n return projection;\n}\n\nfunction clampPhysicalScroll(offset: number, projection: ScrollProjection): number {\n return Math.max(0, Math.min(projection.physicalMax, offset));\n}\n\nfunction physicalToLogicalScroll(offset: number, projection: ScrollProjection): number {\n if (projection.logicalMax === 0 || projection.physicalMax === 0) return 0;\n if (projection.mode === \"indexed\") {\n return logicalOffsetAtRaw(\n projection,\n (clampPhysicalScroll(offset, projection) / projection.physicalMax) * projection.rawMax,\n );\n }\n return (clampPhysicalScroll(offset, projection) / projection.physicalMax) * projection.logicalMax;\n}\n\nfunction logicalToPhysicalScroll(offset: number, projection: ScrollProjection): number {\n if (projection.logicalMax === 0 || projection.physicalMax === 0) return 0;\n const logical = Math.max(0, Math.min(projection.logicalMax, offset));\n if (projection.mode === \"indexed\") {\n return (rawOffsetAtLogical(projection, logical) / projection.rawMax) * projection.physicalMax;\n }\n return (logical / projection.logicalMax) * projection.physicalMax;\n}\n\nfunction columnName(index: number): string {\n let value = index + 1;\n let result = \"\";\n while (value > 0) {\n const remainder = (value - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n value = Math.floor((value - 1) / 26);\n }\n return result;\n}\n\nfunction cellName(cell: CellCoordinate): string {\n return `${columnName(cell.col)}${cell.row + 1}`;\n}\n\nfunction normalizeSelection(selection: SpreadsheetSelection) {\n return {\n top: Math.min(selection.anchor.row, selection.focus.row),\n bottom: Math.max(selection.anchor.row, selection.focus.row),\n left: Math.min(selection.anchor.col, selection.focus.col),\n right: Math.max(selection.anchor.col, selection.focus.col),\n };\n}\n\nfunction selectionName(selection: SpreadsheetSelection): string {\n const normalized = normalizeSelection(selection);\n const first = cellName({ row: normalized.top, col: normalized.left });\n const last = cellName({ row: normalized.bottom, col: normalized.right });\n return first === last ? first : `${first}:${last}`;\n}\n\nfunction isCellSelected(selection: SpreadsheetSelection, row: number, col: number): boolean {\n const normalized = normalizeSelection(selection);\n return (\n row >= normalized.top &&\n row <= normalized.bottom &&\n col >= normalized.left &&\n col <= normalized.right\n );\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toLocaleDateString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n\nfunction parseCellInput(input: string): string | number | boolean | null {\n if (input === \"\") return null;\n const normalized = input.trim();\n if (/^(?:true|false)$/i.test(normalized)) return normalized.toLowerCase() === \"true\";\n if (/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(normalized)) {\n const number = Number(normalized);\n if (Number.isFinite(number)) return number;\n }\n return input;\n}\n\ntype ParsedSpreadsheetClipboard = Readonly<{\n rows: number;\n columns: number;\n inputs: readonly string[];\n}>;\n\n/** Bounded RFC-4180-style TSV parser for Excel/Sheets `text/plain` clipboard data. */\nfunction parseSpreadsheetClipboard(input: string): ParsedSpreadsheetClipboard {\n if (new TextEncoder().encode(input).byteLength > MAX_CLIPBOARD_INPUT_BYTES) {\n throw new Error(\"Clipboard data is too large to paste\");\n }\n const records: string[][] = [[]];\n let field = \"\";\n let quoted = false;\n let endedWithRecordSeparator = false;\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index]!;\n if (quoted) {\n if (character === '\"') {\n if (input[index + 1] === '\"') {\n field += '\"';\n index += 1;\n } else {\n quoted = false;\n }\n } else {\n field += character;\n }\n endedWithRecordSeparator = false;\n continue;\n }\n if (character === '\"' && field.length === 0) {\n quoted = true;\n endedWithRecordSeparator = false;\n } else if (character === \"\\t\") {\n records.at(-1)!.push(field);\n field = \"\";\n endedWithRecordSeparator = false;\n } else if (character === \"\\r\" || character === \"\\n\") {\n records.at(-1)!.push(field);\n field = \"\";\n records.push([]);\n if (character === \"\\r\" && input[index + 1] === \"\\n\") index += 1;\n endedWithRecordSeparator = true;\n } else {\n field += character;\n endedWithRecordSeparator = false;\n }\n }\n if (quoted) throw new Error(\"Clipboard data contains an unterminated quoted cell\");\n if (endedWithRecordSeparator) records.pop();\n else records.at(-1)!.push(field);\n if (records.length === 0) records.push([\"\"]);\n const columns = Math.max(1, ...records.map((record) => record.length));\n const cellCount = records.length * columns;\n if (cellCount > MAX_CLIPBOARD_CELLS) {\n throw new Error(\"Clipboard range is too large to paste\");\n }\n const inputs = records.flatMap((record) => [\n ...record,\n ...Array.from({ length: columns - record.length }, () => \"\"),\n ]);\n return Object.freeze({ rows: records.length, columns, inputs: Object.freeze(inputs) });\n}\n\nfunction escapeSpreadsheetClipboardField(input: string): string {\n return /[\"\\t\\r\\n]/u.test(input) ? `\"${input.replaceAll('\"', '\"\"')}\"` : input;\n}\n\nfunction cellStyle(format: SpreadsheetCanvasCellFormat): CSSProperties {\n return {\n background: format.fill,\n color: format.font?.color,\n fontFamily: format.font?.name,\n fontSize: format.font?.size,\n fontWeight: format.font?.bold ? 600 : undefined,\n fontStyle: format.font?.italic ? \"italic\" : undefined,\n textDecoration: format.font?.underline ? \"underline\" : undefined,\n textAlign: format.horizontalAlignment,\n justifyContent:\n format.horizontalAlignment === \"center\"\n ? \"center\"\n : format.horizontalAlignment === \"right\"\n ? \"flex-end\"\n : \"flex-start\",\n alignItems:\n format.verticalAlignment === \"top\"\n ? \"flex-start\"\n : format.verticalAlignment === \"bottom\"\n ? \"flex-end\"\n : \"center\",\n whiteSpace: format.wrapText ? \"normal\" : \"nowrap\",\n };\n}\n\nfunction canvasAxis(axis: AxisGeometry): SpreadsheetCanvasAxis {\n return {\n count: axis.count,\n total: axis.total,\n offsetAt: (index) => axisOffsetAt(axis, index),\n sizeAt: (index) => axisSizeAt(axis, index),\n indexAtOffset: (offset) => indexAtOffset(axis, offset),\n };\n}\n\nfunction computedToken(style: CSSStyleDeclaration, name: string, fallback: string): string {\n return style.getPropertyValue(name).trim() || fallback;\n}\n\nfunction computedPixels(style: CSSStyleDeclaration, name: string, fallback: number): number {\n const value = Number.parseFloat(style.getPropertyValue(name));\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction spreadsheetCanvasTheme(element: HTMLElement): SpreadsheetCanvasTheme {\n const style = getComputedStyle(element);\n const background =\n style.backgroundColor || computedToken(style, \"--og-color-surface-1\", \"#ffffff\");\n const headerBackground = computedToken(style, \"--og-color-surface-2\", \"#f3f4f6\");\n const border = computedToken(style, \"--og-color-border\", \"#d1d5db\");\n const foreground = style.color || computedToken(style, \"--og-color-fg\", \"#111827\");\n const mutedForeground = computedToken(style, \"--og-color-fg-muted\", \"#6b7280\");\n const accent = computedToken(style, \"--og-color-accent\", \"#3b82f6\");\n const error = computedToken(style, \"--og-color-status-failed\", \"#dc2626\");\n const fontFamily =\n style.fontFamily ||\n computedToken(\n style,\n \"--og-font-sans\",\n 'Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n );\n const fontSize =\n Number.parseFloat(style.fontSize) || computedPixels(style, \"--og-font-size-sm\", 12);\n const headerFontSize = computedPixels(style, \"--og-font-size-xs\", 11);\n return {\n background,\n headerBackground,\n border,\n foreground,\n mutedForeground,\n accent,\n error,\n fontFamily,\n fontSize,\n headerFontSize,\n signature: [\n background,\n headerBackground,\n border,\n foreground,\n mutedForeground,\n accent,\n error,\n fontFamily,\n fontSize,\n headerFontSize,\n ].join(\"\\u001f\"),\n };\n}\n\nfunction useWorkbookViewState(workbook: Workbook): WorkbookViewState {\n const [view, setView] = useState<WorkbookViewState>(() => ({\n revision: workbook.revision,\n dimensionRevision: 0,\n }));\n\n useEffect(() => {\n setView((current) =>\n current.revision === workbook.revision\n ? current\n : { revision: workbook.revision, dimensionRevision: current.dimensionRevision + 1 },\n );\n return workbook.onChange((change: WorkbookChange) => {\n setView((current) => ({\n revision: change.revision,\n dimensionRevision:\n change.reason === \"dimension\" || change.reason === \"structure\"\n ? current.dimensionRevision + 1\n : current.dimensionRevision,\n }));\n });\n }, [workbook]);\n\n return view;\n}\n\nfunction nextAvailableSheetName(workbook: Workbook): string {\n let index = workbook.worksheets.items.length + 1;\n while (workbook.worksheets.items.some((sheet) => sheet.name === `Sheet${index}`)) index += 1;\n return `Sheet${index}`;\n}\n\n/** A reusable workbook shell with first-class sheet switching. */\nexport function SpreadsheetArtifactSurface({\n workbook,\n title = \"Workbook\",\n subtitle,\n actions,\n initialSheetId,\n allowAddSheet = true,\n readOnly = false,\n ...gridProps\n}: SpreadsheetArtifactSurfaceProps) {\n const { revision } = useWorkbookViewState(workbook);\n const availableSheets = workbook.worksheets.items;\n const initial =\n (initialSheetId ? availableSheets.find((sheet) => sheet.id === initialSheetId) : undefined) ??\n (() => {\n try {\n return workbook.worksheets.getActiveWorksheet();\n } catch {\n return availableSheets[0];\n }\n })();\n const [activeSheetId, setActiveSheetId] = useState<string | null>(initial?.id ?? null);\n const activeSheet =\n availableSheets.find((sheet) => sheet.id === activeSheetId) ?? availableSheets[0] ?? null;\n\n useEffect(() => {\n if (!activeSheet && activeSheetId !== null) setActiveSheetId(null);\n else if (activeSheet && activeSheet.id !== activeSheetId) setActiveSheetId(activeSheet.id);\n }, [activeSheet, activeSheetId, revision]);\n\n const selectSheet = useCallback(\n (sheet: Worksheet) => {\n workbook.worksheets.setActiveWorksheet(sheet);\n setActiveSheetId(sheet.id);\n },\n [workbook],\n );\n\n const addSheet = useCallback(() => {\n const sheet = workbook.worksheets.add(nextAvailableSheetName(workbook));\n selectSheet(sheet);\n }, [selectSheet, workbook]);\n\n const footer = (\n <div\n className=\"flex min-h-9 items-center gap-1 overflow-x-auto px-2\"\n role=\"tablist\"\n aria-label=\"Worksheets\"\n >\n {availableSheets.map((sheet) => (\n <button\n key={sheet.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={sheet.id === activeSheet?.id}\n onClick={() => selectSheet(sheet)}\n className={cn(\n \"h-7 shrink-0 rounded-og-sm px-2.5 text-og-sm transition-colors\",\n sheet.id === activeSheet?.id\n ? \"bg-og-surface-3 font-medium text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg\",\n )}\n >\n {sheet.name}\n </button>\n ))}\n {!readOnly && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={addSheet}\n aria-label=\"Add worksheet\"\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg [&>svg]:size-3.5\"\n >\n <PlusIcon />\n </button>\n ) : null}\n </div>\n );\n\n return (\n <ArtifactSurface\n modality=\"spreadsheet\"\n title={title}\n subtitle={\n subtitle ??\n (activeSheet\n ? `${availableSheets.length} sheet${availableSheets.length === 1 ? \"\" : \"s\"}`\n : \"Empty workbook\")\n }\n actions={actions}\n footer={footer}\n >\n {activeSheet ? (\n <SpreadsheetGrid\n key={activeSheet.id}\n {...gridProps}\n workbook={workbook}\n worksheet={activeSheet}\n readOnly={readOnly}\n />\n ) : (\n <div\n className=\"grid h-full place-items-center bg-og-bg p-6 text-center\"\n style={{ minHeight: 224 }}\n >\n <div>\n <p className=\"text-og-base font-medium text-og-fg\">This workbook has no worksheets.</p>\n {!readOnly && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={addSheet}\n className=\"mt-3 rounded-og-sm bg-og-accent-deep px-3 py-1.5 text-og-sm font-medium text-og-accent-fg\"\n >\n Add worksheet\n </button>\n ) : null}\n </div>\n </div>\n )}\n </ArtifactSurface>\n );\n}\n\nexport function SpreadsheetGrid({\n workbook,\n worksheet,\n readOnly = false,\n rowCount: requestedRowCount,\n columnCount: requestedColumnCount,\n overscanRows = 3,\n overscanColumns = 2,\n onSelectionChange,\n onCommit,\n onViewportChange,\n className,\n}: SpreadsheetGridProps) {\n const { revision, dimensionRevision } = useWorkbookViewState(workbook);\n const boundedProjection = requestedRowCount !== undefined || requestedColumnCount !== undefined;\n const usedRange = useMemo(() => {\n void revision;\n return boundedProjection ? worksheet.usedRangeAddress() : null;\n }, [boundedProjection, revision, worksheet]);\n const rowCount = boundedInteger(\n Math.max(\n requestedRowCount ?? MAX_ROWS,\n (usedRange?.row ?? 0) + (usedRange?.rowCount ?? 0) + 32,\n ),\n MAX_ROWS,\n MAX_ROWS,\n );\n const columnCount = boundedInteger(\n Math.max(\n requestedColumnCount ?? MAX_COLUMNS,\n (usedRange?.col ?? 0) + (usedRange?.colCount ?? 0) + 8,\n ),\n MAX_COLUMNS,\n MAX_COLUMNS,\n );\n const rowHeights = useMemo(() => {\n void dimensionRevision;\n return [...worksheet.rowHeightEntries()] as const;\n }, [dimensionRevision, worksheet]);\n const columnWidths = useMemo(() => {\n void dimensionRevision;\n return [...worksheet.columnWidthEntries()] as const;\n }, [dimensionRevision, worksheet]);\n const projection = useMemo<SpreadsheetGridProjection>(() => {\n void dimensionRevision;\n const cells = new SparseSpreadsheetCellIndex(\n (function* projectedCells() {\n for (const { row, col, data } of worksheet.cellEntries()) {\n yield {\n row,\n col,\n value: data.value,\n formula: data.formula,\n format: data.format,\n };\n }\n })(),\n );\n return {\n sheetId: worksheet.id,\n sheetName: worksheet.name,\n generationId: worksheet.id,\n revision,\n dimensionRevision,\n rowCount,\n columnCount,\n defaultRowHeight: worksheet.defaultRowHeight,\n defaultColumnWidth: worksheet.defaultColumnWidth,\n rowHeights,\n columnWidths,\n usedRange,\n cells,\n valueAt: (cell) =>\n cell.formula ? workbook.valueAt(worksheet, { row: cell.row, col: cell.col }) : cell.value,\n readCell: (row, col) => {\n const data = worksheet.cellData(row, col);\n return {\n value: data.formula ? workbook.valueAt(worksheet, { row, col }) : data.value,\n input: data.formula ?? displayValue(data.value),\n format: data.format,\n };\n },\n };\n }, [\n columnCount,\n columnWidths,\n dimensionRevision,\n revision,\n rowCount,\n rowHeights,\n usedRange,\n workbook,\n worksheet,\n ]);\n const commit = useCallback(\n (next: SpreadsheetCommit) => {\n const target = worksheet.getCell(next.cell.row, next.cell.col);\n if (next.kind === \"formula\") target.formulas = [[next.input]];\n else target.values = [[parseCellInput(next.input)]];\n onCommit?.(next);\n },\n [onCommit, worksheet],\n );\n const commitRange = useCallback(\n (next: SpreadsheetRangeCommit) => {\n if (next.rows * next.columns !== next.inputs.length) {\n throw new Error(\"Spreadsheet paste shape is invalid\");\n }\n workbook.transact(() => {\n for (let index = 0; index < next.inputs.length; index += 1) {\n const input = next.inputs[index]!;\n const row = next.anchor.row + Math.floor(index / next.columns);\n const col = next.anchor.col + (index % next.columns);\n worksheet.setCell(\n row,\n col,\n input.startsWith(\"=\")\n ? { formula: input, value: null }\n : { formula: null, value: parseCellInput(input) },\n \"content\",\n );\n }\n });\n },\n [workbook, worksheet],\n );\n const clear = useCallback(\n (next: SpreadsheetSelection) => {\n const normalized = normalizeSelection(next);\n worksheet\n .getRangeByIndexes(\n normalized.top,\n normalized.left,\n normalized.bottom - normalized.top + 1,\n normalized.right - normalized.left + 1,\n )\n .clear({ applyTo: \"contents\" });\n },\n [worksheet],\n );\n\n return (\n <SpreadsheetProjectionGrid\n projection={projection}\n readOnly={readOnly}\n overscanRows={overscanRows}\n overscanColumns={overscanColumns}\n onSelectionChange={onSelectionChange}\n commit={commit}\n commitRange={commitRange}\n clear={clear}\n onViewportChange={onViewportChange}\n className={className}\n />\n );\n}\n\n/**\n * Two-axis virtualized, accessible spreadsheet projection. The caller owns\n * durable model state; React owns only viewport, selection, and edit state.\n */\nexport function SpreadsheetProjectionGrid({\n projection,\n readOnly = false,\n overscanRows = 3,\n overscanColumns = 2,\n onSelectionChange,\n commit,\n commitRange,\n clear,\n onCommandError,\n onViewportChange,\n className,\n}: SpreadsheetProjectionGridProps) {\n const { revision, rowCount, columnCount } = projection;\n const dimensionRevision = projection.dimensionRevision ?? 0;\n const editable = !readOnly && commit !== undefined;\n const rows = useMemo(() => {\n void dimensionRevision;\n return buildAxis(rowCount, projection.defaultRowHeight ?? 24, projection.rowHeights ?? []);\n }, [dimensionRevision, projection.defaultRowHeight, projection.rowHeights, rowCount]);\n const columns = useMemo(() => {\n void dimensionRevision;\n return buildAxis(\n columnCount,\n projection.defaultColumnWidth ?? 96,\n projection.columnWidths ?? [],\n );\n }, [columnCount, dimensionRevision, projection.columnWidths, projection.defaultColumnWidth]);\n const canvasRows = useMemo(() => canvasAxis(rows), [rows]);\n const canvasColumns = useMemo(() => canvasAxis(columns), [columns]);\n const [selection, setSelection] = useState<SpreadsheetSelection>(() => ({\n sheetId: projection.sheetId,\n anchor: { row: 0, col: 0 },\n focus: { row: 0, col: 0 },\n }));\n const [editMode, setEditMode] = useState<\"cell\" | \"formula\" | null>(null);\n const [draft, setDraft] = useState(\n () => projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\",\n );\n const [pendingCommands, setPendingCommands] = useState(0);\n const [commandFailure, setCommandFailure] = useState<{\n message: string;\n retry?: (() => void) | undefined;\n } | null>(null);\n const [viewport, setViewport] = useState<ViewportState>({\n width: FALLBACK_VIEWPORT_WIDTH,\n height: FALLBACK_VIEWPORT_HEIGHT,\n scrollLeft: 0,\n scrollTop: 0,\n devicePixelRatio: 1,\n });\n const [canvasReady, setCanvasReady] = useState(false);\n const [canvasEpoch, setCanvasEpoch] = useState(0);\n const viewportRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const editorRef = useRef<HTMLInputElement>(null);\n const selectionRef = useRef(selection);\n const selectingRef = useRef<SelectingState | null>(null);\n const committingRef = useRef(false);\n const composingRef = useRef(false);\n const commitAfterCompositionRef = useRef(false);\n const selectDraftOnFocusRef = useRef(true);\n const initialDraftRef = useRef(draft);\n const optimisticInputRef = useRef<{\n sheetId: string;\n row: number;\n col: number;\n input: string;\n baseRevision: string | number;\n } | null>(null);\n const mountedRef = useRef(true);\n const commandScopeRef = useRef(0);\n const latestCommandRef = useRef(0);\n const canvasRendererRef = useRef<SpreadsheetCanvasRenderer | null>(null);\n if (!canvasRendererRef.current) canvasRendererRef.current = new SpreadsheetCanvasRenderer();\n const reactId = useId().replaceAll(\":\", \"\");\n\n const updateSelection = useCallback(\n (next: SpreadsheetSelection) => {\n selectionRef.current = next;\n setSelection(next);\n onSelectionChange?.(next);\n },\n [onSelectionChange],\n );\n\n useEffect(() => {\n if (selection.sheetId === projection.sheetId) return;\n commandScopeRef.current += 1;\n latestCommandRef.current += 1;\n const next = {\n sheetId: projection.sheetId,\n anchor: { row: 0, col: 0 },\n focus: { row: 0, col: 0 },\n };\n optimisticInputRef.current = null;\n setPendingCommands(0);\n setCommandFailure(null);\n setEditMode(null);\n updateSelection(next);\n }, [projection.sheetId, selection.sheetId, updateSelection]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n commandScopeRef.current += 1;\n latestCommandRef.current += 1;\n };\n }, []);\n\n useEffect(() => {\n if (editMode !== null) return;\n const optimistic = optimisticInputRef.current;\n if (\n optimistic?.sheetId === projection.sheetId &&\n optimistic.row === selection.focus.row &&\n optimistic.col === selection.focus.col &&\n optimistic.baseRevision === revision\n ) {\n setDraft(optimistic.input);\n return;\n }\n if (optimistic && optimistic.baseRevision !== revision) optimisticInputRef.current = null;\n setDraft(projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\");\n }, [editMode, projection, revision, selection.focus.col, selection.focus.row]);\n\n useClientLayoutEffect(() => {\n const element = viewportRef.current;\n if (!element) return;\n const measure = () => {\n setViewport((current) => ({\n ...current,\n width: element.clientWidth || FALLBACK_VIEWPORT_WIDTH,\n height: element.clientHeight || FALLBACK_VIEWPORT_HEIGHT,\n devicePixelRatio: spreadsheetCanvasDevicePixelRatio(globalThis.devicePixelRatio || 1),\n }));\n };\n measure();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n observer?.observe(element);\n globalThis.addEventListener?.(\"resize\", measure);\n return () => {\n observer?.disconnect();\n globalThis.removeEventListener?.(\"resize\", measure);\n };\n }, []);\n\n useEffect(() => {\n return () => canvasRendererRef.current?.dispose();\n }, []);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n let active = true;\n void document.fonts?.ready.then(() => {\n if (active) setCanvasEpoch((value) => value + 1);\n });\n if (typeof MutationObserver === \"undefined\") {\n return () => {\n active = false;\n };\n }\n const observer = new MutationObserver(() => setCanvasEpoch((value) => value + 1));\n let ancestor: HTMLElement | null = viewportRef.current;\n while (ancestor) {\n observer.observe(ancestor, {\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"data-og-theme\", \"data-og-density\"],\n });\n ancestor = ancestor.parentElement;\n }\n return () => {\n active = false;\n observer.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (editMode !== \"cell\") return;\n const editor = editorRef.current;\n editor?.focus();\n if (!editor) return;\n if (selectDraftOnFocusRef.current) editor.select();\n else editor.setSelectionRange(editor.value.length, editor.value.length);\n }, [editMode]);\n\n const ensureVisible = useCallback(\n (cell: CellCoordinate) => {\n const element = viewportRef.current;\n if (!element) return;\n const viewportWidth = element.clientWidth || FALLBACK_VIEWPORT_WIDTH;\n const viewportHeight = element.clientHeight || FALLBACK_VIEWPORT_HEIGHT;\n const horizontalProjection = buildScrollProjection(columns, ROW_HEADER_WIDTH, viewportWidth);\n const verticalProjection = buildScrollProjection(rows, COLUMN_HEADER_HEIGHT, viewportHeight);\n const left = ROW_HEADER_WIDTH + axisOffsetAt(columns, cell.col);\n const right = left + axisSizeAt(columns, cell.col);\n const top = COLUMN_HEADER_HEIGHT + axisOffsetAt(rows, cell.row);\n const bottom = top + axisSizeAt(rows, cell.row);\n const logicalScrollLeft = physicalToLogicalScroll(element.scrollLeft, horizontalProjection);\n const logicalScrollTop = physicalToLogicalScroll(element.scrollTop, verticalProjection);\n const viewportLeft = logicalScrollLeft + ROW_HEADER_WIDTH;\n const viewportRight = logicalScrollLeft + viewportWidth;\n const viewportTop = logicalScrollTop + COLUMN_HEADER_HEIGHT;\n const viewportBottom = logicalScrollTop + viewportHeight;\n if (left < viewportLeft) {\n element.scrollLeft = logicalToPhysicalScroll(\n Math.max(0, left - ROW_HEADER_WIDTH),\n horizontalProjection,\n );\n } else if (right > viewportRight) {\n element.scrollLeft = logicalToPhysicalScroll(right - viewportWidth, horizontalProjection);\n }\n if (top < viewportTop) {\n element.scrollTop = logicalToPhysicalScroll(\n Math.max(0, top - COLUMN_HEADER_HEIGHT),\n verticalProjection,\n );\n } else if (bottom > viewportBottom) {\n element.scrollTop = logicalToPhysicalScroll(bottom - viewportHeight, verticalProjection);\n }\n },\n [columns, rows],\n );\n\n const moveSelection = useCallback(\n (rowDelta: number, colDelta: number, extend: boolean) => {\n const focus = {\n row: Math.max(0, Math.min(rowCount - 1, selection.focus.row + rowDelta)),\n col: Math.max(0, Math.min(columnCount - 1, selection.focus.col + colDelta)),\n };\n const next = {\n sheetId: projection.sheetId,\n anchor: extend ? selection.anchor : focus,\n focus,\n };\n updateSelection(next);\n ensureVisible(focus);\n },\n [columnCount, ensureVisible, projection.sheetId, rowCount, selection, updateSelection],\n );\n\n const runCommand = useCallback(\n (invoke: () => void | Promise<void>, retry: () => void, rollback: () => void) => {\n const commandId = latestCommandRef.current + 1;\n latestCommandRef.current = commandId;\n const scope = commandScopeRef.current;\n setCommandFailure(null);\n const fail = (cause: unknown) => {\n if (\n !mountedRef.current ||\n commandScopeRef.current !== scope ||\n latestCommandRef.current !== commandId\n ) {\n return;\n }\n const error = cause instanceof Error ? cause : new Error(String(cause));\n rollback();\n setCommandFailure({ message: error.message || \"Spreadsheet change failed\", retry });\n onCommandError?.(error);\n };\n let result: void | Promise<void>;\n try {\n result = invoke();\n } catch (cause) {\n fail(cause);\n return;\n }\n if (!result || typeof result.then !== \"function\") return;\n setPendingCommands((current) => current + 1);\n void Promise.resolve(result).then(\n () => {\n if (!mountedRef.current || commandScopeRef.current !== scope) return;\n setPendingCommands((current) => Math.max(0, current - 1));\n },\n (cause) => {\n if (!mountedRef.current || commandScopeRef.current !== scope) return;\n setPendingCommands((current) => Math.max(0, current - 1));\n fail(cause);\n },\n );\n },\n [onCommandError],\n );\n\n const reportCommandFailure = useCallback(\n (cause: unknown) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setCommandFailure({ message: error.message || \"Spreadsheet action failed\" });\n onCommandError?.(error);\n },\n [onCommandError],\n );\n\n const commitDraft = useCallback(\n (input = draft) => {\n if (committingRef.current) return;\n committingRef.current = true;\n if (!editable || !commit) {\n setEditMode(null);\n queueMicrotask(() => {\n committingRef.current = false;\n });\n return;\n }\n if (input === initialDraftRef.current) {\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n return;\n }\n const next = {\n sheetId: projection.sheetId,\n cell: { ...selection.focus },\n input,\n kind: input.startsWith(\"=\") ? \"formula\" : \"value\",\n } satisfies SpreadsheetCommit;\n const execute = () => {\n optimisticInputRef.current = {\n sheetId: projection.sheetId,\n row: selection.focus.row,\n col: selection.focus.col,\n input,\n baseRevision: revision,\n };\n setDraft(input);\n runCommand(\n () => commit(next),\n execute,\n () => {\n optimisticInputRef.current = null;\n const current = selectionRef.current.focus;\n setDraft(projection.readCell(current.row, current.col)?.input ?? \"\");\n },\n );\n };\n execute();\n initialDraftRef.current = input;\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n },\n [commit, draft, editable, projection, revision, runCommand, selection.focus],\n );\n\n const clearSelection = useCallback(() => {\n if (!editable || !clear) return;\n const current = selection;\n const execute = () =>\n runCommand(\n () => clear(current),\n execute,\n () => {},\n );\n execute();\n }, [clear, editable, runCommand, selection]);\n\n const pasteClipboard = useCallback(\n (event: ReactClipboardEvent<HTMLDivElement>) => {\n if (!editable || editMode !== null) return;\n const clipboardText = event.clipboardData.getData(\"text/plain\");\n if (!clipboardText && !event.clipboardData.types.includes(\"text/plain\")) return;\n event.preventDefault();\n const execute = () => {\n const previousSelection = selectionRef.current;\n const invoke = () => {\n const parsed = parseSpreadsheetClipboard(clipboardText);\n const anchor = previousSelection.focus;\n if (anchor.row + parsed.rows > rowCount || anchor.col + parsed.columns > columnCount) {\n throw new Error(\"Clipboard range does not fit in this worksheet\");\n }\n if (!commitRange && parsed.inputs.length !== 1) {\n throw new Error(\"This spreadsheet adapter does not support rectangular paste\");\n }\n const bottomRight = {\n row: anchor.row + parsed.rows - 1,\n col: anchor.col + parsed.columns - 1,\n };\n updateSelection({\n sheetId: projection.sheetId,\n anchor: { ...anchor },\n focus: bottomRight,\n });\n ensureVisible(bottomRight);\n if (commitRange) {\n return commitRange({\n sheetId: projection.sheetId,\n anchor: { ...anchor },\n rows: parsed.rows,\n columns: parsed.columns,\n inputs: parsed.inputs,\n });\n }\n const input = parsed.inputs[0]!;\n return commit!({\n sheetId: projection.sheetId,\n cell: { ...anchor },\n input,\n kind: input.startsWith(\"=\") ? \"formula\" : \"value\",\n });\n };\n runCommand(invoke, execute, () => updateSelection(previousSelection));\n };\n execute();\n },\n [\n columnCount,\n commit,\n commitRange,\n editMode,\n editable,\n ensureVisible,\n projection.sheetId,\n rowCount,\n runCommand,\n updateSelection,\n ],\n );\n\n const copySelection = useCallback(\n (event: ReactClipboardEvent<HTMLDivElement>) => {\n if (editMode !== null) return;\n const selected = normalizeSelection(selectionRef.current);\n const rowsToCopy = selected.bottom - selected.top + 1;\n const columnsToCopy = selected.right - selected.left + 1;\n if (rowsToCopy * columnsToCopy > MAX_CLIPBOARD_CELLS) {\n event.preventDefault();\n reportCommandFailure(new Error(\"Selected range is too large to copy\"));\n return;\n }\n const coverage = projection.coverage;\n if (\n coverage &&\n (selected.top < coverage.rowStart ||\n selected.bottom >= coverage.rowEnd ||\n selected.left < coverage.columnStart ||\n selected.right >= coverage.columnEnd)\n ) {\n event.preventDefault();\n reportCommandFailure(new Error(\"Selected cells are still loading; copy again when ready\"));\n return;\n }\n const output: string[] = [];\n for (let row = selected.top; row <= selected.bottom; row += 1) {\n const fields: string[] = [];\n for (let col = selected.left; col <= selected.right; col += 1) {\n fields.push(escapeSpreadsheetClipboardField(projection.readCell(row, col)?.input ?? \"\"));\n }\n output.push(fields.join(\"\\t\"));\n }\n event.clipboardData.setData(\"text/plain\", output.join(\"\\r\\n\"));\n event.preventDefault();\n setCommandFailure(null);\n },\n [editMode, projection, reportCommandFailure],\n );\n\n const beginEditing = useCallback(\n (initial?: string, cell: CellCoordinate = selectionRef.current.focus) => {\n if (!editable) return;\n ensureVisible(cell);\n const current = projection.readCell(cell.row, cell.col)?.input ?? \"\";\n initialDraftRef.current = current;\n selectDraftOnFocusRef.current = initial === undefined;\n setDraft(initial ?? current);\n setEditMode(\"cell\");\n },\n [editable, ensureVisible, projection],\n );\n\n const onGridKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (editMode !== null) return;\n if (event.nativeEvent.isComposing || event.nativeEvent.keyCode === 229) return;\n switch (event.key) {\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection(-1, 0, event.shiftKey);\n return;\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection(1, 0, event.shiftKey);\n return;\n case \"ArrowLeft\":\n event.preventDefault();\n moveSelection(0, -1, event.shiftKey);\n return;\n case \"ArrowRight\":\n event.preventDefault();\n moveSelection(0, 1, event.shiftKey);\n return;\n case \"Tab\":\n event.preventDefault();\n moveSelection(0, event.shiftKey ? -1 : 1, false);\n return;\n case \"Enter\":\n case \"F2\":\n event.preventDefault();\n beginEditing();\n return;\n case \"Backspace\":\n case \"Delete\":\n event.preventDefault();\n clearSelection();\n return;\n case \"Home\": {\n event.preventDefault();\n const target =\n event.metaKey || event.ctrlKey\n ? { row: 0, col: 0 }\n : { row: selection.focus.row, col: 0 };\n updateSelection({ sheetId: projection.sheetId, anchor: target, focus: target });\n ensureVisible(target);\n return;\n }\n case \"End\": {\n event.preventDefault();\n const used = projection.usedRange;\n const target =\n event.metaKey || event.ctrlKey\n ? {\n row: Math.min(rowCount - 1, (used?.row ?? 0) + (used?.rowCount ?? 1) - 1),\n col: Math.min(columnCount - 1, (used?.col ?? 0) + (used?.colCount ?? 1) - 1),\n }\n : { row: selection.focus.row, col: columnCount - 1 };\n updateSelection({ sheetId: projection.sheetId, anchor: target, focus: target });\n ensureVisible(target);\n return;\n }\n }\n if (editable && !event.metaKey && !event.ctrlKey && !event.altKey && event.key.length === 1) {\n event.preventDefault();\n beginEditing(event.key);\n }\n },\n [\n beginEditing,\n clearSelection,\n columnCount,\n editMode,\n ensureVisible,\n moveSelection,\n editable,\n rowCount,\n selection.focus.row,\n updateSelection,\n projection.sheetId,\n projection.usedRange,\n ],\n );\n\n const onEditorKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (composingRef.current || event.nativeEvent.isComposing) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n commitDraft();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n committingRef.current = true;\n setDraft(projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\");\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n }\n },\n [commitDraft, projection, selection.focus.col, selection.focus.row],\n );\n\n const onEditorCompositionStart = useCallback(() => {\n composingRef.current = true;\n }, []);\n\n const onEditorCompositionEnd = useCallback(\n (input: string) => {\n composingRef.current = false;\n if (!commitAfterCompositionRef.current) return;\n commitAfterCompositionRef.current = false;\n commitDraft(input);\n },\n [commitDraft],\n );\n\n const commitEditorOnBlur = useCallback(\n (mode: \"cell\" | \"formula\", input: string) => {\n if (editMode !== mode) return;\n if (composingRef.current) {\n commitAfterCompositionRef.current = true;\n return;\n }\n commitDraft(input);\n },\n [commitDraft, editMode],\n );\n\n const selectCell = useCallback(\n (cell: CellCoordinate, extend: boolean) => {\n const current = selectionRef.current;\n const next = {\n sheetId: projection.sheetId,\n anchor: extend ? current.anchor : cell,\n focus: cell,\n };\n updateSelection(next);\n setEditMode(null);\n viewportRef.current?.focus();\n },\n [projection.sheetId, updateSelection],\n );\n\n const hitTestCell = useCallback(\n (clientX: number, clientY: number): CellCoordinate | null => {\n const element = viewportRef.current;\n if (!element) return null;\n const bounds = element.getBoundingClientRect();\n const viewportX = clientX - bounds.left;\n const viewportY = clientY - bounds.top;\n const viewportWidth = element.clientWidth || FALLBACK_VIEWPORT_WIDTH;\n const viewportHeight = element.clientHeight || FALLBACK_VIEWPORT_HEIGHT;\n if (\n viewportX < ROW_HEADER_WIDTH ||\n viewportY < COLUMN_HEADER_HEIGHT ||\n viewportX >= viewportWidth ||\n viewportY >= viewportHeight\n ) {\n return null;\n }\n const horizontalProjection = buildScrollProjection(columns, ROW_HEADER_WIDTH, viewportWidth);\n const verticalProjection = buildScrollProjection(rows, COLUMN_HEADER_HEIGHT, viewportHeight);\n const logicalX =\n physicalToLogicalScroll(element.scrollLeft, horizontalProjection) +\n viewportX -\n ROW_HEADER_WIDTH;\n const logicalY =\n physicalToLogicalScroll(element.scrollTop, verticalProjection) +\n viewportY -\n COLUMN_HEADER_HEIGHT;\n if (logicalX < 0 || logicalY < 0 || logicalX >= columns.total || logicalY >= rows.total) {\n return null;\n }\n return {\n row: Math.min(rowCount - 1, indexAtOffset(rows, logicalY)),\n col: Math.min(columnCount - 1, indexAtOffset(columns, logicalX)),\n };\n },\n [columnCount, columns, rowCount, rows],\n );\n\n const onGridPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return;\n const cell = hitTestCell(event.clientX, event.clientY);\n if (!cell) return;\n event.preventDefault();\n const current = selectionRef.current;\n const anchor = event.shiftKey ? current.anchor : cell;\n selectingRef.current = { pointerId: event.pointerId, anchor };\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n // Synthetic test DOMs and old WebKit builds may not expose pointer capture.\n }\n updateSelection({ sheetId: projection.sheetId, anchor, focus: cell });\n setEditMode(null);\n event.currentTarget.focus();\n },\n [hitTestCell, projection.sheetId, updateSelection],\n );\n\n const onGridPointerMove = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n const selecting = selectingRef.current;\n if (!selecting || selecting.pointerId !== event.pointerId) return;\n const cell = hitTestCell(event.clientX, event.clientY);\n if (!cell) return;\n const current = selectionRef.current;\n if (current.focus.row === cell.row && current.focus.col === cell.col) return;\n updateSelection({ sheetId: projection.sheetId, anchor: selecting.anchor, focus: cell });\n },\n [hitTestCell, projection.sheetId, updateSelection],\n );\n\n const stopPointerSelection = useCallback((pointerId?: number) => {\n if (pointerId !== undefined && selectingRef.current?.pointerId !== pointerId) return;\n selectingRef.current = null;\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const stopSelecting = () => stopPointerSelection();\n window.addEventListener(\"pointerup\", stopSelecting);\n return () => window.removeEventListener(\"pointerup\", stopSelecting);\n }, [stopPointerSelection]);\n\n const horizontalProjection = buildScrollProjection(columns, ROW_HEADER_WIDTH, viewport.width);\n const verticalProjection = buildScrollProjection(rows, COLUMN_HEADER_HEIGHT, viewport.height);\n const physicalScrollLeft = clampPhysicalScroll(viewport.scrollLeft, horizontalProjection);\n const physicalScrollTop = clampPhysicalScroll(viewport.scrollTop, verticalProjection);\n const logicalScrollLeft = physicalToLogicalScroll(viewport.scrollLeft, horizontalProjection);\n const logicalScrollTop = physicalToLogicalScroll(viewport.scrollTop, verticalProjection);\n const visibleRowWindow = visibleInterval(\n rows,\n logicalScrollTop,\n Math.max(1, viewport.height - COLUMN_HEADER_HEIGHT),\n 0,\n );\n const visibleColumnWindow = visibleInterval(\n columns,\n logicalScrollLeft,\n Math.max(1, viewport.width - ROW_HEADER_WIDTH),\n 0,\n );\n const projectedRowWindow = visibleInterval(\n rows,\n logicalScrollTop,\n Math.max(1, viewport.height - COLUMN_HEADER_HEIGHT),\n Math.max(0, overscanRows),\n );\n const projectedColumnWindow = visibleInterval(\n columns,\n logicalScrollLeft,\n Math.max(1, viewport.width - ROW_HEADER_WIDTH),\n Math.max(0, overscanColumns),\n );\n const { rows: rowWindow, columns: columnWindow } = boundVisibleWindows(\n projectedRowWindow,\n projectedColumnWindow,\n selection.focus,\n );\n const visibleRows = indexesBetween(rowWindow.start, rowWindow.end);\n const visibleColumns = indexesBetween(columnWindow.start, columnWindow.end);\n const rowLayout = visibleRows.map((row) => ({\n row,\n top: physicalScrollTop + COLUMN_HEADER_HEIGHT + axisOffsetAt(rows, row) - logicalScrollTop,\n height: axisSizeAt(rows, row),\n }));\n const columnLayout = visibleColumns.map((col) => ({\n col,\n left: physicalScrollLeft + ROW_HEADER_WIDTH + axisOffsetAt(columns, col) - logicalScrollLeft,\n width: axisSizeAt(columns, col),\n }));\n const activeCellVisible =\n selection.focus.row >= rowWindow.start &&\n selection.focus.row < rowWindow.end &&\n selection.focus.col >= columnWindow.start &&\n selection.focus.col < columnWindow.end;\n const activeCellId = `${reactId}-cell-${selection.focus.row}-${selection.focus.col}`;\n const hiddenActiveValue = activeCellVisible\n ? null\n : projection.readCell(selection.focus.row, selection.focus.col)?.value;\n\n useEffect(() => {\n if (!onViewportChange) return;\n const next: SpreadsheetViewport = {\n sheetId: projection.sheetId,\n rowStart: visibleRowWindow.start,\n rowEnd: visibleRowWindow.end,\n columnStart: visibleColumnWindow.start,\n columnEnd: visibleColumnWindow.end,\n overscanRowStart: projectedRowWindow.start,\n overscanRowEnd: projectedRowWindow.end,\n overscanColumnStart: projectedColumnWindow.start,\n overscanColumnEnd: projectedColumnWindow.end,\n logicalScrollLeft,\n logicalScrollTop,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n };\n let active = true;\n const notify = () => {\n if (active) onViewportChange(next);\n };\n if (typeof globalThis.requestAnimationFrame === \"function\") {\n const frame = globalThis.requestAnimationFrame(notify);\n return () => {\n active = false;\n globalThis.cancelAnimationFrame?.(frame);\n };\n }\n queueMicrotask(notify);\n return () => {\n active = false;\n };\n }, [\n logicalScrollLeft,\n logicalScrollTop,\n onViewportChange,\n projectedColumnWindow.end,\n projectedColumnWindow.start,\n projectedRowWindow.end,\n projectedRowWindow.start,\n viewport.height,\n viewport.width,\n visibleColumnWindow.end,\n visibleColumnWindow.start,\n visibleRowWindow.end,\n visibleRowWindow.start,\n projection.sheetId,\n ]);\n\n useClientLayoutEffect(() => {\n void canvasEpoch;\n const canvas = canvasRef.current;\n const viewportElement = viewportRef.current;\n const renderer = canvasRendererRef.current;\n if (!canvas || !viewportElement || !renderer) return;\n const normalized = normalizeSelection(selection);\n const theme = spreadsheetCanvasTheme(viewportElement);\n const paintStartedAt = performance.now();\n const stats = renderer.paint({\n canvas,\n projection,\n rows: canvasRows,\n columns: canvasColumns,\n selection: {\n ...normalized,\n focusRow: selection.focus.row,\n focusColumn: selection.focus.col,\n },\n logicalScrollLeft,\n logicalScrollTop,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n rowHeaderWidth: ROW_HEADER_WIDTH,\n columnHeaderHeight: COLUMN_HEADER_HEIGHT,\n dimensionRevision,\n devicePixelRatio: viewport.devicePixelRatio,\n theme,\n });\n const paintDurationMs = performance.now() - paintStartedAt;\n if (!stats) {\n if (canvasReady) setCanvasReady(false);\n return;\n }\n canvas.dataset.ogTileCacheSize = String(stats.cacheSize);\n canvas.dataset.ogPaintedTiles = String(stats.paintedTiles);\n canvas.dataset.ogReusedTiles = String(stats.reusedTiles);\n canvas.dataset.ogUncachedTiles = String(stats.uncachedTiles);\n canvas.dataset.ogDevicePixelRatio = String(stats.devicePixelRatio);\n canvas.dataset.ogLogicalScrollLeft = String(logicalScrollLeft);\n canvas.dataset.ogLogicalScrollTop = String(logicalScrollTop);\n canvas.dataset.ogPaintDurationMs = String(paintDurationMs);\n if (!canvasReady) setCanvasReady(true);\n }, [\n canvasColumns,\n canvasEpoch,\n canvasReady,\n canvasRows,\n dimensionRevision,\n logicalScrollLeft,\n logicalScrollTop,\n projection,\n revision,\n selection,\n viewport.devicePixelRatio,\n viewport.height,\n viewport.width,\n ]);\n\n return (\n <div\n className={cn(\"relative flex h-full min-w-0 flex-col bg-og-bg\", className)}\n data-og-command-state={commandFailure ? \"error\" : pendingCommands > 0 ? \"pending\" : \"idle\"}\n style={{ minHeight: 256 }}\n >\n <div className=\"flex min-h-9 shrink-0 items-center border-b border-og-border bg-og-surface-1\">\n <output\n aria-label=\"Selected range\"\n className=\"shrink-0 border-r border-og-border px-2 font-mono text-og-xs text-og-fg-muted\"\n style={{ width: 96 }}\n >\n {selectionName(selection)}\n </output>\n <span aria-hidden className=\"px-2 font-og-mono text-og-sm italic text-og-fg-subtle\">\n fx\n </span>\n <input\n aria-label=\"Formula or value\"\n readOnly={!editable}\n aria-invalid={commandFailure ? \"true\" : undefined}\n value={draft}\n onFocus={() => {\n if (editable) {\n const current =\n projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\";\n initialDraftRef.current = current;\n setDraft(current);\n setEditMode(\"formula\");\n }\n }}\n onInput={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={onEditorKeyDown}\n onCompositionStart={onEditorCompositionStart}\n onCompositionEnd={(event) => onEditorCompositionEnd(event.currentTarget.value)}\n onBlur={(event) => commitEditorOnBlur(\"formula\", event.currentTarget.value)}\n className=\"h-8 min-w-0 flex-1 bg-transparent px-1 font-mono text-og-sm text-og-fg outline-hidden placeholder:text-og-fg-subtle\"\n />\n </div>\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {commandFailure?.message ?? (pendingCommands > 0 ? \"Saving spreadsheet changes\" : \"\")}\n </div>\n {commandFailure ? (\n <div\n role=\"alert\"\n className=\"absolute bottom-2 left-2 z-50 flex items-center gap-2 rounded-og-sm border border-og-status-failed/30 bg-og-surface-1/95 px-2 py-1 text-og-xs text-og-status-failed shadow-og-sm\"\n style={{ maxWidth: \"calc(100% - 1rem)\" }}\n >\n <span className=\"truncate\">{commandFailure.message}</span>\n {commandFailure.retry ? (\n <button\n type=\"button\"\n onClick={commandFailure.retry}\n className=\"shrink-0 rounded-og-xs px-1.5 py-0.5 font-medium outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n Retry\n </button>\n ) : null}\n </div>\n ) : null}\n\n <div\n ref={viewportRef}\n role=\"grid\"\n tabIndex={0}\n aria-label={`${projection.sheetName} spreadsheet`}\n aria-rowcount={rowCount}\n aria-colcount={columnCount}\n aria-multiselectable=\"true\"\n aria-readonly={!editable}\n aria-busy={pendingCommands > 0 ? \"true\" : undefined}\n aria-activedescendant={activeCellId}\n onKeyDown={onGridKeyDown}\n onCopy={copySelection}\n onPaste={pasteClipboard}\n onCompositionEnd={(event) => {\n if (editMode === null && editable && event.data) beginEditing(event.data);\n }}\n onPointerDown={onGridPointerDown}\n onPointerMove={onGridPointerMove}\n onPointerUp={(event) => stopPointerSelection(event.pointerId)}\n onPointerCancel={(event) => stopPointerSelection(event.pointerId)}\n onDoubleClick={(event) => {\n const cell = hitTestCell(event.clientX, event.clientY);\n if (!cell) return;\n selectCell(cell, event.shiftKey);\n beginEditing(undefined, cell);\n }}\n onScroll={(event) => {\n const element = event.currentTarget;\n setViewport((current) => ({\n ...current,\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop,\n }));\n }}\n className=\"relative min-h-0 min-w-0 flex-1 overflow-auto overscroll-contain bg-og-surface-1 text-og-sm outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\"\n >\n <div\n role=\"rowgroup\"\n className=\"relative\"\n style={{\n width: horizontalProjection.physicalTotal,\n height: verticalProjection.physicalTotal,\n }}\n >\n <canvas\n ref={canvasRef}\n aria-hidden=\"true\"\n data-og-spreadsheet-canvas=\"retained-tiles\"\n className=\"pointer-events-none absolute z-0 block\"\n style={{\n left: physicalScrollLeft,\n top: physicalScrollTop,\n width: viewport.width,\n height: viewport.height,\n }}\n />\n <div\n aria-hidden\n className=\"sticky left-0 top-0 z-40 border-b border-r border-og-border bg-og-surface-2\"\n style={{\n width: ROW_HEADER_WIDTH,\n height: COLUMN_HEADER_HEIGHT,\n ...(canvasReady\n ? { background: \"transparent\", borderColor: \"transparent\" }\n : undefined),\n }}\n />\n\n <div role=\"row\" className=\"contents\">\n {columnLayout.map(({ col, left, width }) => (\n <div\n key={`header-${col}`}\n role=\"columnheader\"\n aria-colindex={col + 1}\n className=\"sticky top-0 z-30 grid select-none place-items-center overflow-hidden border-b border-r border-og-border bg-og-surface-2 text-og-xs font-medium text-og-fg-muted\"\n style={{\n position: \"absolute\",\n left,\n top: physicalScrollTop,\n width,\n height: COLUMN_HEADER_HEIGHT,\n ...(canvasReady\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n }}\n >\n {columnName(col)}\n </div>\n ))}\n </div>\n\n {rowLayout.map(({ row, top, height }) => {\n return (\n <div\n key={`row-${row}`}\n role=\"row\"\n aria-rowindex={row + 1}\n className=\"absolute left-0\"\n style={{\n top,\n width: horizontalProjection.physicalTotal,\n height,\n }}\n >\n <div\n role=\"rowheader\"\n className=\"sticky left-0 z-20 grid h-full select-none place-items-center border-b border-r border-og-border bg-og-surface-2 text-og-xs text-og-fg-muted\"\n style={{\n width: ROW_HEADER_WIDTH,\n ...(canvasReady\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n }}\n >\n {row + 1}\n </div>\n\n {columnLayout.map(({ col, left, width }) => {\n const active = selection.focus.row === row && selection.focus.col === col;\n const selected = isCellSelected(selection, row, col);\n const data = projection.readCell(row, col) ?? {\n value: null,\n input: \"\",\n format: {},\n };\n const value = data.value;\n const address = cellName({ row, col });\n const error = typeof value === \"string\" && value.startsWith(\"#\");\n return (\n <div\n key={col}\n id={`${reactId}-cell-${row}-${col}`}\n role=\"gridcell\"\n aria-colindex={col + 1}\n aria-selected={selected}\n aria-label={`${address}${value === null ? \"\" : `, ${displayValue(value)}`}`}\n data-og-cell={address}\n className={cn(\n \"pointer-events-none absolute top-0 flex h-full min-w-0 overflow-hidden border-b border-r border-og-border px-1.5 text-og-fg\",\n !canvasReady && selected && !active && \"bg-og-accent/10\",\n !canvasReady &&\n active &&\n \"z-10 bg-og-accent/10 ring-2 ring-inset ring-og-accent\",\n !canvasReady && error && \"text-og-status-failed\",\n )}\n style={{\n left,\n width,\n ...cellStyle(data.format),\n ...(canvasReady\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n }}\n >\n {active && editMode === \"cell\" ? (\n <input\n ref={editorRef}\n aria-label={`Edit ${address}`}\n value={draft}\n onInput={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={onEditorKeyDown}\n onCompositionStart={onEditorCompositionStart}\n onCompositionEnd={(event) =>\n onEditorCompositionEnd(event.currentTarget.value)\n }\n onBlur={(event) => commitEditorOnBlur(\"cell\", event.currentTarget.value)}\n onPointerDown={(event) => event.stopPropagation()}\n className=\"pointer-events-auto absolute inset-0 size-full bg-og-surface-1 px-1.5 font-mono text-og-sm text-og-fg outline-hidden ring-2 ring-inset ring-og-accent\"\n />\n ) : (\n <span className=\"block min-w-0 overflow-hidden text-ellipsis\">\n {displayValue(value)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n })}\n\n {!activeCellVisible ? (\n <div role=\"row\" aria-rowindex={selection.focus.row + 1} className=\"sr-only\">\n <div\n id={activeCellId}\n role=\"gridcell\"\n aria-colindex={selection.focus.col + 1}\n aria-selected=\"true\"\n aria-label={`${cellName(selection.focus)}${\n hiddenActiveValue == null ? \"\" : `, ${displayValue(hiddenActiveValue)}`\n }`}\n />\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","const TILE_SIZE = 256;\nconst MAX_CACHE_PHYSICAL_PIXELS = 32_000_000;\nconst MAX_CACHE_TILES = 96;\nconst MAX_DEVICE_PIXEL_RATIO = 4;\nconst MAX_AXIS_MARKS_PER_PAINT = 8_192;\nconst MAX_CANVAS_EDGE = 8_192;\nconst MAX_CANVAS_PIXELS = 16_000_000;\nconst MAX_TILES_PER_PAINT = 512;\n\nexport type SpreadsheetCanvasCellFormat = {\n fill?: string | undefined;\n font?:\n | {\n name?: string | undefined;\n size?: number | undefined;\n bold?: boolean | undefined;\n italic?: boolean | undefined;\n underline?: boolean | undefined;\n color?: string | undefined;\n }\n | undefined;\n horizontalAlignment?: \"left\" | \"center\" | \"right\" | \"justify\" | undefined;\n verticalAlignment?: \"top\" | \"center\" | \"bottom\" | undefined;\n wrapText?: boolean | undefined;\n};\n\n/** One sparse, already-authorized cell projected into the renderer. */\nexport type SpreadsheetCanvasCell = {\n row: number;\n col: number;\n value: unknown;\n formula?: string | null | undefined;\n format: SpreadsheetCanvasCellFormat;\n};\n\nexport type SpreadsheetCanvasCoverage = {\n rowStart: number;\n rowEnd: number;\n columnStart: number;\n columnEnd: number;\n};\n\n/**\n * A bounded value projection. `coverage` is end-exclusive; omitting it means\n * the source can answer for the entire sheet. A session-backed adapter can\n * replace this object as viewport subscriptions advance without making the\n * React layer or renderer own the canonical workbook model.\n */\nexport type SpreadsheetCanvasProjection = {\n sheetId: string;\n generationId: string | null;\n revision: string | number;\n coverage?: SpreadsheetCanvasCoverage | undefined;\n cells: SpreadsheetCanvasCellSource;\n valueAt: (cell: SpreadsheetCanvasCell) => unknown;\n};\n\nexport type SpreadsheetCanvasCellSource = {\n forEachInRange: (\n rowStart: number,\n rowEnd: number,\n columnStart: number,\n columnEnd: number,\n visit: (cell: SpreadsheetCanvasCell) => void,\n ) => void;\n};\n\nexport type SpreadsheetCanvasAxis = {\n count: number;\n total: number;\n offsetAt: (index: number) => number;\n sizeAt: (index: number) => number;\n indexAtOffset: (offset: number) => number;\n};\n\nexport type SpreadsheetCanvasSelection = {\n top: number;\n bottom: number;\n left: number;\n right: number;\n focusRow: number;\n focusColumn: number;\n};\n\nexport type SpreadsheetCanvasTheme = {\n background: string;\n headerBackground: string;\n border: string;\n foreground: string;\n mutedForeground: string;\n accent: string;\n error: string;\n fontFamily: string;\n fontSize: number;\n headerFontSize: number;\n signature: string;\n};\n\nexport type SpreadsheetCanvasPaint = {\n canvas: HTMLCanvasElement;\n projection: SpreadsheetCanvasProjection;\n rows: SpreadsheetCanvasAxis;\n columns: SpreadsheetCanvasAxis;\n selection: SpreadsheetCanvasSelection;\n logicalScrollLeft: number;\n logicalScrollTop: number;\n viewportWidth: number;\n viewportHeight: number;\n rowHeaderWidth: number;\n columnHeaderHeight: number;\n dimensionRevision: string | number;\n devicePixelRatio: number;\n theme: SpreadsheetCanvasTheme;\n};\n\nexport type SpreadsheetCanvasPaintStats = {\n cacheSize: number;\n paintedTiles: number;\n reusedTiles: number;\n uncachedTiles: number;\n devicePixelRatio: number;\n};\n\ntype IndexedRow = {\n row: number;\n cells: SpreadsheetCanvasCell[];\n};\n\ntype Tile = {\n canvas: HTMLCanvasElement;\n lastUsed: number;\n};\n\n/**\n * A row-major sparse index over stored worksheet cells. Empty cells never enter\n * this structure, so a tile query costs O(log k + v), where v is the number of\n * stored cells intersecting that tile.\n */\nexport class SparseSpreadsheetCellIndex {\n readonly size: number;\n private readonly rows: IndexedRow[];\n\n constructor(entries: Iterable<SpreadsheetCanvasCell>) {\n const sorted = [...entries].sort((left, right) => left.row - right.row || left.col - right.col);\n this.size = sorted.length;\n this.rows = [];\n for (const entry of sorted) {\n const previous = this.rows.at(-1);\n if (previous?.row === entry.row) previous.cells.push(entry);\n else this.rows.push({ row: entry.row, cells: [entry] });\n }\n }\n\n forEachInRange(\n rowStart: number,\n rowEnd: number,\n columnStart: number,\n columnEnd: number,\n visit: (cell: SpreadsheetCanvasCell) => void,\n ): void {\n let rowIndex = lowerBound(this.rows, rowStart, (row) => row.row);\n while (rowIndex < this.rows.length) {\n const row = this.rows[rowIndex]!;\n if (row.row >= rowEnd) break;\n let cellIndex = lowerBound(row.cells, columnStart, (cell) => cell.col);\n while (cellIndex < row.cells.length) {\n const cell = row.cells[cellIndex]!;\n if (cell.col >= columnEnd) break;\n visit(cell);\n cellIndex += 1;\n }\n rowIndex += 1;\n }\n }\n}\n\nfunction lowerBound<T>(\n values: readonly T[],\n target: number,\n valueAt: (value: T) => number,\n): number {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (valueAt(values[middle]!) < target) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction coverageContains(\n coverage: SpreadsheetCanvasCoverage | undefined,\n query: SpreadsheetCanvasCoverage,\n): boolean {\n return (\n coverage === undefined ||\n (coverage.rowStart <= query.rowStart &&\n coverage.rowEnd >= query.rowEnd &&\n coverage.columnStart <= query.columnStart &&\n coverage.columnEnd >= query.columnEnd)\n );\n}\n\nfunction intersectCoverage(\n query: SpreadsheetCanvasCoverage,\n coverage: SpreadsheetCanvasCoverage | undefined,\n): SpreadsheetCanvasCoverage | null {\n if (coverage === undefined) return query;\n const intersection = {\n rowStart: Math.max(query.rowStart, coverage.rowStart),\n rowEnd: Math.min(query.rowEnd, coverage.rowEnd),\n columnStart: Math.max(query.columnStart, coverage.columnStart),\n columnEnd: Math.min(query.columnEnd, coverage.columnEnd),\n };\n return intersection.rowStart < intersection.rowEnd &&\n intersection.columnStart < intersection.columnEnd\n ? intersection\n : null;\n}\n\nexport function spreadsheetCanvasDevicePixelRatio(value: number): number {\n if (!Number.isFinite(value) || value <= 0) return 1;\n return Math.max(1, Math.min(MAX_DEVICE_PIXEL_RATIO, value));\n}\n\n/** Caps backing-store allocation while retaining the full CSS viewport. */\nexport function spreadsheetCanvasBackingScale(\n width: number,\n height: number,\n devicePixelRatio: number,\n): number {\n const safeWidth = finiteExtent(width);\n const safeHeight = finiteExtent(height);\n const requested = spreadsheetCanvasDevicePixelRatio(devicePixelRatio);\n return Math.max(\n Number.EPSILON,\n Math.min(\n requested,\n MAX_CANVAS_EDGE / safeWidth,\n MAX_CANVAS_EDGE / safeHeight,\n Math.sqrt(MAX_CANVAS_PIXELS / (safeWidth * safeHeight)),\n ),\n );\n}\n\n/** Retained 2D tile renderer. Dynamic selection and headers are painted above cached body tiles. */\nexport class SpreadsheetCanvasRenderer {\n private readonly tiles = new Map<string, Tile>();\n private generation = \"\";\n private clock = 0;\n\n dispose(): void {\n this.tiles.clear();\n this.generation = \"\";\n }\n\n paint(input: SpreadsheetCanvasPaint): SpreadsheetCanvasPaintStats | null {\n const context = safeCanvasContext(input.canvas);\n if (!context) return null;\n\n const width = finiteExtent(input.viewportWidth);\n const height = finiteExtent(input.viewportHeight);\n const dpr = spreadsheetCanvasBackingScale(width, height, input.devicePixelRatio);\n const pixelWidth = Math.max(1, Math.min(MAX_CANVAS_EDGE, Math.round(width * dpr)));\n const pixelHeight = Math.max(1, Math.min(MAX_CANVAS_EDGE, Math.round(height * dpr)));\n if (input.canvas.width !== pixelWidth) input.canvas.width = pixelWidth;\n if (input.canvas.height !== pixelHeight) input.canvas.height = pixelHeight;\n input.canvas.style.width = `${width}px`;\n input.canvas.style.height = `${height}px`;\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.clearRect(0, 0, width, height);\n\n const generation = [\n input.projection.sheetId,\n input.projection.generationId ?? \"<none>\",\n input.projection.revision,\n input.dimensionRevision,\n dpr,\n input.theme.signature,\n ].join(\"/\");\n if (generation !== this.generation) {\n this.tiles.clear();\n this.generation = generation;\n }\n\n setFill(context, input.theme.background, \"#ffffff\");\n context.fillRect(0, 0, width, height);\n\n const bodyLeft = input.rowHeaderWidth;\n const bodyTop = input.columnHeaderHeight;\n const visibleLeft = clamp(input.logicalScrollLeft, 0, input.columns.total);\n const visibleTop = clamp(input.logicalScrollTop, 0, input.rows.total);\n const visibleRight = clamp(\n input.logicalScrollLeft + width - bodyLeft,\n visibleLeft,\n input.columns.total,\n );\n const visibleBottom = clamp(\n input.logicalScrollTop + height - bodyTop,\n visibleTop,\n input.rows.total,\n );\n let paintedTiles = 0;\n let reusedTiles = 0;\n let uncachedTiles = 0;\n\n context.save();\n context.beginPath();\n context.rect(bodyLeft, bodyTop, Math.max(0, width - bodyLeft), Math.max(0, height - bodyTop));\n context.clip();\n const firstTileColumn = Math.floor(visibleLeft / TILE_SIZE);\n const lastTileColumn = Math.floor(\n Math.max(visibleLeft, visibleRight - Number.EPSILON) / TILE_SIZE,\n );\n const firstTileRow = Math.floor(visibleTop / TILE_SIZE);\n const lastTileRow = Math.floor(\n Math.max(visibleTop, visibleBottom - Number.EPSILON) / TILE_SIZE,\n );\n let visitedTiles = 0;\n tileLoop: for (let tileRow = firstTileRow; tileRow <= lastTileRow; tileRow += 1) {\n for (let tileColumn = firstTileColumn; tileColumn <= lastTileColumn; tileColumn += 1) {\n if (visitedTiles >= MAX_TILES_PER_PAINT) break tileLoop;\n visitedTiles += 1;\n const key = `${tileColumn}:${tileRow}`;\n let tile = this.tiles.get(key);\n if (!tile) {\n const painted = this.paintTile(input, tileColumn, tileRow, dpr);\n tile = {\n canvas: painted.canvas,\n lastUsed: ++this.clock,\n };\n if (painted.cacheable) this.tiles.set(key, tile);\n else uncachedTiles += 1;\n paintedTiles += 1;\n } else {\n tile.lastUsed = ++this.clock;\n reusedTiles += 1;\n }\n const logicalX = tileColumn * TILE_SIZE;\n const logicalY = tileRow * TILE_SIZE;\n context.drawImage(\n tile.canvas,\n bodyLeft + logicalX - input.logicalScrollLeft,\n bodyTop + logicalY - input.logicalScrollTop,\n TILE_SIZE,\n TILE_SIZE,\n );\n }\n }\n\n paintSelection(context, input);\n paintVisibleGrid(context, input, visibleLeft, visibleTop, visibleRight, visibleBottom);\n context.restore();\n paintHeaders(\n context,\n input,\n width,\n height,\n visibleLeft,\n visibleTop,\n visibleRight,\n visibleBottom,\n );\n\n this.evictTiles(dpr);\n return {\n cacheSize: this.tiles.size,\n paintedTiles,\n reusedTiles,\n uncachedTiles,\n devicePixelRatio: dpr,\n };\n }\n\n private paintTile(\n input: SpreadsheetCanvasPaint,\n tileColumn: number,\n tileRow: number,\n dpr: number,\n ): { canvas: HTMLCanvasElement; cacheable: boolean } {\n const tile = input.canvas.ownerDocument.createElement(\"canvas\");\n tile.width = Math.max(1, Math.round(TILE_SIZE * dpr));\n tile.height = Math.max(1, Math.round(TILE_SIZE * dpr));\n const context = safeCanvasContext(tile);\n if (!context) return { canvas: tile, cacheable: false };\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n setFill(context, input.theme.background, \"#ffffff\");\n context.fillRect(0, 0, TILE_SIZE, TILE_SIZE);\n\n const tileLeft = tileColumn * TILE_SIZE;\n const tileTop = tileRow * TILE_SIZE;\n const tileRight = Math.min(input.columns.total, tileLeft + TILE_SIZE);\n const tileBottom = Math.min(input.rows.total, tileTop + TILE_SIZE);\n const firstColumn = input.columns.indexAtOffset(tileLeft);\n const lastColumn = input.columns.indexAtOffset(Math.max(tileLeft, tileRight - Number.EPSILON));\n const firstRow = input.rows.indexAtOffset(tileTop);\n const lastRow = input.rows.indexAtOffset(Math.max(tileTop, tileBottom - Number.EPSILON));\n const query = {\n rowStart: firstRow,\n rowEnd: Math.min(input.rows.count, lastRow + 1),\n columnStart: firstColumn,\n columnEnd: Math.min(input.columns.count, lastColumn + 1),\n };\n const coveredQuery = intersectCoverage(query, input.projection.coverage);\n const cacheable = coverageContains(input.projection.coverage, query);\n const cells: SpreadsheetCanvasCell[] = [];\n if (coveredQuery) {\n input.projection.cells.forEachInRange(\n coveredQuery.rowStart,\n coveredQuery.rowEnd,\n coveredQuery.columnStart,\n coveredQuery.columnEnd,\n (cell) => cells.push(cell),\n );\n }\n\n for (const cell of cells) {\n const fill = cell.format.fill;\n if (!fill) continue;\n const x = input.columns.offsetAt(cell.col) - tileLeft;\n const y = input.rows.offsetAt(cell.row) - tileTop;\n const width = input.columns.sizeAt(cell.col);\n const height = input.rows.sizeAt(cell.row);\n setFill(context, fill, input.theme.background);\n context.fillRect(x, y, width, height);\n }\n\n paintTileGrid(context, input, tileLeft, tileTop, tileRight, tileBottom);\n\n for (const cell of cells) {\n const value = input.projection.valueAt(cell);\n const text = displayValue(value);\n if (!text) continue;\n paintCellText(context, input, cell, text, tileLeft, tileTop);\n }\n\n return { canvas: tile, cacheable };\n }\n\n private evictTiles(dpr: number): void {\n const pixelsPerTile = Math.max(1, Math.round(TILE_SIZE * dpr)) ** 2;\n const maximum = Math.max(\n 4,\n Math.min(MAX_CACHE_TILES, Math.floor(MAX_CACHE_PHYSICAL_PIXELS / pixelsPerTile)),\n );\n if (this.tiles.size <= maximum) return;\n const oldest = [...this.tiles.entries()].sort(\n (left, right) => left[1].lastUsed - right[1].lastUsed,\n );\n for (let index = 0; index < oldest.length - maximum; index += 1) {\n this.tiles.delete(oldest[index]![0]);\n }\n }\n}\n\nfunction finiteExtent(value: number): number {\n if (!Number.isFinite(value) || value <= 0) return 1;\n return Math.max(1, Math.floor(value));\n}\n\nfunction safeCanvasContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D | null {\n try {\n return canvas.getContext(\"2d\", { alpha: false });\n } catch {\n return null;\n }\n}\n\nfunction setFill(context: CanvasRenderingContext2D, value: string, fallback: string): void {\n context.fillStyle = fallback;\n try {\n context.fillStyle = value;\n } catch {\n // Invalid workbook colors behave like invalid CSS declarations: ignore them.\n }\n}\n\nfunction setStroke(context: CanvasRenderingContext2D, value: string, fallback: string): void {\n context.strokeStyle = fallback;\n try {\n context.strokeStyle = value;\n } catch {\n // Invalid workbook colors behave like invalid CSS declarations: ignore them.\n }\n}\n\nfunction paintTileGrid(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n tileLeft: number,\n tileTop: number,\n tileRight: number,\n tileBottom: number,\n): void {\n setFill(context, input.theme.border, \"#d1d5db\");\n visitAxisBoundaries(input.columns, tileLeft, tileRight, (offset) => {\n context.fillRect(offset - tileLeft - 1, 0, 1, TILE_SIZE);\n });\n visitAxisBoundaries(input.rows, tileTop, tileBottom, (offset) => {\n context.fillRect(0, offset - tileTop - 1, TILE_SIZE, 1);\n });\n}\n\nfunction paintVisibleGrid(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n visibleLeft: number,\n visibleTop: number,\n visibleRight: number,\n visibleBottom: number,\n): void {\n setFill(context, input.theme.border, \"#d1d5db\");\n visitAxisBoundaries(input.columns, visibleLeft, visibleRight, (offset) => {\n const x = input.rowHeaderWidth + offset - input.logicalScrollLeft;\n context.fillRect(x - 1, input.columnHeaderHeight, 1, input.viewportHeight);\n });\n visitAxisBoundaries(input.rows, visibleTop, visibleBottom, (offset) => {\n const y = input.columnHeaderHeight + offset - input.logicalScrollTop;\n context.fillRect(input.rowHeaderWidth, y - 1, input.viewportWidth, 1);\n });\n}\n\nfunction visitAxisBoundaries(\n axis: SpreadsheetCanvasAxis,\n start: number,\n end: number,\n visit: (offset: number) => void,\n): void {\n if (axis.count <= 0 || end < start) return;\n let index = axis.indexAtOffset(start);\n let visits = 0;\n while (index < axis.count && visits < MAX_AXIS_MARKS_PER_PAINT) {\n const boundary = axis.offsetAt(index + 1);\n if (boundary > end + 1) break;\n if (boundary >= start) visit(boundary);\n index += 1;\n visits += 1;\n }\n}\n\nfunction paintSelection(context: CanvasRenderingContext2D, input: SpreadsheetCanvasPaint): void {\n const { selection } = input;\n const left =\n input.rowHeaderWidth + input.columns.offsetAt(selection.left) - input.logicalScrollLeft;\n const right =\n input.rowHeaderWidth + input.columns.offsetAt(selection.right + 1) - input.logicalScrollLeft;\n const top =\n input.columnHeaderHeight + input.rows.offsetAt(selection.top) - input.logicalScrollTop;\n const bottom =\n input.columnHeaderHeight + input.rows.offsetAt(selection.bottom + 1) - input.logicalScrollTop;\n context.save();\n setFill(context, input.theme.accent, \"#3b82f6\");\n context.globalAlpha = 0.1;\n context.fillRect(left, top, right - left, bottom - top);\n context.restore();\n\n const activeLeft =\n input.rowHeaderWidth + input.columns.offsetAt(selection.focusColumn) - input.logicalScrollLeft;\n const activeTop =\n input.columnHeaderHeight + input.rows.offsetAt(selection.focusRow) - input.logicalScrollTop;\n const activeWidth = input.columns.sizeAt(selection.focusColumn);\n const activeHeight = input.rows.sizeAt(selection.focusRow);\n context.save();\n setStroke(context, input.theme.accent, \"#3b82f6\");\n context.lineWidth = 2;\n context.strokeRect(\n activeLeft + 1,\n activeTop + 1,\n Math.max(0, activeWidth - 2),\n Math.max(0, activeHeight - 2),\n );\n context.restore();\n}\n\nfunction paintHeaders(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n width: number,\n height: number,\n visibleLeft: number,\n visibleTop: number,\n visibleRight: number,\n visibleBottom: number,\n): void {\n setFill(context, input.theme.headerBackground, \"#f3f4f6\");\n context.fillRect(0, 0, width, input.columnHeaderHeight);\n context.fillRect(0, input.columnHeaderHeight, input.rowHeaderWidth, height);\n setFill(context, input.theme.border, \"#d1d5db\");\n context.fillRect(0, input.columnHeaderHeight - 1, width, 1);\n context.fillRect(input.rowHeaderWidth - 1, 0, 1, height);\n\n context.save();\n context.beginPath();\n context.rect(\n input.rowHeaderWidth,\n 0,\n Math.max(0, width - input.rowHeaderWidth),\n input.columnHeaderHeight,\n );\n context.clip();\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.font = `600 ${input.theme.headerFontSize}px ${input.theme.fontFamily}`;\n context.textAlign = \"center\";\n context.textBaseline = \"middle\";\n visitAxisItems(input.columns, visibleLeft, visibleRight, (column, offset, size) => {\n const x = input.rowHeaderWidth + offset - input.logicalScrollLeft;\n setFill(context, input.theme.border, \"#d1d5db\");\n context.fillRect(x + size - 1, 0, 1, input.columnHeaderHeight);\n if (size >= 8) {\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.fillText(columnName(column), x + size / 2, input.columnHeaderHeight / 2);\n }\n });\n context.restore();\n\n context.save();\n context.beginPath();\n context.rect(\n 0,\n input.columnHeaderHeight,\n input.rowHeaderWidth,\n Math.max(0, height - input.columnHeaderHeight),\n );\n context.clip();\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.font = `400 ${input.theme.headerFontSize}px ${input.theme.fontFamily}`;\n context.textAlign = \"center\";\n context.textBaseline = \"middle\";\n visitAxisItems(input.rows, visibleTop, visibleBottom, (row, offset, size) => {\n const y = input.columnHeaderHeight + offset - input.logicalScrollTop;\n setFill(context, input.theme.border, \"#d1d5db\");\n context.fillRect(0, y + size - 1, input.rowHeaderWidth, 1);\n if (size >= 8) {\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.fillText(String(row + 1), input.rowHeaderWidth / 2, y + size / 2);\n }\n });\n context.restore();\n}\n\nfunction visitAxisItems(\n axis: SpreadsheetCanvasAxis,\n start: number,\n end: number,\n visit: (index: number, offset: number, size: number) => void,\n): void {\n if (axis.count <= 0 || end < start) return;\n let index = axis.indexAtOffset(start);\n let visits = 0;\n while (index < axis.count && visits < MAX_AXIS_MARKS_PER_PAINT) {\n const offset = axis.offsetAt(index);\n if (offset > end) break;\n visit(index, offset, axis.sizeAt(index));\n index += 1;\n visits += 1;\n }\n}\n\nfunction paintCellText(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n cell: SpreadsheetCanvasCell,\n text: string,\n tileLeft: number,\n tileTop: number,\n): void {\n const format = cell.format;\n const x = input.columns.offsetAt(cell.col) - tileLeft;\n const y = input.rows.offsetAt(cell.row) - tileTop;\n const width = input.columns.sizeAt(cell.col);\n const height = input.rows.sizeAt(cell.row);\n if (width <= 2 || height <= 2) return;\n const fontSize = finitePositive(format.font?.size, input.theme.fontSize);\n const fontFamily = format.font?.name || input.theme.fontFamily;\n const weight = format.font?.bold ? 600 : 400;\n const italic = format.font?.italic ? \"italic \" : \"\";\n context.save();\n context.beginPath();\n context.rect(x + 1, y + 1, Math.max(0, width - 2), Math.max(0, height - 2));\n context.clip();\n context.font = `${italic}${weight} ${fontSize}px ${fontFamily}`;\n setFill(\n context,\n format.font?.color ?? (text.startsWith(\"#\") ? input.theme.error : input.theme.foreground),\n input.theme.foreground,\n );\n const alignment = format.horizontalAlignment;\n context.textAlign = alignment === \"center\" ? \"center\" : alignment === \"right\" ? \"right\" : \"left\";\n context.textBaseline = \"alphabetic\";\n const padding = 6;\n const textX =\n alignment === \"center\"\n ? x + width / 2\n : alignment === \"right\"\n ? x + width - padding\n : x + padding;\n const lineHeight = fontSize * 1.5;\n const availableWidth = Math.max(0, width - padding * 2);\n const lines = format.wrapText\n ? wrapText(context, text, availableWidth, Math.max(1, Math.floor(height / lineHeight)))\n : [ellipsize(context, text.replaceAll(/\\r?\\n/g, \" \"), availableWidth)];\n const blockHeight = lines.length * lineHeight;\n const vertical = format.verticalAlignment;\n const firstBaseline =\n vertical === \"top\"\n ? y + Math.min(height, padding + fontSize)\n : vertical === \"bottom\"\n ? y + height - padding - blockHeight + fontSize\n : y + (height - blockHeight) / 2 + fontSize;\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index]!;\n const baseline = firstBaseline + index * lineHeight;\n context.fillText(line, textX, baseline);\n if (format.font?.underline && line) {\n const metrics = context.measureText(line);\n const textWidth = metrics.width;\n const startX =\n alignment === \"center\"\n ? textX - textWidth / 2\n : alignment === \"right\"\n ? textX - textWidth\n : textX;\n setFill(context, format.font.color ?? input.theme.foreground, input.theme.foreground);\n context.fillRect(startX, baseline + 1, textWidth, Math.max(1, fontSize / 14));\n }\n }\n context.restore();\n}\n\nfunction wrapText(\n context: CanvasRenderingContext2D,\n input: string,\n maximumWidth: number,\n maximumLines: number,\n): string[] {\n if (maximumWidth <= 0) return [\"\"];\n const output: string[] = [];\n for (const paragraph of input.split(/\\r?\\n/)) {\n const words = paragraph.split(/\\s+/).filter(Boolean);\n if (words.length === 0) output.push(\"\");\n let line = \"\";\n for (const word of words) {\n const next = line ? `${line} ${word}` : word;\n if (!line || context.measureText(next).width <= maximumWidth) line = next;\n else {\n output.push(ellipsize(context, line, maximumWidth));\n line = word;\n }\n if (output.length >= maximumLines) break;\n }\n if (output.length < maximumLines && line) output.push(ellipsize(context, line, maximumWidth));\n if (output.length >= maximumLines) break;\n }\n return output.slice(0, maximumLines);\n}\n\nfunction ellipsize(context: CanvasRenderingContext2D, input: string, maximumWidth: number): string {\n if (!input || maximumWidth <= 0) return \"\";\n if (context.measureText(input).width <= maximumWidth) return input;\n const suffix = \"…\";\n const suffixWidth = context.measureText(suffix).width;\n if (suffixWidth > maximumWidth) return \"\";\n let low = 0;\n let high = input.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (context.measureText(`${input.slice(0, middle)}${suffix}`).width <= maximumWidth)\n low = middle;\n else high = middle - 1;\n }\n return `${input.slice(0, low)}${suffix}`;\n}\n\nfunction finitePositive(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toLocaleDateString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n\nfunction columnName(index: number): string {\n let value = index + 1;\n let result = \"\";\n while (value > 0) {\n const remainder = (value - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n value = Math.floor((value - 1) / 26);\n }\n return result;\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.max(minimum, Math.min(maximum, value));\n}\n","import {\n SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n editableArtifactStableId,\n spreadsheetSheetId,\n type EditableArtifactSession,\n type EditableSpreadsheetCellValue,\n type EditableSpreadsheetMetadataProjection,\n type EditableSpreadsheetSheetMetadata,\n type EditableSpreadsheetViewportProjection,\n type EditableSpreadsheetViewportQuery,\n type SpreadsheetCellInput,\n type SpreadsheetSheetGeneration,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { PlusIcon } from \"lucide-react\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { ArtifactSurface } from \"./artifact-surface\";\nimport {\n editableArtifactAccessRevoked,\n editableArtifactStatusLabel,\n EditableArtifactMessage,\n useEditableArtifactView,\n} from \"./editable-artifact-ui\";\nimport { SparseSpreadsheetCellIndex } from \"./spreadsheet-canvas\";\nimport {\n SpreadsheetProjectionGrid,\n type SpreadsheetCommit,\n type SpreadsheetGridProjection,\n type SpreadsheetRangeCommit,\n type SpreadsheetSelection,\n type SpreadsheetViewport,\n} from \"./spreadsheet-grid\";\n\nconst EXCEL_MAX_ROWS = 1_048_576;\nconst EXCEL_MAX_COLUMNS = 16_384;\nconst INITIAL_VIEWPORT_ROWS = 64;\nconst INITIAL_VIEWPORT_COLUMNS = 32;\nconst MAX_INTERACTIVE_QUERY_CELLS = 65_536;\nconst MAX_INTERACTIVE_QUERY_BYTES = 8 * 1024 * 1024;\nconst EMPTY_FORMAT = Object.freeze({});\nconst EMPTY_SHEETS: readonly EditableSpreadsheetSheetMetadata[] = [];\n\nexport type EditableSpreadsheetGridProps = {\n session: EditableArtifactSession;\n sheet: EditableSpreadsheetSheetMetadata;\n metadataRevision: bigint;\n readOnly?: boolean | undefined;\n rowCount?: number | undefined;\n columnCount?: number | undefined;\n overscanRows?: number | undefined;\n overscanColumns?: number | undefined;\n onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;\n onCommit?: ((commit: SpreadsheetCommit) => void) | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;\n className?: string | undefined;\n};\n\nexport type EditableSpreadsheetArtifactSurfaceProps = Omit<\n EditableSpreadsheetGridProps,\n \"metadataRevision\" | \"sheet\"\n> & {\n title?: string | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n initialSheetId?: string | undefined;\n allowAddSheet?: boolean | undefined;\n};\n\ntype ProjectionState = {\n query: EditableSpreadsheetViewportQuery;\n projection: EditableSpreadsheetViewportProjection | null;\n error: Error | null;\n};\n\n/**\n * Durable spreadsheet editor over one SDK session. Canonical state remains in\n * the dedicated Worker; React receives one bounded immutable viewport only.\n */\nexport function EditableSpreadsheetGrid({\n session,\n sheet,\n metadataRevision,\n readOnly = false,\n rowCount: requestedRowCount,\n columnCount: requestedColumnCount,\n overscanRows = 3,\n overscanColumns = 2,\n onSelectionChange,\n onCommit,\n onCommandError,\n onViewportChange,\n className,\n}: EditableSpreadsheetGridProps) {\n const rowCount = boundedSheetCount(requestedRowCount, EXCEL_MAX_ROWS, sheet.usedBounds?.endRow);\n const columnCount = boundedSheetCount(\n requestedColumnCount,\n EXCEL_MAX_COLUMNS,\n sheet.usedBounds?.endColumn,\n );\n const [state, setState] = useState<ProjectionState>(() => ({\n query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),\n projection: null,\n error: null,\n }));\n const activeCellRef = useRef({ row: 0, column: 0 });\n\n useEffect(() => {\n setState({\n query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),\n projection: null,\n error: null,\n });\n activeCellRef.current = { row: 0, column: 0 };\n }, [columnCount, rowCount, session, sheet.sheetId]);\n\n useEffect(() => {\n const query = state.query;\n return session.subscribeSpreadsheetViewport(\n query,\n (projection) => {\n if (!sameViewport(projection, query)) return;\n if (sheet.generationId !== null && projection.generationId !== sheet.generationId) {\n setState((current) =>\n sameViewportQuery(current.query, query)\n ? {\n ...current,\n projection: null,\n error: new Error(\"Spreadsheet generation changed; refreshing metadata\"),\n }\n : current,\n );\n return;\n }\n setState((current) =>\n sameViewportQuery(current.query, query) ? { query, projection, error: null } : current,\n );\n },\n {\n onError(error) {\n setState((current) =>\n sameViewportQuery(current.query, query) ? { ...current, error } : current,\n );\n },\n },\n );\n }, [session, sheet.generationId, state.query]);\n\n const projection = useMemo(\n () =>\n projectSdkViewport(\n sheet,\n metadataRevision,\n state.query,\n state.projection,\n rowCount,\n columnCount,\n ),\n [columnCount, metadataRevision, rowCount, sheet, state.projection, state.query],\n );\n const generation = useMemo(() => sheetGeneration(sheet), [sheet]);\n const editable = !readOnly && generation !== null;\n\n const handleCommit = useCallback(\n async (commit: SpreadsheetCommit) => {\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n const input = spreadsheetCellInput(commit.input, commit.kind);\n await session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"cells.set\",\n sheet: generation,\n anchor: { row: commit.cell.row, column: commit.cell.col },\n rows: 1,\n columns: 1,\n cells: [input],\n },\n ],\n });\n onCommit?.(commit);\n },\n [generation, onCommit, session],\n );\n\n const handleClear = useCallback(\n async (selection: SpreadsheetSelection) => {\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n const top = Math.min(selection.anchor.row, selection.focus.row);\n const bottom = Math.max(selection.anchor.row, selection.focus.row);\n const left = Math.min(selection.anchor.col, selection.focus.col);\n const right = Math.max(selection.anchor.col, selection.focus.col);\n await session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"range.clear\",\n sheet: generation,\n range: {\n start: { row: top, column: left },\n end: { row: bottom, column: right },\n },\n },\n ],\n });\n },\n [generation, session],\n );\n\n const handleCommitRange = useCallback(\n async (commit: SpreadsheetRangeCommit) => {\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n await session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"cells.set\",\n sheet: generation,\n anchor: { row: commit.anchor.row, column: commit.anchor.col },\n rows: commit.rows,\n columns: commit.columns,\n cells: commit.inputs.map((input) =>\n spreadsheetCellInput(input, input.startsWith(\"=\") ? \"formula\" : \"value\"),\n ),\n },\n ],\n });\n },\n [generation, session],\n );\n\n const handleSelection = useCallback(\n (selection: SpreadsheetSelection) => {\n activeCellRef.current = {\n row: selection.focus.row,\n column: selection.focus.col,\n };\n setState((current) => {\n if (queryContains(current.query, selection.focus.row, selection.focus.col)) return current;\n return {\n query: boundedViewportQuery(\n sheet.sheetId,\n selection.focus.row,\n selection.focus.row + 1,\n selection.focus.col,\n selection.focus.col + 1,\n rowCount,\n columnCount,\n activeCellRef.current,\n ),\n projection: current.projection,\n error: null,\n };\n });\n onSelectionChange?.(selection);\n },\n [columnCount, onSelectionChange, rowCount, sheet.sheetId],\n );\n\n const handleViewport = useCallback(\n (viewport: SpreadsheetViewport) => {\n const next = boundedViewportQuery(\n sheet.sheetId,\n viewport.overscanRowStart,\n viewport.overscanRowEnd,\n viewport.overscanColumnStart,\n viewport.overscanColumnEnd,\n rowCount,\n columnCount,\n activeCellRef.current,\n );\n setState((current) =>\n sameViewportQuery(current.query, next)\n ? current\n : { query: next, projection: current.projection, error: null },\n );\n onViewportChange?.(viewport);\n },\n [columnCount, onViewportChange, rowCount, sheet.sheetId],\n );\n\n return (\n <div className={cn(\"relative h-full min-h-0\", className)}>\n <SpreadsheetProjectionGrid\n projection={projection}\n readOnly={!editable}\n overscanRows={overscanRows}\n overscanColumns={overscanColumns}\n onSelectionChange={handleSelection}\n commit={editable ? handleCommit : undefined}\n commitRange={editable ? handleCommitRange : undefined}\n clear={editable ? handleClear : undefined}\n onCommandError={onCommandError}\n onViewportChange={handleViewport}\n />\n {state.error ? (\n <output\n role=\"status\"\n className=\"pointer-events-none absolute bottom-2 left-2 z-50 rounded-og-sm border border-og-status-failed/30 bg-og-surface-1/95 px-2 py-1 text-og-xs text-og-status-failed shadow-og-sm\"\n style={{ maxWidth: \"min(28rem, calc(100% - 1rem))\" }}\n >\n {state.error.message}\n </output>\n ) : null}\n </div>\n );\n}\n\n/** Artifact chrome, sheet navigation, and one Worker-backed spreadsheet grid. */\nexport function EditableSpreadsheetArtifactSurface({\n session,\n title = \"Workbook\",\n subtitle,\n actions,\n initialSheetId,\n allowAddSheet = true,\n readOnly = false,\n ...gridProps\n}: EditableSpreadsheetArtifactSurfaceProps) {\n const { metadata, error: metadataError } = useSpreadsheetMetadata(session);\n const view = useEditableArtifactView(session);\n const [activeSheetId, setActiveSheetId] = useState<string | null>(initialSheetId ?? null);\n const [creatingSheet, setCreatingSheet] = useState(false);\n const [surfaceError, setSurfaceError] = useState<Error | null>(null);\n const sheets = metadata?.sheets ?? EMPTY_SHEETS;\n const activeSheet =\n sheets.find((sheet) => sheet.sheetId === activeSheetId) ??\n (initialSheetId ? sheets.find((sheet) => sheet.sheetId === initialSheetId) : undefined) ??\n sheets[0] ??\n null;\n const writable = !readOnly && view.writable;\n const accessRevoked = editableArtifactAccessRevoked(view);\n\n const addSheet = useCallback(async () => {\n if (!writable || creatingSheet) return;\n setCreatingSheet(true);\n setSurfaceError(null);\n try {\n const after = activeSheet ? sheetGeneration(activeSheet) : null;\n const created = await session.createSpreadsheetSheet({\n name: nextAvailableSheetName(sheets),\n after,\n });\n setActiveSheetId(created.sheetId);\n } catch (cause) {\n setSurfaceError(asError(cause));\n } finally {\n setCreatingSheet(false);\n }\n }, [activeSheet, creatingSheet, session, sheets, writable]);\n\n const footer = (\n <div\n className=\"flex min-h-9 items-center gap-1 overflow-x-auto px-2\"\n role=\"tablist\"\n aria-label=\"Worksheets\"\n >\n {sheets.map((sheet) => (\n <button\n key={`${sheet.sheetId}:${sheet.generationId ?? \"pending\"}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={sheet.sheetId === activeSheet?.sheetId}\n onClick={() => setActiveSheetId(sheet.sheetId)}\n className={cn(\n \"h-7 shrink-0 rounded-og-sm px-2.5 text-og-sm outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent\",\n sheet.sheetId === activeSheet?.sheetId\n ? \"bg-og-surface-3 font-medium text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg\",\n )}\n >\n {sheet.name}\n </button>\n ))}\n {writable && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={() => void addSheet()}\n disabled={creatingSheet}\n aria-label={creatingSheet ? \"Adding worksheet\" : \"Add worksheet\"}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted outline-hidden hover:bg-og-surface-3 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50 [&>svg]:size-3.5\"\n >\n <PlusIcon />\n </button>\n ) : null}\n </div>\n );\n const error = surfaceError ?? metadataError;\n\n return (\n <ArtifactSurface\n modality=\"spreadsheet\"\n title={title}\n subtitle={\n subtitle ??\n (accessRevoked\n ? editableArtifactStatusLabel(view)\n : metadata\n ? `${sheets.length} sheet${sheets.length === 1 ? \"\" : \"s\"}`\n : editableArtifactStatusLabel(view))\n }\n actions={actions}\n footer={accessRevoked ? undefined : footer}\n busy={!accessRevoked && !metadata && !error}\n >\n {accessRevoked ? (\n <EditableArtifactMessage\n title=\"Access changed\"\n detail={editableArtifactStatusLabel(view)}\n />\n ) : activeSheet && metadata ? (\n <EditableSpreadsheetGrid\n key={`${activeSheet.sheetId}:${activeSheet.generationId ?? \"pending\"}`}\n {...gridProps}\n session={session}\n sheet={activeSheet}\n metadataRevision={metadata.revision}\n readOnly={!writable}\n />\n ) : error ? (\n <EditableArtifactMessage title=\"Could not open this workbook\" detail={error.message} />\n ) : metadata ? (\n <div className=\"grid h-full place-items-center bg-og-bg p-6 text-center\">\n <div>\n <p className=\"text-og-base font-medium text-og-fg\">This workbook has no worksheets.</p>\n {writable && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={() => void addSheet()}\n disabled={creatingSheet}\n className=\"mt-3 rounded-og-sm bg-og-accent-deep px-3 py-1.5 text-og-sm font-medium text-og-accent-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50\"\n >\n {creatingSheet ? \"Adding…\" : \"Add worksheet\"}\n </button>\n ) : null}\n </div>\n </div>\n ) : (\n <EditableArtifactMessage\n title=\"Opening workbook\"\n detail={editableArtifactStatusLabel(view)}\n />\n )}\n </ArtifactSurface>\n );\n}\n\nfunction useSpreadsheetMetadata(session: EditableArtifactSession): {\n metadata: EditableSpreadsheetMetadataProjection | null;\n error: Error | null;\n} {\n const [state, setState] = useState<{\n metadata: EditableSpreadsheetMetadataProjection | null;\n error: Error | null;\n }>({ metadata: null, error: null });\n useEffect(\n () =>\n session.subscribeSpreadsheetMetadata({}, (metadata) => setState({ metadata, error: null }), {\n onError: (error) => setState((current) => ({ ...current, error })),\n }),\n [session],\n );\n return state;\n}\n\nfunction projectSdkViewport(\n sheet: EditableSpreadsheetSheetMetadata,\n metadataRevision: bigint,\n query: EditableSpreadsheetViewportQuery,\n viewport: EditableSpreadsheetViewportProjection | null,\n rowCount: number,\n columnCount: number,\n): SpreadsheetGridProjection {\n const current = viewport && sameViewport(viewport, query) ? viewport : null;\n const projectedCells = (current?.cells ?? []).map((cell) => ({\n row: cell.row,\n col: cell.column,\n value: projectedCellValue(cell.value),\n formula: cell.formula,\n format: EMPTY_FORMAT,\n }));\n const cells = new SparseSpreadsheetCellIndex(projectedCells);\n const byCoordinate = new Map(\n projectedCells.map((cell) => [`${cell.row}:${cell.col}`, cell] as const),\n );\n const used = sheet.usedBounds;\n return {\n sheetId: sheet.sheetId,\n sheetName: sheet.name,\n generationId: current?.generationId ?? sheet.generationId,\n revision: `${metadataRevision}:${current?.revision ?? \"loading\"}`,\n dimensionRevision: metadataRevision.toString(),\n rowCount,\n columnCount,\n usedRange: used\n ? {\n row: used.startRow,\n col: used.startColumn,\n rowCount: used.endRow - used.startRow + 1,\n colCount: used.endColumn - used.startColumn + 1,\n }\n : null,\n coverage: current\n ? {\n rowStart: current.startRow,\n rowEnd: current.startRow + current.rowCount,\n columnStart: current.startColumn,\n columnEnd: current.startColumn + current.columnCount,\n }\n : {\n rowStart: query.startRow,\n rowEnd: query.startRow,\n columnStart: query.startColumn,\n columnEnd: query.startColumn,\n },\n cells,\n valueAt: (cell) => cell.value,\n readCell: (row, column) => {\n const cell = byCoordinate.get(`${row}:${column}`);\n return cell\n ? {\n value: cell.value,\n input: cell.formula ?? displayValue(cell.value),\n format: cell.format,\n }\n : null;\n },\n };\n}\n\nfunction initialViewportQuery(\n sheetId: string,\n rowCount: number,\n columnCount: number,\n): EditableSpreadsheetViewportQuery {\n return {\n sheetId,\n startRow: 0,\n startColumn: 0,\n rowCount: Math.min(rowCount, INITIAL_VIEWPORT_ROWS),\n columnCount: Math.min(columnCount, INITIAL_VIEWPORT_COLUMNS),\n maxCells: MAX_INTERACTIVE_QUERY_CELLS,\n maxBytes: MAX_INTERACTIVE_QUERY_BYTES,\n };\n}\n\nfunction boundedViewportQuery(\n sheetId: string,\n desiredRowStart: number,\n desiredRowEnd: number,\n desiredColumnStart: number,\n desiredColumnEnd: number,\n totalRows: number,\n totalColumns: number,\n focus: { row: number; column: number },\n): EditableSpreadsheetViewportQuery {\n let rowStart = clampInteger(desiredRowStart, 0, totalRows - 1);\n let rowEnd = clampInteger(desiredRowEnd, rowStart + 1, totalRows);\n let columnStart = clampInteger(desiredColumnStart, 0, totalColumns - 1);\n let columnEnd = clampInteger(desiredColumnEnd, columnStart + 1, totalColumns);\n const desiredRows = rowEnd - rowStart;\n const desiredColumns = columnEnd - columnStart;\n if (desiredRows * desiredColumns > MAX_INTERACTIVE_QUERY_CELLS) {\n const columns = Math.min(\n desiredColumns,\n Math.max(1, Math.floor(Math.sqrt(MAX_INTERACTIVE_QUERY_CELLS * 2))),\n );\n const rows = Math.max(1, Math.floor(MAX_INTERACTIVE_QUERY_CELLS / columns));\n columnStart = clampWindowStart(columnStart, columnEnd, focus.column, columns, totalColumns);\n columnEnd = Math.min(totalColumns, columnStart + columns);\n rowStart = clampWindowStart(rowStart, rowEnd, focus.row, rows, totalRows);\n rowEnd = Math.min(totalRows, rowStart + rows);\n }\n return {\n sheetId,\n startRow: rowStart,\n startColumn: columnStart,\n rowCount: rowEnd - rowStart,\n columnCount: columnEnd - columnStart,\n maxCells: MAX_INTERACTIVE_QUERY_CELLS,\n maxBytes: MAX_INTERACTIVE_QUERY_BYTES,\n };\n}\n\nfunction clampWindowStart(\n desiredStart: number,\n desiredEnd: number,\n focus: number,\n size: number,\n total: number,\n): number {\n if (desiredEnd - desiredStart <= size) return Math.min(desiredStart, Math.max(0, total - size));\n const centered = focus - Math.floor(size / 2);\n return Math.max(desiredStart, Math.min(desiredEnd - size, centered));\n}\n\nfunction queryContains(\n query: EditableSpreadsheetViewportQuery,\n row: number,\n column: number,\n): boolean {\n return (\n row >= query.startRow &&\n row < query.startRow + query.rowCount &&\n column >= query.startColumn &&\n column < query.startColumn + query.columnCount\n );\n}\n\nfunction sameViewport(\n projection: EditableSpreadsheetViewportProjection,\n query: EditableSpreadsheetViewportQuery,\n): boolean {\n return (\n projection.sheetId === query.sheetId &&\n projection.startRow === query.startRow &&\n projection.startColumn === query.startColumn &&\n projection.rowCount === query.rowCount &&\n projection.columnCount === query.columnCount\n );\n}\n\nfunction sameViewportQuery(\n left: EditableSpreadsheetViewportQuery,\n right: EditableSpreadsheetViewportQuery,\n): boolean {\n return (\n left.sheetId === right.sheetId &&\n left.startRow === right.startRow &&\n left.startColumn === right.startColumn &&\n left.rowCount === right.rowCount &&\n left.columnCount === right.columnCount &&\n left.maxCells === right.maxCells &&\n left.maxBytes === right.maxBytes\n );\n}\n\nfunction sheetGeneration(\n sheet: EditableSpreadsheetSheetMetadata,\n): SpreadsheetSheetGeneration | null {\n if (sheet.generationId === null) return null;\n return {\n kind: \"generation\",\n sheetId: spreadsheetSheetId(sheet.sheetId),\n creationOperationId: editableArtifactStableId(sheet.generationId),\n };\n}\n\nfunction spreadsheetCellInput(\n input: string,\n kind: SpreadsheetCommit[\"kind\"],\n): SpreadsheetCellInput {\n if (kind === \"formula\") return { formula: input, cached: null };\n if (input === \"\") return null;\n const normalized = input.trim();\n if (/^(?:true|false)$/i.test(normalized)) return normalized.toLowerCase() === \"true\";\n if (/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(normalized)) {\n const value = Number(normalized);\n if (Number.isFinite(value)) return value;\n }\n return input;\n}\n\nfunction projectedCellValue(value: EditableSpreadsheetCellValue): unknown {\n switch (value.kind) {\n case \"empty\":\n return null;\n case \"boolean\":\n case \"number\":\n case \"text\":\n return value.value;\n case \"date\":\n return new Date(value.value);\n case \"error\":\n return spreadsheetErrorText(value.value);\n }\n}\n\nfunction spreadsheetErrorText(\n value: Extract<EditableSpreadsheetCellValue, { kind: \"error\" }>[\"value\"],\n): string {\n if (typeof value === \"object\") return value.custom;\n return {\n null: \"#NULL!\",\n divide_by_zero: \"#DIV/0!\",\n value: \"#VALUE!\",\n reference: \"#REF!\",\n name: \"#NAME?\",\n number: \"#NUM!\",\n not_available: \"#N/A\",\n spill: \"#SPILL!\",\n calculation: \"#CALC!\",\n }[value];\n}\n\nfunction boundedSheetCount(\n requested: number | undefined,\n maximum: number,\n usedEnd: number | undefined,\n): number {\n const requestedCount =\n requested === undefined || !Number.isFinite(requested)\n ? maximum\n : Math.max(1, Math.min(maximum, Math.floor(requested)));\n const usedCount =\n usedEnd === undefined || !Number.isSafeInteger(usedEnd)\n ? 1\n : Math.max(1, Math.min(maximum, usedEnd + 1));\n return Math.max(requestedCount, usedCount);\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toISOString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n\nfunction nextAvailableSheetName(sheets: readonly EditableSpreadsheetSheetMetadata[]): string {\n let index = sheets.length + 1;\n while (sheets.some((sheet) => sheet.name === `Sheet${index}`)) index += 1;\n return `Sheet${index}`;\n}\n\nfunction clampInteger(value: number, minimum: number, maximum: number): number {\n if (!Number.isFinite(value)) return minimum;\n return Math.min(maximum, Math.max(minimum, Math.floor(value)));\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(\"Spreadsheet change failed\");\n}\n"],"mappings":"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","names":["columnName","displayValue","horizontalProjection","verticalProjection","logicalScrollLeft","logicalScrollTop","PlusIcon","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","useRef","useEffect","projection","useMemo","useCallback","nextAvailableSheetName","PlusIcon","displayValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/components/artifacts/spreadsheet-grid.tsx","../src/components/artifacts/spreadsheet-canvas.ts","../src/components/artifacts/editable-spreadsheet.tsx"],"sourcesContent":["import type { Workbook, WorkbookChange, Worksheet } from \"@opengeni/artifact-tool/reference\";\nimport { PlusIcon } from \"lucide-react\";\nimport {\n type ClipboardEvent as ReactClipboardEvent,\n type CSSProperties,\n type KeyboardEvent as ReactKeyboardEvent,\n type PointerEvent as ReactPointerEvent,\n type ReactNode,\n useCallback,\n useEffect,\n useId,\n useLayoutEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { ArtifactSurface } from \"./artifact-surface\";\nimport {\n SparseSpreadsheetCellIndex,\n SpreadsheetCanvasRenderer,\n spreadsheetCanvasDevicePixelRatio,\n type SpreadsheetCanvasAxis,\n type SpreadsheetCanvasCellFormat,\n type SpreadsheetCanvasProjection,\n type SpreadsheetCanvasTheme,\n} from \"./spreadsheet-canvas\";\n\nconst MAX_ROWS = 1_048_576;\nconst MAX_COLUMNS = 16_384;\nconst ROW_HEADER_WIDTH = 48;\nconst COLUMN_HEADER_HEIGHT = 28;\nconst FALLBACK_VIEWPORT_WIDTH = 880;\nconst FALLBACK_VIEWPORT_HEIGHT = 480;\n// Firefox collapses oversized layout boxes rather than merely clamping them.\n// Keep the native scroll surface comfortably below every supported engine's\n// limit, then project that bounded physical range over the full logical sheet.\nconst MAX_PHYSICAL_SCROLL_SPAN = 8_000_000;\n// Purely proportional compression can assign short rows after tall overrides\n// to the same browser scroll pixel. Every compressed axis therefore reserves\n// physical address space per item as well as a proportional share.\nconst MIN_PHYSICAL_ITEM_SPAN = 4;\nconst MAX_MOUNTED_AXIS_ITEMS = 512;\nconst MAX_MOUNTED_GRID_CELLS = 2_048;\nconst MAX_CLIPBOARD_INPUT_BYTES = 4 * 1024 * 1024;\nconst MAX_CLIPBOARD_CELLS = 65_536;\n\ntype CellCoordinate = { row: number; col: number };\n\nexport type SpreadsheetSelection = {\n sheetId: string;\n anchor: CellCoordinate;\n focus: CellCoordinate;\n};\n\nexport type SpreadsheetCommit = {\n sheetId: string;\n cell: CellCoordinate;\n input: string;\n kind: \"formula\" | \"value\";\n};\n\n/** Row-major rectangular input submitted as one durable spreadsheet command. */\nexport type SpreadsheetRangeCommit = {\n sheetId: string;\n anchor: CellCoordinate;\n rows: number;\n columns: number;\n inputs: readonly string[];\n};\n\n/** End-exclusive logical windows emitted at most once per animation frame. */\nexport type SpreadsheetViewport = {\n sheetId: string;\n rowStart: number;\n rowEnd: number;\n columnStart: number;\n columnEnd: number;\n overscanRowStart: number;\n overscanRowEnd: number;\n overscanColumnStart: number;\n overscanColumnEnd: number;\n logicalScrollLeft: number;\n logicalScrollTop: number;\n viewportWidth: number;\n viewportHeight: number;\n};\n\nexport type SpreadsheetGridProps = {\n workbook: Workbook;\n worksheet: Worksheet;\n readOnly?: boolean | undefined;\n /** Addressable rows in the interactive projection. Grows to include used data. */\n rowCount?: number | undefined;\n /** Addressable columns in the interactive projection. Grows to include used data. */\n columnCount?: number | undefined;\n overscanRows?: number | undefined;\n overscanColumns?: number | undefined;\n onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;\n onCommit?: ((commit: SpreadsheetCommit) => void) | undefined;\n onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;\n className?: string | undefined;\n};\n\nexport type SpreadsheetProjectionCell = {\n value: unknown;\n input: string;\n format: SpreadsheetCanvasCellFormat;\n};\n\n/**\n * Synchronous, bounded view state consumed by the React editor. Durable model\n * ownership stays with the caller (legacy Workbook, SDK Worker, or another\n * projection adapter); edits return through `commit` / `clear` ports.\n */\nexport type SpreadsheetGridProjection = SpreadsheetCanvasProjection & {\n sheetName: string;\n rowCount: number;\n columnCount: number;\n defaultRowHeight?: number | undefined;\n defaultColumnWidth?: number | undefined;\n rowHeights?: readonly (readonly [number, number])[] | undefined;\n columnWidths?: readonly (readonly [number, number])[] | undefined;\n dimensionRevision?: string | number | undefined;\n usedRange?: { row: number; col: number; rowCount: number; colCount: number } | null | undefined;\n readCell: (row: number, column: number) => SpreadsheetProjectionCell | null;\n};\n\nexport type SpreadsheetProjectionGridProps = {\n projection: SpreadsheetGridProjection;\n readOnly?: boolean | undefined;\n overscanRows?: number | undefined;\n overscanColumns?: number | undefined;\n onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;\n commit?: ((commit: SpreadsheetCommit) => void | Promise<void>) | undefined;\n commitRange?: ((commit: SpreadsheetRangeCommit) => void | Promise<void>) | undefined;\n clear?: ((selection: SpreadsheetSelection) => void | Promise<void>) | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;\n className?: string | undefined;\n};\n\nexport type SpreadsheetArtifactSurfaceProps = Omit<SpreadsheetGridProps, \"worksheet\"> & {\n title?: string | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n initialSheetId?: string | undefined;\n allowAddSheet?: boolean | undefined;\n};\n\ntype AxisGeometry = {\n count: number;\n defaultSize: number;\n overrides: readonly AxisOverride[];\n total: number;\n};\n\ntype AxisOverride = {\n index: number;\n size: number;\n start: number;\n end: number;\n cumulativeDelta: number;\n};\n\ntype ViewportState = {\n width: number;\n height: number;\n scrollLeft: number;\n scrollTop: number;\n devicePixelRatio: number;\n};\n\ntype SelectingState = {\n pointerId: number;\n anchor: CellCoordinate;\n};\n\ntype ScrollProjection = {\n axis: AxisGeometry;\n mode: \"identity\" | \"indexed\";\n physicalTotal: number;\n logicalMax: number;\n physicalMax: number;\n baseItemSpan: number;\n proportionalSpan: number;\n rawMax: number;\n};\n\ntype WorkbookViewState = {\n revision: number;\n dimensionRevision: number;\n};\n\nconst useClientLayoutEffect = typeof window === \"undefined\" ? useEffect : useLayoutEffect;\n\nfunction boundedInteger(value: number | undefined, fallback: number, max: number): number {\n if (value === undefined) return fallback;\n if (!Number.isFinite(value)) return fallback;\n return Math.min(max, Math.max(1, Math.floor(value)));\n}\n\nfunction buildAxis(\n count: number,\n defaultSize: number,\n entries: Iterable<readonly [number, number]>,\n): AxisGeometry {\n const normalizedDefault = Number.isFinite(defaultSize) && defaultSize > 0 ? defaultSize : 1;\n const sorted = [...entries]\n .filter(\n ([index, size]) =>\n Number.isInteger(index) && index >= 0 && index < count && Number.isFinite(size) && size > 0,\n )\n .sort(([left], [right]) => left - right);\n const overrides: AxisOverride[] = [];\n let cumulativeDelta = 0;\n for (const [index, size] of sorted) {\n // A Map-backed source is unique. Last-write-wins also makes this robust to\n // custom adapters that repeat an index.\n const previous = overrides.at(-1);\n if (previous?.index === index) {\n cumulativeDelta -= previous.size - normalizedDefault;\n overrides.pop();\n }\n if (size === normalizedDefault) continue;\n const start = index * normalizedDefault + cumulativeDelta;\n cumulativeDelta += size - normalizedDefault;\n overrides.push({\n index,\n size,\n start,\n end: start + size,\n cumulativeDelta,\n });\n }\n return {\n count,\n defaultSize: normalizedDefault,\n overrides,\n total: count * normalizedDefault + cumulativeDelta,\n };\n}\n\nfunction lowerBoundOverrideIndex(axis: AxisGeometry, index: number): number {\n let low = 0;\n let high = axis.overrides.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (axis.overrides[middle]!.index < index) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction axisOffsetAt(axis: AxisGeometry, index: number): number {\n if (index <= 0) return 0;\n if (index >= axis.count) return axis.total;\n const insertion = lowerBoundOverrideIndex(axis, index);\n const delta = insertion > 0 ? axis.overrides[insertion - 1]!.cumulativeDelta : 0;\n return index * axis.defaultSize + delta;\n}\n\nfunction axisSizeAt(axis: AxisGeometry, index: number): number {\n const candidate = axis.overrides[lowerBoundOverrideIndex(axis, index)];\n return candidate?.index === index ? candidate.size : axis.defaultSize;\n}\n\nfunction upperBoundOverrideStart(axis: AxisGeometry, offset: number): number {\n let low = 0;\n let high = axis.overrides.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (axis.overrides[middle]!.start <= offset) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction indexAtOffset(axis: AxisGeometry, offset: number): number {\n if (axis.count <= 1) return 0;\n const target = Math.max(0, Math.min(axis.total - 1, offset));\n const previousIndex = upperBoundOverrideStart(axis, target) - 1;\n if (previousIndex < 0) {\n return Math.min(\n (axis.overrides[0]?.index ?? axis.count) - 1,\n Math.floor(target / axis.defaultSize),\n );\n }\n const previous = axis.overrides[previousIndex]!;\n if (target < previous.end) return previous.index;\n const nextOverrideIndex = axis.overrides[previousIndex + 1]?.index ?? axis.count;\n return Math.min(\n axis.count - 1,\n nextOverrideIndex - 1,\n previous.index + 1 + Math.floor((target - previous.end) / axis.defaultSize),\n );\n}\n\nfunction visibleInterval(\n axis: AxisGeometry,\n startOffset: number,\n viewportSize: number,\n overscan: number,\n): { start: number; end: number } {\n const start = Math.max(0, indexAtOffset(axis, startOffset) - overscan);\n const end = Math.min(\n axis.count,\n indexAtOffset(axis, startOffset + Math.max(1, viewportSize)) + overscan + 1,\n );\n return { start, end };\n}\n\nfunction boundVisibleWindows(\n rows: { start: number; end: number },\n columns: { start: number; end: number },\n focus: CellCoordinate,\n): {\n rows: { start: number; end: number };\n columns: { start: number; end: number };\n} {\n let rowCount = Math.min(MAX_MOUNTED_AXIS_ITEMS, rows.end - rows.start);\n let columnCount = Math.min(MAX_MOUNTED_AXIS_ITEMS, columns.end - columns.start);\n if (rowCount * columnCount > MAX_MOUNTED_GRID_CELLS) {\n const balancedLimit = Math.floor(Math.sqrt(MAX_MOUNTED_GRID_CELLS));\n if (rowCount > balancedLimit && columnCount > balancedLimit) {\n rowCount = balancedLimit;\n columnCount = balancedLimit;\n } else if (rowCount >= columnCount) {\n rowCount = Math.max(1, Math.floor(MAX_MOUNTED_GRID_CELLS / columnCount));\n } else {\n columnCount = Math.max(1, Math.floor(MAX_MOUNTED_GRID_CELLS / rowCount));\n }\n }\n return {\n rows: centeredInterval(rows, rowCount, focus.row),\n columns: centeredInterval(columns, columnCount, focus.col),\n };\n}\n\nfunction centeredInterval(\n interval: { start: number; end: number },\n count: number,\n focus: number,\n): { start: number; end: number } {\n if (count >= interval.end - interval.start) return interval;\n if (focus < interval.start || focus >= interval.end) {\n return { start: interval.start, end: interval.start + count };\n }\n const start = Math.max(\n interval.start,\n Math.min(interval.end - count, focus - Math.floor(count / 2)),\n );\n return { start, end: start + count };\n}\n\nfunction indexesBetween(start: number, end: number): number[] {\n return Array.from({ length: end - start }, (_, index) => start + index);\n}\n\nfunction rawBoundaryAt(projection: ScrollProjection, index: number): number {\n if (index <= 0) return 0;\n if (index >= projection.axis.count) {\n return projection.axis.count * projection.baseItemSpan + projection.proportionalSpan;\n }\n return (\n index * projection.baseItemSpan +\n (axisOffsetAt(projection.axis, index) / projection.axis.total) * projection.proportionalSpan\n );\n}\n\nfunction rawOffsetAtLogical(projection: ScrollProjection, offset: number): number {\n if (offset <= 0) return 0;\n if (offset >= projection.axis.total) {\n return rawBoundaryAt(projection, projection.axis.count);\n }\n const index = indexAtOffset(projection.axis, offset);\n const logicalStart = axisOffsetAt(projection.axis, index);\n const logicalSize = axisSizeAt(projection.axis, index);\n const fraction = Math.max(0, Math.min(1, (offset - logicalStart) / logicalSize));\n const rawStart = rawBoundaryAt(projection, index);\n const rawEnd = rawBoundaryAt(projection, index + 1);\n return rawStart + fraction * (rawEnd - rawStart);\n}\n\nfunction logicalOffsetAtRaw(projection: ScrollProjection, rawOffset: number): number {\n const target = Math.max(0, Math.min(projection.rawMax, rawOffset));\n let low = 0;\n let high = projection.axis.count;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (rawBoundaryAt(projection, middle) <= target) low = middle;\n else high = middle - 1;\n }\n const index = Math.min(projection.axis.count - 1, low);\n const rawStart = rawBoundaryAt(projection, index);\n const rawEnd = rawBoundaryAt(projection, index + 1);\n const fraction = rawEnd === rawStart ? 0 : (target - rawStart) / (rawEnd - rawStart);\n return Math.min(\n projection.logicalMax,\n axisOffsetAt(projection.axis, index) + fraction * axisSizeAt(projection.axis, index),\n );\n}\n\nfunction buildScrollProjection(\n axis: AxisGeometry,\n headerSize: number,\n viewportSize: number,\n): ScrollProjection {\n const logicalTotal = headerSize + axis.total;\n const physicalTotal = Math.min(logicalTotal, MAX_PHYSICAL_SCROLL_SPAN);\n const logicalMax = Math.max(0, logicalTotal - viewportSize);\n const physicalMax = Math.max(0, physicalTotal - viewportSize);\n const mode = physicalTotal === logicalTotal ? \"identity\" : \"indexed\";\n const physicalAxisCapacity = Math.max(0, physicalTotal - headerSize);\n const baseItemSpan =\n mode === \"indexed\" ? Math.min(MIN_PHYSICAL_ITEM_SPAN, physicalAxisCapacity / axis.count) : 0;\n const projection: ScrollProjection = {\n axis,\n mode,\n physicalTotal,\n logicalMax,\n physicalMax,\n baseItemSpan,\n proportionalSpan: Math.max(0, physicalAxisCapacity - baseItemSpan * axis.count),\n rawMax: 0,\n };\n projection.rawMax = rawOffsetAtLogical(projection, logicalMax);\n return projection;\n}\n\nfunction clampPhysicalScroll(offset: number, projection: ScrollProjection): number {\n return Math.max(0, Math.min(projection.physicalMax, offset));\n}\n\nfunction physicalToLogicalScroll(offset: number, projection: ScrollProjection): number {\n if (projection.logicalMax === 0 || projection.physicalMax === 0) return 0;\n if (projection.mode === \"indexed\") {\n return logicalOffsetAtRaw(\n projection,\n (clampPhysicalScroll(offset, projection) / projection.physicalMax) * projection.rawMax,\n );\n }\n return (clampPhysicalScroll(offset, projection) / projection.physicalMax) * projection.logicalMax;\n}\n\nfunction logicalToPhysicalScroll(offset: number, projection: ScrollProjection): number {\n if (projection.logicalMax === 0 || projection.physicalMax === 0) return 0;\n const logical = Math.max(0, Math.min(projection.logicalMax, offset));\n if (projection.mode === \"indexed\") {\n return (rawOffsetAtLogical(projection, logical) / projection.rawMax) * projection.physicalMax;\n }\n return (logical / projection.logicalMax) * projection.physicalMax;\n}\n\nfunction columnName(index: number): string {\n let value = index + 1;\n let result = \"\";\n while (value > 0) {\n const remainder = (value - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n value = Math.floor((value - 1) / 26);\n }\n return result;\n}\n\nfunction cellName(cell: CellCoordinate): string {\n return `${columnName(cell.col)}${cell.row + 1}`;\n}\n\nfunction normalizeSelection(selection: SpreadsheetSelection) {\n return {\n top: Math.min(selection.anchor.row, selection.focus.row),\n bottom: Math.max(selection.anchor.row, selection.focus.row),\n left: Math.min(selection.anchor.col, selection.focus.col),\n right: Math.max(selection.anchor.col, selection.focus.col),\n };\n}\n\nfunction selectionName(selection: SpreadsheetSelection): string {\n const normalized = normalizeSelection(selection);\n const first = cellName({ row: normalized.top, col: normalized.left });\n const last = cellName({ row: normalized.bottom, col: normalized.right });\n return first === last ? first : `${first}:${last}`;\n}\n\nfunction isCellSelected(selection: SpreadsheetSelection, row: number, col: number): boolean {\n const normalized = normalizeSelection(selection);\n return (\n row >= normalized.top &&\n row <= normalized.bottom &&\n col >= normalized.left &&\n col <= normalized.right\n );\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toLocaleDateString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n\nfunction parseCellInput(input: string): string | number | boolean | null {\n if (input === \"\") return null;\n const normalized = input.trim();\n if (/^(?:true|false)$/i.test(normalized)) return normalized.toLowerCase() === \"true\";\n if (/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(normalized)) {\n const number = Number(normalized);\n if (Number.isFinite(number)) return number;\n }\n return input;\n}\n\ntype ParsedSpreadsheetClipboard = Readonly<{\n rows: number;\n columns: number;\n inputs: readonly string[];\n}>;\n\n/** Bounded RFC-4180-style TSV parser for Excel/Sheets `text/plain` clipboard data. */\nfunction parseSpreadsheetClipboard(input: string): ParsedSpreadsheetClipboard {\n if (new TextEncoder().encode(input).byteLength > MAX_CLIPBOARD_INPUT_BYTES) {\n throw new Error(\"Clipboard data is too large to paste\");\n }\n const records: string[][] = [[]];\n let field = \"\";\n let quoted = false;\n let endedWithRecordSeparator = false;\n for (let index = 0; index < input.length; index += 1) {\n const character = input[index]!;\n if (quoted) {\n if (character === '\"') {\n if (input[index + 1] === '\"') {\n field += '\"';\n index += 1;\n } else {\n quoted = false;\n }\n } else {\n field += character;\n }\n endedWithRecordSeparator = false;\n continue;\n }\n if (character === '\"' && field.length === 0) {\n quoted = true;\n endedWithRecordSeparator = false;\n } else if (character === \"\\t\") {\n records.at(-1)!.push(field);\n field = \"\";\n endedWithRecordSeparator = false;\n } else if (character === \"\\r\" || character === \"\\n\") {\n records.at(-1)!.push(field);\n field = \"\";\n records.push([]);\n if (character === \"\\r\" && input[index + 1] === \"\\n\") index += 1;\n endedWithRecordSeparator = true;\n } else {\n field += character;\n endedWithRecordSeparator = false;\n }\n }\n if (quoted) throw new Error(\"Clipboard data contains an unterminated quoted cell\");\n if (endedWithRecordSeparator) records.pop();\n else records.at(-1)!.push(field);\n if (records.length === 0) records.push([\"\"]);\n const columns = Math.max(1, ...records.map((record) => record.length));\n const cellCount = records.length * columns;\n if (cellCount > MAX_CLIPBOARD_CELLS) {\n throw new Error(\"Clipboard range is too large to paste\");\n }\n const inputs = records.flatMap((record) => [\n ...record,\n ...Array.from({ length: columns - record.length }, () => \"\"),\n ]);\n return Object.freeze({ rows: records.length, columns, inputs: Object.freeze(inputs) });\n}\n\nfunction escapeSpreadsheetClipboardField(input: string): string {\n return /[\"\\t\\r\\n]/u.test(input) ? `\"${input.replaceAll('\"', '\"\"')}\"` : input;\n}\n\nfunction cellStyle(format: SpreadsheetCanvasCellFormat): CSSProperties {\n return {\n background: format.fill,\n color: format.font?.color,\n fontFamily: format.font?.name,\n fontSize: format.font?.size,\n fontWeight: format.font?.bold ? 600 : undefined,\n fontStyle: format.font?.italic ? \"italic\" : undefined,\n textDecoration: format.font?.underline ? \"underline\" : undefined,\n textAlign: format.horizontalAlignment,\n justifyContent:\n format.horizontalAlignment === \"center\"\n ? \"center\"\n : format.horizontalAlignment === \"right\"\n ? \"flex-end\"\n : \"flex-start\",\n alignItems:\n format.verticalAlignment === \"top\"\n ? \"flex-start\"\n : format.verticalAlignment === \"bottom\"\n ? \"flex-end\"\n : \"center\",\n whiteSpace: format.wrapText ? \"normal\" : \"nowrap\",\n };\n}\n\nfunction canvasAxis(axis: AxisGeometry): SpreadsheetCanvasAxis {\n return {\n count: axis.count,\n total: axis.total,\n offsetAt: (index) => axisOffsetAt(axis, index),\n sizeAt: (index) => axisSizeAt(axis, index),\n indexAtOffset: (offset) => indexAtOffset(axis, offset),\n };\n}\n\nfunction computedToken(style: CSSStyleDeclaration, name: string, fallback: string): string {\n return style.getPropertyValue(name).trim() || fallback;\n}\n\nfunction computedPixels(style: CSSStyleDeclaration, name: string, fallback: number): number {\n const value = Number.parseFloat(style.getPropertyValue(name));\n return Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction spreadsheetCanvasTheme(element: HTMLElement): SpreadsheetCanvasTheme {\n const style = getComputedStyle(element);\n const background =\n style.backgroundColor || computedToken(style, \"--og-color-surface-1\", \"#ffffff\");\n const headerBackground = computedToken(style, \"--og-color-surface-2\", \"#f3f4f6\");\n const border = computedToken(style, \"--og-color-border\", \"#d1d5db\");\n const foreground = style.color || computedToken(style, \"--og-color-fg\", \"#111827\");\n const mutedForeground = computedToken(style, \"--og-color-fg-muted\", \"#6b7280\");\n const accent = computedToken(style, \"--og-color-accent\", \"#3b82f6\");\n const error = computedToken(style, \"--og-color-status-failed\", \"#dc2626\");\n const fontFamily =\n style.fontFamily ||\n computedToken(\n style,\n \"--og-font-sans\",\n 'Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", sans-serif',\n );\n const fontSize =\n Number.parseFloat(style.fontSize) || computedPixels(style, \"--og-font-size-sm\", 12);\n const headerFontSize = computedPixels(style, \"--og-font-size-xs\", 11);\n return {\n background,\n headerBackground,\n border,\n foreground,\n mutedForeground,\n accent,\n error,\n fontFamily,\n fontSize,\n headerFontSize,\n signature: [\n background,\n headerBackground,\n border,\n foreground,\n mutedForeground,\n accent,\n error,\n fontFamily,\n fontSize,\n headerFontSize,\n ].join(\"\\u001f\"),\n };\n}\n\nfunction useWorkbookViewState(workbook: Workbook): WorkbookViewState {\n const [view, setView] = useState<WorkbookViewState>(() => ({\n revision: workbook.revision,\n dimensionRevision: 0,\n }));\n\n useEffect(() => {\n setView((current) =>\n current.revision === workbook.revision\n ? current\n : { revision: workbook.revision, dimensionRevision: current.dimensionRevision + 1 },\n );\n return workbook.onChange((change: WorkbookChange) => {\n setView((current) => ({\n revision: change.revision,\n dimensionRevision:\n change.reason === \"dimension\" || change.reason === \"structure\"\n ? current.dimensionRevision + 1\n : current.dimensionRevision,\n }));\n });\n }, [workbook]);\n\n return view;\n}\n\nfunction nextAvailableSheetName(workbook: Workbook): string {\n let index = workbook.worksheets.items.length + 1;\n while (workbook.worksheets.items.some((sheet) => sheet.name === `Sheet${index}`)) index += 1;\n return `Sheet${index}`;\n}\n\n/** A reusable workbook shell with first-class sheet switching. */\nexport function SpreadsheetArtifactSurface({\n workbook,\n title = \"Workbook\",\n subtitle,\n actions,\n initialSheetId,\n allowAddSheet = true,\n readOnly = false,\n ...gridProps\n}: SpreadsheetArtifactSurfaceProps) {\n const { revision } = useWorkbookViewState(workbook);\n const availableSheets = workbook.worksheets.items;\n const initial =\n (initialSheetId ? availableSheets.find((sheet) => sheet.id === initialSheetId) : undefined) ??\n (() => {\n try {\n return workbook.worksheets.getActiveWorksheet();\n } catch {\n return availableSheets[0];\n }\n })();\n const [activeSheetId, setActiveSheetId] = useState<string | null>(initial?.id ?? null);\n const activeSheet =\n availableSheets.find((sheet) => sheet.id === activeSheetId) ?? availableSheets[0] ?? null;\n\n useEffect(() => {\n if (!activeSheet && activeSheetId !== null) setActiveSheetId(null);\n else if (activeSheet && activeSheet.id !== activeSheetId) setActiveSheetId(activeSheet.id);\n }, [activeSheet, activeSheetId, revision]);\n\n const selectSheet = useCallback(\n (sheet: Worksheet) => {\n workbook.worksheets.setActiveWorksheet(sheet);\n setActiveSheetId(sheet.id);\n },\n [workbook],\n );\n\n const addSheet = useCallback(() => {\n const sheet = workbook.worksheets.add(nextAvailableSheetName(workbook));\n selectSheet(sheet);\n }, [selectSheet, workbook]);\n\n const footer = (\n <div\n className=\"flex min-h-9 items-center gap-1 overflow-x-auto px-2\"\n role=\"tablist\"\n aria-label=\"Worksheets\"\n >\n {availableSheets.map((sheet) => (\n <button\n key={sheet.id}\n type=\"button\"\n role=\"tab\"\n aria-selected={sheet.id === activeSheet?.id}\n onClick={() => selectSheet(sheet)}\n className={cn(\n \"h-7 shrink-0 rounded-og-sm px-2.5 text-og-sm transition-colors\",\n sheet.id === activeSheet?.id\n ? \"bg-og-surface-3 font-medium text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg\",\n )}\n >\n {sheet.name}\n </button>\n ))}\n {!readOnly && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={addSheet}\n aria-label=\"Add worksheet\"\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg [&>svg]:size-3.5\"\n >\n <PlusIcon />\n </button>\n ) : null}\n </div>\n );\n\n return (\n <ArtifactSurface\n modality=\"spreadsheet\"\n title={title}\n subtitle={\n subtitle ??\n (activeSheet\n ? `${availableSheets.length} sheet${availableSheets.length === 1 ? \"\" : \"s\"}`\n : \"Empty workbook\")\n }\n actions={actions}\n footer={footer}\n >\n {activeSheet ? (\n <SpreadsheetGrid\n key={activeSheet.id}\n {...gridProps}\n workbook={workbook}\n worksheet={activeSheet}\n readOnly={readOnly}\n />\n ) : (\n <div\n className=\"grid h-full place-items-center bg-og-bg p-6 text-center\"\n style={{ minHeight: 224 }}\n >\n <div>\n <p className=\"text-og-base font-medium text-og-fg\">This workbook has no worksheets.</p>\n {!readOnly && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={addSheet}\n className=\"mt-3 rounded-og-sm bg-og-accent-deep px-3 py-1.5 text-og-sm font-medium text-og-accent-fg\"\n >\n Add worksheet\n </button>\n ) : null}\n </div>\n </div>\n )}\n </ArtifactSurface>\n );\n}\n\nexport function SpreadsheetGrid({\n workbook,\n worksheet,\n readOnly = false,\n rowCount: requestedRowCount,\n columnCount: requestedColumnCount,\n overscanRows = 3,\n overscanColumns = 2,\n onSelectionChange,\n onCommit,\n onViewportChange,\n className,\n}: SpreadsheetGridProps) {\n const { revision, dimensionRevision } = useWorkbookViewState(workbook);\n const boundedProjection = requestedRowCount !== undefined || requestedColumnCount !== undefined;\n const usedRange = useMemo(() => {\n void revision;\n return boundedProjection ? worksheet.usedRangeAddress() : null;\n }, [boundedProjection, revision, worksheet]);\n const rowCount = boundedInteger(\n Math.max(\n requestedRowCount ?? MAX_ROWS,\n (usedRange?.row ?? 0) + (usedRange?.rowCount ?? 0) + 32,\n ),\n MAX_ROWS,\n MAX_ROWS,\n );\n const columnCount = boundedInteger(\n Math.max(\n requestedColumnCount ?? MAX_COLUMNS,\n (usedRange?.col ?? 0) + (usedRange?.colCount ?? 0) + 8,\n ),\n MAX_COLUMNS,\n MAX_COLUMNS,\n );\n const rowHeights = useMemo(() => {\n void dimensionRevision;\n return [...worksheet.rowHeightEntries()] as const;\n }, [dimensionRevision, worksheet]);\n const columnWidths = useMemo(() => {\n void dimensionRevision;\n return [...worksheet.columnWidthEntries()] as const;\n }, [dimensionRevision, worksheet]);\n const projection = useMemo<SpreadsheetGridProjection>(() => {\n void dimensionRevision;\n const cells = new SparseSpreadsheetCellIndex(\n (function* projectedCells() {\n for (const { row, col, data } of worksheet.cellEntries()) {\n yield {\n row,\n col,\n value: data.value,\n formula: data.formula,\n format: data.format,\n };\n }\n })(),\n );\n return {\n sheetId: worksheet.id,\n sheetName: worksheet.name,\n generationId: worksheet.id,\n revision,\n dimensionRevision,\n rowCount,\n columnCount,\n defaultRowHeight: worksheet.defaultRowHeight,\n defaultColumnWidth: worksheet.defaultColumnWidth,\n rowHeights,\n columnWidths,\n usedRange,\n cells,\n valueAt: (cell) =>\n cell.formula ? workbook.valueAt(worksheet, { row: cell.row, col: cell.col }) : cell.value,\n readCell: (row, col) => {\n const data = worksheet.cellData(row, col);\n return {\n value: data.formula ? workbook.valueAt(worksheet, { row, col }) : data.value,\n input: data.formula ?? displayValue(data.value),\n format: data.format,\n };\n },\n };\n }, [\n columnCount,\n columnWidths,\n dimensionRevision,\n revision,\n rowCount,\n rowHeights,\n usedRange,\n workbook,\n worksheet,\n ]);\n const commit = useCallback(\n (next: SpreadsheetCommit) => {\n const target = worksheet.getCell(next.cell.row, next.cell.col);\n if (next.kind === \"formula\") target.formulas = [[next.input]];\n else target.values = [[parseCellInput(next.input)]];\n onCommit?.(next);\n },\n [onCommit, worksheet],\n );\n const commitRange = useCallback(\n (next: SpreadsheetRangeCommit) => {\n if (next.rows * next.columns !== next.inputs.length) {\n throw new Error(\"Spreadsheet paste shape is invalid\");\n }\n workbook.transact(() => {\n for (let index = 0; index < next.inputs.length; index += 1) {\n const input = next.inputs[index]!;\n const row = next.anchor.row + Math.floor(index / next.columns);\n const col = next.anchor.col + (index % next.columns);\n worksheet.setCell(\n row,\n col,\n input.startsWith(\"=\")\n ? { formula: input, value: null }\n : { formula: null, value: parseCellInput(input) },\n \"content\",\n );\n }\n });\n },\n [workbook, worksheet],\n );\n const clear = useCallback(\n (next: SpreadsheetSelection) => {\n const normalized = normalizeSelection(next);\n worksheet\n .getRangeByIndexes(\n normalized.top,\n normalized.left,\n normalized.bottom - normalized.top + 1,\n normalized.right - normalized.left + 1,\n )\n .clear({ applyTo: \"contents\" });\n },\n [worksheet],\n );\n\n return (\n <SpreadsheetProjectionGrid\n projection={projection}\n readOnly={readOnly}\n overscanRows={overscanRows}\n overscanColumns={overscanColumns}\n onSelectionChange={onSelectionChange}\n commit={commit}\n commitRange={commitRange}\n clear={clear}\n onViewportChange={onViewportChange}\n className={className}\n />\n );\n}\n\n/**\n * Two-axis virtualized, accessible spreadsheet projection. The caller owns\n * durable model state; React owns only viewport, selection, and edit state.\n */\nexport function SpreadsheetProjectionGrid({\n projection,\n readOnly = false,\n overscanRows = 3,\n overscanColumns = 2,\n onSelectionChange,\n commit,\n commitRange,\n clear,\n onCommandError,\n onViewportChange,\n className,\n}: SpreadsheetProjectionGridProps) {\n const { revision, rowCount, columnCount } = projection;\n const dimensionRevision = projection.dimensionRevision ?? 0;\n const editable = !readOnly && commit !== undefined;\n const rows = useMemo(() => {\n void dimensionRevision;\n return buildAxis(rowCount, projection.defaultRowHeight ?? 24, projection.rowHeights ?? []);\n }, [dimensionRevision, projection.defaultRowHeight, projection.rowHeights, rowCount]);\n const columns = useMemo(() => {\n void dimensionRevision;\n return buildAxis(\n columnCount,\n projection.defaultColumnWidth ?? 96,\n projection.columnWidths ?? [],\n );\n }, [columnCount, dimensionRevision, projection.columnWidths, projection.defaultColumnWidth]);\n const canvasRows = useMemo(() => canvasAxis(rows), [rows]);\n const canvasColumns = useMemo(() => canvasAxis(columns), [columns]);\n const [selection, setSelection] = useState<SpreadsheetSelection>(() => ({\n sheetId: projection.sheetId,\n anchor: { row: 0, col: 0 },\n focus: { row: 0, col: 0 },\n }));\n const [editMode, setEditMode] = useState<\"cell\" | \"formula\" | null>(null);\n const [draft, setDraft] = useState(\n () => projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\",\n );\n const [pendingCommands, setPendingCommands] = useState(0);\n const [commandFailure, setCommandFailure] = useState<{\n message: string;\n retry?: (() => void) | undefined;\n } | null>(null);\n const [viewport, setViewport] = useState<ViewportState>({\n width: FALLBACK_VIEWPORT_WIDTH,\n height: FALLBACK_VIEWPORT_HEIGHT,\n scrollLeft: 0,\n scrollTop: 0,\n devicePixelRatio: 1,\n });\n const [canvasReady, setCanvasReady] = useState(false);\n const [canvasEpoch, setCanvasEpoch] = useState(0);\n const viewportRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const editorRef = useRef<HTMLInputElement>(null);\n const selectionRef = useRef(selection);\n const selectingRef = useRef<SelectingState | null>(null);\n const committingRef = useRef(false);\n const composingRef = useRef(false);\n const commitAfterCompositionRef = useRef(false);\n const selectDraftOnFocusRef = useRef(true);\n const initialDraftRef = useRef(draft);\n const optimisticInputRef = useRef<{\n sheetId: string;\n row: number;\n col: number;\n input: string;\n baseRevision: string | number;\n } | null>(null);\n const mountedRef = useRef(true);\n const commandScopeRef = useRef(0);\n const latestCommandRef = useRef(0);\n const canvasRendererRef = useRef<SpreadsheetCanvasRenderer | null>(null);\n if (!canvasRendererRef.current) canvasRendererRef.current = new SpreadsheetCanvasRenderer();\n const reactId = useId().replaceAll(\":\", \"\");\n\n const updateSelection = useCallback(\n (next: SpreadsheetSelection) => {\n selectionRef.current = next;\n setSelection(next);\n onSelectionChange?.(next);\n },\n [onSelectionChange],\n );\n\n useEffect(() => {\n if (selection.sheetId === projection.sheetId) return;\n commandScopeRef.current += 1;\n latestCommandRef.current += 1;\n const next = {\n sheetId: projection.sheetId,\n anchor: { row: 0, col: 0 },\n focus: { row: 0, col: 0 },\n };\n optimisticInputRef.current = null;\n setPendingCommands(0);\n setCommandFailure(null);\n setEditMode(null);\n updateSelection(next);\n }, [projection.sheetId, selection.sheetId, updateSelection]);\n\n useEffect(() => {\n mountedRef.current = true;\n return () => {\n mountedRef.current = false;\n commandScopeRef.current += 1;\n latestCommandRef.current += 1;\n };\n }, []);\n\n useEffect(() => {\n if (editMode !== null) return;\n const optimistic = optimisticInputRef.current;\n if (\n optimistic?.sheetId === projection.sheetId &&\n optimistic.row === selection.focus.row &&\n optimistic.col === selection.focus.col &&\n optimistic.baseRevision === revision\n ) {\n setDraft(optimistic.input);\n return;\n }\n if (optimistic && optimistic.baseRevision !== revision) optimisticInputRef.current = null;\n setDraft(projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\");\n }, [editMode, projection, revision, selection.focus.col, selection.focus.row]);\n\n useClientLayoutEffect(() => {\n const element = viewportRef.current;\n if (!element) return;\n const measure = () => {\n setViewport((current) => ({\n ...current,\n width: element.clientWidth || FALLBACK_VIEWPORT_WIDTH,\n height: element.clientHeight || FALLBACK_VIEWPORT_HEIGHT,\n devicePixelRatio: spreadsheetCanvasDevicePixelRatio(globalThis.devicePixelRatio || 1),\n }));\n };\n measure();\n const observer = typeof ResizeObserver === \"undefined\" ? null : new ResizeObserver(measure);\n observer?.observe(element);\n globalThis.addEventListener?.(\"resize\", measure);\n return () => {\n observer?.disconnect();\n globalThis.removeEventListener?.(\"resize\", measure);\n };\n }, []);\n\n useEffect(() => {\n return () => canvasRendererRef.current?.dispose();\n }, []);\n\n useEffect(() => {\n if (typeof document === \"undefined\") return;\n let active = true;\n void document.fonts?.ready.then(() => {\n if (active) setCanvasEpoch((value) => value + 1);\n });\n if (typeof MutationObserver === \"undefined\") {\n return () => {\n active = false;\n };\n }\n const observer = new MutationObserver(() => setCanvasEpoch((value) => value + 1));\n let ancestor: HTMLElement | null = viewportRef.current;\n while (ancestor) {\n observer.observe(ancestor, {\n attributes: true,\n attributeFilter: [\"class\", \"style\", \"data-og-theme\", \"data-og-density\"],\n });\n ancestor = ancestor.parentElement;\n }\n return () => {\n active = false;\n observer.disconnect();\n };\n }, []);\n\n useEffect(() => {\n if (editMode !== \"cell\") return;\n const editor = editorRef.current;\n editor?.focus();\n if (!editor) return;\n if (selectDraftOnFocusRef.current) editor.select();\n else editor.setSelectionRange(editor.value.length, editor.value.length);\n }, [editMode]);\n\n const ensureVisible = useCallback(\n (cell: CellCoordinate) => {\n const element = viewportRef.current;\n if (!element) return;\n const viewportWidth = element.clientWidth || FALLBACK_VIEWPORT_WIDTH;\n const viewportHeight = element.clientHeight || FALLBACK_VIEWPORT_HEIGHT;\n const horizontalProjection = buildScrollProjection(columns, ROW_HEADER_WIDTH, viewportWidth);\n const verticalProjection = buildScrollProjection(rows, COLUMN_HEADER_HEIGHT, viewportHeight);\n const left = ROW_HEADER_WIDTH + axisOffsetAt(columns, cell.col);\n const right = left + axisSizeAt(columns, cell.col);\n const top = COLUMN_HEADER_HEIGHT + axisOffsetAt(rows, cell.row);\n const bottom = top + axisSizeAt(rows, cell.row);\n const logicalScrollLeft = physicalToLogicalScroll(element.scrollLeft, horizontalProjection);\n const logicalScrollTop = physicalToLogicalScroll(element.scrollTop, verticalProjection);\n const viewportLeft = logicalScrollLeft + ROW_HEADER_WIDTH;\n const viewportRight = logicalScrollLeft + viewportWidth;\n const viewportTop = logicalScrollTop + COLUMN_HEADER_HEIGHT;\n const viewportBottom = logicalScrollTop + viewportHeight;\n if (left < viewportLeft) {\n element.scrollLeft = logicalToPhysicalScroll(\n Math.max(0, left - ROW_HEADER_WIDTH),\n horizontalProjection,\n );\n } else if (right > viewportRight) {\n element.scrollLeft = logicalToPhysicalScroll(right - viewportWidth, horizontalProjection);\n }\n if (top < viewportTop) {\n element.scrollTop = logicalToPhysicalScroll(\n Math.max(0, top - COLUMN_HEADER_HEIGHT),\n verticalProjection,\n );\n } else if (bottom > viewportBottom) {\n element.scrollTop = logicalToPhysicalScroll(bottom - viewportHeight, verticalProjection);\n }\n },\n [columns, rows],\n );\n\n const moveSelection = useCallback(\n (rowDelta: number, colDelta: number, extend: boolean) => {\n const focus = {\n row: Math.max(0, Math.min(rowCount - 1, selection.focus.row + rowDelta)),\n col: Math.max(0, Math.min(columnCount - 1, selection.focus.col + colDelta)),\n };\n const next = {\n sheetId: projection.sheetId,\n anchor: extend ? selection.anchor : focus,\n focus,\n };\n updateSelection(next);\n ensureVisible(focus);\n },\n [columnCount, ensureVisible, projection.sheetId, rowCount, selection, updateSelection],\n );\n\n const runCommand = useCallback(\n (invoke: () => void | Promise<void>, retry: () => void, rollback: () => void) => {\n const commandId = latestCommandRef.current + 1;\n latestCommandRef.current = commandId;\n const scope = commandScopeRef.current;\n setCommandFailure(null);\n const fail = (cause: unknown) => {\n if (\n !mountedRef.current ||\n commandScopeRef.current !== scope ||\n latestCommandRef.current !== commandId\n ) {\n return;\n }\n const error = cause instanceof Error ? cause : new Error(String(cause));\n rollback();\n setCommandFailure({ message: error.message || \"Spreadsheet change failed\", retry });\n onCommandError?.(error);\n };\n let result: void | Promise<void>;\n try {\n result = invoke();\n } catch (cause) {\n fail(cause);\n return;\n }\n if (!result || typeof result.then !== \"function\") return;\n setPendingCommands((current) => current + 1);\n void Promise.resolve(result).then(\n () => {\n if (!mountedRef.current || commandScopeRef.current !== scope) return;\n setPendingCommands((current) => Math.max(0, current - 1));\n },\n (cause) => {\n if (!mountedRef.current || commandScopeRef.current !== scope) return;\n setPendingCommands((current) => Math.max(0, current - 1));\n fail(cause);\n },\n );\n },\n [onCommandError],\n );\n\n const reportCommandFailure = useCallback(\n (cause: unknown) => {\n const error = cause instanceof Error ? cause : new Error(String(cause));\n setCommandFailure({ message: error.message || \"Spreadsheet action failed\" });\n onCommandError?.(error);\n },\n [onCommandError],\n );\n\n const commitDraft = useCallback(\n (input = draft) => {\n if (committingRef.current) return;\n committingRef.current = true;\n if (!editable || !commit) {\n setEditMode(null);\n queueMicrotask(() => {\n committingRef.current = false;\n });\n return;\n }\n if (input === initialDraftRef.current) {\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n return;\n }\n const next = {\n sheetId: projection.sheetId,\n cell: { ...selection.focus },\n input,\n kind: input.startsWith(\"=\") ? \"formula\" : \"value\",\n } satisfies SpreadsheetCommit;\n const execute = () => {\n optimisticInputRef.current = {\n sheetId: projection.sheetId,\n row: selection.focus.row,\n col: selection.focus.col,\n input,\n baseRevision: revision,\n };\n setDraft(input);\n runCommand(\n () => commit(next),\n execute,\n () => {\n optimisticInputRef.current = null;\n const current = selectionRef.current.focus;\n setDraft(projection.readCell(current.row, current.col)?.input ?? \"\");\n },\n );\n };\n execute();\n initialDraftRef.current = input;\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n },\n [commit, draft, editable, projection, revision, runCommand, selection.focus],\n );\n\n const clearSelection = useCallback(() => {\n if (!editable || !clear) return;\n const current = selection;\n const execute = () =>\n runCommand(\n () => clear(current),\n execute,\n () => {},\n );\n execute();\n }, [clear, editable, runCommand, selection]);\n\n const pasteClipboard = useCallback(\n (event: ReactClipboardEvent<HTMLDivElement>) => {\n if (!editable || editMode !== null) return;\n const clipboardText = event.clipboardData.getData(\"text/plain\");\n if (!clipboardText && !event.clipboardData.types.includes(\"text/plain\")) return;\n event.preventDefault();\n const execute = () => {\n const previousSelection = selectionRef.current;\n const invoke = () => {\n const parsed = parseSpreadsheetClipboard(clipboardText);\n const anchor = previousSelection.focus;\n if (anchor.row + parsed.rows > rowCount || anchor.col + parsed.columns > columnCount) {\n throw new Error(\"Clipboard range does not fit in this worksheet\");\n }\n if (!commitRange && parsed.inputs.length !== 1) {\n throw new Error(\"This spreadsheet adapter does not support rectangular paste\");\n }\n const bottomRight = {\n row: anchor.row + parsed.rows - 1,\n col: anchor.col + parsed.columns - 1,\n };\n updateSelection({\n sheetId: projection.sheetId,\n anchor: { ...anchor },\n focus: bottomRight,\n });\n ensureVisible(bottomRight);\n if (commitRange) {\n return commitRange({\n sheetId: projection.sheetId,\n anchor: { ...anchor },\n rows: parsed.rows,\n columns: parsed.columns,\n inputs: parsed.inputs,\n });\n }\n const input = parsed.inputs[0]!;\n return commit!({\n sheetId: projection.sheetId,\n cell: { ...anchor },\n input,\n kind: input.startsWith(\"=\") ? \"formula\" : \"value\",\n });\n };\n runCommand(invoke, execute, () => updateSelection(previousSelection));\n };\n execute();\n },\n [\n columnCount,\n commit,\n commitRange,\n editMode,\n editable,\n ensureVisible,\n projection.sheetId,\n rowCount,\n runCommand,\n updateSelection,\n ],\n );\n\n const copySelection = useCallback(\n (event: ReactClipboardEvent<HTMLDivElement>) => {\n if (editMode !== null) return;\n const selected = normalizeSelection(selectionRef.current);\n const rowsToCopy = selected.bottom - selected.top + 1;\n const columnsToCopy = selected.right - selected.left + 1;\n if (rowsToCopy * columnsToCopy > MAX_CLIPBOARD_CELLS) {\n event.preventDefault();\n reportCommandFailure(new Error(\"Selected range is too large to copy\"));\n return;\n }\n const coverage = projection.coverage;\n if (\n coverage &&\n (selected.top < coverage.rowStart ||\n selected.bottom >= coverage.rowEnd ||\n selected.left < coverage.columnStart ||\n selected.right >= coverage.columnEnd)\n ) {\n event.preventDefault();\n reportCommandFailure(new Error(\"Selected cells are still loading; copy again when ready\"));\n return;\n }\n const output: string[] = [];\n for (let row = selected.top; row <= selected.bottom; row += 1) {\n const fields: string[] = [];\n for (let col = selected.left; col <= selected.right; col += 1) {\n fields.push(escapeSpreadsheetClipboardField(projection.readCell(row, col)?.input ?? \"\"));\n }\n output.push(fields.join(\"\\t\"));\n }\n event.clipboardData.setData(\"text/plain\", output.join(\"\\r\\n\"));\n event.preventDefault();\n setCommandFailure(null);\n },\n [editMode, projection, reportCommandFailure],\n );\n\n const beginEditing = useCallback(\n (initial?: string, cell: CellCoordinate = selectionRef.current.focus) => {\n if (!editable) return;\n ensureVisible(cell);\n const current = projection.readCell(cell.row, cell.col)?.input ?? \"\";\n initialDraftRef.current = current;\n selectDraftOnFocusRef.current = initial === undefined;\n setDraft(initial ?? current);\n setEditMode(\"cell\");\n },\n [editable, ensureVisible, projection],\n );\n\n const onGridKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLDivElement>) => {\n if (editMode !== null) return;\n if (event.nativeEvent.isComposing || event.nativeEvent.keyCode === 229) return;\n switch (event.key) {\n case \"ArrowUp\":\n event.preventDefault();\n moveSelection(-1, 0, event.shiftKey);\n return;\n case \"ArrowDown\":\n event.preventDefault();\n moveSelection(1, 0, event.shiftKey);\n return;\n case \"ArrowLeft\":\n event.preventDefault();\n moveSelection(0, -1, event.shiftKey);\n return;\n case \"ArrowRight\":\n event.preventDefault();\n moveSelection(0, 1, event.shiftKey);\n return;\n case \"Tab\":\n event.preventDefault();\n moveSelection(0, event.shiftKey ? -1 : 1, false);\n return;\n case \"Enter\":\n case \"F2\":\n event.preventDefault();\n beginEditing();\n return;\n case \"Backspace\":\n case \"Delete\":\n event.preventDefault();\n clearSelection();\n return;\n case \"Home\": {\n event.preventDefault();\n const target =\n event.metaKey || event.ctrlKey\n ? { row: 0, col: 0 }\n : { row: selection.focus.row, col: 0 };\n updateSelection({ sheetId: projection.sheetId, anchor: target, focus: target });\n ensureVisible(target);\n return;\n }\n case \"End\": {\n event.preventDefault();\n const used = projection.usedRange;\n const target =\n event.metaKey || event.ctrlKey\n ? {\n row: Math.min(rowCount - 1, (used?.row ?? 0) + (used?.rowCount ?? 1) - 1),\n col: Math.min(columnCount - 1, (used?.col ?? 0) + (used?.colCount ?? 1) - 1),\n }\n : { row: selection.focus.row, col: columnCount - 1 };\n updateSelection({ sheetId: projection.sheetId, anchor: target, focus: target });\n ensureVisible(target);\n return;\n }\n }\n if (editable && !event.metaKey && !event.ctrlKey && !event.altKey && event.key.length === 1) {\n event.preventDefault();\n beginEditing(event.key);\n }\n },\n [\n beginEditing,\n clearSelection,\n columnCount,\n editMode,\n ensureVisible,\n moveSelection,\n editable,\n rowCount,\n selection.focus.row,\n updateSelection,\n projection.sheetId,\n projection.usedRange,\n ],\n );\n\n const onEditorKeyDown = useCallback(\n (event: ReactKeyboardEvent<HTMLInputElement>) => {\n if (composingRef.current || event.nativeEvent.isComposing) return;\n if (event.key === \"Enter\") {\n event.preventDefault();\n commitDraft();\n } else if (event.key === \"Escape\") {\n event.preventDefault();\n committingRef.current = true;\n setDraft(projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\");\n setEditMode(null);\n viewportRef.current?.focus();\n queueMicrotask(() => {\n committingRef.current = false;\n });\n }\n },\n [commitDraft, projection, selection.focus.col, selection.focus.row],\n );\n\n const onEditorCompositionStart = useCallback(() => {\n composingRef.current = true;\n }, []);\n\n const onEditorCompositionEnd = useCallback(\n (input: string) => {\n composingRef.current = false;\n if (!commitAfterCompositionRef.current) return;\n commitAfterCompositionRef.current = false;\n commitDraft(input);\n },\n [commitDraft],\n );\n\n const commitEditorOnBlur = useCallback(\n (mode: \"cell\" | \"formula\", input: string) => {\n if (editMode !== mode) return;\n if (composingRef.current) {\n commitAfterCompositionRef.current = true;\n return;\n }\n commitDraft(input);\n },\n [commitDraft, editMode],\n );\n\n const selectCell = useCallback(\n (cell: CellCoordinate, extend: boolean) => {\n const current = selectionRef.current;\n const next = {\n sheetId: projection.sheetId,\n anchor: extend ? current.anchor : cell,\n focus: cell,\n };\n updateSelection(next);\n setEditMode(null);\n viewportRef.current?.focus();\n },\n [projection.sheetId, updateSelection],\n );\n\n const hitTestCell = useCallback(\n (clientX: number, clientY: number): CellCoordinate | null => {\n const element = viewportRef.current;\n if (!element) return null;\n const bounds = element.getBoundingClientRect();\n const viewportX = clientX - bounds.left;\n const viewportY = clientY - bounds.top;\n const viewportWidth = element.clientWidth || FALLBACK_VIEWPORT_WIDTH;\n const viewportHeight = element.clientHeight || FALLBACK_VIEWPORT_HEIGHT;\n if (\n viewportX < ROW_HEADER_WIDTH ||\n viewportY < COLUMN_HEADER_HEIGHT ||\n viewportX >= viewportWidth ||\n viewportY >= viewportHeight\n ) {\n return null;\n }\n const horizontalProjection = buildScrollProjection(columns, ROW_HEADER_WIDTH, viewportWidth);\n const verticalProjection = buildScrollProjection(rows, COLUMN_HEADER_HEIGHT, viewportHeight);\n const logicalX =\n physicalToLogicalScroll(element.scrollLeft, horizontalProjection) +\n viewportX -\n ROW_HEADER_WIDTH;\n const logicalY =\n physicalToLogicalScroll(element.scrollTop, verticalProjection) +\n viewportY -\n COLUMN_HEADER_HEIGHT;\n if (logicalX < 0 || logicalY < 0 || logicalX >= columns.total || logicalY >= rows.total) {\n return null;\n }\n return {\n row: Math.min(rowCount - 1, indexAtOffset(rows, logicalY)),\n col: Math.min(columnCount - 1, indexAtOffset(columns, logicalX)),\n };\n },\n [columnCount, columns, rowCount, rows],\n );\n\n const onGridPointerDown = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n if (event.button !== 0) return;\n const cell = hitTestCell(event.clientX, event.clientY);\n if (!cell) return;\n event.preventDefault();\n const current = selectionRef.current;\n const anchor = event.shiftKey ? current.anchor : cell;\n selectingRef.current = { pointerId: event.pointerId, anchor };\n try {\n event.currentTarget.setPointerCapture(event.pointerId);\n } catch {\n // Synthetic test DOMs and old WebKit builds may not expose pointer capture.\n }\n updateSelection({ sheetId: projection.sheetId, anchor, focus: cell });\n setEditMode(null);\n event.currentTarget.focus();\n },\n [hitTestCell, projection.sheetId, updateSelection],\n );\n\n const onGridPointerMove = useCallback(\n (event: ReactPointerEvent<HTMLDivElement>) => {\n const selecting = selectingRef.current;\n if (!selecting || selecting.pointerId !== event.pointerId) return;\n const cell = hitTestCell(event.clientX, event.clientY);\n if (!cell) return;\n const current = selectionRef.current;\n if (current.focus.row === cell.row && current.focus.col === cell.col) return;\n updateSelection({ sheetId: projection.sheetId, anchor: selecting.anchor, focus: cell });\n },\n [hitTestCell, projection.sheetId, updateSelection],\n );\n\n const stopPointerSelection = useCallback((pointerId?: number) => {\n if (pointerId !== undefined && selectingRef.current?.pointerId !== pointerId) return;\n selectingRef.current = null;\n }, []);\n\n useEffect(() => {\n if (typeof window === \"undefined\") return;\n const stopSelecting = () => stopPointerSelection();\n window.addEventListener(\"pointerup\", stopSelecting);\n return () => window.removeEventListener(\"pointerup\", stopSelecting);\n }, [stopPointerSelection]);\n\n const horizontalProjection = buildScrollProjection(columns, ROW_HEADER_WIDTH, viewport.width);\n const verticalProjection = buildScrollProjection(rows, COLUMN_HEADER_HEIGHT, viewport.height);\n const physicalScrollLeft = clampPhysicalScroll(viewport.scrollLeft, horizontalProjection);\n const physicalScrollTop = clampPhysicalScroll(viewport.scrollTop, verticalProjection);\n const logicalScrollLeft = physicalToLogicalScroll(viewport.scrollLeft, horizontalProjection);\n const logicalScrollTop = physicalToLogicalScroll(viewport.scrollTop, verticalProjection);\n const visibleRowWindow = visibleInterval(\n rows,\n logicalScrollTop,\n Math.max(1, viewport.height - COLUMN_HEADER_HEIGHT),\n 0,\n );\n const visibleColumnWindow = visibleInterval(\n columns,\n logicalScrollLeft,\n Math.max(1, viewport.width - ROW_HEADER_WIDTH),\n 0,\n );\n const projectedRowWindow = visibleInterval(\n rows,\n logicalScrollTop,\n Math.max(1, viewport.height - COLUMN_HEADER_HEIGHT),\n Math.max(0, overscanRows),\n );\n const projectedColumnWindow = visibleInterval(\n columns,\n logicalScrollLeft,\n Math.max(1, viewport.width - ROW_HEADER_WIDTH),\n Math.max(0, overscanColumns),\n );\n const { rows: rowWindow, columns: columnWindow } = boundVisibleWindows(\n projectedRowWindow,\n projectedColumnWindow,\n selection.focus,\n );\n const visibleRows = indexesBetween(rowWindow.start, rowWindow.end);\n const visibleColumns = indexesBetween(columnWindow.start, columnWindow.end);\n const rowLayout = visibleRows.map((row) => ({\n row,\n top: physicalScrollTop + COLUMN_HEADER_HEIGHT + axisOffsetAt(rows, row) - logicalScrollTop,\n height: axisSizeAt(rows, row),\n }));\n const columnLayout = visibleColumns.map((col) => ({\n col,\n left: physicalScrollLeft + ROW_HEADER_WIDTH + axisOffsetAt(columns, col) - logicalScrollLeft,\n width: axisSizeAt(columns, col),\n }));\n const activeCellVisible =\n selection.focus.row >= rowWindow.start &&\n selection.focus.row < rowWindow.end &&\n selection.focus.col >= columnWindow.start &&\n selection.focus.col < columnWindow.end;\n const activeCellId = `${reactId}-cell-${selection.focus.row}-${selection.focus.col}`;\n const hiddenActiveValue = activeCellVisible\n ? null\n : projection.readCell(selection.focus.row, selection.focus.col)?.value;\n\n useEffect(() => {\n if (!onViewportChange) return;\n const next: SpreadsheetViewport = {\n sheetId: projection.sheetId,\n rowStart: visibleRowWindow.start,\n rowEnd: visibleRowWindow.end,\n columnStart: visibleColumnWindow.start,\n columnEnd: visibleColumnWindow.end,\n overscanRowStart: projectedRowWindow.start,\n overscanRowEnd: projectedRowWindow.end,\n overscanColumnStart: projectedColumnWindow.start,\n overscanColumnEnd: projectedColumnWindow.end,\n logicalScrollLeft,\n logicalScrollTop,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n };\n let active = true;\n const notify = () => {\n if (active) onViewportChange(next);\n };\n if (typeof globalThis.requestAnimationFrame === \"function\") {\n const frame = globalThis.requestAnimationFrame(notify);\n return () => {\n active = false;\n globalThis.cancelAnimationFrame?.(frame);\n };\n }\n queueMicrotask(notify);\n return () => {\n active = false;\n };\n }, [\n logicalScrollLeft,\n logicalScrollTop,\n onViewportChange,\n projectedColumnWindow.end,\n projectedColumnWindow.start,\n projectedRowWindow.end,\n projectedRowWindow.start,\n viewport.height,\n viewport.width,\n visibleColumnWindow.end,\n visibleColumnWindow.start,\n visibleRowWindow.end,\n visibleRowWindow.start,\n projection.sheetId,\n ]);\n\n useClientLayoutEffect(() => {\n void canvasEpoch;\n const canvas = canvasRef.current;\n const viewportElement = viewportRef.current;\n const renderer = canvasRendererRef.current;\n if (!canvas || !viewportElement || !renderer) return;\n const normalized = normalizeSelection(selection);\n const theme = spreadsheetCanvasTheme(viewportElement);\n const paintStartedAt = performance.now();\n const stats = renderer.paint({\n canvas,\n projection,\n rows: canvasRows,\n columns: canvasColumns,\n selection: {\n ...normalized,\n focusRow: selection.focus.row,\n focusColumn: selection.focus.col,\n },\n logicalScrollLeft,\n logicalScrollTop,\n viewportWidth: viewport.width,\n viewportHeight: viewport.height,\n rowHeaderWidth: ROW_HEADER_WIDTH,\n columnHeaderHeight: COLUMN_HEADER_HEIGHT,\n dimensionRevision,\n devicePixelRatio: viewport.devicePixelRatio,\n theme,\n });\n const paintDurationMs = performance.now() - paintStartedAt;\n if (!stats) {\n if (canvasReady) setCanvasReady(false);\n return;\n }\n canvas.dataset.ogTileCacheSize = String(stats.cacheSize);\n canvas.dataset.ogPaintedTiles = String(stats.paintedTiles);\n canvas.dataset.ogReusedTiles = String(stats.reusedTiles);\n canvas.dataset.ogUncachedTiles = String(stats.uncachedTiles);\n canvas.dataset.ogDevicePixelRatio = String(stats.devicePixelRatio);\n canvas.dataset.ogLogicalScrollLeft = String(logicalScrollLeft);\n canvas.dataset.ogLogicalScrollTop = String(logicalScrollTop);\n canvas.dataset.ogPaintDurationMs = String(paintDurationMs);\n if (!canvasReady) setCanvasReady(true);\n }, [\n canvasColumns,\n canvasEpoch,\n canvasReady,\n canvasRows,\n dimensionRevision,\n logicalScrollLeft,\n logicalScrollTop,\n projection,\n revision,\n selection,\n viewport.devicePixelRatio,\n viewport.height,\n viewport.width,\n ]);\n\n return (\n <div\n className={cn(\"relative flex h-full min-w-0 flex-col bg-og-bg\", className)}\n data-og-command-state={commandFailure ? \"error\" : pendingCommands > 0 ? \"pending\" : \"idle\"}\n style={{ minHeight: 256 }}\n >\n <div className=\"flex min-h-9 shrink-0 items-center border-b border-og-border bg-og-surface-1\">\n <output\n aria-label=\"Selected range\"\n className=\"shrink-0 border-r border-og-border px-2 font-mono text-og-xs text-og-fg-muted\"\n style={{ width: 96 }}\n >\n {selectionName(selection)}\n </output>\n <span aria-hidden className=\"px-2 font-og-mono text-og-sm italic text-og-fg-subtle\">\n fx\n </span>\n <input\n aria-label=\"Formula or value\"\n readOnly={!editable}\n aria-invalid={commandFailure ? \"true\" : undefined}\n value={draft}\n onFocus={() => {\n if (editable) {\n const current =\n projection.readCell(selection.focus.row, selection.focus.col)?.input ?? \"\";\n initialDraftRef.current = current;\n setDraft(current);\n setEditMode(\"formula\");\n }\n }}\n onInput={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={onEditorKeyDown}\n onCompositionStart={onEditorCompositionStart}\n onCompositionEnd={(event) => onEditorCompositionEnd(event.currentTarget.value)}\n onBlur={(event) => commitEditorOnBlur(\"formula\", event.currentTarget.value)}\n className=\"h-8 min-w-0 flex-1 bg-transparent px-1 font-mono text-og-sm text-og-fg outline-hidden placeholder:text-og-fg-subtle\"\n />\n </div>\n <div role=\"status\" aria-live=\"polite\" className=\"sr-only\">\n {commandFailure?.message ?? (pendingCommands > 0 ? \"Saving spreadsheet changes\" : \"\")}\n </div>\n {commandFailure ? (\n <div\n role=\"alert\"\n className=\"absolute bottom-2 left-2 z-50 flex items-center gap-2 rounded-og-sm border border-og-status-failed/30 bg-og-surface-1/95 px-2 py-1 text-og-xs text-og-status-failed shadow-og-sm\"\n style={{ maxWidth: \"calc(100% - 1rem)\" }}\n >\n <span className=\"truncate\">{commandFailure.message}</span>\n {commandFailure.retry ? (\n <button\n type=\"button\"\n onClick={commandFailure.retry}\n className=\"shrink-0 rounded-og-xs px-1.5 py-0.5 font-medium outline-hidden hover:bg-og-surface-3 focus-visible:ring-2 focus-visible:ring-og-accent\"\n >\n Retry\n </button>\n ) : null}\n </div>\n ) : null}\n\n <div\n ref={viewportRef}\n role=\"grid\"\n tabIndex={0}\n aria-label={`${projection.sheetName} spreadsheet`}\n aria-rowcount={rowCount}\n aria-colcount={columnCount}\n aria-multiselectable=\"true\"\n aria-readonly={!editable}\n aria-busy={pendingCommands > 0 ? \"true\" : undefined}\n aria-activedescendant={activeCellId}\n onKeyDown={onGridKeyDown}\n onCopy={copySelection}\n onPaste={pasteClipboard}\n onCompositionEnd={(event) => {\n if (editMode === null && editable && event.data) beginEditing(event.data);\n }}\n onPointerDown={onGridPointerDown}\n onPointerMove={onGridPointerMove}\n onPointerUp={(event) => stopPointerSelection(event.pointerId)}\n onPointerCancel={(event) => stopPointerSelection(event.pointerId)}\n onDoubleClick={(event) => {\n const cell = hitTestCell(event.clientX, event.clientY);\n if (!cell) return;\n selectCell(cell, event.shiftKey);\n beginEditing(undefined, cell);\n }}\n onScroll={(event) => {\n const element = event.currentTarget;\n setViewport((current) => ({\n ...current,\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop,\n }));\n }}\n className=\"relative min-h-0 min-w-0 flex-1 overflow-auto overscroll-contain bg-og-surface-1 text-og-sm outline-hidden focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-og-accent\"\n >\n <div\n role=\"rowgroup\"\n className=\"relative\"\n style={{\n width: horizontalProjection.physicalTotal,\n height: verticalProjection.physicalTotal,\n }}\n >\n <canvas\n ref={canvasRef}\n aria-hidden=\"true\"\n data-og-spreadsheet-canvas=\"retained-tiles\"\n className=\"pointer-events-none absolute z-0 block\"\n style={{\n left: physicalScrollLeft,\n top: physicalScrollTop,\n width: viewport.width,\n height: viewport.height,\n }}\n />\n <div\n aria-hidden\n className=\"sticky left-0 top-0 z-40 border-b border-r border-og-border bg-og-surface-2\"\n style={{\n width: ROW_HEADER_WIDTH,\n height: COLUMN_HEADER_HEIGHT,\n ...(canvasReady\n ? { background: \"transparent\", borderColor: \"transparent\" }\n : undefined),\n }}\n />\n\n <div role=\"row\" className=\"contents\">\n {columnLayout.map(({ col, left, width }) => (\n <div\n key={`header-${col}`}\n role=\"columnheader\"\n aria-colindex={col + 1}\n className=\"sticky top-0 z-30 grid select-none place-items-center overflow-hidden border-b border-r border-og-border bg-og-surface-2 text-og-xs font-medium text-og-fg-muted\"\n style={{\n position: \"absolute\",\n left,\n top: physicalScrollTop,\n width,\n height: COLUMN_HEADER_HEIGHT,\n ...(canvasReady\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n }}\n >\n {columnName(col)}\n </div>\n ))}\n </div>\n\n {rowLayout.map(({ row, top, height }) => {\n return (\n <div\n key={`row-${row}`}\n role=\"row\"\n aria-rowindex={row + 1}\n className=\"absolute left-0\"\n style={{\n top,\n width: horizontalProjection.physicalTotal,\n height,\n }}\n >\n <div\n role=\"rowheader\"\n className=\"sticky left-0 z-20 grid h-full select-none place-items-center border-b border-r border-og-border bg-og-surface-2 text-og-xs text-og-fg-muted\"\n style={{\n width: ROW_HEADER_WIDTH,\n ...(canvasReady\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n }}\n >\n {row + 1}\n </div>\n\n {columnLayout.map(({ col, left, width }) => {\n const active = selection.focus.row === row && selection.focus.col === col;\n const selected = isCellSelected(selection, row, col);\n const data = projection.readCell(row, col) ?? {\n value: null,\n input: \"\",\n format: {},\n };\n const value = data.value;\n const address = cellName({ row, col });\n const error = typeof value === \"string\" && value.startsWith(\"#\");\n return (\n <div\n key={col}\n id={`${reactId}-cell-${row}-${col}`}\n role=\"gridcell\"\n aria-colindex={col + 1}\n aria-selected={selected}\n aria-label={`${address}${value === null ? \"\" : `, ${displayValue(value)}`}`}\n data-og-cell={address}\n className={cn(\n \"pointer-events-none absolute top-0 flex h-full min-w-0 overflow-hidden border-b border-r border-og-border px-1.5 text-og-fg\",\n !canvasReady && selected && !active && \"bg-og-accent/10\",\n !canvasReady &&\n active &&\n \"z-10 bg-og-accent/10 ring-2 ring-inset ring-og-accent\",\n !canvasReady && error && \"text-og-status-failed\",\n )}\n style={{\n left,\n width,\n ...cellStyle(data.format),\n ...(canvasReady\n ? {\n background: \"transparent\",\n borderColor: \"transparent\",\n color: \"transparent\",\n }\n : undefined),\n }}\n >\n {active && editMode === \"cell\" ? (\n <input\n ref={editorRef}\n aria-label={`Edit ${address}`}\n value={draft}\n onInput={(event) => setDraft(event.currentTarget.value)}\n onKeyDown={onEditorKeyDown}\n onCompositionStart={onEditorCompositionStart}\n onCompositionEnd={(event) =>\n onEditorCompositionEnd(event.currentTarget.value)\n }\n onBlur={(event) => commitEditorOnBlur(\"cell\", event.currentTarget.value)}\n onPointerDown={(event) => event.stopPropagation()}\n className=\"pointer-events-auto absolute inset-0 size-full bg-og-surface-1 px-1.5 font-mono text-og-sm text-og-fg outline-hidden ring-2 ring-inset ring-og-accent\"\n />\n ) : (\n <span className=\"block min-w-0 overflow-hidden text-ellipsis\">\n {displayValue(value)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n })}\n\n {!activeCellVisible ? (\n <div role=\"row\" aria-rowindex={selection.focus.row + 1} className=\"sr-only\">\n <div\n id={activeCellId}\n role=\"gridcell\"\n aria-colindex={selection.focus.col + 1}\n aria-selected=\"true\"\n aria-label={`${cellName(selection.focus)}${\n hiddenActiveValue == null ? \"\" : `, ${displayValue(hiddenActiveValue)}`\n }`}\n />\n </div>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","const TILE_SIZE = 256;\nconst MAX_CACHE_PHYSICAL_PIXELS = 32_000_000;\nconst MAX_CACHE_TILES = 96;\nconst MAX_DEVICE_PIXEL_RATIO = 4;\nconst MAX_AXIS_MARKS_PER_PAINT = 8_192;\nconst MAX_CANVAS_EDGE = 8_192;\nconst MAX_CANVAS_PIXELS = 16_000_000;\nconst MAX_TILES_PER_PAINT = 512;\n\nexport type SpreadsheetCanvasCellFormat = {\n fill?: string | undefined;\n font?:\n | {\n name?: string | undefined;\n size?: number | undefined;\n bold?: boolean | undefined;\n italic?: boolean | undefined;\n underline?: boolean | undefined;\n color?: string | undefined;\n }\n | undefined;\n horizontalAlignment?: \"left\" | \"center\" | \"right\" | \"justify\" | undefined;\n verticalAlignment?: \"top\" | \"center\" | \"bottom\" | undefined;\n wrapText?: boolean | undefined;\n};\n\n/** One sparse, already-authorized cell projected into the renderer. */\nexport type SpreadsheetCanvasCell = {\n row: number;\n col: number;\n value: unknown;\n formula?: string | null | undefined;\n format: SpreadsheetCanvasCellFormat;\n};\n\nexport type SpreadsheetCanvasCoverage = {\n rowStart: number;\n rowEnd: number;\n columnStart: number;\n columnEnd: number;\n};\n\n/**\n * A bounded value projection. `coverage` is end-exclusive; omitting it means\n * the source can answer for the entire sheet. A session-backed adapter can\n * replace this object as viewport subscriptions advance without making the\n * React layer or renderer own the canonical workbook model.\n */\nexport type SpreadsheetCanvasProjection = {\n sheetId: string;\n generationId: string | null;\n revision: string | number;\n coverage?: SpreadsheetCanvasCoverage | undefined;\n cells: SpreadsheetCanvasCellSource;\n valueAt: (cell: SpreadsheetCanvasCell) => unknown;\n};\n\nexport type SpreadsheetCanvasCellSource = {\n forEachInRange: (\n rowStart: number,\n rowEnd: number,\n columnStart: number,\n columnEnd: number,\n visit: (cell: SpreadsheetCanvasCell) => void,\n ) => void;\n};\n\nexport type SpreadsheetCanvasAxis = {\n count: number;\n total: number;\n offsetAt: (index: number) => number;\n sizeAt: (index: number) => number;\n indexAtOffset: (offset: number) => number;\n};\n\nexport type SpreadsheetCanvasSelection = {\n top: number;\n bottom: number;\n left: number;\n right: number;\n focusRow: number;\n focusColumn: number;\n};\n\nexport type SpreadsheetCanvasTheme = {\n background: string;\n headerBackground: string;\n border: string;\n foreground: string;\n mutedForeground: string;\n accent: string;\n error: string;\n fontFamily: string;\n fontSize: number;\n headerFontSize: number;\n signature: string;\n};\n\nexport type SpreadsheetCanvasPaint = {\n canvas: HTMLCanvasElement;\n projection: SpreadsheetCanvasProjection;\n rows: SpreadsheetCanvasAxis;\n columns: SpreadsheetCanvasAxis;\n selection: SpreadsheetCanvasSelection;\n logicalScrollLeft: number;\n logicalScrollTop: number;\n viewportWidth: number;\n viewportHeight: number;\n rowHeaderWidth: number;\n columnHeaderHeight: number;\n dimensionRevision: string | number;\n devicePixelRatio: number;\n theme: SpreadsheetCanvasTheme;\n};\n\nexport type SpreadsheetCanvasPaintStats = {\n cacheSize: number;\n paintedTiles: number;\n reusedTiles: number;\n uncachedTiles: number;\n devicePixelRatio: number;\n};\n\ntype IndexedRow = {\n row: number;\n cells: SpreadsheetCanvasCell[];\n};\n\ntype Tile = {\n canvas: HTMLCanvasElement;\n lastUsed: number;\n};\n\n/**\n * A row-major sparse index over stored worksheet cells. Empty cells never enter\n * this structure, so a tile query costs O(log k + v), where v is the number of\n * stored cells intersecting that tile.\n */\nexport class SparseSpreadsheetCellIndex {\n readonly size: number;\n private readonly rows: IndexedRow[];\n\n constructor(entries: Iterable<SpreadsheetCanvasCell>) {\n const sorted = [...entries].sort((left, right) => left.row - right.row || left.col - right.col);\n this.size = sorted.length;\n this.rows = [];\n for (const entry of sorted) {\n const previous = this.rows.at(-1);\n if (previous?.row === entry.row) previous.cells.push(entry);\n else this.rows.push({ row: entry.row, cells: [entry] });\n }\n }\n\n forEachInRange(\n rowStart: number,\n rowEnd: number,\n columnStart: number,\n columnEnd: number,\n visit: (cell: SpreadsheetCanvasCell) => void,\n ): void {\n let rowIndex = lowerBound(this.rows, rowStart, (row) => row.row);\n while (rowIndex < this.rows.length) {\n const row = this.rows[rowIndex]!;\n if (row.row >= rowEnd) break;\n let cellIndex = lowerBound(row.cells, columnStart, (cell) => cell.col);\n while (cellIndex < row.cells.length) {\n const cell = row.cells[cellIndex]!;\n if (cell.col >= columnEnd) break;\n visit(cell);\n cellIndex += 1;\n }\n rowIndex += 1;\n }\n }\n}\n\nfunction lowerBound<T>(\n values: readonly T[],\n target: number,\n valueAt: (value: T) => number,\n): number {\n let low = 0;\n let high = values.length;\n while (low < high) {\n const middle = (low + high) >>> 1;\n if (valueAt(values[middle]!) < target) low = middle + 1;\n else high = middle;\n }\n return low;\n}\n\nfunction coverageContains(\n coverage: SpreadsheetCanvasCoverage | undefined,\n query: SpreadsheetCanvasCoverage,\n): boolean {\n return (\n coverage === undefined ||\n (coverage.rowStart <= query.rowStart &&\n coverage.rowEnd >= query.rowEnd &&\n coverage.columnStart <= query.columnStart &&\n coverage.columnEnd >= query.columnEnd)\n );\n}\n\nfunction intersectCoverage(\n query: SpreadsheetCanvasCoverage,\n coverage: SpreadsheetCanvasCoverage | undefined,\n): SpreadsheetCanvasCoverage | null {\n if (coverage === undefined) return query;\n const intersection = {\n rowStart: Math.max(query.rowStart, coverage.rowStart),\n rowEnd: Math.min(query.rowEnd, coverage.rowEnd),\n columnStart: Math.max(query.columnStart, coverage.columnStart),\n columnEnd: Math.min(query.columnEnd, coverage.columnEnd),\n };\n return intersection.rowStart < intersection.rowEnd &&\n intersection.columnStart < intersection.columnEnd\n ? intersection\n : null;\n}\n\nexport function spreadsheetCanvasDevicePixelRatio(value: number): number {\n if (!Number.isFinite(value) || value <= 0) return 1;\n return Math.max(1, Math.min(MAX_DEVICE_PIXEL_RATIO, value));\n}\n\n/** Caps backing-store allocation while retaining the full CSS viewport. */\nexport function spreadsheetCanvasBackingScale(\n width: number,\n height: number,\n devicePixelRatio: number,\n): number {\n const safeWidth = finiteExtent(width);\n const safeHeight = finiteExtent(height);\n const requested = spreadsheetCanvasDevicePixelRatio(devicePixelRatio);\n return Math.max(\n Number.EPSILON,\n Math.min(\n requested,\n MAX_CANVAS_EDGE / safeWidth,\n MAX_CANVAS_EDGE / safeHeight,\n Math.sqrt(MAX_CANVAS_PIXELS / (safeWidth * safeHeight)),\n ),\n );\n}\n\n/** Retained 2D tile renderer. Dynamic selection and headers are painted above cached body tiles. */\nexport class SpreadsheetCanvasRenderer {\n private readonly tiles = new Map<string, Tile>();\n private generation = \"\";\n private clock = 0;\n\n dispose(): void {\n this.tiles.clear();\n this.generation = \"\";\n }\n\n paint(input: SpreadsheetCanvasPaint): SpreadsheetCanvasPaintStats | null {\n const context = safeCanvasContext(input.canvas);\n if (!context) return null;\n\n const width = finiteExtent(input.viewportWidth);\n const height = finiteExtent(input.viewportHeight);\n const dpr = spreadsheetCanvasBackingScale(width, height, input.devicePixelRatio);\n const pixelWidth = Math.max(1, Math.min(MAX_CANVAS_EDGE, Math.round(width * dpr)));\n const pixelHeight = Math.max(1, Math.min(MAX_CANVAS_EDGE, Math.round(height * dpr)));\n if (input.canvas.width !== pixelWidth) input.canvas.width = pixelWidth;\n if (input.canvas.height !== pixelHeight) input.canvas.height = pixelHeight;\n input.canvas.style.width = `${width}px`;\n input.canvas.style.height = `${height}px`;\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n context.clearRect(0, 0, width, height);\n\n const generation = [\n input.projection.sheetId,\n input.projection.generationId ?? \"<none>\",\n input.projection.revision,\n input.dimensionRevision,\n dpr,\n input.theme.signature,\n ].join(\"/\");\n if (generation !== this.generation) {\n this.tiles.clear();\n this.generation = generation;\n }\n\n setFill(context, input.theme.background, \"#ffffff\");\n context.fillRect(0, 0, width, height);\n\n const bodyLeft = input.rowHeaderWidth;\n const bodyTop = input.columnHeaderHeight;\n const visibleLeft = clamp(input.logicalScrollLeft, 0, input.columns.total);\n const visibleTop = clamp(input.logicalScrollTop, 0, input.rows.total);\n const visibleRight = clamp(\n input.logicalScrollLeft + width - bodyLeft,\n visibleLeft,\n input.columns.total,\n );\n const visibleBottom = clamp(\n input.logicalScrollTop + height - bodyTop,\n visibleTop,\n input.rows.total,\n );\n let paintedTiles = 0;\n let reusedTiles = 0;\n let uncachedTiles = 0;\n\n context.save();\n context.beginPath();\n context.rect(bodyLeft, bodyTop, Math.max(0, width - bodyLeft), Math.max(0, height - bodyTop));\n context.clip();\n const firstTileColumn = Math.floor(visibleLeft / TILE_SIZE);\n const lastTileColumn = Math.floor(\n Math.max(visibleLeft, visibleRight - Number.EPSILON) / TILE_SIZE,\n );\n const firstTileRow = Math.floor(visibleTop / TILE_SIZE);\n const lastTileRow = Math.floor(\n Math.max(visibleTop, visibleBottom - Number.EPSILON) / TILE_SIZE,\n );\n let visitedTiles = 0;\n tileLoop: for (let tileRow = firstTileRow; tileRow <= lastTileRow; tileRow += 1) {\n for (let tileColumn = firstTileColumn; tileColumn <= lastTileColumn; tileColumn += 1) {\n if (visitedTiles >= MAX_TILES_PER_PAINT) break tileLoop;\n visitedTiles += 1;\n const key = `${tileColumn}:${tileRow}`;\n let tile = this.tiles.get(key);\n if (!tile) {\n const painted = this.paintTile(input, tileColumn, tileRow, dpr);\n tile = {\n canvas: painted.canvas,\n lastUsed: ++this.clock,\n };\n if (painted.cacheable) this.tiles.set(key, tile);\n else uncachedTiles += 1;\n paintedTiles += 1;\n } else {\n tile.lastUsed = ++this.clock;\n reusedTiles += 1;\n }\n const logicalX = tileColumn * TILE_SIZE;\n const logicalY = tileRow * TILE_SIZE;\n context.drawImage(\n tile.canvas,\n bodyLeft + logicalX - input.logicalScrollLeft,\n bodyTop + logicalY - input.logicalScrollTop,\n TILE_SIZE,\n TILE_SIZE,\n );\n }\n }\n\n paintSelection(context, input);\n paintVisibleGrid(context, input, visibleLeft, visibleTop, visibleRight, visibleBottom);\n context.restore();\n paintHeaders(\n context,\n input,\n width,\n height,\n visibleLeft,\n visibleTop,\n visibleRight,\n visibleBottom,\n );\n\n this.evictTiles(dpr);\n return {\n cacheSize: this.tiles.size,\n paintedTiles,\n reusedTiles,\n uncachedTiles,\n devicePixelRatio: dpr,\n };\n }\n\n private paintTile(\n input: SpreadsheetCanvasPaint,\n tileColumn: number,\n tileRow: number,\n dpr: number,\n ): { canvas: HTMLCanvasElement; cacheable: boolean } {\n const tile = input.canvas.ownerDocument.createElement(\"canvas\");\n tile.width = Math.max(1, Math.round(TILE_SIZE * dpr));\n tile.height = Math.max(1, Math.round(TILE_SIZE * dpr));\n const context = safeCanvasContext(tile);\n if (!context) return { canvas: tile, cacheable: false };\n context.setTransform(dpr, 0, 0, dpr, 0, 0);\n setFill(context, input.theme.background, \"#ffffff\");\n context.fillRect(0, 0, TILE_SIZE, TILE_SIZE);\n\n const tileLeft = tileColumn * TILE_SIZE;\n const tileTop = tileRow * TILE_SIZE;\n const tileRight = Math.min(input.columns.total, tileLeft + TILE_SIZE);\n const tileBottom = Math.min(input.rows.total, tileTop + TILE_SIZE);\n const firstColumn = input.columns.indexAtOffset(tileLeft);\n const lastColumn = input.columns.indexAtOffset(Math.max(tileLeft, tileRight - Number.EPSILON));\n const firstRow = input.rows.indexAtOffset(tileTop);\n const lastRow = input.rows.indexAtOffset(Math.max(tileTop, tileBottom - Number.EPSILON));\n const query = {\n rowStart: firstRow,\n rowEnd: Math.min(input.rows.count, lastRow + 1),\n columnStart: firstColumn,\n columnEnd: Math.min(input.columns.count, lastColumn + 1),\n };\n const coveredQuery = intersectCoverage(query, input.projection.coverage);\n const cacheable = coverageContains(input.projection.coverage, query);\n const cells: SpreadsheetCanvasCell[] = [];\n if (coveredQuery) {\n input.projection.cells.forEachInRange(\n coveredQuery.rowStart,\n coveredQuery.rowEnd,\n coveredQuery.columnStart,\n coveredQuery.columnEnd,\n (cell) => cells.push(cell),\n );\n }\n\n for (const cell of cells) {\n const fill = cell.format.fill;\n if (!fill) continue;\n const x = input.columns.offsetAt(cell.col) - tileLeft;\n const y = input.rows.offsetAt(cell.row) - tileTop;\n const width = input.columns.sizeAt(cell.col);\n const height = input.rows.sizeAt(cell.row);\n setFill(context, fill, input.theme.background);\n context.fillRect(x, y, width, height);\n }\n\n paintTileGrid(context, input, tileLeft, tileTop, tileRight, tileBottom);\n\n for (const cell of cells) {\n const value = input.projection.valueAt(cell);\n const text = displayValue(value);\n if (!text) continue;\n paintCellText(context, input, cell, text, tileLeft, tileTop);\n }\n\n return { canvas: tile, cacheable };\n }\n\n private evictTiles(dpr: number): void {\n const pixelsPerTile = Math.max(1, Math.round(TILE_SIZE * dpr)) ** 2;\n const maximum = Math.max(\n 4,\n Math.min(MAX_CACHE_TILES, Math.floor(MAX_CACHE_PHYSICAL_PIXELS / pixelsPerTile)),\n );\n if (this.tiles.size <= maximum) return;\n const oldest = [...this.tiles.entries()].sort(\n (left, right) => left[1].lastUsed - right[1].lastUsed,\n );\n for (let index = 0; index < oldest.length - maximum; index += 1) {\n this.tiles.delete(oldest[index]![0]);\n }\n }\n}\n\nfunction finiteExtent(value: number): number {\n if (!Number.isFinite(value) || value <= 0) return 1;\n return Math.max(1, Math.floor(value));\n}\n\nfunction safeCanvasContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D | null {\n try {\n return canvas.getContext(\"2d\", { alpha: false });\n } catch {\n return null;\n }\n}\n\nfunction setFill(context: CanvasRenderingContext2D, value: string, fallback: string): void {\n context.fillStyle = fallback;\n try {\n context.fillStyle = value;\n } catch {\n // Invalid workbook colors behave like invalid CSS declarations: ignore them.\n }\n}\n\nfunction setStroke(context: CanvasRenderingContext2D, value: string, fallback: string): void {\n context.strokeStyle = fallback;\n try {\n context.strokeStyle = value;\n } catch {\n // Invalid workbook colors behave like invalid CSS declarations: ignore them.\n }\n}\n\nfunction paintTileGrid(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n tileLeft: number,\n tileTop: number,\n tileRight: number,\n tileBottom: number,\n): void {\n setFill(context, input.theme.border, \"#d1d5db\");\n visitAxisBoundaries(input.columns, tileLeft, tileRight, (offset) => {\n context.fillRect(offset - tileLeft - 1, 0, 1, TILE_SIZE);\n });\n visitAxisBoundaries(input.rows, tileTop, tileBottom, (offset) => {\n context.fillRect(0, offset - tileTop - 1, TILE_SIZE, 1);\n });\n}\n\nfunction paintVisibleGrid(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n visibleLeft: number,\n visibleTop: number,\n visibleRight: number,\n visibleBottom: number,\n): void {\n setFill(context, input.theme.border, \"#d1d5db\");\n visitAxisBoundaries(input.columns, visibleLeft, visibleRight, (offset) => {\n const x = input.rowHeaderWidth + offset - input.logicalScrollLeft;\n context.fillRect(x - 1, input.columnHeaderHeight, 1, input.viewportHeight);\n });\n visitAxisBoundaries(input.rows, visibleTop, visibleBottom, (offset) => {\n const y = input.columnHeaderHeight + offset - input.logicalScrollTop;\n context.fillRect(input.rowHeaderWidth, y - 1, input.viewportWidth, 1);\n });\n}\n\nfunction visitAxisBoundaries(\n axis: SpreadsheetCanvasAxis,\n start: number,\n end: number,\n visit: (offset: number) => void,\n): void {\n if (axis.count <= 0 || end < start) return;\n let index = axis.indexAtOffset(start);\n let visits = 0;\n while (index < axis.count && visits < MAX_AXIS_MARKS_PER_PAINT) {\n const boundary = axis.offsetAt(index + 1);\n if (boundary > end + 1) break;\n if (boundary >= start) visit(boundary);\n index += 1;\n visits += 1;\n }\n}\n\nfunction paintSelection(context: CanvasRenderingContext2D, input: SpreadsheetCanvasPaint): void {\n const { selection } = input;\n const left =\n input.rowHeaderWidth + input.columns.offsetAt(selection.left) - input.logicalScrollLeft;\n const right =\n input.rowHeaderWidth + input.columns.offsetAt(selection.right + 1) - input.logicalScrollLeft;\n const top =\n input.columnHeaderHeight + input.rows.offsetAt(selection.top) - input.logicalScrollTop;\n const bottom =\n input.columnHeaderHeight + input.rows.offsetAt(selection.bottom + 1) - input.logicalScrollTop;\n context.save();\n setFill(context, input.theme.accent, \"#3b82f6\");\n context.globalAlpha = 0.1;\n context.fillRect(left, top, right - left, bottom - top);\n context.restore();\n\n const activeLeft =\n input.rowHeaderWidth + input.columns.offsetAt(selection.focusColumn) - input.logicalScrollLeft;\n const activeTop =\n input.columnHeaderHeight + input.rows.offsetAt(selection.focusRow) - input.logicalScrollTop;\n const activeWidth = input.columns.sizeAt(selection.focusColumn);\n const activeHeight = input.rows.sizeAt(selection.focusRow);\n context.save();\n setStroke(context, input.theme.accent, \"#3b82f6\");\n context.lineWidth = 2;\n context.strokeRect(\n activeLeft + 1,\n activeTop + 1,\n Math.max(0, activeWidth - 2),\n Math.max(0, activeHeight - 2),\n );\n context.restore();\n}\n\nfunction paintHeaders(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n width: number,\n height: number,\n visibleLeft: number,\n visibleTop: number,\n visibleRight: number,\n visibleBottom: number,\n): void {\n setFill(context, input.theme.headerBackground, \"#f3f4f6\");\n context.fillRect(0, 0, width, input.columnHeaderHeight);\n context.fillRect(0, input.columnHeaderHeight, input.rowHeaderWidth, height);\n setFill(context, input.theme.border, \"#d1d5db\");\n context.fillRect(0, input.columnHeaderHeight - 1, width, 1);\n context.fillRect(input.rowHeaderWidth - 1, 0, 1, height);\n\n context.save();\n context.beginPath();\n context.rect(\n input.rowHeaderWidth,\n 0,\n Math.max(0, width - input.rowHeaderWidth),\n input.columnHeaderHeight,\n );\n context.clip();\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.font = `600 ${input.theme.headerFontSize}px ${input.theme.fontFamily}`;\n context.textAlign = \"center\";\n context.textBaseline = \"middle\";\n visitAxisItems(input.columns, visibleLeft, visibleRight, (column, offset, size) => {\n const x = input.rowHeaderWidth + offset - input.logicalScrollLeft;\n setFill(context, input.theme.border, \"#d1d5db\");\n context.fillRect(x + size - 1, 0, 1, input.columnHeaderHeight);\n if (size >= 8) {\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.fillText(columnName(column), x + size / 2, input.columnHeaderHeight / 2);\n }\n });\n context.restore();\n\n context.save();\n context.beginPath();\n context.rect(\n 0,\n input.columnHeaderHeight,\n input.rowHeaderWidth,\n Math.max(0, height - input.columnHeaderHeight),\n );\n context.clip();\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.font = `400 ${input.theme.headerFontSize}px ${input.theme.fontFamily}`;\n context.textAlign = \"center\";\n context.textBaseline = \"middle\";\n visitAxisItems(input.rows, visibleTop, visibleBottom, (row, offset, size) => {\n const y = input.columnHeaderHeight + offset - input.logicalScrollTop;\n setFill(context, input.theme.border, \"#d1d5db\");\n context.fillRect(0, y + size - 1, input.rowHeaderWidth, 1);\n if (size >= 8) {\n setFill(context, input.theme.mutedForeground, \"#6b7280\");\n context.fillText(String(row + 1), input.rowHeaderWidth / 2, y + size / 2);\n }\n });\n context.restore();\n}\n\nfunction visitAxisItems(\n axis: SpreadsheetCanvasAxis,\n start: number,\n end: number,\n visit: (index: number, offset: number, size: number) => void,\n): void {\n if (axis.count <= 0 || end < start) return;\n let index = axis.indexAtOffset(start);\n let visits = 0;\n while (index < axis.count && visits < MAX_AXIS_MARKS_PER_PAINT) {\n const offset = axis.offsetAt(index);\n if (offset > end) break;\n visit(index, offset, axis.sizeAt(index));\n index += 1;\n visits += 1;\n }\n}\n\nfunction paintCellText(\n context: CanvasRenderingContext2D,\n input: SpreadsheetCanvasPaint,\n cell: SpreadsheetCanvasCell,\n text: string,\n tileLeft: number,\n tileTop: number,\n): void {\n const format = cell.format;\n const x = input.columns.offsetAt(cell.col) - tileLeft;\n const y = input.rows.offsetAt(cell.row) - tileTop;\n const width = input.columns.sizeAt(cell.col);\n const height = input.rows.sizeAt(cell.row);\n if (width <= 2 || height <= 2) return;\n const fontSize = finitePositive(format.font?.size, input.theme.fontSize);\n const fontFamily = format.font?.name || input.theme.fontFamily;\n const weight = format.font?.bold ? 600 : 400;\n const italic = format.font?.italic ? \"italic \" : \"\";\n context.save();\n context.beginPath();\n context.rect(x + 1, y + 1, Math.max(0, width - 2), Math.max(0, height - 2));\n context.clip();\n context.font = `${italic}${weight} ${fontSize}px ${fontFamily}`;\n setFill(\n context,\n format.font?.color ?? (text.startsWith(\"#\") ? input.theme.error : input.theme.foreground),\n input.theme.foreground,\n );\n const alignment = format.horizontalAlignment;\n context.textAlign = alignment === \"center\" ? \"center\" : alignment === \"right\" ? \"right\" : \"left\";\n context.textBaseline = \"alphabetic\";\n const padding = 6;\n const textX =\n alignment === \"center\"\n ? x + width / 2\n : alignment === \"right\"\n ? x + width - padding\n : x + padding;\n const lineHeight = fontSize * 1.5;\n const availableWidth = Math.max(0, width - padding * 2);\n const lines = format.wrapText\n ? wrapText(context, text, availableWidth, Math.max(1, Math.floor(height / lineHeight)))\n : [ellipsize(context, text.replaceAll(/\\r?\\n/g, \" \"), availableWidth)];\n const blockHeight = lines.length * lineHeight;\n const vertical = format.verticalAlignment;\n const firstBaseline =\n vertical === \"top\"\n ? y + Math.min(height, padding + fontSize)\n : vertical === \"bottom\"\n ? y + height - padding - blockHeight + fontSize\n : y + (height - blockHeight) / 2 + fontSize;\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index]!;\n const baseline = firstBaseline + index * lineHeight;\n context.fillText(line, textX, baseline);\n if (format.font?.underline && line) {\n const metrics = context.measureText(line);\n const textWidth = metrics.width;\n const startX =\n alignment === \"center\"\n ? textX - textWidth / 2\n : alignment === \"right\"\n ? textX - textWidth\n : textX;\n setFill(context, format.font.color ?? input.theme.foreground, input.theme.foreground);\n context.fillRect(startX, baseline + 1, textWidth, Math.max(1, fontSize / 14));\n }\n }\n context.restore();\n}\n\nfunction wrapText(\n context: CanvasRenderingContext2D,\n input: string,\n maximumWidth: number,\n maximumLines: number,\n): string[] {\n if (maximumWidth <= 0) return [\"\"];\n const output: string[] = [];\n for (const paragraph of input.split(/\\r?\\n/)) {\n const words = paragraph.split(/\\s+/).filter(Boolean);\n if (words.length === 0) output.push(\"\");\n let line = \"\";\n for (const word of words) {\n const next = line ? `${line} ${word}` : word;\n if (!line || context.measureText(next).width <= maximumWidth) line = next;\n else {\n output.push(ellipsize(context, line, maximumWidth));\n line = word;\n }\n if (output.length >= maximumLines) break;\n }\n if (output.length < maximumLines && line) output.push(ellipsize(context, line, maximumWidth));\n if (output.length >= maximumLines) break;\n }\n return output.slice(0, maximumLines);\n}\n\nfunction ellipsize(context: CanvasRenderingContext2D, input: string, maximumWidth: number): string {\n if (!input || maximumWidth <= 0) return \"\";\n if (context.measureText(input).width <= maximumWidth) return input;\n const suffix = \"…\";\n const suffixWidth = context.measureText(suffix).width;\n if (suffixWidth > maximumWidth) return \"\";\n let low = 0;\n let high = input.length;\n while (low < high) {\n const middle = Math.ceil((low + high) / 2);\n if (context.measureText(`${input.slice(0, middle)}${suffix}`).width <= maximumWidth)\n low = middle;\n else high = middle - 1;\n }\n return `${input.slice(0, low)}${suffix}`;\n}\n\nfunction finitePositive(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isFinite(value) && value > 0 ? value : fallback;\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toLocaleDateString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n\nfunction columnName(index: number): string {\n let value = index + 1;\n let result = \"\";\n while (value > 0) {\n const remainder = (value - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n value = Math.floor((value - 1) / 26);\n }\n return result;\n}\n\nfunction clamp(value: number, minimum: number, maximum: number): number {\n return Math.max(minimum, Math.min(maximum, value));\n}\n","import {\n SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n editableArtifactStableId,\n spreadsheetSheetId,\n type EditableArtifactSession,\n type EditableSpreadsheetCellValue,\n type EditableSpreadsheetMetadataProjection,\n type EditableSpreadsheetSheetMetadata,\n type EditableSpreadsheetViewportProjection,\n type EditableSpreadsheetViewportQuery,\n type SpreadsheetCellInput,\n type SpreadsheetSheetGeneration,\n} from \"@opengeni/sdk/editable-artifacts\";\nimport { PlusIcon } from \"lucide-react\";\nimport { type ReactNode, useCallback, useEffect, useMemo, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/cn\";\nimport { ArtifactSurface } from \"./artifact-surface\";\nimport {\n editableArtifactAccessRevoked,\n editableArtifactStatusLabel,\n EditableArtifactMessage,\n useEditableArtifactView,\n} from \"./editable-artifact-ui\";\nimport { SparseSpreadsheetCellIndex } from \"./spreadsheet-canvas\";\nimport {\n SpreadsheetProjectionGrid,\n type SpreadsheetCommit,\n type SpreadsheetGridProjection,\n type SpreadsheetRangeCommit,\n type SpreadsheetSelection,\n type SpreadsheetViewport,\n} from \"./spreadsheet-grid\";\n\nconst EXCEL_MAX_ROWS = 1_048_576;\nconst EXCEL_MAX_COLUMNS = 16_384;\nconst INITIAL_VIEWPORT_ROWS = 64;\nconst INITIAL_VIEWPORT_COLUMNS = 32;\nconst MAX_INTERACTIVE_QUERY_CELLS = 65_536;\nconst MAX_INTERACTIVE_QUERY_BYTES = 8 * 1024 * 1024;\nconst EMPTY_FORMAT = Object.freeze({});\nconst EMPTY_SHEETS: readonly EditableSpreadsheetSheetMetadata[] = [];\n\nexport type EditableSpreadsheetGridProps = {\n session: EditableArtifactSession;\n sheet: EditableSpreadsheetSheetMetadata;\n metadataRevision: bigint;\n readOnly?: boolean | undefined;\n rowCount?: number | undefined;\n columnCount?: number | undefined;\n overscanRows?: number | undefined;\n overscanColumns?: number | undefined;\n onSelectionChange?: ((selection: SpreadsheetSelection) => void) | undefined;\n onCommit?: ((commit: SpreadsheetCommit) => void) | undefined;\n onCommandError?: ((error: Error) => void) | undefined;\n onViewportChange?: ((viewport: SpreadsheetViewport) => void) | undefined;\n className?: string | undefined;\n};\n\nexport type EditableSpreadsheetArtifactSurfaceProps = Omit<\n EditableSpreadsheetGridProps,\n \"metadataRevision\" | \"sheet\"\n> & {\n title?: string | undefined;\n subtitle?: ReactNode | undefined;\n actions?: ReactNode | undefined;\n initialSheetId?: string | undefined;\n allowAddSheet?: boolean | undefined;\n};\n\ntype ProjectionState = {\n query: EditableSpreadsheetViewportQuery;\n projection: EditableSpreadsheetViewportProjection | null;\n error: Error | null;\n};\n\n/**\n * Durable spreadsheet editor over one SDK session. Canonical state remains in\n * the dedicated Worker; React receives one bounded immutable viewport only.\n */\nexport function EditableSpreadsheetGrid({\n session,\n sheet,\n metadataRevision,\n readOnly = false,\n rowCount: requestedRowCount,\n columnCount: requestedColumnCount,\n overscanRows = 3,\n overscanColumns = 2,\n onSelectionChange,\n onCommit,\n onCommandError,\n onViewportChange,\n className,\n}: EditableSpreadsheetGridProps) {\n const rowCount = boundedSheetCount(requestedRowCount, EXCEL_MAX_ROWS, sheet.usedBounds?.endRow);\n const columnCount = boundedSheetCount(\n requestedColumnCount,\n EXCEL_MAX_COLUMNS,\n sheet.usedBounds?.endColumn,\n );\n const [state, setState] = useState<ProjectionState>(() => ({\n query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),\n projection: null,\n error: null,\n }));\n const activeCellRef = useRef({ row: 0, column: 0 });\n\n useEffect(() => {\n setState({\n query: initialViewportQuery(sheet.sheetId, rowCount, columnCount),\n projection: null,\n error: null,\n });\n activeCellRef.current = { row: 0, column: 0 };\n }, [columnCount, rowCount, session, sheet.sheetId]);\n\n useEffect(() => {\n const query = state.query;\n return session.subscribeSpreadsheetViewport(\n query,\n (projection) => {\n if (!sameViewport(projection, query)) return;\n if (sheet.generationId !== null && projection.generationId !== sheet.generationId) {\n setState((current) =>\n sameViewportQuery(current.query, query)\n ? {\n ...current,\n projection: null,\n error: new Error(\"Spreadsheet generation changed; refreshing metadata\"),\n }\n : current,\n );\n return;\n }\n setState((current) =>\n sameViewportQuery(current.query, query) ? { query, projection, error: null } : current,\n );\n },\n {\n onError(error) {\n setState((current) =>\n sameViewportQuery(current.query, query) ? { ...current, error } : current,\n );\n },\n },\n );\n }, [session, sheet.generationId, state.query]);\n\n const projection = useMemo(\n () =>\n projectSdkViewport(\n sheet,\n metadataRevision,\n state.query,\n state.projection,\n rowCount,\n columnCount,\n ),\n [columnCount, metadataRevision, rowCount, sheet, state.projection, state.query],\n );\n const generation = useMemo(() => sheetGeneration(sheet), [sheet]);\n const editable = !readOnly && generation !== null;\n\n const handleCommit = useCallback(\n async (commit: SpreadsheetCommit) => {\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n const input = spreadsheetCellInput(commit.input, commit.kind);\n await session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"cells.set\",\n sheet: generation,\n anchor: { row: commit.cell.row, column: commit.cell.col },\n rows: 1,\n columns: 1,\n cells: [input],\n },\n ],\n });\n onCommit?.(commit);\n },\n [generation, onCommit, session],\n );\n\n const handleClear = useCallback(\n async (selection: SpreadsheetSelection) => {\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n const top = Math.min(selection.anchor.row, selection.focus.row);\n const bottom = Math.max(selection.anchor.row, selection.focus.row);\n const left = Math.min(selection.anchor.col, selection.focus.col);\n const right = Math.max(selection.anchor.col, selection.focus.col);\n await session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"range.clear\",\n sheet: generation,\n range: {\n start: { row: top, column: left },\n end: { row: bottom, column: right },\n },\n },\n ],\n });\n },\n [generation, session],\n );\n\n const handleCommitRange = useCallback(\n async (commit: SpreadsheetRangeCommit) => {\n if (!generation) throw new Error(\"This sheet generation is not writable yet\");\n await session.applySpreadsheetCommands({\n version: SPREADSHEET_ARTIFACT_COMMAND_VERSION,\n commands: [\n {\n kind: \"cells.set\",\n sheet: generation,\n anchor: { row: commit.anchor.row, column: commit.anchor.col },\n rows: commit.rows,\n columns: commit.columns,\n cells: commit.inputs.map((input) =>\n spreadsheetCellInput(input, input.startsWith(\"=\") ? \"formula\" : \"value\"),\n ),\n },\n ],\n });\n },\n [generation, session],\n );\n\n const handleSelection = useCallback(\n (selection: SpreadsheetSelection) => {\n activeCellRef.current = {\n row: selection.focus.row,\n column: selection.focus.col,\n };\n setState((current) => {\n if (queryContains(current.query, selection.focus.row, selection.focus.col)) return current;\n return {\n query: boundedViewportQuery(\n sheet.sheetId,\n selection.focus.row,\n selection.focus.row + 1,\n selection.focus.col,\n selection.focus.col + 1,\n rowCount,\n columnCount,\n activeCellRef.current,\n ),\n projection: current.projection,\n error: null,\n };\n });\n onSelectionChange?.(selection);\n },\n [columnCount, onSelectionChange, rowCount, sheet.sheetId],\n );\n\n const handleViewport = useCallback(\n (viewport: SpreadsheetViewport) => {\n const next = boundedViewportQuery(\n sheet.sheetId,\n viewport.overscanRowStart,\n viewport.overscanRowEnd,\n viewport.overscanColumnStart,\n viewport.overscanColumnEnd,\n rowCount,\n columnCount,\n activeCellRef.current,\n );\n setState((current) =>\n sameViewportQuery(current.query, next)\n ? current\n : { query: next, projection: current.projection, error: null },\n );\n onViewportChange?.(viewport);\n },\n [columnCount, onViewportChange, rowCount, sheet.sheetId],\n );\n\n return (\n <div className={cn(\"relative h-full min-h-0\", className)}>\n <SpreadsheetProjectionGrid\n projection={projection}\n readOnly={!editable}\n overscanRows={overscanRows}\n overscanColumns={overscanColumns}\n onSelectionChange={handleSelection}\n commit={editable ? handleCommit : undefined}\n commitRange={editable ? handleCommitRange : undefined}\n clear={editable ? handleClear : undefined}\n onCommandError={onCommandError}\n onViewportChange={handleViewport}\n />\n {state.error ? (\n <output\n role=\"status\"\n className=\"pointer-events-none absolute bottom-2 left-2 z-50 rounded-og-sm border border-og-status-failed/30 bg-og-surface-1/95 px-2 py-1 text-og-xs text-og-status-failed shadow-og-sm\"\n style={{ maxWidth: \"min(28rem, calc(100% - 1rem))\" }}\n >\n {state.error.message}\n </output>\n ) : null}\n </div>\n );\n}\n\n/** Artifact chrome, sheet navigation, and one Worker-backed spreadsheet grid. */\nexport function EditableSpreadsheetArtifactSurface({\n session,\n title = \"Workbook\",\n subtitle,\n actions,\n initialSheetId,\n allowAddSheet = true,\n readOnly = false,\n ...gridProps\n}: EditableSpreadsheetArtifactSurfaceProps) {\n const { metadata, error: metadataError } = useSpreadsheetMetadata(session);\n const view = useEditableArtifactView(session);\n const [activeSheetId, setActiveSheetId] = useState<string | null>(initialSheetId ?? null);\n const [creatingSheet, setCreatingSheet] = useState(false);\n const [surfaceError, setSurfaceError] = useState<Error | null>(null);\n const sheets = metadata?.sheets ?? EMPTY_SHEETS;\n const activeSheet =\n sheets.find((sheet) => sheet.sheetId === activeSheetId) ??\n (initialSheetId ? sheets.find((sheet) => sheet.sheetId === initialSheetId) : undefined) ??\n sheets[0] ??\n null;\n const writable = !readOnly && view.writable;\n const accessRevoked = editableArtifactAccessRevoked(view);\n\n const addSheet = useCallback(async () => {\n if (!writable || creatingSheet) return;\n setCreatingSheet(true);\n setSurfaceError(null);\n try {\n const after = activeSheet ? sheetGeneration(activeSheet) : null;\n const created = await session.createSpreadsheetSheet({\n name: nextAvailableSheetName(sheets),\n after,\n });\n setActiveSheetId(created.sheetId);\n } catch (cause) {\n setSurfaceError(asError(cause));\n } finally {\n setCreatingSheet(false);\n }\n }, [activeSheet, creatingSheet, session, sheets, writable]);\n\n const footer = (\n <div\n className=\"flex min-h-9 items-center gap-1 overflow-x-auto px-2\"\n role=\"tablist\"\n aria-label=\"Worksheets\"\n >\n {sheets.map((sheet) => (\n <button\n key={`${sheet.sheetId}:${sheet.generationId ?? \"pending\"}`}\n type=\"button\"\n role=\"tab\"\n aria-selected={sheet.sheetId === activeSheet?.sheetId}\n onClick={() => setActiveSheetId(sheet.sheetId)}\n className={cn(\n \"h-7 shrink-0 rounded-og-sm px-2.5 text-og-sm outline-hidden transition-colors focus-visible:ring-2 focus-visible:ring-og-accent\",\n sheet.sheetId === activeSheet?.sheetId\n ? \"bg-og-surface-3 font-medium text-og-fg\"\n : \"text-og-fg-muted hover:bg-og-surface-3 hover:text-og-fg\",\n )}\n >\n {sheet.name}\n </button>\n ))}\n {writable && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={() => void addSheet()}\n disabled={creatingSheet}\n aria-label={creatingSheet ? \"Adding worksheet\" : \"Add worksheet\"}\n className=\"grid size-7 shrink-0 place-items-center rounded-og-sm text-og-fg-muted outline-hidden hover:bg-og-surface-3 hover:text-og-fg focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50 [&>svg]:size-3.5\"\n >\n <PlusIcon />\n </button>\n ) : null}\n </div>\n );\n const error = surfaceError ?? metadataError;\n\n return (\n <ArtifactSurface\n modality=\"spreadsheet\"\n title={title}\n subtitle={\n subtitle ??\n (accessRevoked\n ? editableArtifactStatusLabel(view)\n : metadata\n ? `${sheets.length} sheet${sheets.length === 1 ? \"\" : \"s\"}`\n : editableArtifactStatusLabel(view))\n }\n actions={actions}\n footer={accessRevoked ? undefined : footer}\n busy={!accessRevoked && !metadata && !error}\n >\n {accessRevoked ? (\n <EditableArtifactMessage\n title=\"Access changed\"\n detail={editableArtifactStatusLabel(view)}\n />\n ) : activeSheet && metadata ? (\n <EditableSpreadsheetGrid\n key={`${activeSheet.sheetId}:${activeSheet.generationId ?? \"pending\"}`}\n {...gridProps}\n session={session}\n sheet={activeSheet}\n metadataRevision={metadata.revision}\n readOnly={!writable}\n />\n ) : error ? (\n <EditableArtifactMessage title=\"Could not open this workbook\" detail={error.message} />\n ) : metadata ? (\n <div className=\"grid h-full place-items-center bg-og-bg p-6 text-center\">\n <div>\n <p className=\"text-og-base font-medium text-og-fg\">This workbook has no worksheets.</p>\n {writable && allowAddSheet ? (\n <button\n type=\"button\"\n onClick={() => void addSheet()}\n disabled={creatingSheet}\n className=\"mt-3 rounded-og-sm bg-og-accent-deep px-3 py-1.5 text-og-sm font-medium text-og-accent-fg outline-hidden focus-visible:ring-2 focus-visible:ring-og-accent disabled:opacity-50\"\n >\n {creatingSheet ? \"Adding…\" : \"Add worksheet\"}\n </button>\n ) : null}\n </div>\n </div>\n ) : (\n <EditableArtifactMessage\n title=\"Opening workbook\"\n detail={editableArtifactStatusLabel(view)}\n />\n )}\n </ArtifactSurface>\n );\n}\n\nfunction useSpreadsheetMetadata(session: EditableArtifactSession): {\n metadata: EditableSpreadsheetMetadataProjection | null;\n error: Error | null;\n} {\n const [state, setState] = useState<{\n metadata: EditableSpreadsheetMetadataProjection | null;\n error: Error | null;\n }>({ metadata: null, error: null });\n useEffect(\n () =>\n session.subscribeSpreadsheetMetadata({}, (metadata) => setState({ metadata, error: null }), {\n onError: (error) => setState((current) => ({ ...current, error })),\n }),\n [session],\n );\n return state;\n}\n\nfunction projectSdkViewport(\n sheet: EditableSpreadsheetSheetMetadata,\n metadataRevision: bigint,\n query: EditableSpreadsheetViewportQuery,\n viewport: EditableSpreadsheetViewportProjection | null,\n rowCount: number,\n columnCount: number,\n): SpreadsheetGridProjection {\n const current = viewport && sameViewport(viewport, query) ? viewport : null;\n const projectedCells = (current?.cells ?? []).map((cell) => ({\n row: cell.row,\n col: cell.column,\n value: projectedCellValue(cell.value),\n formula: cell.formula,\n format: EMPTY_FORMAT,\n }));\n const cells = new SparseSpreadsheetCellIndex(projectedCells);\n const byCoordinate = new Map(\n projectedCells.map((cell) => [`${cell.row}:${cell.col}`, cell] as const),\n );\n const used = sheet.usedBounds;\n return {\n sheetId: sheet.sheetId,\n sheetName: sheet.name,\n generationId: current?.generationId ?? sheet.generationId,\n revision: `${metadataRevision}:${current?.revision ?? \"loading\"}`,\n dimensionRevision: metadataRevision.toString(),\n rowCount,\n columnCount,\n usedRange: used\n ? {\n row: used.startRow,\n col: used.startColumn,\n rowCount: used.endRow - used.startRow + 1,\n colCount: used.endColumn - used.startColumn + 1,\n }\n : null,\n coverage: current\n ? {\n rowStart: current.startRow,\n rowEnd: current.startRow + current.rowCount,\n columnStart: current.startColumn,\n columnEnd: current.startColumn + current.columnCount,\n }\n : {\n rowStart: query.startRow,\n rowEnd: query.startRow,\n columnStart: query.startColumn,\n columnEnd: query.startColumn,\n },\n cells,\n valueAt: (cell) => cell.value,\n readCell: (row, column) => {\n const cell = byCoordinate.get(`${row}:${column}`);\n return cell\n ? {\n value: cell.value,\n input: cell.formula ?? displayValue(cell.value),\n format: cell.format,\n }\n : null;\n },\n };\n}\n\nfunction initialViewportQuery(\n sheetId: string,\n rowCount: number,\n columnCount: number,\n): EditableSpreadsheetViewportQuery {\n return {\n sheetId,\n startRow: 0,\n startColumn: 0,\n rowCount: Math.min(rowCount, INITIAL_VIEWPORT_ROWS),\n columnCount: Math.min(columnCount, INITIAL_VIEWPORT_COLUMNS),\n maxCells: MAX_INTERACTIVE_QUERY_CELLS,\n maxBytes: MAX_INTERACTIVE_QUERY_BYTES,\n };\n}\n\nfunction boundedViewportQuery(\n sheetId: string,\n desiredRowStart: number,\n desiredRowEnd: number,\n desiredColumnStart: number,\n desiredColumnEnd: number,\n totalRows: number,\n totalColumns: number,\n focus: { row: number; column: number },\n): EditableSpreadsheetViewportQuery {\n let rowStart = clampInteger(desiredRowStart, 0, totalRows - 1);\n let rowEnd = clampInteger(desiredRowEnd, rowStart + 1, totalRows);\n let columnStart = clampInteger(desiredColumnStart, 0, totalColumns - 1);\n let columnEnd = clampInteger(desiredColumnEnd, columnStart + 1, totalColumns);\n const desiredRows = rowEnd - rowStart;\n const desiredColumns = columnEnd - columnStart;\n if (desiredRows * desiredColumns > MAX_INTERACTIVE_QUERY_CELLS) {\n const columns = Math.min(\n desiredColumns,\n Math.max(1, Math.floor(Math.sqrt(MAX_INTERACTIVE_QUERY_CELLS * 2))),\n );\n const rows = Math.max(1, Math.floor(MAX_INTERACTIVE_QUERY_CELLS / columns));\n columnStart = clampWindowStart(columnStart, columnEnd, focus.column, columns, totalColumns);\n columnEnd = Math.min(totalColumns, columnStart + columns);\n rowStart = clampWindowStart(rowStart, rowEnd, focus.row, rows, totalRows);\n rowEnd = Math.min(totalRows, rowStart + rows);\n }\n return {\n sheetId,\n startRow: rowStart,\n startColumn: columnStart,\n rowCount: rowEnd - rowStart,\n columnCount: columnEnd - columnStart,\n maxCells: MAX_INTERACTIVE_QUERY_CELLS,\n maxBytes: MAX_INTERACTIVE_QUERY_BYTES,\n };\n}\n\nfunction clampWindowStart(\n desiredStart: number,\n desiredEnd: number,\n focus: number,\n size: number,\n total: number,\n): number {\n if (desiredEnd - desiredStart <= size) return Math.min(desiredStart, Math.max(0, total - size));\n const centered = focus - Math.floor(size / 2);\n return Math.max(desiredStart, Math.min(desiredEnd - size, centered));\n}\n\nfunction queryContains(\n query: EditableSpreadsheetViewportQuery,\n row: number,\n column: number,\n): boolean {\n return (\n row >= query.startRow &&\n row < query.startRow + query.rowCount &&\n column >= query.startColumn &&\n column < query.startColumn + query.columnCount\n );\n}\n\nfunction sameViewport(\n projection: EditableSpreadsheetViewportProjection,\n query: EditableSpreadsheetViewportQuery,\n): boolean {\n return (\n projection.sheetId === query.sheetId &&\n projection.startRow === query.startRow &&\n projection.startColumn === query.startColumn &&\n projection.rowCount === query.rowCount &&\n projection.columnCount === query.columnCount\n );\n}\n\nfunction sameViewportQuery(\n left: EditableSpreadsheetViewportQuery,\n right: EditableSpreadsheetViewportQuery,\n): boolean {\n return (\n left.sheetId === right.sheetId &&\n left.startRow === right.startRow &&\n left.startColumn === right.startColumn &&\n left.rowCount === right.rowCount &&\n left.columnCount === right.columnCount &&\n left.maxCells === right.maxCells &&\n left.maxBytes === right.maxBytes\n );\n}\n\nfunction sheetGeneration(\n sheet: EditableSpreadsheetSheetMetadata,\n): SpreadsheetSheetGeneration | null {\n if (sheet.generationId === null) return null;\n return {\n kind: \"generation\",\n sheetId: spreadsheetSheetId(sheet.sheetId),\n creationOperationId: editableArtifactStableId(sheet.generationId),\n };\n}\n\nfunction spreadsheetCellInput(\n input: string,\n kind: SpreadsheetCommit[\"kind\"],\n): SpreadsheetCellInput {\n if (kind === \"formula\") return { formula: input };\n if (input === \"\") return null;\n const normalized = input.trim();\n if (/^(?:true|false)$/i.test(normalized)) return normalized.toLowerCase() === \"true\";\n if (/^[+-]?(?:\\d+(?:\\.\\d*)?|\\.\\d+)(?:e[+-]?\\d+)?$/i.test(normalized)) {\n const value = Number(normalized);\n if (Number.isFinite(value)) return value;\n }\n return input;\n}\n\nfunction projectedCellValue(value: EditableSpreadsheetCellValue): unknown {\n switch (value.kind) {\n case \"empty\":\n return null;\n case \"boolean\":\n case \"number\":\n case \"text\":\n return value.value;\n case \"date\":\n return new Date(value.value);\n case \"error\":\n return spreadsheetErrorText(value.value);\n }\n}\n\nfunction spreadsheetErrorText(\n value: Extract<EditableSpreadsheetCellValue, { kind: \"error\" }>[\"value\"],\n): string {\n if (typeof value === \"object\") return value.custom;\n return {\n null: \"#NULL!\",\n divide_by_zero: \"#DIV/0!\",\n value: \"#VALUE!\",\n reference: \"#REF!\",\n name: \"#NAME?\",\n number: \"#NUM!\",\n not_available: \"#N/A\",\n spill: \"#SPILL!\",\n calculation: \"#CALC!\",\n }[value];\n}\n\nfunction boundedSheetCount(\n requested: number | undefined,\n maximum: number,\n usedEnd: number | undefined,\n): number {\n const requestedCount =\n requested === undefined || !Number.isFinite(requested)\n ? maximum\n : Math.max(1, Math.min(maximum, Math.floor(requested)));\n const usedCount =\n usedEnd === undefined || !Number.isSafeInteger(usedEnd)\n ? 1\n : Math.max(1, Math.min(maximum, usedEnd + 1));\n return Math.max(requestedCount, usedCount);\n}\n\nfunction displayValue(value: unknown): string {\n if (value === null || value === undefined) return \"\";\n if (value instanceof Date) return Number.isNaN(value.getTime()) ? \"\" : value.toISOString();\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n\nfunction nextAvailableSheetName(sheets: readonly EditableSpreadsheetSheetMetadata[]): string {\n let index = sheets.length + 1;\n while (sheets.some((sheet) => sheet.name === `Sheet${index}`)) index += 1;\n return `Sheet${index}`;\n}\n\nfunction clampInteger(value: number, minimum: number, maximum: number): number {\n if (!Number.isFinite(value)) return minimum;\n return Math.min(maximum, Math.max(minimum, Math.floor(value)));\n}\n\nfunction asError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(\"Spreadsheet change failed\");\n}\n"],"mappings":"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","names":["columnName","displayValue","horizontalProjection","verticalProjection","logicalScrollLeft","logicalScrollTop","PlusIcon","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","useRef","useEffect","projection","useMemo","useCallback","nextAvailableSheetName","PlusIcon","displayValue"]}
|