@ricsam/react-spreadsheets 0.0.7 → 0.0.8

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.
@@ -2,7 +2,7 @@
2
2
  "version": 3,
3
3
  "sources": ["../../src/spreadsheet/spreadsheet.tsx", "../../src/utils/use-resize-observer.ts", "../../src/utils/use-color-scheme.ts", "../../src/utils/contrast-text.ts", "../../src/utils/cn.ts", "../../src/spreadsheet/constants.ts", "../../src/spreadsheet/utils.ts", "../../src/clipboard/clipboard-manager.ts", "../../src/grid/frame.tsx", "../../src/grid/icons.tsx", "../../src/grid/types.ts", "../../src/spreadsheet/snapping.ts", "../../src/workbook/workbook.tsx", "../../src/utils/use-scheme-root.ts", "../../src/workbook/border-sides.ts", "../../src/workbook/cell-data-type.ts", "../../src/workbook/cell-edit-error.ts", "../../src/workbook/workbook-selection-manager.ts", "../../src/spreadsheet/zoom-constants.ts", "../../src/utils/use-click-away.ts"],
4
4
  "sourcesContent": [
5
- "import {\n type Format,\n SelectionManager,\n type SelectionManagerState,\n useInitializeSelectionManager,\n useSelectionManager\n} from '@ricsam/selection-manager';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode\n} from 'react';\nimport { useResizeObserver } from '../utils/use-resize-observer';\nimport { useColorScheme } from '../utils/use-color-scheme';\nimport { getContrastingTextColor } from '../utils/contrast-text';\nimport { cn } from '../utils/cn';\nimport { DEFAULT_CELL_HEIGHT, DEFAULT_CELL_WIDTH, HEADER_HEIGHT, HEADER_WIDTH } from './constants';\n\nimport type {\n CellRenderContext,\n SerializedCellValue,\n SpreadsheetColumnWidths,\n SpreadsheetRowHeights\n} from '../types';\nimport { type CellDataUpdate, ClipboardUtils } from '../clipboard/clipboard-manager';\nimport { Frame } from '../grid/frame';\nimport { ViewportStream } from '../grid/types';\nimport { columnToIndex, getRowNumber, indexToColumn, parseCellReference, rowToLetter } from './utils';\nimport { CONTROLLED_ZOOM_FACTOR, MAX_ZOOM, MIN_ZOOM, ZOOM_FACTOR } from './zoom-constants';\nimport {\n getCellSnapAnchorFromRect,\n getRectFromCellSnapAnchor,\n moveCellSnapAnchorToNearestOrigin,\n normalizeCellSnapAnchor,\n resizeCellSnapAnchorToNearestEdges,\n type CellSnapAnchor,\n type CellSnapRect,\n type CellSnapResizeHandle\n} from './snapping';\n\n/**\n * Resolves the grid line color used for canvas painting.\n *\n * Canvas 2D cannot evaluate CSS, so the themed `--rsp-gridline` value has to be\n * resolved to a concrete color first. Reading the custom property directly is\n * not enough: custom properties compute to an unresolved token sequence, so a\n * `light-dark()` value comes back verbatim and is not paintable.\n *\n * Instead we read a real, inherited property (`color`) from a hidden probe\n * element that declares `color: var(--_rsp-gridline)`. The browser resolves\n * `light-dark()` against the probe's inherited `color-scheme`, which yields a\n * paintable `rgb(...)` string that always matches what the DOM is showing.\n */\nconst resolveGridLineColor = (\n probe: HTMLElement | null,\n colorScheme: 'light' | 'dark'\n): string => {\n const fallback = colorScheme === 'dark' ? '#232c3d' : '#e8ebf1';\n\n if (!probe || typeof getComputedStyle !== 'function') {\n return fallback;\n }\n\n const resolved = getComputedStyle(probe).color?.trim();\n\n // A fully transparent result means the probe never received a usable value.\n if (!resolved || resolved.includes('light-dark(') || resolved === 'rgba(0, 0, 0, 0)') {\n return fallback;\n }\n\n return resolved;\n};\n\n/**\n * Keeps consumer-supplied cell fills readable in both color schemes.\n *\n * A custom `backgroundColor` is normally a literal from the document model and\n * has no dark-mode variant, while the grid's default ink follows the active\n * scheme. Pairing a light literal fill with the dark theme's near-white text\n * produces unreadable cells, so when the consumer set a background but no\n * explicit text color we derive a readable one from that background.\n */\nconst withReadableTextColor = (\n style: React.CSSProperties | undefined\n): React.CSSProperties | undefined => {\n if (!style?.backgroundColor || style.color) return style;\n\n const background = style.backgroundColor;\n if (typeof background !== 'string') return style;\n\n const color = getContrastingTextColor(background);\n if (!color) return style;\n\n return { ...style, color };\n};\n\nconst hasBorderStyle = (style?: React.CSSProperties): boolean =>\n Boolean(\n style?.borderColor ||\n style?.borderTopColor ||\n style?.borderRightColor ||\n style?.borderBottomColor ||\n style?.borderLeftColor\n );\n\n// Cell component with callback ref for optimal performance\nconst CellComponent = React.memo(\n ({\n value,\n row,\n col,\n selectionManager,\n cellToPixelBase,\n getColumnWidth,\n getRowHeight,\n customCellStyle,\n customCellRenderer,\n inputValue,\n editInputVersion,\n width,\n height\n }: {\n selectionManager: SelectionManager;\n cellToPixelBase: (row: number, col: string) => { x: number; y: number };\n getColumnWidth: (col: string) => number;\n getRowHeight: (row: number) => number;\n customCellStyle?: (cell: CellRenderContext) => React.CSSProperties;\n customCellRenderer?: (cell: CellRenderContext) => React.ReactNode;\n width?: number;\n height?: number;\n inputValue: SerializedCellValue;\n editInputVersion: number;\n } & CellData) => {\n const cellRef = useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n const rowIndex = row - 1; // Convert to 0-based\n const colIndex = columnToIndex(col);\n return selectionManager.setupCellElement(el, {\n row: rowIndex,\n col: colIndex\n });\n }\n },\n [row, col, selectionManager]\n );\n\n // Track hook state changes\n const colIndex = columnToIndex(col);\n const rowIndex = row - 1;\n const isSelected = useSelectionManager(selectionManager, () =>\n selectionManager.isSelected({ row: rowIndex, col: colIndex })\n );\n const isBeingEdited = useSelectionManager(selectionManager, () =>\n selectionManager.isEditingCell(rowIndex, colIndex)\n );\n\n const { x, y } = cellToPixelBase(row, col);\n const cellStyleCallbackData: CellRenderContext = {\n id: `${col}${row}`,\n row: getRowNumber(row),\n col,\n rowIndex: row - 1,\n colIndex: columnToIndex(col),\n value,\n isSelected: isSelected,\n isBeingEdited: isBeingEdited || false\n };\n const customStyle = withReadableTextColor(customCellStyle?.(cellStyleCallbackData));\n\n const canHaveFillHandle = useSelectionManager(selectionManager, () => {\n return selectionManager.canCellHaveFillHandle({\n row: rowIndex,\n col: colIndex\n });\n });\n\n const inputRef = useCallback(\n (el: HTMLTextAreaElement | null) => {\n if (el) {\n const rowIndex = row - 1; // Convert to 0-based\n const colIndex = columnToIndex(col);\n return selectionManager.setupInputElement(el as unknown as HTMLInputElement, {\n rowIndex,\n colIndex\n });\n }\n },\n [row, col, selectionManager]\n );\n\n return (\n <div\n ref={cellRef}\n className={cn('rsp-cell', {\n 'rsp-cell-multiline': typeof value === 'string' && value.includes('\\n'),\n 'rsp-cell-selected': isSelected,\n 'rsp-cell-editing': isBeingEdited,\n // Selection tinting is only applied when the consumer has not taken\n // over the background, so custom borders/fills stay visible.\n 'rsp-cell-plain': !(hasBorderStyle(customStyle) && !customStyle?.backgroundColor)\n })}\n data-testid={`spreadsheet-cell-${col}${row}`}\n style={{\n left: x,\n top: y,\n width: getColumnWidth(col) - 1,\n height: getRowHeight(row) - 1,\n ...customStyle,\n // While editing, the cell must present the plain editor surface. The\n // custom style is applied inline and would otherwise outrank the\n // stylesheet, leaving the typed text on a conditional fill.\n ...(isBeingEdited\n ? { backgroundColor: undefined, color: undefined }\n : null)\n }}\n >\n {isBeingEdited ? (\n <textarea\n key={editInputVersion}\n className=\"rsp-cell-editor\"\n data-testid={`spreadsheet-cell-input-${col}${row}`}\n ref={inputRef}\n defaultValue={inputValue?.toString() ?? ''}\n onKeyDownCapture={(event) => {\n if (event.key === 'Enter') event.preventDefault();\n }}\n style={{\n left: x + 4,\n top: y + 4,\n width,\n height\n }}\n />\n ) : customCellRenderer ? (\n customCellRenderer(cellStyleCallbackData)\n ) : (\n value\n )}\n {canHaveFillHandle && (\n <div\n className=\"rsp-fill-handle\"\n data-fill-handle={true}\n data-testid={`spreadsheet-fill-handle-${col}${row}`}\n />\n )}\n </div>\n );\n }\n);\n\nCellComponent.displayName = 'CellComponent';\n\n// Header component with callback ref for optimal performance\nconst HeaderComponent = React.memo(\n ({\n index,\n type,\n selectionManager,\n reverseHeaders,\n getColumnWidth,\n getRowHeight,\n handleColumnResizeStart,\n handleColumnResizeDoubleClick,\n handleRowResizeStart,\n handleRowResizeDoubleClick\n }: {\n index: number;\n type: 'row' | 'col';\n selectionManager: SelectionManager;\n reverseHeaders?: boolean;\n getColumnWidth: (col: string) => number;\n getRowHeight: (row: number) => number;\n handleColumnResizeStart: (e: React.MouseEvent, col: string) => void;\n handleColumnResizeDoubleClick: (e: React.MouseEvent, col: string) => void;\n handleRowResizeStart: (e: React.MouseEvent, row: number) => void;\n handleRowResizeDoubleClick: (e: React.MouseEvent, row: number) => void;\n }) => {\n const headerRef = useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n return selectionManager.setupHeaderElement(el, index, type);\n }\n },\n [index, type, selectionManager]\n );\n\n // Calculate position and size based on index and type\n const { position, size } = React.useMemo(() => {\n if (type === 'col') {\n const col = indexToColumn(index);\n const width = getColumnWidth(col);\n const height = HEADER_HEIGHT;\n\n // Calculate x position\n let x = 0;\n for (let i = 0; i < index; i++) {\n const colKey = indexToColumn(i);\n x += getColumnWidth(colKey);\n }\n\n return {\n position: { x, y: 0 },\n size: { width, height }\n };\n } else {\n // row header\n const row = index + 1;\n const width = HEADER_WIDTH;\n const height = getRowHeight(row);\n\n // Calculate y position\n let y = 0;\n for (let i = 1; i <= index; i++) {\n y += getRowHeight(i);\n }\n\n return {\n position: { x: 0, y },\n size: { width, height }\n };\n }\n }, [index, type, getColumnWidth, getRowHeight]);\n\n // Check if this header is selected\n const isSelected = useSelectionManager(selectionManager, () => {\n if (type === 'col') {\n return selectionManager.isWholeColSelected(index);\n } else {\n return selectionManager.isWholeRowSelected(index);\n }\n });\n\n const content =\n type === 'col'\n ? reverseHeaders\n ? index + 1\n : indexToColumn(index)\n : reverseHeaders\n ? rowToLetter(index + 1)\n : index + 1;\n\n return (\n <div\n ref={headerRef}\n className={cn('rsp-header', `rsp-header-${type}`, {\n 'rsp-header-selected': isSelected\n })}\n data-testid={`spreadsheet-${type}-header-${type === 'col' ? indexToColumn(index) : index + 1}`}\n style={{\n left: position.x,\n top: position.y,\n width: size.width - 1,\n height: size.height - 1\n }}\n >\n {content}\n {type === 'col' && (\n <div\n className=\"rsp-col-resize-handle\"\n data-testid={`spreadsheet-column-resize-handle-${indexToColumn(index)}`}\n onMouseDown={(e) => handleColumnResizeStart(e, indexToColumn(index))}\n onDoubleClick={(e) => handleColumnResizeDoubleClick(e, indexToColumn(index))}\n />\n )}\n {type === 'row' && (\n <div\n className=\"rsp-row-resize-handle\"\n data-testid={`spreadsheet-row-resize-handle-${index + 1}`}\n onMouseDown={(e) => handleRowResizeStart(e, index + 1)}\n onDoubleClick={(e) => handleRowResizeDoubleClick(e, index + 1)}\n />\n )}\n </div>\n );\n }\n);\n\nHeaderComponent.displayName = 'HeaderComponent';\n\nconst isEditableKeyboardTarget = (target: EventTarget | null): boolean => {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n return Boolean(target.closest('input, textarea, select, [contenteditable=\"true\"]'));\n};\n\n// Types and interfaces\ninterface CellData {\n value: SerializedCellValue;\n /**\n * The row of the cell, e.g. 1, 2, 3, etc.\n */\n row: number;\n /**\n * The column of the cell, e.g. \"A\", \"B\", \"C\", etc.\n */\n col: string;\n}\n\n// Overlay component types (similar to Grid)\nexport interface SpreadsheetChildInitial {\n x: number;\n y: number;\n width: number;\n height: number;\n zoom?: number;\n}\n\nexport interface SpreadsheetChild {\n id: string;\n title: string;\n x: number; // pixel position relative to cell grid (before zoom/scroll applied)\n y: number;\n width: number;\n height: number;\n zoom?: number;\n snapToCells?: boolean;\n cellAnchor?: CellSnapAnchor;\n minimized?: boolean;\n initial?: SpreadsheetChildInitial;\n component: string;\n canClose?: boolean;\n persistent?: boolean;\n props?: any;\n}\n\nexport interface SpreadsheetChildState {\n isSelected: boolean;\n isMinimized: boolean;\n}\n\nexport type SpreadsheetComponent = (child: SpreadsheetChild, state: SpreadsheetChildState) => ReactNode;\n\nconst columnWidthsRecordToMap = (columnWidths?: SpreadsheetColumnWidths): Map<string, number> => {\n return new Map(\n Object.entries(columnWidths || {}).filter((entry): entry is [string, number] => {\n const width = entry[1];\n return typeof width === 'number' && Number.isFinite(width) && width > 0;\n })\n );\n};\n\nconst columnWidthsMapToRecord = (columnWidths: Map<string, number>): SpreadsheetColumnWidths => {\n const result: SpreadsheetColumnWidths = {};\n columnWidths.forEach((width, column) => {\n if (Number.isFinite(width) && width > 0) {\n result[column] = width;\n }\n });\n return result;\n};\n\nconst rowHeightsRecordToMap = (rowHeights?: SpreadsheetRowHeights): Map<number, number> => {\n const entries = Object.entries(rowHeights || {}).flatMap(([row, height]) => {\n const rowNumber = Number(row);\n if (Number.isInteger(rowNumber) && rowNumber > 0 && Number.isFinite(height) && height > 0) {\n return [[rowNumber, height] as [number, number]];\n }\n return [];\n });\n\n return new Map(entries);\n};\n\nconst rowHeightsMapToRecord = (rowHeights: Map<number, number>): SpreadsheetRowHeights => {\n const result: SpreadsheetRowHeights = {};\n rowHeights.forEach((height, row) => {\n if (Number.isInteger(row) && row > 0 && Number.isFinite(height) && height > 0) {\n result[row] = height;\n }\n });\n return result;\n};\n\nconst isSnappedTextBox = (child: SpreadsheetChild): boolean =>\n child.component === 'RichText' && Boolean(child.snapToCells);\n\nconst areCellSnapAnchorsEqual = (a: CellSnapAnchor, b: CellSnapAnchor): boolean =>\n a.startCol === b.startCol && a.startRow === b.startRow && a.endCol === b.endCol && a.endRow === b.endRow;\n\nconst applyCellSnapAnchorToTextBox = (\n child: SpreadsheetChild,\n anchor: CellSnapAnchor,\n columnWidths: Map<string, number>,\n rowHeights: Map<number, number>\n): SpreadsheetChild => {\n const normalizedAnchor = normalizeCellSnapAnchor(anchor);\n const rect = getRectFromCellSnapAnchor(normalizedAnchor, columnWidths, rowHeights);\n\n return {\n ...child,\n snapToCells: true,\n cellAnchor: normalizedAnchor,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height\n };\n};\n\nconst syncSnappedTextBoxRects = (\n children: SpreadsheetChild[],\n columnWidths: Map<string, number>,\n rowHeights: Map<number, number>\n): SpreadsheetChild[] => {\n let changed = false;\n\n const nextChildren = children.map((child) => {\n if (!isSnappedTextBox(child)) {\n return child;\n }\n\n const fallbackAnchor = getCellSnapAnchorFromRect(child, columnWidths, rowHeights);\n const anchor = child.cellAnchor ? normalizeCellSnapAnchor(child.cellAnchor) : fallbackAnchor;\n const rect = getRectFromCellSnapAnchor(anchor, columnWidths, rowHeights);\n const currentAnchor = child.cellAnchor ? normalizeCellSnapAnchor(child.cellAnchor) : undefined;\n const anchorChanged = !currentAnchor || !areCellSnapAnchorsEqual(currentAnchor, anchor);\n const rectChanged =\n child.x !== rect.x || child.y !== rect.y || child.width !== rect.width || child.height !== rect.height;\n\n if (!anchorChanged && !rectChanged) {\n return child;\n }\n\n changed = true;\n return {\n ...child,\n cellAnchor: anchor,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height\n };\n });\n\n return changed ? nextChildren : children;\n};\n\nconst isCellSnapResizeHandle = (handle: string): handle is CellSnapResizeHandle => {\n return (\n handle === 'top' ||\n handle === 'right' ||\n handle === 'bottom' ||\n handle === 'left' ||\n handle === 'top-left' ||\n handle === 'top-right' ||\n handle === 'bottom-left' ||\n handle === 'bottom-right'\n );\n};\n\nexport interface SpreadsheetProps {\n style?: React.CSSProperties;\n /** Extra class name applied to the outer `.rsp-root` element. */\n className?: string;\n containerProps?: React.HTMLAttributes<HTMLDivElement>;\n cellData?: Map<string, SerializedCellValue>;\n onCellDataChange?: (data: Map<string, SerializedCellValue>) => void;\n onCellDataChangeError?: (error: unknown) => void;\n columnWidths?: SpreadsheetColumnWidths;\n onColumnWidthsChange?: (columnWidths: SpreadsheetColumnWidths) => void;\n rowHeights?: SpreadsheetRowHeights;\n onRowHeightsChange?: (rowHeights: SpreadsheetRowHeights) => void;\n customCellStyle?: (cell: CellRenderContext) => React.CSSProperties;\n customCellRenderer?: (cell: CellRenderContext) => React.ReactNode;\n /**\n * Used for saving the value to the cell data. Most useful for parsing a pasted\n * string value to a number.\n */\n parseValue?: (\n value: string,\n cell: {\n id: string;\n row: number;\n col: string;\n rowIndex: number;\n colIndex: number;\n }\n ) => string | number;\n\n selection?: {\n initialState?: Partial<SelectionManagerState>;\n state?: SelectionManagerState;\n onStateChange?: (state: SelectionManagerState) => void;\n effects?: (selectionManager: SelectionManager) => (() => void) | void;\n formats?: Format[];\n };\n\n // Overlay component props\n components?: Record<string, SpreadsheetComponent>;\n overlayChildren?: SpreadsheetChild[];\n selectedOverlayId?: string | null;\n onOverlaySelect?: (childId: string | null) => void;\n onOverlayChildrenChange?: (children: SpreadsheetChild[]) => void;\n overlayPlaceholder?: {\n componentType: string;\n title: string;\n width: number;\n height: number;\n onPlaced: (x: number, y: number) => void;\n onCancel?: () => void;\n };\n /** Whether the parent component is selected (used to gate overlay selection) */\n parentSelected?: boolean;\n}\n\ninterface ViewportState {\n scrollX: number;\n scrollY: number;\n zoom: number;\n}\n\ninterface GridDimensions {\n cellWidth: number;\n cellHeight: number;\n headerWidth: number;\n headerHeight: number;\n}\n\n// Ref interface for imperative methods\nexport interface SpreadsheetRef {\n focus: () => void;\n blur: () => void;\n}\n\nclass SpreadsheetClipboardManager extends ClipboardUtils {\n constructor(\n private cellDataRef: React.RefObject<Map<string, SerializedCellValue>>,\n private selectionManager: SelectionManager\n ) {\n super();\n }\n public triggerCopy() {\n const extractedCells = this.extractCellsFromSelection(this.selectionManager, this.cellDataRef.current);\n\n if (!extractedCells) return;\n\n const { width, height, cells } = extractedCells;\n\n const exportGrid = this.createExportGrid(width, height);\n\n cells.forEach(({ relative, value }) => {\n const row = exportGrid[relative.rowIndex];\n if (!row) return;\n row[relative.columnIndex] = value === undefined ? '' : String(value);\n });\n\n this.writeToOsClipboard(exportGrid);\n }\n public triggerPaste(updates: CellDataUpdate[]) {\n this.selectionManager.saveCellValues(updates);\n }\n}\n\n// Main component\nexport const Spreadsheet = forwardRef<\n SpreadsheetRef | undefined,\n SpreadsheetProps & {\n disableClipboard?: boolean;\n }\n>(\n (\n {\n style,\n className,\n containerProps,\n cellData: controlledCellData,\n onCellDataChange,\n onCellDataChangeError,\n columnWidths: controlledColumnWidths,\n onColumnWidthsChange,\n rowHeights: controlledRowHeights,\n onRowHeightsChange,\n customCellStyle,\n customCellRenderer,\n parseValue,\n selection,\n components,\n overlayChildren: controlledOverlayChildren,\n selectedOverlayId: controlledSelectedOverlayId,\n onOverlaySelect,\n onOverlayChildrenChange,\n overlayPlaceholder,\n parentSelected = true,\n disableClipboard = false\n },\n ref\n ) => {\n const [{ width, height }, containerRef] = useResizeObserver();\n const [containerDivRef, setContainerDivRef] = useState<HTMLDivElement | null>(null);\n // Resolved from the mounted element so a consumer can pin a subtree to\n // light or dark via `color-scheme` and have canvas gridlines follow.\n const colorScheme = useColorScheme(containerDivRef);\n // Hidden element used to read the browser-resolved `--rsp-gridline` color\n // for canvas painting (see `resolveGridLineColor`).\n const gridLineProbeRef = useRef<HTMLSpanElement | null>(null);\n\n const selectionManager = useInitializeSelectionManager({\n getNumCols: () => ({ type: 'infinity' }),\n getNumRows: () => ({ type: 'infinity' }),\n initialState: selection?.initialState,\n state: selection?.state,\n onStateChange: selection?.onStateChange,\n containerElement: containerDivRef,\n formats: selection?.formats,\n disableAutoClipboard: true\n });\n\n const effects = selection?.effects;\n useEffect(() => {\n if (effects) {\n return effects(selectionManager);\n }\n }, [selectionManager, effects]);\n\n // State management\n const [internalCellData, setInternalCellData] = useState<Map<string, SerializedCellValue>>(new Map());\n const [retryingEdit, setRetryingEdit] = useState<{\n rowIndex: number;\n colIndex: number;\n version: number;\n } | null>(null);\n const retryingEditVersionRef = useRef(0);\n\n // Use controlled cellData if provided, otherwise use internal state\n const cellData = controlledCellData ?? internalCellData;\n\n const cellDataRef = useRef(cellData);\n cellDataRef.current = cellData;\n\n const isControlled = controlledCellData !== undefined;\n const prevIsControlledRef = useRef(isControlled);\n\n selectionManager.getCellsWithData = (area) => {\n const cells: { rowIndex: number; colIndex: number }[] = [];\n cellData.forEach((value, key) => {\n const { rowIndex, columnIndex } = parseCellReference(key);\n if (\n columnIndex >= area.start.col &&\n (area.end.col.type === 'infinity' || columnIndex <= area.end.col.value) &&\n rowIndex >= area.start.row &&\n (area.end.row.type === 'infinity' || rowIndex <= area.end.row.value)\n ) {\n cells.push({ rowIndex, colIndex: columnIndex });\n }\n });\n return cells;\n };\n\n React.useEffect(() => {\n if (isControlled !== prevIsControlledRef.current) {\n prevIsControlledRef.current = isControlled;\n console.warn(\n `The component went from ${\n prevIsControlledRef.current ? 'controlled' : 'uncontrolled'\n } to ${isControlled ? 'controlled' : 'uncontrolled'}, this is not supported`\n );\n }\n }, [controlledCellData, isControlled]);\n\n const [viewport, setViewport] = useState<ViewportState>({\n scrollX: 0,\n scrollY: 0,\n zoom: 1\n });\n const controlledColumnWidthsMap = useMemo(\n () => (controlledColumnWidths ? columnWidthsRecordToMap(controlledColumnWidths) : undefined),\n [controlledColumnWidths]\n );\n const [internalColumnWidths, setInternalColumnWidths] = useState<Map<string, number>>(() =>\n columnWidthsRecordToMap(controlledColumnWidths)\n );\n const [transientColumnWidths, setTransientColumnWidths] = useState<Map<string, number> | null>(null);\n const columnWidths = transientColumnWidths ?? controlledColumnWidthsMap ?? internalColumnWidths;\n const columnWidthsRef = useRef(columnWidths);\n columnWidthsRef.current = columnWidths;\n const previousControlledColumnWidthsRef = useRef(controlledColumnWidths);\n useEffect(() => {\n if (controlledColumnWidths !== previousControlledColumnWidthsRef.current) {\n previousControlledColumnWidthsRef.current = controlledColumnWidths;\n setTransientColumnWidths(null);\n }\n }, [controlledColumnWidths]);\n const controlledRowHeightsMap = useMemo(\n () => (controlledRowHeights ? rowHeightsRecordToMap(controlledRowHeights) : undefined),\n [controlledRowHeights]\n );\n const [internalRowHeights, setInternalRowHeights] = useState<Map<number, number>>(() =>\n rowHeightsRecordToMap(controlledRowHeights)\n );\n const [transientRowHeights, setTransientRowHeights] = useState<Map<number, number> | null>(null);\n const rowHeights = transientRowHeights ?? controlledRowHeightsMap ?? internalRowHeights;\n const rowHeightsRef = useRef(rowHeights);\n rowHeightsRef.current = rowHeights;\n const previousControlledRowHeightsRef = useRef(controlledRowHeights);\n useEffect(() => {\n if (controlledRowHeights !== previousControlledRowHeightsRef.current) {\n previousControlledRowHeightsRef.current = controlledRowHeights;\n setTransientRowHeights(null);\n }\n }, [controlledRowHeights]);\n\n const [isResizingColumn, setIsResizingColumn] = useState<string | null>(null);\n const [isResizingRow, setIsResizingRow] = useState<number | null>(null);\n const [resizeStartX, setResizeStartX] = useState(0);\n const [resizeStartY, setResizeStartY] = useState(0);\n const [resizeStartSize, setResizeStartSize] = useState(0);\n\n // Overlay state management\n const [internalOverlayChildren, setInternalOverlayChildren] = useState<SpreadsheetChild[]>([]);\n const [transientOverlayChildren, setTransientOverlayChildren] = useState<SpreadsheetChild[] | null>(null);\n const [internalSelectedOverlayId, setInternalSelectedOverlayId] = useState<string | null>(null);\n const [mountedPersistentOverlayIds, setMountedPersistentOverlayIds] = useState<Set<string>>(new Set());\n\n // Placeholder state for overlay placement\n const [placeholderPos, setPlaceholderPos] = useState<{ x: number; y: number } | null>(null);\n\n // Use transient overlay state while dragging/resizing, then commit once the interaction ends.\n const overlayChildren = transientOverlayChildren ?? controlledOverlayChildren ?? internalOverlayChildren;\n const selectedOverlayId =\n controlledSelectedOverlayId !== undefined ? controlledSelectedOverlayId : internalSelectedOverlayId;\n\n const previousControlledOverlayChildrenRef = useRef(controlledOverlayChildren);\n useEffect(() => {\n if (controlledOverlayChildren !== previousControlledOverlayChildrenRef.current) {\n previousControlledOverlayChildrenRef.current = controlledOverlayChildren;\n setTransientOverlayChildren(null);\n }\n }, [controlledOverlayChildren]);\n\n const overlayChildrenRef = useRef<SpreadsheetChild[]>(overlayChildren);\n overlayChildrenRef.current = overlayChildren;\n const overlayInteractionDraftRectsRef = useRef<Record<string, CellSnapRect>>({});\n const pendingSnappedTextBoxLayoutCommitRef = useRef(false);\n\n // Refs\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const overlayContainerRef = useRef<HTMLDivElement>(null);\n const viewportStreamRef = useRef(\n new ViewportStream({\n x: viewport.scrollX,\n y: viewport.scrollY,\n zoom: viewport.zoom\n })\n );\n\n // Update viewport stream when viewport changes\n React.useEffect(() => {\n viewportStreamRef.current.next({\n x: viewport.scrollX,\n y: viewport.scrollY,\n zoom: viewport.zoom\n });\n }, [viewport.scrollX, viewport.scrollY, viewport.zoom]);\n // Grid dimensions\n const gridDims: GridDimensions = useMemo(\n () => ({\n cellWidth: DEFAULT_CELL_WIDTH * viewport.zoom,\n cellHeight: DEFAULT_CELL_HEIGHT * viewport.zoom,\n headerWidth: HEADER_WIDTH * viewport.zoom,\n headerHeight: HEADER_HEIGHT * viewport.zoom\n }),\n [viewport.zoom]\n );\n\n // Handle mouse movement for placeholder positioning\n React.useEffect(() => {\n if (!overlayPlaceholder || !containerDivRef) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const rect = containerDivRef.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Check if mouse is within the spreadsheet (after headers)\n if (mouseX >= gridDims.headerWidth && mouseY >= gridDims.headerHeight) {\n // Convert screen coordinates to sheet coordinates (centered on cursor)\n const sheetX =\n (mouseX - gridDims.headerWidth + viewport.scrollX) / viewport.zoom - overlayPlaceholder.width / 2;\n const sheetY =\n (mouseY - gridDims.headerHeight + viewport.scrollY) / viewport.zoom -\n overlayPlaceholder.height / 2;\n\n // Clamp to minimum bounds (can't be negative or overlap headers)\n const clampedX = Math.max(0, sheetX);\n const clampedY = Math.max(0, sheetY);\n\n setPlaceholderPos({ x: clampedX, y: clampedY });\n } else {\n // Clear placeholder position when mouse is over headers\n setPlaceholderPos(null);\n }\n };\n\n const handleClick = (e: MouseEvent) => {\n if (placeholderPos) {\n e.stopPropagation();\n // Final bounds check before placement\n const finalX = Math.max(0, placeholderPos.x);\n const finalY = Math.max(0, placeholderPos.y);\n overlayPlaceholder.onPlaced(finalX, finalY);\n setPlaceholderPos(null);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n overlayPlaceholder.onCancel?.();\n setPlaceholderPos(null);\n }\n };\n\n const handleContextMenu = (e: MouseEvent) => {\n e.preventDefault();\n overlayPlaceholder.onCancel?.();\n setPlaceholderPos(null);\n };\n\n containerDivRef.addEventListener('mousemove', handleMouseMove);\n containerDivRef.addEventListener('click', handleClick);\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('contextmenu', handleContextMenu);\n\n return () => {\n containerDivRef.removeEventListener('mousemove', handleMouseMove);\n containerDivRef.removeEventListener('click', handleClick);\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('contextmenu', handleContextMenu);\n };\n }, [overlayPlaceholder, containerDivRef, viewport, gridDims, placeholderPos]);\n\n const effectsRefOb = {\n onCellDataChange,\n onCellDataChangeError,\n controlledCellData,\n parseValue,\n cellData,\n viewport,\n gridDims,\n height\n };\n const effectsRef = useRef(effectsRefOb);\n effectsRef.current = effectsRefOb;\n\n // Styles are now imported via CSS module\n\n // Helper function to setup canvas with devicePixelRatio scaling\n const setupCanvas = useCallback((canvas: HTMLCanvasElement, width: number, height: number) => {\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n // Set actual size in memory (scaled for high-DPI)\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n\n // Set display size (CSS pixels)\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n\n // Scale the drawing context so everything draws at the correct size\n ctx.scale(devicePixelRatio, devicePixelRatio);\n\n return ctx;\n }, []);\n\n // Draw main grid on canvas\n const drawGrid = useCallback(() => {\n if (!canvasRef.current || !width || !height) return;\n\n const ctx = setupCanvas(canvasRef.current, width, height);\n if (!ctx) return;\n\n ctx.clearRect(0, 0, width, height);\n // Canvas 2D cannot evaluate CSS, so read the resolved gridline color from\n // a hidden probe element that the browser has already themed for us.\n ctx.strokeStyle = resolveGridLineColor(gridLineProbeRef.current, colorScheme);\n ctx.lineWidth = 1;\n\n // Draw vertical grid lines using custom column widths\n let x = gridDims.headerWidth;\n let colIndex = 0;\n\n // Skip columns before viewport\n while (x < viewport.scrollX + gridDims.headerWidth) {\n const colWidth = (columnWidths.get(indexToColumn(colIndex)) || DEFAULT_CELL_WIDTH) * viewport.zoom;\n if (x + colWidth > viewport.scrollX + gridDims.headerWidth) {\n break;\n }\n x += colWidth;\n colIndex++;\n }\n\n // Draw visible columns\n while (x - viewport.scrollX < width) {\n const drawX = x - viewport.scrollX;\n if (drawX >= gridDims.headerWidth && drawX <= width) {\n ctx.beginPath();\n ctx.moveTo(drawX, gridDims.headerHeight);\n ctx.lineTo(drawX, height);\n ctx.stroke();\n }\n const colWidth = (columnWidths.get(indexToColumn(colIndex)) || DEFAULT_CELL_WIDTH) * viewport.zoom;\n x += colWidth;\n colIndex++;\n }\n\n // Draw horizontal grid lines using custom row heights\n let y = gridDims.headerHeight;\n let rowNum = 1;\n\n // Skip rows before viewport\n while (y < viewport.scrollY + gridDims.headerHeight) {\n const rowHeight = (rowHeights.get(rowNum) || DEFAULT_CELL_HEIGHT) * viewport.zoom;\n if (y + rowHeight > viewport.scrollY + gridDims.headerHeight) {\n break;\n }\n y += rowHeight;\n rowNum++;\n }\n\n // Draw visible rows\n while (y - viewport.scrollY < height) {\n const drawY = y - viewport.scrollY;\n if (drawY >= gridDims.headerHeight && drawY <= height) {\n ctx.beginPath();\n ctx.moveTo(gridDims.headerWidth, drawY);\n ctx.lineTo(width, drawY);\n ctx.stroke();\n }\n const rowHeight = (rowHeights.get(rowNum) || DEFAULT_CELL_HEIGHT) * viewport.zoom;\n y += rowHeight;\n rowNum++;\n }\n }, [\n columnWidths,\n gridDims.headerHeight,\n gridDims.headerWidth,\n height,\n rowHeights,\n setupCanvas,\n viewport.scrollX,\n viewport.scrollY,\n viewport.zoom,\n width,\n colorScheme\n ]);\n\n // Get visible cells for rendering - ensure we always render all visible positions\n const getVisibleCells = useCallback(() => {\n if (!width || !height) return [];\n\n const cells: CellData[] = [];\n\n // Find first visible column\n let x = 0;\n let startCol = 0;\n while (x < viewport.scrollX) {\n const colWidth = (columnWidths.get(indexToColumn(startCol)) || DEFAULT_CELL_WIDTH) * viewport.zoom;\n if (x + colWidth > viewport.scrollX) {\n break;\n }\n x += colWidth;\n startCol++;\n }\n\n // Find first visible row\n let y = 0;\n let startRow = 0;\n while (y < viewport.scrollY) {\n const rowHeight = (rowHeights.get(startRow + 1) || DEFAULT_CELL_HEIGHT) * viewport.zoom;\n if (y + rowHeight > viewport.scrollY) {\n break;\n }\n y += rowHeight;\n startRow++;\n }\n\n // Collect visible cells\n let rowY = y;\n let row = startRow;\n while (rowY < viewport.scrollY + height) {\n let colX = x;\n let col = startCol;\n while (colX < viewport.scrollX + width) {\n const colKey = indexToColumn(col);\n const rowNum = getRowNumber(row);\n const cellKey = `${colKey}${rowNum}`;\n cells.push({\n value: cellData.get(cellKey) ?? '',\n row: rowNum,\n col: colKey\n });\n const colWidth = (columnWidths.get(colKey) || DEFAULT_CELL_WIDTH) * viewport.zoom;\n colX += colWidth;\n col++;\n }\n const rowHeight = (rowHeights.get(row + 1) || DEFAULT_CELL_HEIGHT) * viewport.zoom;\n rowY += rowHeight;\n row++;\n }\n\n return cells;\n }, [\n cellData,\n columnWidths,\n height,\n rowHeights,\n viewport.scrollX,\n viewport.scrollY,\n viewport.zoom,\n width\n ]);\n\n // Get column width (considering custom sizes)\n const getColumnWidth = useCallback(\n (col: string) => {\n return columnWidths.get(col) || DEFAULT_CELL_WIDTH;\n },\n [columnWidths]\n );\n\n // Get row height (considering custom sizes)\n const getRowHeight = useCallback(\n (row: number) => {\n return rowHeights.get(row) || DEFAULT_CELL_HEIGHT;\n },\n [rowHeights]\n );\n\n // Convert cell coordinates to base pixel coordinates (without scroll offset, for container transform)\n const cellToPixelBase = useCallback(\n (row: number, col: string) => {\n const colIndex = columnToIndex(col);\n const rowIndex = row - 1;\n\n // Calculate x position considering custom column widths\n let x = HEADER_WIDTH;\n for (let i = 0; i < colIndex; i++) {\n const colKey = indexToColumn(i);\n x += columnWidths.get(colKey) || DEFAULT_CELL_WIDTH;\n }\n\n // Calculate y position considering custom row heights\n let y = HEADER_HEIGHT;\n for (let i = 1; i <= rowIndex; i++) {\n y += rowHeights.get(i) || DEFAULT_CELL_HEIGHT;\n }\n\n return { x, y };\n },\n [columnWidths, rowHeights]\n );\n\n React.useEffect(() => {\n return selectionManager.listenToUpdateData((updates) => {\n const editingState = selectionManager.isEditing;\n try {\n const { cellData, onCellDataChange } = effectsRef.current;\n const newData = new Map(cellData);\n updates.forEach(({ value, rowIndex, colIndex }) => {\n const key = `${indexToColumn(colIndex)}${rowIndex + 1}`;\n const parseValue = effectsRef.current.parseValue;\n if (value === '') {\n newData.delete(key);\n } else {\n // Apply parse function if provided, otherwise use value as-is\n let parsedValue: number | string = value;\n if (parseValue && typeof value === 'string') {\n // Extract cell info from key (e.g., \"A1\" -> row=1, col=\"A\")\n const match = key.match(/^([A-Z]+)(\\d+)$/);\n const col = match?.[1];\n const rowText = match?.[2];\n if (col && rowText) {\n const row = parseInt(rowText, 10);\n const colIndex = columnToIndex(col);\n const rowIndex = row - 1;\n\n parsedValue = parseValue(value, {\n id: key,\n row,\n col,\n rowIndex,\n colIndex\n });\n }\n }\n newData.set(key, parsedValue);\n }\n });\n onCellDataChange?.(newData);\n setInternalCellData(newData);\n } catch (error) {\n console.error('Failed to update spreadsheet cell data:', error);\n effectsRef.current.onCellDataChangeError?.(error);\n\n const rejectedUpdate = updates.length === 1 ? updates[0] : undefined;\n if (\n editingState.type === 'cell' &&\n rejectedUpdate &&\n rejectedUpdate.rowIndex === editingState.row &&\n rejectedUpdate.colIndex === editingState.col\n ) {\n const rejectedValue = rejectedUpdate.value === undefined ? '' : String(rejectedUpdate.value);\n queueMicrotask(() => {\n retryingEditVersionRef.current += 1;\n setRetryingEdit({\n rowIndex: editingState.row,\n colIndex: editingState.col,\n version: retryingEditVersionRef.current\n });\n selectionManager.editCell(editingState.row, editingState.col, rejectedValue);\n });\n }\n }\n });\n }, [selectionManager]);\n\n const clipboardManager = useMemo(() => {\n return new SpreadsheetClipboardManager(cellDataRef, selectionManager);\n }, [selectionManager]);\n\n React.useEffect(() => {\n if (disableClipboard) return;\n selectionManager.listenToCopy(() => {\n clipboardManager.triggerCopy();\n });\n }, [selectionManager, clipboardManager, disableClipboard]);\n\n React.useEffect(() => {\n if (disableClipboard) return;\n selectionManager.listenToPaste(({ updates }) => {\n clipboardManager.triggerPaste(updates);\n });\n }, [selectionManager, clipboardManager, disableClipboard]);\n\n // Handle wheel events (scroll only, zoom disabled)\n const handleWheel = useCallback((e: WheelEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Always scroll, ignore zoom\n setViewport((prev) => ({\n ...prev,\n scrollX: Math.max(0, prev.scrollX + e.deltaX),\n scrollY: Math.max(0, prev.scrollY + e.deltaY)\n }));\n }, []);\n\n // Overlay interaction handlers\n const commitOverlayChildren = useCallback(\n (children: SpreadsheetChild[]) => {\n overlayChildrenRef.current = children;\n\n if (onOverlayChildrenChange) {\n onOverlayChildrenChange(children);\n setTransientOverlayChildren(children);\n return;\n }\n\n setInternalOverlayChildren(children);\n setTransientOverlayChildren(null);\n },\n [onOverlayChildrenChange]\n );\n\n const updateOverlayChildrenLocally = useCallback(\n (updater: (children: SpreadsheetChild[]) => SpreadsheetChild[]) => {\n const nextChildren = updater(overlayChildrenRef.current);\n overlayChildrenRef.current = nextChildren;\n setTransientOverlayChildren(nextChildren);\n\n if (!onOverlayChildrenChange) {\n setInternalOverlayChildren(nextChildren);\n }\n },\n [onOverlayChildrenChange]\n );\n\n const updateSnappedTextBoxRectsLocally = useCallback(\n (nextColumnWidths: Map<string, number>, nextRowHeights: Map<number, number>) => {\n const nextChildren = syncSnappedTextBoxRects(\n overlayChildrenRef.current,\n nextColumnWidths,\n nextRowHeights\n );\n\n if (nextChildren === overlayChildrenRef.current) {\n return;\n }\n\n overlayChildrenRef.current = nextChildren;\n pendingSnappedTextBoxLayoutCommitRef.current = true;\n setTransientOverlayChildren(nextChildren);\n\n if (!onOverlayChildrenChange) {\n setInternalOverlayChildren(nextChildren);\n }\n },\n [onOverlayChildrenChange]\n );\n\n const commitSnappedTextBoxRects = useCallback(\n (nextColumnWidths: Map<string, number>, nextRowHeights: Map<number, number>) => {\n const nextChildren = syncSnappedTextBoxRects(\n overlayChildrenRef.current,\n nextColumnWidths,\n nextRowHeights\n );\n\n if (nextChildren !== overlayChildrenRef.current) {\n commitOverlayChildren(nextChildren);\n pendingSnappedTextBoxLayoutCommitRef.current = false;\n return;\n }\n\n if (pendingSnappedTextBoxLayoutCommitRef.current) {\n commitOverlayChildren(overlayChildrenRef.current);\n pendingSnappedTextBoxLayoutCommitRef.current = false;\n }\n },\n [commitOverlayChildren]\n );\n\n const updateColumnWidthsLocally = useCallback(\n (updater: (columnWidths: Map<string, number>) => Map<string, number>) => {\n const nextColumnWidths = updater(columnWidthsRef.current);\n columnWidthsRef.current = nextColumnWidths;\n setTransientColumnWidths(nextColumnWidths);\n updateSnappedTextBoxRectsLocally(nextColumnWidths, rowHeightsRef.current);\n\n if (!onColumnWidthsChange) {\n setInternalColumnWidths(nextColumnWidths);\n }\n },\n [onColumnWidthsChange, updateSnappedTextBoxRectsLocally]\n );\n\n const commitColumnWidths = useCallback(\n (nextColumnWidths: Map<string, number>) => {\n columnWidthsRef.current = nextColumnWidths;\n\n if (onColumnWidthsChange) {\n onColumnWidthsChange(columnWidthsMapToRecord(nextColumnWidths));\n setTransientColumnWidths(nextColumnWidths);\n commitSnappedTextBoxRects(nextColumnWidths, rowHeightsRef.current);\n return;\n }\n\n setInternalColumnWidths(nextColumnWidths);\n setTransientColumnWidths(null);\n commitSnappedTextBoxRects(nextColumnWidths, rowHeightsRef.current);\n },\n [commitSnappedTextBoxRects, onColumnWidthsChange]\n );\n\n const updateRowHeightsLocally = useCallback(\n (updater: (rowHeights: Map<number, number>) => Map<number, number>) => {\n const nextRowHeights = updater(rowHeightsRef.current);\n rowHeightsRef.current = nextRowHeights;\n setTransientRowHeights(nextRowHeights);\n updateSnappedTextBoxRectsLocally(columnWidthsRef.current, nextRowHeights);\n\n if (!onRowHeightsChange) {\n setInternalRowHeights(nextRowHeights);\n }\n },\n [onRowHeightsChange, updateSnappedTextBoxRectsLocally]\n );\n\n const commitRowHeights = useCallback(\n (nextRowHeights: Map<number, number>) => {\n rowHeightsRef.current = nextRowHeights;\n\n if (onRowHeightsChange) {\n onRowHeightsChange(rowHeightsMapToRecord(nextRowHeights));\n setTransientRowHeights(nextRowHeights);\n commitSnappedTextBoxRects(columnWidthsRef.current, nextRowHeights);\n return;\n }\n\n setInternalRowHeights(nextRowHeights);\n setTransientRowHeights(null);\n commitSnappedTextBoxRects(columnWidthsRef.current, nextRowHeights);\n },\n [commitSnappedTextBoxRects, onRowHeightsChange]\n );\n\n // Handle column resize\n const handleColumnResizeStart = useCallback(\n (e: React.MouseEvent, col: string) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizingColumn(col);\n setResizeStartX(e.clientX);\n setResizeStartSize(getColumnWidth(col));\n },\n [getColumnWidth]\n );\n\n // Handle row resize\n const handleRowResizeStart = useCallback(\n (e: React.MouseEvent, row: number) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizingRow(row);\n setResizeStartY(e.clientY);\n setResizeStartSize(getRowHeight(row));\n },\n [getRowHeight]\n );\n\n // Handle resize move\n const handleResizeMove = useCallback(\n (e: MouseEvent) => {\n if (isResizingColumn) {\n const delta = e.clientX - resizeStartX;\n const newWidth = Math.max(20, resizeStartSize + delta / viewport.zoom);\n updateColumnWidthsLocally((prev) => new Map(prev).set(isResizingColumn, newWidth));\n } else if (isResizingRow !== null) {\n const delta = e.clientY - resizeStartY;\n const newHeight = Math.max(20, resizeStartSize + delta / viewport.zoom);\n updateRowHeightsLocally((prev) => new Map(prev).set(isResizingRow, newHeight));\n }\n },\n [\n isResizingColumn,\n isResizingRow,\n resizeStartX,\n resizeStartY,\n resizeStartSize,\n updateColumnWidthsLocally,\n updateRowHeightsLocally,\n viewport.zoom\n ]\n );\n\n // Handle resize end\n const handleResizeEnd = useCallback(() => {\n if (isResizingColumn) {\n commitColumnWidths(columnWidthsRef.current);\n }\n if (isResizingRow !== null) {\n commitRowHeights(rowHeightsRef.current);\n }\n setIsResizingColumn(null);\n setIsResizingRow(null);\n }, [commitColumnWidths, commitRowHeights, isResizingColumn, isResizingRow]);\n\n // Handle resize double click (auto-fit)\n const handleColumnResizeDoubleClick = useCallback(\n (e: React.MouseEvent, col: string) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { viewport, gridDims, height, cellData } = effectsRef.current;\n\n // Measure all visible cells in the column\n let maxWidth = 50; // Minimum width\n\n // Check visible cells\n const startRow = Math.max(0, Math.floor(viewport.scrollY / gridDims.cellHeight));\n const endRow = Math.ceil((viewport.scrollY + height) / gridDims.cellHeight) + 1;\n\n for (let row = startRow; row <= endRow; row++) {\n const cellKey = `${col}${getRowNumber(row)}`;\n const content = cellData.get(cellKey) ?? '';\n if (content) {\n // Estimate text width (rough approximation)\n const estimatedWidth = String(content).length * 8 + 20; // 8px per char + padding\n maxWidth = Math.max(maxWidth, estimatedWidth);\n }\n }\n\n commitColumnWidths(new Map(columnWidthsRef.current).set(col, maxWidth));\n },\n [commitColumnWidths]\n );\n\n // Handle resize double click for rows\n const handleRowResizeDoubleClick = useCallback(\n (e: React.MouseEvent, row: number) => {\n e.preventDefault();\n e.stopPropagation();\n\n // For simplicity, set to a reasonable height\n // In a real implementation, you'd measure the content\n commitRowHeights(new Map(rowHeightsRef.current).set(row, DEFAULT_CELL_HEIGHT));\n },\n [commitRowHeights]\n );\n\n const commitCurrentOverlayChildren = useCallback(() => {\n overlayInteractionDraftRectsRef.current = {};\n commitOverlayChildren(overlayChildrenRef.current);\n }, [commitOverlayChildren]);\n\n const setSelectedOverlay = useCallback(\n (childId: string | null) => {\n if (onOverlaySelect) {\n onOverlaySelect(childId);\n }\n setInternalSelectedOverlayId(childId);\n },\n [onOverlaySelect]\n );\n\n const handleOverlayClick = useCallback(\n (childId: string, e: React.MouseEvent) => {\n e.stopPropagation();\n // Only allow overlay selection if parent is selected\n if (!parentSelected) {\n return;\n }\n // Blur the SelectionManager when selecting an overlay\n selectionManager.blur();\n setSelectedOverlay(childId);\n },\n [setSelectedOverlay, selectionManager, parentSelected]\n );\n\n const handleOverlayBackgroundClick = useCallback(() => {\n setSelectedOverlay(null);\n }, [setSelectedOverlay]);\n\n const getOverlayInteractionDraftRect = useCallback((child: SpreadsheetChild): CellSnapRect => {\n const currentDraft = overlayInteractionDraftRectsRef.current[child.id];\n if (currentDraft) {\n return currentDraft;\n }\n\n const draft = {\n x: child.x,\n y: child.y,\n width: child.width,\n height: child.height\n };\n overlayInteractionDraftRectsRef.current[child.id] = draft;\n return draft;\n }, []);\n\n const handleOverlayMove = useCallback(\n (childId: string, deltaX: number, deltaY: number) => {\n updateOverlayChildrenLocally((children) =>\n children.map((child) => {\n if (child.id !== childId) return child;\n\n if (isSnappedTextBox(child)) {\n const draft = getOverlayInteractionDraftRect(child);\n draft.x = Math.max(0, draft.x + deltaX);\n draft.y = Math.max(0, draft.y + deltaY);\n\n const baseAnchor =\n child.cellAnchor ??\n getCellSnapAnchorFromRect(child, columnWidthsRef.current, rowHeightsRef.current);\n const nextAnchor = moveCellSnapAnchorToNearestOrigin(\n baseAnchor,\n draft,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n\n return applyCellSnapAnchorToTextBox(\n child,\n nextAnchor,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n }\n\n // Constrain overlay position to prevent overlapping with headers\n const newX = Math.max(0, child.x + deltaX);\n const newY = Math.max(0, child.y + deltaY);\n return { ...child, x: newX, y: newY };\n })\n );\n },\n [getOverlayInteractionDraftRect, updateOverlayChildrenLocally]\n );\n\n const handleOverlayResize = useCallback(\n (childId: string, deltaWidth: number, deltaHeight: number, shiftKey: boolean, handle: string) => {\n updateOverlayChildrenLocally((children) =>\n children.map((child) => {\n if (child.id !== childId) return child;\n\n if (isSnappedTextBox(child) && isCellSnapResizeHandle(handle)) {\n const draft = getOverlayInteractionDraftRect(child);\n let nextX = draft.x;\n let nextY = draft.y;\n let nextWidth = draft.width;\n let nextHeight = draft.height;\n\n if (handle === 'left' || handle === 'top-left' || handle === 'bottom-left') {\n nextX = draft.x - deltaWidth;\n nextWidth = draft.width + deltaWidth;\n }\n if (handle === 'right' || handle === 'top-right' || handle === 'bottom-right') {\n nextWidth = draft.width + deltaWidth;\n }\n if (handle === 'top' || handle === 'top-left' || handle === 'top-right') {\n nextY = draft.y - deltaHeight;\n nextHeight = draft.height + deltaHeight;\n }\n if (handle === 'bottom' || handle === 'bottom-left' || handle === 'bottom-right') {\n nextHeight = draft.height + deltaHeight;\n }\n\n if (nextX < 0) {\n nextWidth += nextX;\n nextX = 0;\n }\n if (nextY < 0) {\n nextHeight += nextY;\n nextY = 0;\n }\n\n draft.x = nextX;\n draft.y = nextY;\n draft.width = Math.max(1, nextWidth);\n draft.height = Math.max(1, nextHeight);\n\n const baseAnchor =\n child.cellAnchor ??\n getCellSnapAnchorFromRect(child, columnWidthsRef.current, rowHeightsRef.current);\n const nextAnchor = resizeCellSnapAnchorToNearestEdges(\n baseAnchor,\n draft,\n handle,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n\n return applyCellSnapAnchorToTextBox(\n child,\n nextAnchor,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n }\n\n if (shiftKey && (deltaWidth !== 0 || deltaHeight !== 0)) {\n // Locked aspect ratio mode - adjust zoom\n const currentZoom = child.zoom || 1;\n const currentVisualWidth = child.width;\n const currentVisualHeight = child.height;\n\n const widthScale = deltaWidth !== 0 ? 1 + deltaWidth / currentVisualWidth : 1;\n const heightScale = deltaHeight !== 0 ? 1 + deltaHeight / currentVisualHeight : 1;\n\n let scaleDelta: number;\n if (handle.includes('-')) {\n scaleDelta = Math.abs(widthScale - 1) > Math.abs(heightScale - 1) ? widthScale : heightScale;\n } else if (handle === 'left' || handle === 'right') {\n scaleDelta = widthScale;\n } else if (handle === 'top' || handle === 'bottom') {\n scaleDelta = heightScale;\n } else {\n scaleDelta = Math.max(widthScale, heightScale);\n }\n\n const newZoom = currentZoom * scaleDelta;\n const newWidth = child.width * scaleDelta;\n const newHeight = child.height * scaleDelta;\n const deltaX = newWidth - child.width;\n const deltaY = newHeight - child.height;\n\n let newX = child.x;\n let newY = child.y;\n if (handle === 'left' || handle === 'bottom-left') {\n newX = child.x - deltaX;\n }\n if (handle === 'top' || handle === 'top-right') {\n newY = child.y - deltaY;\n }\n if (handle === 'top-left') {\n newX = child.x - deltaX;\n newY = child.y - deltaY;\n }\n\n // Constrain overlay position to prevent overlapping with headers\n newX = Math.max(0, newX);\n newY = Math.max(0, newY);\n\n return {\n ...child,\n x: newX,\n y: newY,\n width: newWidth,\n height: newHeight,\n zoom: newZoom\n };\n } else {\n // Normal resize mode\n let newX = child.x;\n let newY = child.y;\n if (handle === 'left' || handle === 'bottom-left') {\n newX = child.x - deltaWidth;\n }\n if (handle === 'top' || handle === 'top-right') {\n newY = child.y - deltaHeight;\n }\n if (handle === 'top-left') {\n newX = child.x - deltaWidth;\n newY = child.y - deltaHeight;\n }\n\n // Constrain overlay position to prevent overlapping with headers\n newX = Math.max(0, newX);\n newY = Math.max(0, newY);\n\n return {\n ...child,\n x: newX,\n y: newY,\n width: child.width + deltaWidth,\n height: child.height + deltaHeight,\n zoom: child.zoom\n };\n }\n })\n );\n },\n [getOverlayInteractionDraftRect, updateOverlayChildrenLocally]\n );\n\n const handleOverlaySnapToCellsToggle = useCallback(\n (childId: string, enabled: boolean) => {\n overlayInteractionDraftRectsRef.current = {};\n commitOverlayChildren(\n overlayChildrenRef.current.map((child) => {\n if (child.id !== childId || child.component !== 'RichText') {\n return child;\n }\n\n if (!enabled) {\n return {\n ...child,\n snapToCells: false,\n cellAnchor: undefined\n };\n }\n\n const anchor = getCellSnapAnchorFromRect(child, columnWidthsRef.current, rowHeightsRef.current);\n\n return applyCellSnapAnchorToTextBox(\n child,\n anchor,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n })\n );\n },\n [commitOverlayChildren]\n );\n\n const handleOverlayReset = useCallback(\n (childId: string) => {\n commitOverlayChildren(\n overlayChildrenRef.current.map((child) => {\n if (child.id !== childId || !child.initial) return child;\n return {\n ...child,\n x: child.initial.x,\n y: child.initial.y,\n width: child.initial.width,\n height: child.initial.height,\n zoom: child.initial.zoom || 1,\n minimized: false\n };\n })\n );\n },\n [commitOverlayChildren]\n );\n\n const handleOverlayMinimize = useCallback(\n (childId: string) => {\n commitOverlayChildren(\n overlayChildrenRef.current.map((child) =>\n child.id === childId && child.component !== 'RichText'\n ? { ...child, minimized: !child.minimized }\n : child\n )\n );\n },\n [commitOverlayChildren]\n );\n\n const handleOverlayClose = useCallback(\n (childId: string) => {\n commitOverlayChildren(overlayChildrenRef.current.filter((child) => child.id !== childId));\n },\n [commitOverlayChildren]\n );\n\n useEffect(() => {\n const handleOverlayDeleteKeyDown = (event: KeyboardEvent) => {\n if (!selectedOverlayId || (event.key !== 'Backspace' && event.key !== 'Delete')) {\n return;\n }\n\n if (isEditableKeyboardTarget(event.target)) {\n return;\n }\n\n const selectedOverlay = overlayChildrenRef.current.find((child) => child.id === selectedOverlayId);\n if (selectedOverlay?.component !== 'RichText') {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n setSelectedOverlay(null);\n handleOverlayClose(selectedOverlayId);\n };\n\n document.addEventListener('keydown', handleOverlayDeleteKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleOverlayDeleteKeyDown);\n };\n }, [handleOverlayClose, selectedOverlayId, setSelectedOverlay]);\n\n // Effects\n useEffect(() => {\n drawGrid();\n }, [drawGrid]);\n\n // Handle resize mouse events\n useEffect(() => {\n if (isResizingColumn || isResizingRow !== null) {\n document.addEventListener('mousemove', handleResizeMove);\n document.addEventListener('mouseup', handleResizeEnd);\n document.body.style.cursor = isResizingColumn ? 'col-resize' : 'row-resize';\n\n return () => {\n document.removeEventListener('mousemove', handleResizeMove);\n document.removeEventListener('mouseup', handleResizeEnd);\n document.body.style.cursor = '';\n };\n }\n }, [isResizingColumn, isResizingRow, handleResizeMove, handleResizeEnd]);\n\n // Handle editing state changes and additional keypress events\n useEffect(() => {\n const editingCleanup = selectionManager.observeStateChange(\n (state) => state.isEditing.type,\n (type) => {\n if (type !== 'none') {\n // When editing, set up additional event handlers for paste, etc.\n const handleEditingKeydown = (e: KeyboardEvent) => {\n // Handle paste during editing\n if ((e.metaKey || e.ctrlKey) && e.key === 'v') {\n // Let the browser handle paste into the input naturally\n return;\n }\n\n // Handle delete/backspace during editing\n if (e.key === 'Delete' || e.key === 'Backspace') {\n // Let the browser handle these naturally in the input\n return;\n }\n };\n\n window.addEventListener('keydown', handleEditingKeydown);\n return () => {\n window.removeEventListener('keydown', handleEditingKeydown);\n };\n }\n },\n true\n );\n\n return editingCleanup;\n }, [selectionManager]);\n\n // Listen to SelectionManager focus changes - deselect overlays when cells gain focus\n React.useEffect(() => {\n return selectionManager.observeStateChange(\n (state) => state.hasFocus,\n (hasFocus) => {\n if (hasFocus && selectedOverlayId) {\n // SelectionManager gained focus, deselect overlay\n setSelectedOverlay(null);\n }\n }\n );\n }, [selectionManager, selectedOverlayId, setSelectedOverlay]);\n\n // Get visible column headers (just the column info, no positions)\n const getVisibleColumnHeaders = useCallback(() => {\n if (!width) return [];\n\n const headers: { col: string; colIndex: number }[] = [];\n let x = 0;\n let startCol = 0;\n\n // Find the first visible column\n while (x < viewport.scrollX) {\n const col = indexToColumn(startCol);\n const colWidth = getColumnWidth(col) * viewport.zoom;\n if (x + colWidth > viewport.scrollX) {\n break;\n }\n x += colWidth;\n startCol++;\n }\n\n // Collect visible columns\n while (x < viewport.scrollX + width) {\n const col = indexToColumn(startCol);\n const colWidth = getColumnWidth(col) * viewport.zoom;\n headers.push({\n col,\n colIndex: startCol\n });\n x += colWidth;\n startCol++;\n }\n\n return headers;\n }, [width, viewport, getColumnWidth]);\n\n // Get visible row headers (just the row info, no positions)\n const getVisibleRowHeaders = useCallback(() => {\n if (!height) return [];\n\n const headers: { row: number; rowIndex: number }[] = [];\n let y = 0;\n let rowNum = 1;\n\n // Find the first visible row\n while (y < viewport.scrollY) {\n const rowHeight = getRowHeight(rowNum) * viewport.zoom;\n if (y + rowHeight > viewport.scrollY) {\n break;\n }\n y += rowHeight;\n rowNum++;\n }\n\n // Collect visible rows\n while (y < viewport.scrollY + height) {\n const rowHeight = getRowHeight(rowNum) * viewport.zoom;\n headers.push({\n row: rowNum,\n rowIndex: rowNum - 1\n });\n y += rowHeight;\n rowNum++;\n }\n\n return headers;\n }, [height, viewport, getRowHeight]);\n\n // Get visible overlays with culling and persistent tracking\n const { visibleOverlays, overlaysToRender } = useMemo(() => {\n if (!width || !height || !overlayChildren) {\n return { visibleOverlays: [], overlaysToRender: [] };\n }\n\n const visible: SpreadsheetChild[] = [];\n const toRender: SpreadsheetChild[] = [];\n const newMountedPersistentIds = new Set(mountedPersistentOverlayIds);\n\n overlayChildren.forEach((child) => {\n // Calculate child's bounds in screen coordinates\n const childLeft = child.x * viewport.zoom - viewport.scrollX + gridDims.headerWidth;\n const childTop = child.y * viewport.zoom - viewport.scrollY + gridDims.headerHeight;\n const childRight = childLeft + child.width * viewport.zoom;\n const childBottom = childTop + child.height * viewport.zoom;\n\n // Calculate viewport bounds with margin\n const margin = 100;\n const viewportLeft = gridDims.headerWidth - margin;\n const viewportTop = gridDims.headerHeight - margin;\n const viewportRight = width + margin;\n const viewportBottom = height + margin;\n\n // Check if overlay is within viewport\n const isVisible =\n childRight >= viewportLeft &&\n childLeft <= viewportRight &&\n childBottom >= viewportTop &&\n childTop <= viewportBottom;\n\n if (isVisible) {\n visible.push(child);\n toRender.push(child);\n if (child.persistent) {\n newMountedPersistentIds.add(child.id);\n }\n } else if (child.persistent && mountedPersistentOverlayIds.has(child.id)) {\n // Persistent child that was previously mounted but is now invisible\n toRender.push(child);\n }\n });\n\n // Update mounted persistent children if changed\n if (\n newMountedPersistentIds.size !== mountedPersistentOverlayIds.size ||\n [...newMountedPersistentIds].some((id) => !mountedPersistentOverlayIds.has(id))\n ) {\n setMountedPersistentOverlayIds(newMountedPersistentIds);\n }\n\n return { visibleOverlays: visible, overlaysToRender: toRender };\n }, [\n overlayChildren,\n viewport.zoom,\n viewport.scrollX,\n viewport.scrollY,\n width,\n height,\n gridDims.headerWidth,\n gridDims.headerHeight,\n mountedPersistentOverlayIds\n ]);\n\n // Render visible cells\n const visibleCells = React.useMemo(() => getVisibleCells(), [getVisibleCells]);\n const visibleColumnHeaders = React.useMemo(() => getVisibleColumnHeaders(), [getVisibleColumnHeaders]);\n const visibleRowHeaders = React.useMemo(() => getVisibleRowHeaders(), [getVisibleRowHeaders]);\n\n const hasFocus = useSelectionManager(selectionManager, () => selectionManager.hasFocus);\n\n // Add wheel handler to container\n React.useEffect(() => {\n if (!containerDivRef || !hasFocus || !parentSelected) {\n return;\n }\n containerDivRef.addEventListener('wheel', handleWheel, {\n passive: false\n });\n return () => {\n containerDivRef.removeEventListener('wheel', handleWheel);\n };\n }, [containerDivRef, handleWheel, hasFocus, parentSelected]);\n\n // Forward ref\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n selectionManager.focus();\n },\n blur: () => {\n selectionManager.blur();\n }\n }),\n [selectionManager]\n );\n\n return (\n <div\n className={cn('rsp-root', className)}\n // A stylesheet cannot read an ancestor's `color-scheme`, so the resolved\n // value is reflected here to drive the light/dark token switch.\n data-rsp-scheme={colorScheme}\n style={{ position: 'relative', ...style }}\n {...containerProps}\n >\n <div style={{ position: 'absolute', inset: 0 }} ref={containerRef}>\n {Boolean(width && height) && (\n <div\n ref={setContainerDivRef}\n className={cn('rsp-container', { 'rsp-focused': hasFocus })}\n data-testid=\"spreadsheet-container\"\n style={{\n width,\n height\n }}\n tabIndex={0}\n >\n {/* Resolves the themed gridline color for the canvas. Kept in the\n DOM (not `display: none`) so the value stays computable. */}\n <span\n ref={gridLineProbeRef}\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n width: 0,\n height: 0,\n visibility: 'hidden',\n pointerEvents: 'none',\n color: 'var(--_rsp-gridline)'\n }}\n />\n\n <canvas\n ref={canvasRef}\n className=\"rsp-canvas\"\n data-testid=\"spreadsheet-canvas\"\n style={{ width, height }}\n />\n\n {/* Column headers */}\n <div\n className=\"rsp-column-headers\"\n data-testid=\"spreadsheet-column-headers\"\n style={{\n left: gridDims.headerWidth,\n right: 0,\n height: gridDims.headerHeight,\n zIndex: 20\n }}\n >\n <div\n style={{\n transform: `translateX(${-viewport.scrollX}px) scale(${viewport.zoom})`,\n transformOrigin: '0 0'\n }}\n >\n {visibleColumnHeaders.map(({ col, colIndex }) => {\n return (\n <HeaderComponent\n key={col}\n index={colIndex}\n type=\"col\"\n selectionManager={selectionManager}\n getColumnWidth={getColumnWidth}\n getRowHeight={getRowHeight}\n handleColumnResizeStart={handleColumnResizeStart}\n handleColumnResizeDoubleClick={handleColumnResizeDoubleClick}\n handleRowResizeStart={handleRowResizeStart}\n handleRowResizeDoubleClick={handleRowResizeDoubleClick}\n />\n );\n })}\n </div>\n </div>\n\n {/* Row headers */}\n <div\n className=\"rsp-row-headers\"\n data-testid=\"spreadsheet-row-headers\"\n style={{\n top: gridDims.headerHeight,\n bottom: 0,\n width: gridDims.headerWidth,\n zIndex: 20\n }}\n >\n <div\n style={{\n transform: `translateY(${-viewport.scrollY}px) scale(${viewport.zoom})`,\n transformOrigin: '0 0'\n }}\n >\n {visibleRowHeaders.map(({ row, rowIndex }) => {\n return (\n <HeaderComponent\n key={row}\n index={rowIndex}\n type=\"row\"\n selectionManager={selectionManager}\n getColumnWidth={getColumnWidth}\n getRowHeight={getRowHeight}\n handleColumnResizeStart={handleColumnResizeStart}\n handleColumnResizeDoubleClick={handleColumnResizeDoubleClick}\n handleRowResizeStart={handleRowResizeStart}\n handleRowResizeDoubleClick={handleRowResizeDoubleClick}\n />\n );\n })}\n </div>\n </div>\n\n {/* Corner header */}\n <div\n className=\"rsp-corner-header\"\n data-testid=\"spreadsheet-corner-header\"\n style={{\n width: gridDims.headerWidth,\n height: gridDims.headerHeight,\n zIndex: 40\n }}\n />\n\n <div\n className=\"rsp-cells\"\n data-testid=\"spreadsheet-cells\"\n style={{\n transform: `translate(${-viewport.scrollX}px, ${-viewport.scrollY}px) scale(${viewport.zoom})`,\n transformOrigin: '0 0'\n }}\n >\n {visibleCells.map((cell) => (\n <CellComponent\n key={`${cell.col}${cell.row}`}\n value={cellData.get(`${cell.col}${cell.row}`) ?? ''}\n row={cell.row}\n col={cell.col}\n selectionManager={selectionManager}\n cellToPixelBase={cellToPixelBase}\n getColumnWidth={getColumnWidth}\n getRowHeight={getRowHeight}\n customCellStyle={customCellStyle}\n customCellRenderer={customCellRenderer}\n inputValue={cellData.get(`${cell.col}${cell.row}`) ?? ''}\n editInputVersion={\n retryingEdit?.rowIndex === cell.row - 1 &&\n retryingEdit?.colIndex === columnToIndex(cell.col)\n ? retryingEdit.version\n : 0\n }\n width={width}\n height={height}\n />\n ))}\n </div>\n\n {/* Overlay components layer */}\n {components && overlayChildren && overlayChildren.length > 0 && (\n <div\n ref={overlayContainerRef}\n className=\"rsp-overlays\"\n data-testid=\"spreadsheet-overlays\"\n onClick={handleOverlayBackgroundClick}\n >\n {overlaysToRender.map((child) => {\n const isChildVisible = visibleOverlays.includes(child);\n const isSelected = selectedOverlayId === child.id;\n const childZoom = child.zoom || 1;\n const isTextBox = child.component === 'RichText';\n const isMinimized = Boolean(child.minimized && !isTextBox);\n\n return (\n <div\n key={child.id}\n style={{\n position: 'absolute',\n width: child.width,\n height: isMinimized ? 0 : child.height,\n transform: `translate(${\n child.x * viewport.zoom - viewport.scrollX + gridDims.headerWidth\n }px, ${\n child.y * viewport.zoom - viewport.scrollY + gridDims.headerHeight\n }px) scale(${viewport.zoom})`,\n transformOrigin: '0 0',\n display: isChildVisible ? 'block' : 'none',\n pointerEvents: 'auto',\n zIndex: isSelected ? 50 : 5\n }}\n onClick={(e) => handleOverlayClick(child.id, e)}\n >\n <Frame\n child={child}\n isSelected={isSelected}\n zoom={viewport.zoom}\n viewport$={viewportStreamRef.current}\n onMove={(dx, dy) => handleOverlayMove(child.id, dx, dy)}\n onResize={(dw, dh, shift, handle) =>\n handleOverlayResize(child.id, dw, dh, shift, handle)\n }\n onSnapToCellsToggle={(enabled) => handleOverlaySnapToCellsToggle(child.id, enabled)}\n onReset={() => handleOverlayReset(child.id)}\n onMinimize={() => handleOverlayMinimize(child.id)}\n onClose={() => handleOverlayClose(child.id)}\n onInteractionEnd={commitCurrentOverlayChildren}\n />\n {!isMinimized && (\n <div\n style={{\n transform: childZoom !== 1 ? `scale(${childZoom})` : undefined,\n transformOrigin: '0 0',\n width: child.width / childZoom,\n height: child.height / childZoom,\n position: 'absolute',\n overflow: 'hidden',\n top: 0,\n left: 0\n }}\n >\n {components[child.component]?.(child, {\n isSelected,\n isMinimized: !!child.minimized\n })}\n </div>\n )}\n </div>\n );\n })}\n\n {/* Placeholder for overlay placement */}\n {overlayPlaceholder && placeholderPos && (\n <div\n className=\"rsp-overlay-placeholder\"\n style={{\n width: overlayPlaceholder.width,\n height: overlayPlaceholder.height,\n transform: `translate(${\n placeholderPos.x * viewport.zoom - viewport.scrollX + gridDims.headerWidth\n }px, ${\n placeholderPos.y * viewport.zoom - viewport.scrollY + gridDims.headerHeight\n }px) scale(${viewport.zoom})`,\n transformOrigin: '0 0'\n }}\n >\n <div className=\"rsp-overlay-placeholder-label\">\n {overlayPlaceholder.title}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nSpreadsheet.displayName = 'Spreadsheet';\n",
5
+ "import {\n type Format,\n type MaybeInfNumber,\n type NavigationRequest,\n SelectionManager,\n type SelectionNavigationModel,\n type SelectionManagerState,\n type SMCell,\n useInitializeSelectionManager,\n useSelectionManager\n} from '@ricsam/selection-manager';\nimport React, {\n forwardRef,\n useCallback,\n useEffect,\n useImperativeHandle,\n useMemo,\n useRef,\n useState,\n type ReactNode\n} from 'react';\nimport { useResizeObserver } from '../utils/use-resize-observer';\nimport { useColorScheme } from '../utils/use-color-scheme';\nimport { getContrastingTextColor } from '../utils/contrast-text';\nimport { cn } from '../utils/cn';\nimport { DEFAULT_CELL_HEIGHT, DEFAULT_CELL_WIDTH, HEADER_HEIGHT, HEADER_WIDTH } from './constants';\n\nimport type {\n CellRenderContext,\n SerializedCellValue,\n SpreadsheetColumnWidths,\n SpreadsheetRowHeights\n} from '../types';\nimport { type CellDataUpdate, ClipboardUtils } from '../clipboard/clipboard-manager';\nimport { Frame } from '../grid/frame';\nimport { ViewportStream } from '../grid/types';\nimport { columnToIndex, getRowNumber, indexToColumn, parseCellReference, rowToLetter } from './utils';\nimport { CONTROLLED_ZOOM_FACTOR, MAX_ZOOM, MIN_ZOOM, ZOOM_FACTOR } from './zoom-constants';\nimport {\n getColumnEdgePosition,\n getCellSnapAnchorFromRect,\n getRectFromCellSnapAnchor,\n getRowEdgePosition,\n moveCellSnapAnchorToNearestOrigin,\n normalizeCellSnapAnchor,\n resizeCellSnapAnchorToNearestEdges,\n type CellSnapAnchor,\n type CellSnapRect,\n type CellSnapResizeHandle\n} from './snapping';\n\n/**\n * Resolves the grid line color used for canvas painting.\n *\n * Canvas 2D cannot evaluate CSS, so the themed `--rsp-gridline` value has to be\n * resolved to a concrete color first. Reading the custom property directly is\n * not enough: custom properties compute to an unresolved token sequence, so a\n * `light-dark()` value comes back verbatim and is not paintable.\n *\n * Instead we read a real, inherited property (`color`) from a hidden probe\n * element that declares `color: var(--_rsp-gridline)`. The browser resolves\n * `light-dark()` against the probe's inherited `color-scheme`, which yields a\n * paintable `rgb(...)` string that always matches what the DOM is showing.\n */\nconst resolveGridLineColor = (\n probe: HTMLElement | null,\n colorScheme: 'light' | 'dark'\n): string => {\n const fallback = colorScheme === 'dark' ? '#232c3d' : '#e8ebf1';\n\n if (!probe || typeof getComputedStyle !== 'function') {\n return fallback;\n }\n\n const resolved = getComputedStyle(probe).color?.trim();\n\n // A fully transparent result means the probe never received a usable value.\n if (!resolved || resolved.includes('light-dark(') || resolved === 'rgba(0, 0, 0, 0)') {\n return fallback;\n }\n\n return resolved;\n};\n\n/**\n * Keeps consumer-supplied cell fills readable in both color schemes.\n *\n * A custom `backgroundColor` is normally a literal from the document model and\n * has no dark-mode variant, while the grid's default ink follows the active\n * scheme. Pairing a light literal fill with the dark theme's near-white text\n * produces unreadable cells, so when the consumer set a background but no\n * explicit text color we derive a readable one from that background.\n */\nconst withReadableTextColor = (\n style: React.CSSProperties | undefined\n): React.CSSProperties | undefined => {\n if (!style?.backgroundColor || style.color) return style;\n\n const background = style.backgroundColor;\n if (typeof background !== 'string') return style;\n\n const color = getContrastingTextColor(background);\n if (!color) return style;\n\n return { ...style, color };\n};\n\nconst hasBorderStyle = (style?: React.CSSProperties): boolean =>\n Boolean(\n style?.borderColor ||\n style?.borderTopColor ||\n style?.borderRightColor ||\n style?.borderBottomColor ||\n style?.borderLeftColor\n );\n\nconst normalizeFiniteCount = (count: number | undefined): number | undefined => {\n if (count === undefined || count === Infinity) return undefined;\n if (!Number.isFinite(count)) return 0;\n return Math.max(0, Math.floor(count));\n};\n\nconst countToSelectionBound = (count: number | undefined): MaybeInfNumber =>\n count === undefined ? { type: 'infinity' } : { type: 'number', value: count };\n\nconst alignScrollOffset = (\n current: number,\n itemStart: number,\n itemEnd: number,\n viewportSize: number,\n align: SpreadsheetScrollAlignment\n): number => {\n if (viewportSize <= 0) return current;\n if (align === 'start') return itemStart;\n if (align === 'end') return itemEnd - viewportSize;\n if (itemStart < current) return itemStart;\n if (itemEnd > current + viewportSize) return itemEnd - viewportSize;\n return current;\n};\n\nconst hasCellData = (value: SerializedCellValue): boolean => value !== undefined && value !== '';\n\nconst getSparseUsedRange = (\n cellData: Map<string, SerializedCellValue>,\n rowCount?: number,\n columnCount?: number\n) => {\n let minRow = Infinity;\n let maxRow = -1;\n let minCol = Infinity;\n let maxCol = -1;\n\n for (const [reference, value] of cellData) {\n if (!hasCellData(value)) continue;\n\n let rowIndex: number;\n let columnIndex: number;\n try {\n ({ rowIndex, columnIndex } = parseCellReference(reference));\n } catch {\n continue;\n }\n\n if (\n rowIndex < 0 ||\n columnIndex < 0 ||\n (rowCount !== undefined && rowIndex >= rowCount) ||\n (columnCount !== undefined && columnIndex >= columnCount)\n ) {\n continue;\n }\n\n minRow = Math.min(minRow, rowIndex);\n maxRow = Math.max(maxRow, rowIndex);\n minCol = Math.min(minCol, columnIndex);\n maxCol = Math.max(maxCol, columnIndex);\n }\n\n if (maxRow < 0 || maxCol < 0) return undefined;\n\n return {\n start: { row: minRow, col: minCol },\n end: {\n row: { type: 'number' as const, value: maxRow },\n col: { type: 'number' as const, value: maxCol }\n }\n };\n};\n\n/**\n * Excel-style sparse jump navigation along the active row or column.\n * Tables remain authoritative and are handled by SelectionManager's fallback.\n */\nconst resolveSparseNavigationTarget = (\n request: NavigationRequest,\n cellData: Map<string, SerializedCellValue>\n): SMCell | undefined => {\n if (request.kind !== 'jump' || request.table) return undefined;\n\n const isVertical = request.direction === 'up' || request.direction === 'down';\n const movingForward = request.direction === 'down' || request.direction === 'right';\n const originAxis = isVertical ? request.origin.row : request.origin.col;\n const fixedAxis = isVertical ? request.origin.col : request.origin.row;\n const occupied = new Set<number>();\n\n for (const [reference, value] of cellData) {\n if (!hasCellData(value)) continue;\n\n let rowIndex: number;\n let columnIndex: number;\n try {\n ({ rowIndex, columnIndex } = parseCellReference(reference));\n } catch {\n continue;\n }\n\n if ((isVertical ? columnIndex : rowIndex) === fixedAxis) {\n occupied.add(isVertical ? rowIndex : columnIndex);\n }\n }\n\n const step = movingForward ? 1 : -1;\n let targetAxis: number | undefined;\n\n // When the adjacent cell contains data, jump to the end of that contiguous run.\n if (occupied.has(originAxis + step)) {\n targetAxis = originAxis + step;\n while (occupied.has(targetAxis + step)) targetAxis += step;\n } else {\n // Otherwise jump across the blank region to the next populated cell.\n const candidates = [...occupied].filter((index) =>\n movingForward ? index > originAxis : index < originAxis\n );\n if (candidates.length > 0) {\n targetAxis = movingForward ? Math.min(...candidates) : Math.max(...candidates);\n }\n }\n\n if (targetAxis === undefined) return undefined;\n return isVertical\n ? { row: targetAxis, col: request.origin.col }\n : { row: request.origin.row, col: targetAxis };\n};\n\n// Cell component with callback ref for optimal performance\nconst CellComponent = React.memo(\n ({\n value,\n row,\n col,\n selectionManager,\n cellToPixelBase,\n getColumnWidth,\n getRowHeight,\n customCellStyle,\n customCellRenderer,\n inputValue,\n editInputVersion,\n width,\n height\n }: {\n selectionManager: SelectionManager;\n cellToPixelBase: (row: number, col: string) => { x: number; y: number };\n getColumnWidth: (col: string) => number;\n getRowHeight: (row: number) => number;\n customCellStyle?: (cell: CellRenderContext) => React.CSSProperties;\n customCellRenderer?: (cell: CellRenderContext) => React.ReactNode;\n width?: number;\n height?: number;\n inputValue: SerializedCellValue;\n editInputVersion: number;\n } & CellData) => {\n const cellRef = useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n const rowIndex = row - 1; // Convert to 0-based\n const colIndex = columnToIndex(col);\n return selectionManager.setupCellElement(el, {\n row: rowIndex,\n col: colIndex\n });\n }\n },\n [row, col, selectionManager]\n );\n\n // Track hook state changes\n const colIndex = columnToIndex(col);\n const rowIndex = row - 1;\n const isSelected = useSelectionManager(selectionManager, () =>\n selectionManager.isSelected({ row: rowIndex, col: colIndex })\n );\n const isBeingEdited = useSelectionManager(selectionManager, () =>\n selectionManager.isEditingCell(rowIndex, colIndex)\n );\n\n const { x, y } = cellToPixelBase(row, col);\n const cellStyleCallbackData: CellRenderContext = {\n id: `${col}${row}`,\n row: getRowNumber(row),\n col,\n rowIndex: row - 1,\n colIndex: columnToIndex(col),\n value,\n isSelected: isSelected,\n isBeingEdited: isBeingEdited || false\n };\n const customStyle = withReadableTextColor(customCellStyle?.(cellStyleCallbackData));\n\n const canHaveFillHandle = useSelectionManager(selectionManager, () => {\n return selectionManager.canCellHaveFillHandle({\n row: rowIndex,\n col: colIndex\n });\n });\n\n const inputRef = useCallback(\n (el: HTMLTextAreaElement | null) => {\n if (el) {\n const rowIndex = row - 1; // Convert to 0-based\n const colIndex = columnToIndex(col);\n return selectionManager.setupInputElement(el as unknown as HTMLInputElement, {\n rowIndex,\n colIndex\n });\n }\n },\n [row, col, selectionManager]\n );\n\n return (\n <div\n ref={cellRef}\n className={cn('rsp-cell', {\n 'rsp-cell-multiline': typeof value === 'string' && value.includes('\\n'),\n 'rsp-cell-selected': isSelected,\n 'rsp-cell-editing': isBeingEdited,\n // Selection tinting is only applied when the consumer has not taken\n // over the background, so custom borders/fills stay visible.\n 'rsp-cell-plain': !(hasBorderStyle(customStyle) && !customStyle?.backgroundColor)\n })}\n data-testid={`spreadsheet-cell-${col}${row}`}\n style={{\n left: x,\n top: y,\n width: getColumnWidth(col) - 1,\n height: getRowHeight(row) - 1,\n ...customStyle,\n // While editing, the cell must present the plain editor surface. The\n // custom style is applied inline and would otherwise outrank the\n // stylesheet, leaving the typed text on a conditional fill.\n ...(isBeingEdited\n ? { backgroundColor: undefined, color: undefined }\n : null)\n }}\n >\n {isBeingEdited ? (\n <textarea\n key={editInputVersion}\n className=\"rsp-cell-editor\"\n data-testid={`spreadsheet-cell-input-${col}${row}`}\n ref={inputRef}\n defaultValue={inputValue?.toString() ?? ''}\n onKeyDownCapture={(event) => {\n if (event.key === 'Enter') event.preventDefault();\n }}\n style={{\n left: x + 4,\n top: y + 4,\n width,\n height\n }}\n />\n ) : customCellRenderer ? (\n customCellRenderer(cellStyleCallbackData)\n ) : (\n value\n )}\n {canHaveFillHandle && (\n <div\n className=\"rsp-fill-handle\"\n data-fill-handle={true}\n data-testid={`spreadsheet-fill-handle-${col}${row}`}\n />\n )}\n </div>\n );\n }\n);\n\nCellComponent.displayName = 'CellComponent';\n\n// Header component with callback ref for optimal performance\nconst HeaderComponent = React.memo(\n ({\n index,\n type,\n selectionManager,\n reverseHeaders,\n getColumnWidth,\n getRowHeight,\n handleColumnResizeStart,\n handleColumnResizeDoubleClick,\n handleRowResizeStart,\n handleRowResizeDoubleClick\n }: {\n index: number;\n type: 'row' | 'col';\n selectionManager: SelectionManager;\n reverseHeaders?: boolean;\n getColumnWidth: (col: string) => number;\n getRowHeight: (row: number) => number;\n handleColumnResizeStart: (e: React.MouseEvent, col: string) => void;\n handleColumnResizeDoubleClick: (e: React.MouseEvent, col: string) => void;\n handleRowResizeStart: (e: React.MouseEvent, row: number) => void;\n handleRowResizeDoubleClick: (e: React.MouseEvent, row: number) => void;\n }) => {\n const headerRef = useCallback(\n (el: HTMLElement | null) => {\n if (el) {\n return selectionManager.setupHeaderElement(el, index, type);\n }\n },\n [index, type, selectionManager]\n );\n\n // Calculate position and size based on index and type\n const { position, size } = React.useMemo(() => {\n if (type === 'col') {\n const col = indexToColumn(index);\n const width = getColumnWidth(col);\n const height = HEADER_HEIGHT;\n\n // Calculate x position\n let x = 0;\n for (let i = 0; i < index; i++) {\n const colKey = indexToColumn(i);\n x += getColumnWidth(colKey);\n }\n\n return {\n position: { x, y: 0 },\n size: { width, height }\n };\n } else {\n // row header\n const row = index + 1;\n const width = HEADER_WIDTH;\n const height = getRowHeight(row);\n\n // Calculate y position\n let y = 0;\n for (let i = 1; i <= index; i++) {\n y += getRowHeight(i);\n }\n\n return {\n position: { x: 0, y },\n size: { width, height }\n };\n }\n }, [index, type, getColumnWidth, getRowHeight]);\n\n // Check if this header is selected\n const isSelected = useSelectionManager(selectionManager, () => {\n if (type === 'col') {\n return selectionManager.isWholeColSelected(index);\n } else {\n return selectionManager.isWholeRowSelected(index);\n }\n });\n\n const content =\n type === 'col'\n ? reverseHeaders\n ? index + 1\n : indexToColumn(index)\n : reverseHeaders\n ? rowToLetter(index + 1)\n : index + 1;\n\n return (\n <div\n ref={headerRef}\n className={cn('rsp-header', `rsp-header-${type}`, {\n 'rsp-header-selected': isSelected\n })}\n data-testid={`spreadsheet-${type}-header-${type === 'col' ? indexToColumn(index) : index + 1}`}\n style={{\n left: position.x,\n top: position.y,\n width: size.width - 1,\n height: size.height - 1\n }}\n >\n {content}\n {type === 'col' && (\n <div\n className=\"rsp-col-resize-handle\"\n data-testid={`spreadsheet-column-resize-handle-${indexToColumn(index)}`}\n onMouseDown={(e) => handleColumnResizeStart(e, indexToColumn(index))}\n onDoubleClick={(e) => handleColumnResizeDoubleClick(e, indexToColumn(index))}\n />\n )}\n {type === 'row' && (\n <div\n className=\"rsp-row-resize-handle\"\n data-testid={`spreadsheet-row-resize-handle-${index + 1}`}\n onMouseDown={(e) => handleRowResizeStart(e, index + 1)}\n onDoubleClick={(e) => handleRowResizeDoubleClick(e, index + 1)}\n />\n )}\n </div>\n );\n }\n);\n\nHeaderComponent.displayName = 'HeaderComponent';\n\nconst isEditableKeyboardTarget = (target: EventTarget | null): boolean => {\n if (!(target instanceof HTMLElement)) {\n return false;\n }\n\n return Boolean(target.closest('input, textarea, select, [contenteditable=\"true\"]'));\n};\n\n// Types and interfaces\ninterface CellData {\n value: SerializedCellValue;\n /**\n * The row of the cell, e.g. 1, 2, 3, etc.\n */\n row: number;\n /**\n * The column of the cell, e.g. \"A\", \"B\", \"C\", etc.\n */\n col: string;\n}\n\n// Overlay component types (similar to Grid)\nexport interface SpreadsheetChildInitial {\n x: number;\n y: number;\n width: number;\n height: number;\n zoom?: number;\n}\n\nexport interface SpreadsheetChild {\n id: string;\n title: string;\n x: number; // pixel position relative to cell grid (before zoom/scroll applied)\n y: number;\n width: number;\n height: number;\n zoom?: number;\n snapToCells?: boolean;\n cellAnchor?: CellSnapAnchor;\n minimized?: boolean;\n initial?: SpreadsheetChildInitial;\n component: string;\n canClose?: boolean;\n persistent?: boolean;\n props?: any;\n}\n\nexport interface SpreadsheetChildState {\n isSelected: boolean;\n isMinimized: boolean;\n}\n\nexport type SpreadsheetComponent = (child: SpreadsheetChild, state: SpreadsheetChildState) => ReactNode;\n\nconst columnWidthsRecordToMap = (columnWidths?: SpreadsheetColumnWidths): Map<string, number> => {\n return new Map(\n Object.entries(columnWidths || {}).filter((entry): entry is [string, number] => {\n const width = entry[1];\n return typeof width === 'number' && Number.isFinite(width) && width > 0;\n })\n );\n};\n\nconst columnWidthsMapToRecord = (columnWidths: Map<string, number>): SpreadsheetColumnWidths => {\n const result: SpreadsheetColumnWidths = {};\n columnWidths.forEach((width, column) => {\n if (Number.isFinite(width) && width > 0) {\n result[column] = width;\n }\n });\n return result;\n};\n\nconst rowHeightsRecordToMap = (rowHeights?: SpreadsheetRowHeights): Map<number, number> => {\n const entries = Object.entries(rowHeights || {}).flatMap(([row, height]) => {\n const rowNumber = Number(row);\n if (Number.isInteger(rowNumber) && rowNumber > 0 && Number.isFinite(height) && height > 0) {\n return [[rowNumber, height] as [number, number]];\n }\n return [];\n });\n\n return new Map(entries);\n};\n\nconst rowHeightsMapToRecord = (rowHeights: Map<number, number>): SpreadsheetRowHeights => {\n const result: SpreadsheetRowHeights = {};\n rowHeights.forEach((height, row) => {\n if (Number.isInteger(row) && row > 0 && Number.isFinite(height) && height > 0) {\n result[row] = height;\n }\n });\n return result;\n};\n\nconst isSnappedTextBox = (child: SpreadsheetChild): boolean =>\n child.component === 'RichText' && Boolean(child.snapToCells);\n\nconst areCellSnapAnchorsEqual = (a: CellSnapAnchor, b: CellSnapAnchor): boolean =>\n a.startCol === b.startCol && a.startRow === b.startRow && a.endCol === b.endCol && a.endRow === b.endRow;\n\nconst applyCellSnapAnchorToTextBox = (\n child: SpreadsheetChild,\n anchor: CellSnapAnchor,\n columnWidths: Map<string, number>,\n rowHeights: Map<number, number>\n): SpreadsheetChild => {\n const normalizedAnchor = normalizeCellSnapAnchor(anchor);\n const rect = getRectFromCellSnapAnchor(normalizedAnchor, columnWidths, rowHeights);\n\n return {\n ...child,\n snapToCells: true,\n cellAnchor: normalizedAnchor,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height\n };\n};\n\nconst syncSnappedTextBoxRects = (\n children: SpreadsheetChild[],\n columnWidths: Map<string, number>,\n rowHeights: Map<number, number>\n): SpreadsheetChild[] => {\n let changed = false;\n\n const nextChildren = children.map((child) => {\n if (!isSnappedTextBox(child)) {\n return child;\n }\n\n const fallbackAnchor = getCellSnapAnchorFromRect(child, columnWidths, rowHeights);\n const anchor = child.cellAnchor ? normalizeCellSnapAnchor(child.cellAnchor) : fallbackAnchor;\n const rect = getRectFromCellSnapAnchor(anchor, columnWidths, rowHeights);\n const currentAnchor = child.cellAnchor ? normalizeCellSnapAnchor(child.cellAnchor) : undefined;\n const anchorChanged = !currentAnchor || !areCellSnapAnchorsEqual(currentAnchor, anchor);\n const rectChanged =\n child.x !== rect.x || child.y !== rect.y || child.width !== rect.width || child.height !== rect.height;\n\n if (!anchorChanged && !rectChanged) {\n return child;\n }\n\n changed = true;\n return {\n ...child,\n cellAnchor: anchor,\n x: rect.x,\n y: rect.y,\n width: rect.width,\n height: rect.height\n };\n });\n\n return changed ? nextChildren : children;\n};\n\nconst isCellSnapResizeHandle = (handle: string): handle is CellSnapResizeHandle => {\n return (\n handle === 'top' ||\n handle === 'right' ||\n handle === 'bottom' ||\n handle === 'left' ||\n handle === 'top-left' ||\n handle === 'top-right' ||\n handle === 'bottom-left' ||\n handle === 'bottom-right'\n );\n};\n\nexport interface SpreadsheetProps {\n style?: React.CSSProperties;\n /** Extra class name applied to the outer `.rsp-root` element. */\n className?: string;\n containerProps?: React.HTMLAttributes<HTMLDivElement>;\n cellData?: Map<string, SerializedCellValue>;\n onCellDataChange?: (data: Map<string, SerializedCellValue>) => void;\n onCellDataChangeError?: (error: unknown) => void;\n /** Finite number of rows. Omit for an unbounded sheet. */\n rowCount?: number;\n /** Finite number of columns. Omit for an unbounded sheet. */\n columnCount?: number;\n columnWidths?: SpreadsheetColumnWidths;\n onColumnWidthsChange?: (columnWidths: SpreadsheetColumnWidths) => void;\n rowHeights?: SpreadsheetRowHeights;\n onRowHeightsChange?: (rowHeights: SpreadsheetRowHeights) => void;\n customCellStyle?: (cell: CellRenderContext) => React.CSSProperties;\n customCellRenderer?: (cell: CellRenderContext) => React.ReactNode;\n /**\n * Used for saving the value to the cell data. Most useful for parsing a pasted\n * string value to a number.\n */\n parseValue?: (\n value: string,\n cell: {\n id: string;\n row: number;\n col: string;\n rowIndex: number;\n colIndex: number;\n }\n ) => string | number;\n\n selection?: {\n initialState?: Partial<SelectionManagerState>;\n state?: SelectionManagerState;\n onStateChange?: (state: SelectionManagerState) => void;\n effects?: (selectionManager: SelectionManager) => (() => void) | void;\n formats?: Format[];\n /** Data- and table-aware keyboard navigation hooks. */\n navigation?: SelectionNavigationModel;\n };\n\n // Overlay component props\n components?: Record<string, SpreadsheetComponent>;\n overlayChildren?: SpreadsheetChild[];\n selectedOverlayId?: string | null;\n onOverlaySelect?: (childId: string | null) => void;\n onOverlayChildrenChange?: (children: SpreadsheetChild[]) => void;\n overlayPlaceholder?: {\n componentType: string;\n title: string;\n width: number;\n height: number;\n onPlaced: (x: number, y: number) => void;\n onCancel?: () => void;\n };\n /** Whether the parent component is selected (used to gate overlay selection) */\n parentSelected?: boolean;\n}\n\ninterface ViewportState {\n scrollX: number;\n scrollY: number;\n zoom: number;\n}\n\ninterface GridDimensions {\n cellWidth: number;\n cellHeight: number;\n headerWidth: number;\n headerHeight: number;\n}\n\nexport type SpreadsheetScrollAlignment = 'nearest' | 'start' | 'end';\n\nexport interface SpreadsheetScrollToCellOptions {\n align?: SpreadsheetScrollAlignment;\n}\n\n// Ref interface for imperative methods\nexport interface SpreadsheetRef {\n focus: () => void;\n blur: () => void;\n /** Reveal a zero-based cell without changing the selection. */\n scrollToCell: (\n cell: SMCell,\n options?: SpreadsheetScrollToCellOptions\n ) => void;\n}\n\nclass SpreadsheetClipboardManager extends ClipboardUtils {\n constructor(\n private cellDataRef: React.RefObject<Map<string, SerializedCellValue>>,\n private selectionManager: SelectionManager\n ) {\n super();\n }\n public triggerCopy() {\n const extractedCells = this.extractCellsFromSelection(this.selectionManager, this.cellDataRef.current);\n\n if (!extractedCells) return;\n\n const { width, height, cells } = extractedCells;\n\n const exportGrid = this.createExportGrid(width, height);\n\n cells.forEach(({ relative, value }) => {\n const row = exportGrid[relative.rowIndex];\n if (!row) return;\n row[relative.columnIndex] = value === undefined ? '' : String(value);\n });\n\n this.writeToOsClipboard(exportGrid);\n }\n public triggerPaste(updates: CellDataUpdate[]) {\n this.selectionManager.saveCellValues(updates);\n }\n}\n\n// Main component\nexport const Spreadsheet = forwardRef<\n SpreadsheetRef | undefined,\n SpreadsheetProps & {\n disableClipboard?: boolean;\n }\n>(\n (\n {\n style,\n className,\n containerProps,\n cellData: controlledCellData,\n onCellDataChange,\n onCellDataChangeError,\n rowCount,\n columnCount,\n columnWidths: controlledColumnWidths,\n onColumnWidthsChange,\n rowHeights: controlledRowHeights,\n onRowHeightsChange,\n customCellStyle,\n customCellRenderer,\n parseValue,\n selection,\n components,\n overlayChildren: controlledOverlayChildren,\n selectedOverlayId: controlledSelectedOverlayId,\n onOverlaySelect,\n onOverlayChildrenChange,\n overlayPlaceholder,\n parentSelected = true,\n disableClipboard = false\n },\n ref\n ) => {\n const [{ width, height }, containerRef] = useResizeObserver();\n const [containerDivRef, setContainerDivRef] = useState<HTMLDivElement | null>(null);\n // Resolved from the mounted element so a consumer can pin a subtree to\n // light or dark via `color-scheme` and have canvas gridlines follow.\n const colorScheme = useColorScheme(containerDivRef);\n // Hidden element used to read the browser-resolved `--rsp-gridline` color\n // for canvas painting (see `resolveGridLineColor`).\n const gridLineProbeRef = useRef<HTMLSpanElement | null>(null);\n\n // State management\n const [internalCellData, setInternalCellData] = useState<Map<string, SerializedCellValue>>(new Map());\n const [retryingEdit, setRetryingEdit] = useState<{\n rowIndex: number;\n colIndex: number;\n version: number;\n } | null>(null);\n const retryingEditVersionRef = useRef(0);\n\n // Use controlled cellData if provided, otherwise use internal state\n const cellData = controlledCellData ?? internalCellData;\n\n const cellDataRef = useRef(cellData);\n cellDataRef.current = cellData;\n\n const finiteRowCount = normalizeFiniteCount(rowCount);\n const finiteColumnCount = normalizeFiniteCount(columnCount);\n const gridCountsRef = useRef({ rows: finiteRowCount, columns: finiteColumnCount });\n gridCountsRef.current = { rows: finiteRowCount, columns: finiteColumnCount };\n\n const getNumRows = useCallback(\n () => countToSelectionBound(gridCountsRef.current.rows),\n []\n );\n const getNumCols = useCallback(\n () => countToSelectionBound(gridCountsRef.current.columns),\n []\n );\n const getDefaultUsedRange = useCallback(\n () =>\n getSparseUsedRange(\n cellDataRef.current,\n gridCountsRef.current.rows,\n gridCountsRef.current.columns\n ),\n []\n );\n const defaultResolveTarget = useCallback(\n (request: NavigationRequest) =>\n resolveSparseNavigationTarget(request, cellDataRef.current),\n []\n );\n const consumerNavigation = selection?.navigation;\n const navigation = useMemo<SelectionNavigationModel>(\n () => ({\n getUsedRange: consumerNavigation?.getUsedRange ?? getDefaultUsedRange,\n ...(consumerNavigation?.getTableAt\n ? { getTableAt: consumerNavigation.getTableAt }\n : {}),\n resolveTarget: consumerNavigation?.resolveTarget ?? defaultResolveTarget\n }),\n [consumerNavigation, defaultResolveTarget, getDefaultUsedRange]\n );\n\n const selectionManager = useInitializeSelectionManager({\n getNumCols,\n getNumRows,\n initialState: selection?.initialState,\n state: selection?.state,\n onStateChange: selection?.onStateChange,\n containerElement: containerDivRef,\n formats: selection?.formats,\n navigation,\n disableAutoClipboard: true\n });\n\n const effects = selection?.effects;\n useEffect(() => {\n if (effects) {\n return effects(selectionManager);\n }\n }, [selectionManager, effects]);\n\n const isControlled = controlledCellData !== undefined;\n const prevIsControlledRef = useRef(isControlled);\n\n selectionManager.getCellsWithData = (area) => {\n const cells: { rowIndex: number; colIndex: number }[] = [];\n cellData.forEach((value, key) => {\n const { rowIndex, columnIndex } = parseCellReference(key);\n if (\n columnIndex >= area.start.col &&\n (area.end.col.type === 'infinity' || columnIndex <= area.end.col.value) &&\n rowIndex >= area.start.row &&\n (area.end.row.type === 'infinity' || rowIndex <= area.end.row.value)\n ) {\n cells.push({ rowIndex, colIndex: columnIndex });\n }\n });\n return cells;\n };\n\n React.useEffect(() => {\n if (isControlled !== prevIsControlledRef.current) {\n prevIsControlledRef.current = isControlled;\n console.warn(\n `The component went from ${\n prevIsControlledRef.current ? 'controlled' : 'uncontrolled'\n } to ${isControlled ? 'controlled' : 'uncontrolled'}, this is not supported`\n );\n }\n }, [controlledCellData, isControlled]);\n\n const [viewport, setViewport] = useState<ViewportState>({\n scrollX: 0,\n scrollY: 0,\n zoom: 1\n });\n const controlledColumnWidthsMap = useMemo(\n () => (controlledColumnWidths ? columnWidthsRecordToMap(controlledColumnWidths) : undefined),\n [controlledColumnWidths]\n );\n const [internalColumnWidths, setInternalColumnWidths] = useState<Map<string, number>>(() =>\n columnWidthsRecordToMap(controlledColumnWidths)\n );\n const [transientColumnWidths, setTransientColumnWidths] = useState<Map<string, number> | null>(null);\n const columnWidths = transientColumnWidths ?? controlledColumnWidthsMap ?? internalColumnWidths;\n const columnWidthsRef = useRef(columnWidths);\n columnWidthsRef.current = columnWidths;\n const previousControlledColumnWidthsRef = useRef(controlledColumnWidths);\n useEffect(() => {\n if (controlledColumnWidths !== previousControlledColumnWidthsRef.current) {\n previousControlledColumnWidthsRef.current = controlledColumnWidths;\n setTransientColumnWidths(null);\n }\n }, [controlledColumnWidths]);\n const controlledRowHeightsMap = useMemo(\n () => (controlledRowHeights ? rowHeightsRecordToMap(controlledRowHeights) : undefined),\n [controlledRowHeights]\n );\n const [internalRowHeights, setInternalRowHeights] = useState<Map<number, number>>(() =>\n rowHeightsRecordToMap(controlledRowHeights)\n );\n const [transientRowHeights, setTransientRowHeights] = useState<Map<number, number> | null>(null);\n const rowHeights = transientRowHeights ?? controlledRowHeightsMap ?? internalRowHeights;\n const rowHeightsRef = useRef(rowHeights);\n rowHeightsRef.current = rowHeights;\n const previousControlledRowHeightsRef = useRef(controlledRowHeights);\n useEffect(() => {\n if (controlledRowHeights !== previousControlledRowHeightsRef.current) {\n previousControlledRowHeightsRef.current = controlledRowHeights;\n setTransientRowHeights(null);\n }\n }, [controlledRowHeights]);\n\n const [isResizingColumn, setIsResizingColumn] = useState<string | null>(null);\n const [isResizingRow, setIsResizingRow] = useState<number | null>(null);\n const [resizeStartX, setResizeStartX] = useState(0);\n const [resizeStartY, setResizeStartY] = useState(0);\n const [resizeStartSize, setResizeStartSize] = useState(0);\n\n // Overlay state management\n const [internalOverlayChildren, setInternalOverlayChildren] = useState<SpreadsheetChild[]>([]);\n const [transientOverlayChildren, setTransientOverlayChildren] = useState<SpreadsheetChild[] | null>(null);\n const [internalSelectedOverlayId, setInternalSelectedOverlayId] = useState<string | null>(null);\n const [mountedPersistentOverlayIds, setMountedPersistentOverlayIds] = useState<Set<string>>(new Set());\n\n // Placeholder state for overlay placement\n const [placeholderPos, setPlaceholderPos] = useState<{ x: number; y: number } | null>(null);\n\n // Use transient overlay state while dragging/resizing, then commit once the interaction ends.\n const overlayChildren = transientOverlayChildren ?? controlledOverlayChildren ?? internalOverlayChildren;\n const selectedOverlayId =\n controlledSelectedOverlayId !== undefined ? controlledSelectedOverlayId : internalSelectedOverlayId;\n\n const previousControlledOverlayChildrenRef = useRef(controlledOverlayChildren);\n useEffect(() => {\n if (controlledOverlayChildren !== previousControlledOverlayChildrenRef.current) {\n previousControlledOverlayChildrenRef.current = controlledOverlayChildren;\n setTransientOverlayChildren(null);\n }\n }, [controlledOverlayChildren]);\n\n const overlayChildrenRef = useRef<SpreadsheetChild[]>(overlayChildren);\n overlayChildrenRef.current = overlayChildren;\n const overlayInteractionDraftRectsRef = useRef<Record<string, CellSnapRect>>({});\n const pendingSnappedTextBoxLayoutCommitRef = useRef(false);\n\n // Refs\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const overlayContainerRef = useRef<HTMLDivElement>(null);\n const viewportStreamRef = useRef(\n new ViewportStream({\n x: viewport.scrollX,\n y: viewport.scrollY,\n zoom: viewport.zoom\n })\n );\n\n // Update viewport stream when viewport changes\n React.useEffect(() => {\n viewportStreamRef.current.next({\n x: viewport.scrollX,\n y: viewport.scrollY,\n zoom: viewport.zoom\n });\n }, [viewport.scrollX, viewport.scrollY, viewport.zoom]);\n // Grid dimensions\n const gridDims: GridDimensions = useMemo(\n () => ({\n cellWidth: DEFAULT_CELL_WIDTH * viewport.zoom,\n cellHeight: DEFAULT_CELL_HEIGHT * viewport.zoom,\n headerWidth: HEADER_WIDTH * viewport.zoom,\n headerHeight: HEADER_HEIGHT * viewport.zoom\n }),\n [viewport.zoom]\n );\n\n // Handle mouse movement for placeholder positioning\n React.useEffect(() => {\n if (!overlayPlaceholder || !containerDivRef) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const rect = containerDivRef.getBoundingClientRect();\n const mouseX = e.clientX - rect.left;\n const mouseY = e.clientY - rect.top;\n\n // Check if mouse is within the spreadsheet (after headers)\n if (mouseX >= gridDims.headerWidth && mouseY >= gridDims.headerHeight) {\n // Convert screen coordinates to sheet coordinates (centered on cursor)\n const sheetX =\n (mouseX - gridDims.headerWidth + viewport.scrollX) / viewport.zoom - overlayPlaceholder.width / 2;\n const sheetY =\n (mouseY - gridDims.headerHeight + viewport.scrollY) / viewport.zoom -\n overlayPlaceholder.height / 2;\n\n // Clamp to minimum bounds (can't be negative or overlap headers)\n const clampedX = Math.max(0, sheetX);\n const clampedY = Math.max(0, sheetY);\n\n setPlaceholderPos({ x: clampedX, y: clampedY });\n } else {\n // Clear placeholder position when mouse is over headers\n setPlaceholderPos(null);\n }\n };\n\n const handleClick = (e: MouseEvent) => {\n if (placeholderPos) {\n e.stopPropagation();\n // Final bounds check before placement\n const finalX = Math.max(0, placeholderPos.x);\n const finalY = Math.max(0, placeholderPos.y);\n overlayPlaceholder.onPlaced(finalX, finalY);\n setPlaceholderPos(null);\n }\n };\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n overlayPlaceholder.onCancel?.();\n setPlaceholderPos(null);\n }\n };\n\n const handleContextMenu = (e: MouseEvent) => {\n e.preventDefault();\n overlayPlaceholder.onCancel?.();\n setPlaceholderPos(null);\n };\n\n containerDivRef.addEventListener('mousemove', handleMouseMove);\n containerDivRef.addEventListener('click', handleClick);\n window.addEventListener('keydown', handleKeyDown);\n window.addEventListener('contextmenu', handleContextMenu);\n\n return () => {\n containerDivRef.removeEventListener('mousemove', handleMouseMove);\n containerDivRef.removeEventListener('click', handleClick);\n window.removeEventListener('keydown', handleKeyDown);\n window.removeEventListener('contextmenu', handleContextMenu);\n };\n }, [overlayPlaceholder, containerDivRef, viewport, gridDims, placeholderPos]);\n\n const effectsRefOb = {\n onCellDataChange,\n onCellDataChangeError,\n controlledCellData,\n parseValue,\n cellData,\n viewport,\n gridDims,\n height\n };\n const effectsRef = useRef(effectsRefOb);\n effectsRef.current = effectsRefOb;\n\n // Styles are now imported via CSS module\n\n // Helper function to setup canvas with devicePixelRatio scaling\n const setupCanvas = useCallback((canvas: HTMLCanvasElement, width: number, height: number) => {\n const ctx = canvas.getContext('2d');\n if (!ctx) return null;\n\n const devicePixelRatio = window.devicePixelRatio || 1;\n\n // Set actual size in memory (scaled for high-DPI)\n canvas.width = width * devicePixelRatio;\n canvas.height = height * devicePixelRatio;\n\n // Set display size (CSS pixels)\n canvas.style.width = width + 'px';\n canvas.style.height = height + 'px';\n\n // Scale the drawing context so everything draws at the correct size\n ctx.scale(devicePixelRatio, devicePixelRatio);\n\n return ctx;\n }, []);\n\n // Draw main grid on canvas\n const drawGrid = useCallback(() => {\n if (!canvasRef.current || !width || !height) return;\n\n const ctx = setupCanvas(canvasRef.current, width, height);\n if (!ctx) return;\n\n ctx.clearRect(0, 0, width, height);\n // Canvas 2D cannot evaluate CSS, so read the resolved gridline color from\n // a hidden probe element that the browser has already themed for us.\n ctx.strokeStyle = resolveGridLineColor(gridLineProbeRef.current, colorScheme);\n ctx.lineWidth = 1;\n\n // Draw vertical grid lines using custom column widths\n let x = gridDims.headerWidth;\n let colIndex = 0;\n\n // Skip columns before viewport\n while (\n x < viewport.scrollX + gridDims.headerWidth &&\n (finiteColumnCount === undefined || colIndex < finiteColumnCount)\n ) {\n const colWidth = (columnWidths.get(indexToColumn(colIndex)) || DEFAULT_CELL_WIDTH) * viewport.zoom;\n if (x + colWidth > viewport.scrollX + gridDims.headerWidth) {\n break;\n }\n x += colWidth;\n colIndex++;\n }\n\n // Draw visible columns\n while (\n x - viewport.scrollX < width &&\n (finiteColumnCount === undefined || colIndex < finiteColumnCount)\n ) {\n const drawX = x - viewport.scrollX;\n if (drawX >= gridDims.headerWidth && drawX <= width) {\n ctx.beginPath();\n ctx.moveTo(drawX, gridDims.headerHeight);\n ctx.lineTo(drawX, height);\n ctx.stroke();\n }\n const colWidth = (columnWidths.get(indexToColumn(colIndex)) || DEFAULT_CELL_WIDTH) * viewport.zoom;\n x += colWidth;\n colIndex++;\n }\n\n // Draw horizontal grid lines using custom row heights\n let y = gridDims.headerHeight;\n let rowNum = 1;\n\n // Skip rows before viewport\n while (\n y < viewport.scrollY + gridDims.headerHeight &&\n (finiteRowCount === undefined || rowNum <= finiteRowCount)\n ) {\n const rowHeight = (rowHeights.get(rowNum) || DEFAULT_CELL_HEIGHT) * viewport.zoom;\n if (y + rowHeight > viewport.scrollY + gridDims.headerHeight) {\n break;\n }\n y += rowHeight;\n rowNum++;\n }\n\n // Draw visible rows\n while (\n y - viewport.scrollY < height &&\n (finiteRowCount === undefined || rowNum <= finiteRowCount)\n ) {\n const drawY = y - viewport.scrollY;\n if (drawY >= gridDims.headerHeight && drawY <= height) {\n ctx.beginPath();\n ctx.moveTo(gridDims.headerWidth, drawY);\n ctx.lineTo(width, drawY);\n ctx.stroke();\n }\n const rowHeight = (rowHeights.get(rowNum) || DEFAULT_CELL_HEIGHT) * viewport.zoom;\n y += rowHeight;\n rowNum++;\n }\n }, [\n columnWidths,\n finiteColumnCount,\n finiteRowCount,\n gridDims.headerHeight,\n gridDims.headerWidth,\n height,\n rowHeights,\n setupCanvas,\n viewport.scrollX,\n viewport.scrollY,\n viewport.zoom,\n width,\n colorScheme\n ]);\n\n // Get visible cells for rendering - ensure we always render all visible positions\n const getVisibleCells = useCallback(() => {\n if (!width || !height) return [];\n\n const cells: CellData[] = [];\n\n // Find first visible column\n let x = 0;\n let startCol = 0;\n while (\n x < viewport.scrollX &&\n (finiteColumnCount === undefined || startCol < finiteColumnCount)\n ) {\n const colWidth = (columnWidths.get(indexToColumn(startCol)) || DEFAULT_CELL_WIDTH) * viewport.zoom;\n if (x + colWidth > viewport.scrollX) {\n break;\n }\n x += colWidth;\n startCol++;\n }\n\n // Find first visible row\n let y = 0;\n let startRow = 0;\n while (\n y < viewport.scrollY &&\n (finiteRowCount === undefined || startRow < finiteRowCount)\n ) {\n const rowHeight = (rowHeights.get(startRow + 1) || DEFAULT_CELL_HEIGHT) * viewport.zoom;\n if (y + rowHeight > viewport.scrollY) {\n break;\n }\n y += rowHeight;\n startRow++;\n }\n\n // Collect visible cells\n let rowY = y;\n let row = startRow;\n while (\n rowY < viewport.scrollY + height &&\n (finiteRowCount === undefined || row < finiteRowCount)\n ) {\n let colX = x;\n let col = startCol;\n while (\n colX < viewport.scrollX + width &&\n (finiteColumnCount === undefined || col < finiteColumnCount)\n ) {\n const colKey = indexToColumn(col);\n const rowNum = getRowNumber(row);\n const cellKey = `${colKey}${rowNum}`;\n cells.push({\n value: cellData.get(cellKey) ?? '',\n row: rowNum,\n col: colKey\n });\n const colWidth = (columnWidths.get(colKey) || DEFAULT_CELL_WIDTH) * viewport.zoom;\n colX += colWidth;\n col++;\n }\n const rowHeight = (rowHeights.get(row + 1) || DEFAULT_CELL_HEIGHT) * viewport.zoom;\n rowY += rowHeight;\n row++;\n }\n\n return cells;\n }, [\n cellData,\n columnWidths,\n finiteColumnCount,\n finiteRowCount,\n height,\n rowHeights,\n viewport.scrollX,\n viewport.scrollY,\n viewport.zoom,\n width\n ]);\n\n // Get column width (considering custom sizes)\n const getColumnWidth = useCallback(\n (col: string) => {\n return columnWidths.get(col) || DEFAULT_CELL_WIDTH;\n },\n [columnWidths]\n );\n\n // Get row height (considering custom sizes)\n const getRowHeight = useCallback(\n (row: number) => {\n return rowHeights.get(row) || DEFAULT_CELL_HEIGHT;\n },\n [rowHeights]\n );\n\n // Convert cell coordinates to base pixel coordinates (without scroll offset, for container transform)\n const cellToPixelBase = useCallback(\n (row: number, col: string) => {\n const colIndex = columnToIndex(col);\n const rowIndex = row - 1;\n\n // Calculate x position considering custom column widths\n let x = HEADER_WIDTH;\n for (let i = 0; i < colIndex; i++) {\n const colKey = indexToColumn(i);\n x += columnWidths.get(colKey) || DEFAULT_CELL_WIDTH;\n }\n\n // Calculate y position considering custom row heights\n let y = HEADER_HEIGHT;\n for (let i = 1; i <= rowIndex; i++) {\n y += rowHeights.get(i) || DEFAULT_CELL_HEIGHT;\n }\n\n return { x, y };\n },\n [columnWidths, rowHeights]\n );\n\n const clampViewportOffsets = useCallback(\n (scrollX: number, scrollY: number, zoom: number) => {\n const bodyWidth = Math.max(0, width - HEADER_WIDTH * zoom);\n const bodyHeight = Math.max(0, height - HEADER_HEIGHT * zoom);\n const maxScrollX =\n finiteColumnCount === undefined\n ? Infinity\n : Math.max(\n 0,\n getColumnEdgePosition(finiteColumnCount, columnWidths) * zoom - bodyWidth\n );\n const maxScrollY =\n finiteRowCount === undefined\n ? Infinity\n : Math.max(\n 0,\n getRowEdgePosition(finiteRowCount, rowHeights) * zoom - bodyHeight\n );\n\n return {\n scrollX: Math.min(Math.max(0, scrollX), maxScrollX),\n scrollY: Math.min(Math.max(0, scrollY), maxScrollY)\n };\n },\n [columnWidths, finiteColumnCount, finiteRowCount, height, rowHeights, width]\n );\n\n const revealCell = useCallback(\n (\n cell: SMCell,\n options: {\n rowAlign?: SpreadsheetScrollAlignment;\n columnAlign?: SpreadsheetScrollAlignment;\n } = {}\n ) => {\n if (finiteRowCount === 0 || finiteColumnCount === 0) return;\n if (!Number.isFinite(cell.row) || !Number.isFinite(cell.col)) return;\n\n const requestedRow = Math.max(0, Math.floor(cell.row));\n const requestedCol = Math.max(0, Math.floor(cell.col));\n const row =\n finiteRowCount === undefined\n ? requestedRow\n : Math.min(requestedRow, finiteRowCount - 1);\n const col =\n finiteColumnCount === undefined\n ? requestedCol\n : Math.min(requestedCol, finiteColumnCount - 1);\n\n setViewport((previous) => {\n const bodyWidth = Math.max(0, width - HEADER_WIDTH * previous.zoom);\n const bodyHeight = Math.max(0, height - HEADER_HEIGHT * previous.zoom);\n const left = getColumnEdgePosition(col, columnWidths) * previous.zoom;\n const right = getColumnEdgePosition(col + 1, columnWidths) * previous.zoom;\n const top = getRowEdgePosition(row, rowHeights) * previous.zoom;\n const bottom = getRowEdgePosition(row + 1, rowHeights) * previous.zoom;\n const desired = clampViewportOffsets(\n alignScrollOffset(\n previous.scrollX,\n left,\n right,\n bodyWidth,\n options.columnAlign ?? 'nearest'\n ),\n alignScrollOffset(\n previous.scrollY,\n top,\n bottom,\n bodyHeight,\n options.rowAlign ?? 'nearest'\n ),\n previous.zoom\n );\n\n if (\n desired.scrollX === previous.scrollX &&\n desired.scrollY === previous.scrollY\n ) {\n return previous;\n }\n return { ...previous, ...desired };\n });\n },\n [\n clampViewportOffsets,\n columnWidths,\n finiteColumnCount,\n finiteRowCount,\n height,\n rowHeights,\n width\n ]\n );\n\n const scrollToCell = useCallback(\n (cell: SMCell, options: SpreadsheetScrollToCellOptions = {}) => {\n const align = options.align ?? 'nearest';\n revealCell(cell, { rowAlign: align, columnAlign: align });\n },\n [revealCell]\n );\n\n useEffect(\n () =>\n selectionManager.listenToViewportRequest((request) => {\n const isVertical = request.direction === 'up' || request.direction === 'down';\n revealCell(request.cell, {\n rowAlign: isVertical ? request.align : 'nearest',\n columnAlign: isVertical ? 'nearest' : request.align\n });\n }),\n [revealCell, selectionManager]\n );\n\n // Keep an existing viewport valid when finite dimensions or custom sizes shrink.\n useEffect(() => {\n setViewport((previous) => {\n const next = clampViewportOffsets(\n previous.scrollX,\n previous.scrollY,\n previous.zoom\n );\n return next.scrollX === previous.scrollX && next.scrollY === previous.scrollY\n ? previous\n : { ...previous, ...next };\n });\n }, [clampViewportOffsets]);\n\n React.useEffect(() => {\n return selectionManager.listenToUpdateData((updates) => {\n const editingState = selectionManager.isEditing;\n try {\n const { cellData, onCellDataChange } = effectsRef.current;\n const newData = new Map(cellData);\n updates.forEach(({ value, rowIndex, colIndex }) => {\n const key = `${indexToColumn(colIndex)}${rowIndex + 1}`;\n const parseValue = effectsRef.current.parseValue;\n if (value === '') {\n newData.delete(key);\n } else {\n // Apply parse function if provided, otherwise use value as-is\n let parsedValue: number | string = value;\n if (parseValue && typeof value === 'string') {\n // Extract cell info from key (e.g., \"A1\" -> row=1, col=\"A\")\n const match = key.match(/^([A-Z]+)(\\d+)$/);\n const col = match?.[1];\n const rowText = match?.[2];\n if (col && rowText) {\n const row = parseInt(rowText, 10);\n const colIndex = columnToIndex(col);\n const rowIndex = row - 1;\n\n parsedValue = parseValue(value, {\n id: key,\n row,\n col,\n rowIndex,\n colIndex\n });\n }\n }\n newData.set(key, parsedValue);\n }\n });\n onCellDataChange?.(newData);\n setInternalCellData(newData);\n } catch (error) {\n console.error('Failed to update spreadsheet cell data:', error);\n effectsRef.current.onCellDataChangeError?.(error);\n\n const rejectedUpdate = updates.length === 1 ? updates[0] : undefined;\n if (\n editingState.type === 'cell' &&\n rejectedUpdate &&\n rejectedUpdate.rowIndex === editingState.row &&\n rejectedUpdate.colIndex === editingState.col\n ) {\n const rejectedValue = rejectedUpdate.value === undefined ? '' : String(rejectedUpdate.value);\n queueMicrotask(() => {\n retryingEditVersionRef.current += 1;\n setRetryingEdit({\n rowIndex: editingState.row,\n colIndex: editingState.col,\n version: retryingEditVersionRef.current\n });\n selectionManager.editCell(editingState.row, editingState.col, rejectedValue);\n });\n }\n }\n });\n }, [selectionManager]);\n\n const clipboardManager = useMemo(() => {\n return new SpreadsheetClipboardManager(cellDataRef, selectionManager);\n }, [selectionManager]);\n\n React.useEffect(() => {\n if (disableClipboard) return;\n selectionManager.listenToCopy(() => {\n clipboardManager.triggerCopy();\n });\n }, [selectionManager, clipboardManager, disableClipboard]);\n\n React.useEffect(() => {\n if (disableClipboard) return;\n selectionManager.listenToPaste(({ updates }) => {\n clipboardManager.triggerPaste(updates);\n });\n }, [selectionManager, clipboardManager, disableClipboard]);\n\n // Handle wheel events (scroll only, zoom disabled)\n const handleWheel = useCallback(\n (e: WheelEvent) => {\n e.preventDefault();\n e.stopPropagation();\n\n // Always scroll, ignore zoom.\n setViewport((previous) => ({\n ...previous,\n ...clampViewportOffsets(\n previous.scrollX + e.deltaX,\n previous.scrollY + e.deltaY,\n previous.zoom\n )\n }));\n },\n [clampViewportOffsets]\n );\n\n // Overlay interaction handlers\n const commitOverlayChildren = useCallback(\n (children: SpreadsheetChild[]) => {\n overlayChildrenRef.current = children;\n\n if (onOverlayChildrenChange) {\n onOverlayChildrenChange(children);\n setTransientOverlayChildren(children);\n return;\n }\n\n setInternalOverlayChildren(children);\n setTransientOverlayChildren(null);\n },\n [onOverlayChildrenChange]\n );\n\n const updateOverlayChildrenLocally = useCallback(\n (updater: (children: SpreadsheetChild[]) => SpreadsheetChild[]) => {\n const nextChildren = updater(overlayChildrenRef.current);\n overlayChildrenRef.current = nextChildren;\n setTransientOverlayChildren(nextChildren);\n\n if (!onOverlayChildrenChange) {\n setInternalOverlayChildren(nextChildren);\n }\n },\n [onOverlayChildrenChange]\n );\n\n const updateSnappedTextBoxRectsLocally = useCallback(\n (nextColumnWidths: Map<string, number>, nextRowHeights: Map<number, number>) => {\n const nextChildren = syncSnappedTextBoxRects(\n overlayChildrenRef.current,\n nextColumnWidths,\n nextRowHeights\n );\n\n if (nextChildren === overlayChildrenRef.current) {\n return;\n }\n\n overlayChildrenRef.current = nextChildren;\n pendingSnappedTextBoxLayoutCommitRef.current = true;\n setTransientOverlayChildren(nextChildren);\n\n if (!onOverlayChildrenChange) {\n setInternalOverlayChildren(nextChildren);\n }\n },\n [onOverlayChildrenChange]\n );\n\n const commitSnappedTextBoxRects = useCallback(\n (nextColumnWidths: Map<string, number>, nextRowHeights: Map<number, number>) => {\n const nextChildren = syncSnappedTextBoxRects(\n overlayChildrenRef.current,\n nextColumnWidths,\n nextRowHeights\n );\n\n if (nextChildren !== overlayChildrenRef.current) {\n commitOverlayChildren(nextChildren);\n pendingSnappedTextBoxLayoutCommitRef.current = false;\n return;\n }\n\n if (pendingSnappedTextBoxLayoutCommitRef.current) {\n commitOverlayChildren(overlayChildrenRef.current);\n pendingSnappedTextBoxLayoutCommitRef.current = false;\n }\n },\n [commitOverlayChildren]\n );\n\n const updateColumnWidthsLocally = useCallback(\n (updater: (columnWidths: Map<string, number>) => Map<string, number>) => {\n const nextColumnWidths = updater(columnWidthsRef.current);\n columnWidthsRef.current = nextColumnWidths;\n setTransientColumnWidths(nextColumnWidths);\n updateSnappedTextBoxRectsLocally(nextColumnWidths, rowHeightsRef.current);\n\n if (!onColumnWidthsChange) {\n setInternalColumnWidths(nextColumnWidths);\n }\n },\n [onColumnWidthsChange, updateSnappedTextBoxRectsLocally]\n );\n\n const commitColumnWidths = useCallback(\n (nextColumnWidths: Map<string, number>) => {\n columnWidthsRef.current = nextColumnWidths;\n\n if (onColumnWidthsChange) {\n onColumnWidthsChange(columnWidthsMapToRecord(nextColumnWidths));\n setTransientColumnWidths(nextColumnWidths);\n commitSnappedTextBoxRects(nextColumnWidths, rowHeightsRef.current);\n return;\n }\n\n setInternalColumnWidths(nextColumnWidths);\n setTransientColumnWidths(null);\n commitSnappedTextBoxRects(nextColumnWidths, rowHeightsRef.current);\n },\n [commitSnappedTextBoxRects, onColumnWidthsChange]\n );\n\n const updateRowHeightsLocally = useCallback(\n (updater: (rowHeights: Map<number, number>) => Map<number, number>) => {\n const nextRowHeights = updater(rowHeightsRef.current);\n rowHeightsRef.current = nextRowHeights;\n setTransientRowHeights(nextRowHeights);\n updateSnappedTextBoxRectsLocally(columnWidthsRef.current, nextRowHeights);\n\n if (!onRowHeightsChange) {\n setInternalRowHeights(nextRowHeights);\n }\n },\n [onRowHeightsChange, updateSnappedTextBoxRectsLocally]\n );\n\n const commitRowHeights = useCallback(\n (nextRowHeights: Map<number, number>) => {\n rowHeightsRef.current = nextRowHeights;\n\n if (onRowHeightsChange) {\n onRowHeightsChange(rowHeightsMapToRecord(nextRowHeights));\n setTransientRowHeights(nextRowHeights);\n commitSnappedTextBoxRects(columnWidthsRef.current, nextRowHeights);\n return;\n }\n\n setInternalRowHeights(nextRowHeights);\n setTransientRowHeights(null);\n commitSnappedTextBoxRects(columnWidthsRef.current, nextRowHeights);\n },\n [commitSnappedTextBoxRects, onRowHeightsChange]\n );\n\n // Handle column resize\n const handleColumnResizeStart = useCallback(\n (e: React.MouseEvent, col: string) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizingColumn(col);\n setResizeStartX(e.clientX);\n setResizeStartSize(getColumnWidth(col));\n },\n [getColumnWidth]\n );\n\n // Handle row resize\n const handleRowResizeStart = useCallback(\n (e: React.MouseEvent, row: number) => {\n e.preventDefault();\n e.stopPropagation();\n setIsResizingRow(row);\n setResizeStartY(e.clientY);\n setResizeStartSize(getRowHeight(row));\n },\n [getRowHeight]\n );\n\n // Handle resize move\n const handleResizeMove = useCallback(\n (e: MouseEvent) => {\n if (isResizingColumn) {\n const delta = e.clientX - resizeStartX;\n const newWidth = Math.max(20, resizeStartSize + delta / viewport.zoom);\n updateColumnWidthsLocally((prev) => new Map(prev).set(isResizingColumn, newWidth));\n } else if (isResizingRow !== null) {\n const delta = e.clientY - resizeStartY;\n const newHeight = Math.max(20, resizeStartSize + delta / viewport.zoom);\n updateRowHeightsLocally((prev) => new Map(prev).set(isResizingRow, newHeight));\n }\n },\n [\n isResizingColumn,\n isResizingRow,\n resizeStartX,\n resizeStartY,\n resizeStartSize,\n updateColumnWidthsLocally,\n updateRowHeightsLocally,\n viewport.zoom\n ]\n );\n\n // Handle resize end\n const handleResizeEnd = useCallback(() => {\n if (isResizingColumn) {\n commitColumnWidths(columnWidthsRef.current);\n }\n if (isResizingRow !== null) {\n commitRowHeights(rowHeightsRef.current);\n }\n setIsResizingColumn(null);\n setIsResizingRow(null);\n }, [commitColumnWidths, commitRowHeights, isResizingColumn, isResizingRow]);\n\n // Handle resize double click (auto-fit)\n const handleColumnResizeDoubleClick = useCallback(\n (e: React.MouseEvent, col: string) => {\n e.preventDefault();\n e.stopPropagation();\n\n const { viewport, gridDims, height, cellData } = effectsRef.current;\n\n // Measure all visible cells in the column\n let maxWidth = 50; // Minimum width\n\n // Check visible cells\n const startRow = Math.max(0, Math.floor(viewport.scrollY / gridDims.cellHeight));\n const endRow = Math.ceil((viewport.scrollY + height) / gridDims.cellHeight) + 1;\n\n for (let row = startRow; row <= endRow; row++) {\n const cellKey = `${col}${getRowNumber(row)}`;\n const content = cellData.get(cellKey) ?? '';\n if (content) {\n // Estimate text width (rough approximation)\n const estimatedWidth = String(content).length * 8 + 20; // 8px per char + padding\n maxWidth = Math.max(maxWidth, estimatedWidth);\n }\n }\n\n commitColumnWidths(new Map(columnWidthsRef.current).set(col, maxWidth));\n },\n [commitColumnWidths]\n );\n\n // Handle resize double click for rows\n const handleRowResizeDoubleClick = useCallback(\n (e: React.MouseEvent, row: number) => {\n e.preventDefault();\n e.stopPropagation();\n\n // For simplicity, set to a reasonable height\n // In a real implementation, you'd measure the content\n commitRowHeights(new Map(rowHeightsRef.current).set(row, DEFAULT_CELL_HEIGHT));\n },\n [commitRowHeights]\n );\n\n const commitCurrentOverlayChildren = useCallback(() => {\n overlayInteractionDraftRectsRef.current = {};\n commitOverlayChildren(overlayChildrenRef.current);\n }, [commitOverlayChildren]);\n\n const setSelectedOverlay = useCallback(\n (childId: string | null) => {\n if (onOverlaySelect) {\n onOverlaySelect(childId);\n }\n setInternalSelectedOverlayId(childId);\n },\n [onOverlaySelect]\n );\n\n const handleOverlayClick = useCallback(\n (childId: string, e: React.MouseEvent) => {\n e.stopPropagation();\n // Only allow overlay selection if parent is selected\n if (!parentSelected) {\n return;\n }\n // Blur the SelectionManager when selecting an overlay\n selectionManager.blur();\n setSelectedOverlay(childId);\n },\n [setSelectedOverlay, selectionManager, parentSelected]\n );\n\n const handleOverlayBackgroundClick = useCallback(() => {\n setSelectedOverlay(null);\n }, [setSelectedOverlay]);\n\n const getOverlayInteractionDraftRect = useCallback((child: SpreadsheetChild): CellSnapRect => {\n const currentDraft = overlayInteractionDraftRectsRef.current[child.id];\n if (currentDraft) {\n return currentDraft;\n }\n\n const draft = {\n x: child.x,\n y: child.y,\n width: child.width,\n height: child.height\n };\n overlayInteractionDraftRectsRef.current[child.id] = draft;\n return draft;\n }, []);\n\n const handleOverlayMove = useCallback(\n (childId: string, deltaX: number, deltaY: number) => {\n updateOverlayChildrenLocally((children) =>\n children.map((child) => {\n if (child.id !== childId) return child;\n\n if (isSnappedTextBox(child)) {\n const draft = getOverlayInteractionDraftRect(child);\n draft.x = Math.max(0, draft.x + deltaX);\n draft.y = Math.max(0, draft.y + deltaY);\n\n const baseAnchor =\n child.cellAnchor ??\n getCellSnapAnchorFromRect(child, columnWidthsRef.current, rowHeightsRef.current);\n const nextAnchor = moveCellSnapAnchorToNearestOrigin(\n baseAnchor,\n draft,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n\n return applyCellSnapAnchorToTextBox(\n child,\n nextAnchor,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n }\n\n // Constrain overlay position to prevent overlapping with headers\n const newX = Math.max(0, child.x + deltaX);\n const newY = Math.max(0, child.y + deltaY);\n return { ...child, x: newX, y: newY };\n })\n );\n },\n [getOverlayInteractionDraftRect, updateOverlayChildrenLocally]\n );\n\n const handleOverlayResize = useCallback(\n (childId: string, deltaWidth: number, deltaHeight: number, shiftKey: boolean, handle: string) => {\n updateOverlayChildrenLocally((children) =>\n children.map((child) => {\n if (child.id !== childId) return child;\n\n if (isSnappedTextBox(child) && isCellSnapResizeHandle(handle)) {\n const draft = getOverlayInteractionDraftRect(child);\n let nextX = draft.x;\n let nextY = draft.y;\n let nextWidth = draft.width;\n let nextHeight = draft.height;\n\n if (handle === 'left' || handle === 'top-left' || handle === 'bottom-left') {\n nextX = draft.x - deltaWidth;\n nextWidth = draft.width + deltaWidth;\n }\n if (handle === 'right' || handle === 'top-right' || handle === 'bottom-right') {\n nextWidth = draft.width + deltaWidth;\n }\n if (handle === 'top' || handle === 'top-left' || handle === 'top-right') {\n nextY = draft.y - deltaHeight;\n nextHeight = draft.height + deltaHeight;\n }\n if (handle === 'bottom' || handle === 'bottom-left' || handle === 'bottom-right') {\n nextHeight = draft.height + deltaHeight;\n }\n\n if (nextX < 0) {\n nextWidth += nextX;\n nextX = 0;\n }\n if (nextY < 0) {\n nextHeight += nextY;\n nextY = 0;\n }\n\n draft.x = nextX;\n draft.y = nextY;\n draft.width = Math.max(1, nextWidth);\n draft.height = Math.max(1, nextHeight);\n\n const baseAnchor =\n child.cellAnchor ??\n getCellSnapAnchorFromRect(child, columnWidthsRef.current, rowHeightsRef.current);\n const nextAnchor = resizeCellSnapAnchorToNearestEdges(\n baseAnchor,\n draft,\n handle,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n\n return applyCellSnapAnchorToTextBox(\n child,\n nextAnchor,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n }\n\n if (shiftKey && (deltaWidth !== 0 || deltaHeight !== 0)) {\n // Locked aspect ratio mode - adjust zoom\n const currentZoom = child.zoom || 1;\n const currentVisualWidth = child.width;\n const currentVisualHeight = child.height;\n\n const widthScale = deltaWidth !== 0 ? 1 + deltaWidth / currentVisualWidth : 1;\n const heightScale = deltaHeight !== 0 ? 1 + deltaHeight / currentVisualHeight : 1;\n\n let scaleDelta: number;\n if (handle.includes('-')) {\n scaleDelta = Math.abs(widthScale - 1) > Math.abs(heightScale - 1) ? widthScale : heightScale;\n } else if (handle === 'left' || handle === 'right') {\n scaleDelta = widthScale;\n } else if (handle === 'top' || handle === 'bottom') {\n scaleDelta = heightScale;\n } else {\n scaleDelta = Math.max(widthScale, heightScale);\n }\n\n const newZoom = currentZoom * scaleDelta;\n const newWidth = child.width * scaleDelta;\n const newHeight = child.height * scaleDelta;\n const deltaX = newWidth - child.width;\n const deltaY = newHeight - child.height;\n\n let newX = child.x;\n let newY = child.y;\n if (handle === 'left' || handle === 'bottom-left') {\n newX = child.x - deltaX;\n }\n if (handle === 'top' || handle === 'top-right') {\n newY = child.y - deltaY;\n }\n if (handle === 'top-left') {\n newX = child.x - deltaX;\n newY = child.y - deltaY;\n }\n\n // Constrain overlay position to prevent overlapping with headers\n newX = Math.max(0, newX);\n newY = Math.max(0, newY);\n\n return {\n ...child,\n x: newX,\n y: newY,\n width: newWidth,\n height: newHeight,\n zoom: newZoom\n };\n } else {\n // Normal resize mode\n let newX = child.x;\n let newY = child.y;\n if (handle === 'left' || handle === 'bottom-left') {\n newX = child.x - deltaWidth;\n }\n if (handle === 'top' || handle === 'top-right') {\n newY = child.y - deltaHeight;\n }\n if (handle === 'top-left') {\n newX = child.x - deltaWidth;\n newY = child.y - deltaHeight;\n }\n\n // Constrain overlay position to prevent overlapping with headers\n newX = Math.max(0, newX);\n newY = Math.max(0, newY);\n\n return {\n ...child,\n x: newX,\n y: newY,\n width: child.width + deltaWidth,\n height: child.height + deltaHeight,\n zoom: child.zoom\n };\n }\n })\n );\n },\n [getOverlayInteractionDraftRect, updateOverlayChildrenLocally]\n );\n\n const handleOverlaySnapToCellsToggle = useCallback(\n (childId: string, enabled: boolean) => {\n overlayInteractionDraftRectsRef.current = {};\n commitOverlayChildren(\n overlayChildrenRef.current.map((child) => {\n if (child.id !== childId || child.component !== 'RichText') {\n return child;\n }\n\n if (!enabled) {\n return {\n ...child,\n snapToCells: false,\n cellAnchor: undefined\n };\n }\n\n const anchor = getCellSnapAnchorFromRect(child, columnWidthsRef.current, rowHeightsRef.current);\n\n return applyCellSnapAnchorToTextBox(\n child,\n anchor,\n columnWidthsRef.current,\n rowHeightsRef.current\n );\n })\n );\n },\n [commitOverlayChildren]\n );\n\n const handleOverlayReset = useCallback(\n (childId: string) => {\n commitOverlayChildren(\n overlayChildrenRef.current.map((child) => {\n if (child.id !== childId || !child.initial) return child;\n return {\n ...child,\n x: child.initial.x,\n y: child.initial.y,\n width: child.initial.width,\n height: child.initial.height,\n zoom: child.initial.zoom || 1,\n minimized: false\n };\n })\n );\n },\n [commitOverlayChildren]\n );\n\n const handleOverlayMinimize = useCallback(\n (childId: string) => {\n commitOverlayChildren(\n overlayChildrenRef.current.map((child) =>\n child.id === childId && child.component !== 'RichText'\n ? { ...child, minimized: !child.minimized }\n : child\n )\n );\n },\n [commitOverlayChildren]\n );\n\n const handleOverlayClose = useCallback(\n (childId: string) => {\n commitOverlayChildren(overlayChildrenRef.current.filter((child) => child.id !== childId));\n },\n [commitOverlayChildren]\n );\n\n useEffect(() => {\n const handleOverlayDeleteKeyDown = (event: KeyboardEvent) => {\n if (!selectedOverlayId || (event.key !== 'Backspace' && event.key !== 'Delete')) {\n return;\n }\n\n if (isEditableKeyboardTarget(event.target)) {\n return;\n }\n\n const selectedOverlay = overlayChildrenRef.current.find((child) => child.id === selectedOverlayId);\n if (selectedOverlay?.component !== 'RichText') {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n setSelectedOverlay(null);\n handleOverlayClose(selectedOverlayId);\n };\n\n document.addEventListener('keydown', handleOverlayDeleteKeyDown);\n\n return () => {\n document.removeEventListener('keydown', handleOverlayDeleteKeyDown);\n };\n }, [handleOverlayClose, selectedOverlayId, setSelectedOverlay]);\n\n // Effects\n useEffect(() => {\n drawGrid();\n }, [drawGrid]);\n\n // Handle resize mouse events\n useEffect(() => {\n if (isResizingColumn || isResizingRow !== null) {\n document.addEventListener('mousemove', handleResizeMove);\n document.addEventListener('mouseup', handleResizeEnd);\n document.body.style.cursor = isResizingColumn ? 'col-resize' : 'row-resize';\n\n return () => {\n document.removeEventListener('mousemove', handleResizeMove);\n document.removeEventListener('mouseup', handleResizeEnd);\n document.body.style.cursor = '';\n };\n }\n }, [isResizingColumn, isResizingRow, handleResizeMove, handleResizeEnd]);\n\n // Handle editing state changes and additional keypress events\n useEffect(() => {\n const editingCleanup = selectionManager.observeStateChange(\n (state) => state.isEditing.type,\n (type) => {\n if (type !== 'none') {\n // When editing, set up additional event handlers for paste, etc.\n const handleEditingKeydown = (e: KeyboardEvent) => {\n // Handle paste during editing\n if ((e.metaKey || e.ctrlKey) && e.key === 'v') {\n // Let the browser handle paste into the input naturally\n return;\n }\n\n // Handle delete/backspace during editing\n if (e.key === 'Delete' || e.key === 'Backspace') {\n // Let the browser handle these naturally in the input\n return;\n }\n };\n\n window.addEventListener('keydown', handleEditingKeydown);\n return () => {\n window.removeEventListener('keydown', handleEditingKeydown);\n };\n }\n },\n true\n );\n\n return editingCleanup;\n }, [selectionManager]);\n\n // Listen to SelectionManager focus changes - deselect overlays when cells gain focus\n React.useEffect(() => {\n return selectionManager.observeStateChange(\n (state) => state.hasFocus,\n (hasFocus) => {\n if (hasFocus && selectedOverlayId) {\n // SelectionManager gained focus, deselect overlay\n setSelectedOverlay(null);\n }\n }\n );\n }, [selectionManager, selectedOverlayId, setSelectedOverlay]);\n\n // Get visible column headers (just the column info, no positions)\n const getVisibleColumnHeaders = useCallback(() => {\n if (!width) return [];\n\n const headers: { col: string; colIndex: number }[] = [];\n let x = 0;\n let startCol = 0;\n\n // Find the first visible column\n while (\n x < viewport.scrollX &&\n (finiteColumnCount === undefined || startCol < finiteColumnCount)\n ) {\n const col = indexToColumn(startCol);\n const colWidth = getColumnWidth(col) * viewport.zoom;\n if (x + colWidth > viewport.scrollX) {\n break;\n }\n x += colWidth;\n startCol++;\n }\n\n // Collect visible columns\n while (\n x < viewport.scrollX + width &&\n (finiteColumnCount === undefined || startCol < finiteColumnCount)\n ) {\n const col = indexToColumn(startCol);\n const colWidth = getColumnWidth(col) * viewport.zoom;\n headers.push({\n col,\n colIndex: startCol\n });\n x += colWidth;\n startCol++;\n }\n\n return headers;\n }, [finiteColumnCount, width, viewport, getColumnWidth]);\n\n // Get visible row headers (just the row info, no positions)\n const getVisibleRowHeaders = useCallback(() => {\n if (!height) return [];\n\n const headers: { row: number; rowIndex: number }[] = [];\n let y = 0;\n let rowNum = 1;\n\n // Find the first visible row\n while (\n y < viewport.scrollY &&\n (finiteRowCount === undefined || rowNum <= finiteRowCount)\n ) {\n const rowHeight = getRowHeight(rowNum) * viewport.zoom;\n if (y + rowHeight > viewport.scrollY) {\n break;\n }\n y += rowHeight;\n rowNum++;\n }\n\n // Collect visible rows\n while (\n y < viewport.scrollY + height &&\n (finiteRowCount === undefined || rowNum <= finiteRowCount)\n ) {\n const rowHeight = getRowHeight(rowNum) * viewport.zoom;\n headers.push({\n row: rowNum,\n rowIndex: rowNum - 1\n });\n y += rowHeight;\n rowNum++;\n }\n\n return headers;\n }, [finiteRowCount, height, viewport, getRowHeight]);\n\n // Get visible overlays with culling and persistent tracking\n const { visibleOverlays, overlaysToRender } = useMemo(() => {\n if (!width || !height || !overlayChildren) {\n return { visibleOverlays: [], overlaysToRender: [] };\n }\n\n const visible: SpreadsheetChild[] = [];\n const toRender: SpreadsheetChild[] = [];\n const newMountedPersistentIds = new Set(mountedPersistentOverlayIds);\n\n overlayChildren.forEach((child) => {\n // Calculate child's bounds in screen coordinates\n const childLeft = child.x * viewport.zoom - viewport.scrollX + gridDims.headerWidth;\n const childTop = child.y * viewport.zoom - viewport.scrollY + gridDims.headerHeight;\n const childRight = childLeft + child.width * viewport.zoom;\n const childBottom = childTop + child.height * viewport.zoom;\n\n // Calculate viewport bounds with margin\n const margin = 100;\n const viewportLeft = gridDims.headerWidth - margin;\n const viewportTop = gridDims.headerHeight - margin;\n const viewportRight = width + margin;\n const viewportBottom = height + margin;\n\n // Check if overlay is within viewport\n const isVisible =\n childRight >= viewportLeft &&\n childLeft <= viewportRight &&\n childBottom >= viewportTop &&\n childTop <= viewportBottom;\n\n if (isVisible) {\n visible.push(child);\n toRender.push(child);\n if (child.persistent) {\n newMountedPersistentIds.add(child.id);\n }\n } else if (child.persistent && mountedPersistentOverlayIds.has(child.id)) {\n // Persistent child that was previously mounted but is now invisible\n toRender.push(child);\n }\n });\n\n // Update mounted persistent children if changed\n if (\n newMountedPersistentIds.size !== mountedPersistentOverlayIds.size ||\n [...newMountedPersistentIds].some((id) => !mountedPersistentOverlayIds.has(id))\n ) {\n setMountedPersistentOverlayIds(newMountedPersistentIds);\n }\n\n return { visibleOverlays: visible, overlaysToRender: toRender };\n }, [\n overlayChildren,\n viewport.zoom,\n viewport.scrollX,\n viewport.scrollY,\n width,\n height,\n gridDims.headerWidth,\n gridDims.headerHeight,\n mountedPersistentOverlayIds\n ]);\n\n // Render visible cells\n const visibleCells = React.useMemo(() => getVisibleCells(), [getVisibleCells]);\n const visibleColumnHeaders = React.useMemo(() => getVisibleColumnHeaders(), [getVisibleColumnHeaders]);\n const visibleRowHeaders = React.useMemo(() => getVisibleRowHeaders(), [getVisibleRowHeaders]);\n\n const hasFocus = useSelectionManager(selectionManager, () => selectionManager.hasFocus);\n const referenceSelection = useSelectionManager(\n selectionManager,\n () => selectionManager.referenceSelection\n );\n const referenceSelectionRect = useMemo(() => {\n if (referenceSelection.type === 'none') return undefined;\n if (finiteRowCount === 0 || finiteColumnCount === 0) return undefined;\n\n const range = referenceSelection.range;\n const lastVisibleRow = visibleCells.reduce(\n (maximum, cell) => Math.max(maximum, cell.row - 1),\n range.start.row\n );\n const lastVisibleCol = visibleCells.reduce(\n (maximum, cell) => Math.max(maximum, columnToIndex(cell.col)),\n range.start.col\n );\n const rawEndRow =\n range.end.row.type === 'number'\n ? range.end.row.value\n : finiteRowCount === undefined\n ? lastVisibleRow\n : finiteRowCount - 1;\n const rawEndCol =\n range.end.col.type === 'number'\n ? range.end.col.value\n : finiteColumnCount === undefined\n ? lastVisibleCol\n : finiteColumnCount - 1;\n const maxRow = finiteRowCount === undefined ? Infinity : finiteRowCount - 1;\n const maxCol = finiteColumnCount === undefined ? Infinity : finiteColumnCount - 1;\n const startRow = Math.min(Math.max(0, Math.min(range.start.row, rawEndRow)), maxRow);\n const endRow = Math.min(Math.max(0, Math.max(range.start.row, rawEndRow)), maxRow);\n const startCol = Math.min(Math.max(0, Math.min(range.start.col, rawEndCol)), maxCol);\n const endCol = Math.min(Math.max(0, Math.max(range.start.col, rawEndCol)), maxCol);\n const rect = getRectFromCellSnapAnchor(\n {\n startCol,\n startRow,\n endCol: endCol + 1,\n endRow: endRow + 1\n },\n columnWidths,\n rowHeights\n );\n\n return {\n left: HEADER_WIDTH + rect.x,\n top: HEADER_HEIGHT + rect.y,\n width: rect.width,\n height: rect.height\n };\n }, [\n columnWidths,\n finiteColumnCount,\n finiteRowCount,\n referenceSelection,\n rowHeights,\n visibleCells\n ]);\n\n // Add wheel handler to container\n React.useEffect(() => {\n if (!containerDivRef || !hasFocus || !parentSelected) {\n return;\n }\n containerDivRef.addEventListener('wheel', handleWheel, {\n passive: false\n });\n return () => {\n containerDivRef.removeEventListener('wheel', handleWheel);\n };\n }, [containerDivRef, handleWheel, hasFocus, parentSelected]);\n\n // Forward ref\n useImperativeHandle(\n ref,\n () => ({\n focus: () => {\n selectionManager.focus();\n },\n blur: () => {\n selectionManager.blur();\n },\n scrollToCell\n }),\n [scrollToCell, selectionManager]\n );\n\n return (\n <div\n className={cn('rsp-root', className)}\n // A stylesheet cannot read an ancestor's `color-scheme`, so the resolved\n // value is reflected here to drive the light/dark token switch.\n data-rsp-scheme={colorScheme}\n style={{ position: 'relative', ...style }}\n {...containerProps}\n >\n <div style={{ position: 'absolute', inset: 0 }} ref={containerRef}>\n {Boolean(width && height) && (\n <div\n ref={setContainerDivRef}\n className={cn('rsp-container', { 'rsp-focused': hasFocus })}\n data-testid=\"spreadsheet-container\"\n style={{\n width,\n height\n }}\n tabIndex={0}\n >\n {/* Resolves the themed gridline color for the canvas. Kept in the\n DOM (not `display: none`) so the value stays computable. */}\n <span\n ref={gridLineProbeRef}\n aria-hidden=\"true\"\n style={{\n position: 'absolute',\n width: 0,\n height: 0,\n visibility: 'hidden',\n pointerEvents: 'none',\n color: 'var(--_rsp-gridline)'\n }}\n />\n\n <canvas\n ref={canvasRef}\n className=\"rsp-canvas\"\n data-testid=\"spreadsheet-canvas\"\n style={{ width, height }}\n />\n\n {/* Column headers */}\n <div\n className=\"rsp-column-headers\"\n data-testid=\"spreadsheet-column-headers\"\n style={{\n left: gridDims.headerWidth,\n right: 0,\n height: gridDims.headerHeight,\n zIndex: 20\n }}\n >\n <div\n style={{\n transform: `translateX(${-viewport.scrollX}px) scale(${viewport.zoom})`,\n transformOrigin: '0 0'\n }}\n >\n {visibleColumnHeaders.map(({ col, colIndex }) => {\n return (\n <HeaderComponent\n key={col}\n index={colIndex}\n type=\"col\"\n selectionManager={selectionManager}\n getColumnWidth={getColumnWidth}\n getRowHeight={getRowHeight}\n handleColumnResizeStart={handleColumnResizeStart}\n handleColumnResizeDoubleClick={handleColumnResizeDoubleClick}\n handleRowResizeStart={handleRowResizeStart}\n handleRowResizeDoubleClick={handleRowResizeDoubleClick}\n />\n );\n })}\n </div>\n </div>\n\n {/* Row headers */}\n <div\n className=\"rsp-row-headers\"\n data-testid=\"spreadsheet-row-headers\"\n style={{\n top: gridDims.headerHeight,\n bottom: 0,\n width: gridDims.headerWidth,\n zIndex: 20\n }}\n >\n <div\n style={{\n transform: `translateY(${-viewport.scrollY}px) scale(${viewport.zoom})`,\n transformOrigin: '0 0'\n }}\n >\n {visibleRowHeaders.map(({ row, rowIndex }) => {\n return (\n <HeaderComponent\n key={row}\n index={rowIndex}\n type=\"row\"\n selectionManager={selectionManager}\n getColumnWidth={getColumnWidth}\n getRowHeight={getRowHeight}\n handleColumnResizeStart={handleColumnResizeStart}\n handleColumnResizeDoubleClick={handleColumnResizeDoubleClick}\n handleRowResizeStart={handleRowResizeStart}\n handleRowResizeDoubleClick={handleRowResizeDoubleClick}\n />\n );\n })}\n </div>\n </div>\n\n {/* Corner header */}\n <div\n className=\"rsp-corner-header\"\n data-testid=\"spreadsheet-corner-header\"\n style={{\n width: gridDims.headerWidth,\n height: gridDims.headerHeight,\n zIndex: 40\n }}\n />\n\n <div\n className=\"rsp-cells\"\n data-testid=\"spreadsheet-cells\"\n style={{\n transform: `translate(${-viewport.scrollX}px, ${-viewport.scrollY}px) scale(${viewport.zoom})`,\n transformOrigin: '0 0'\n }}\n >\n {visibleCells.map((cell) => (\n <CellComponent\n key={`${cell.col}${cell.row}`}\n value={cellData.get(`${cell.col}${cell.row}`) ?? ''}\n row={cell.row}\n col={cell.col}\n selectionManager={selectionManager}\n cellToPixelBase={cellToPixelBase}\n getColumnWidth={getColumnWidth}\n getRowHeight={getRowHeight}\n customCellStyle={customCellStyle}\n customCellRenderer={customCellRenderer}\n inputValue={cellData.get(`${cell.col}${cell.row}`) ?? ''}\n editInputVersion={\n retryingEdit?.rowIndex === cell.row - 1 &&\n retryingEdit?.colIndex === columnToIndex(cell.col)\n ? retryingEdit.version\n : 0\n }\n width={width}\n height={height}\n />\n ))}\n {referenceSelectionRect && referenceSelection.type !== 'none' && (\n <div\n aria-hidden=\"true\"\n className={cn(\n 'rsp-reference-selection',\n `rsp-reference-selection-${referenceSelection.type}`\n )}\n data-testid=\"spreadsheet-reference-selection\"\n data-reference-id={referenceSelection.id}\n data-reference-phase={referenceSelection.type}\n style={referenceSelectionRect}\n />\n )}\n </div>\n\n {/* Overlay components layer */}\n {components && overlayChildren && overlayChildren.length > 0 && (\n <div\n ref={overlayContainerRef}\n className=\"rsp-overlays\"\n data-testid=\"spreadsheet-overlays\"\n onClick={handleOverlayBackgroundClick}\n >\n {overlaysToRender.map((child) => {\n const isChildVisible = visibleOverlays.includes(child);\n const isSelected = selectedOverlayId === child.id;\n const childZoom = child.zoom || 1;\n const isTextBox = child.component === 'RichText';\n const isMinimized = Boolean(child.minimized && !isTextBox);\n\n return (\n <div\n key={child.id}\n style={{\n position: 'absolute',\n width: child.width,\n height: isMinimized ? 0 : child.height,\n transform: `translate(${\n child.x * viewport.zoom - viewport.scrollX + gridDims.headerWidth\n }px, ${\n child.y * viewport.zoom - viewport.scrollY + gridDims.headerHeight\n }px) scale(${viewport.zoom})`,\n transformOrigin: '0 0',\n display: isChildVisible ? 'block' : 'none',\n pointerEvents: 'auto',\n zIndex: isSelected ? 50 : 5\n }}\n onClick={(e) => handleOverlayClick(child.id, e)}\n >\n <Frame\n child={child}\n isSelected={isSelected}\n zoom={viewport.zoom}\n viewport$={viewportStreamRef.current}\n onMove={(dx, dy) => handleOverlayMove(child.id, dx, dy)}\n onResize={(dw, dh, shift, handle) =>\n handleOverlayResize(child.id, dw, dh, shift, handle)\n }\n onSnapToCellsToggle={(enabled) => handleOverlaySnapToCellsToggle(child.id, enabled)}\n onReset={() => handleOverlayReset(child.id)}\n onMinimize={() => handleOverlayMinimize(child.id)}\n onClose={() => handleOverlayClose(child.id)}\n onInteractionEnd={commitCurrentOverlayChildren}\n />\n {!isMinimized && (\n <div\n style={{\n transform: childZoom !== 1 ? `scale(${childZoom})` : undefined,\n transformOrigin: '0 0',\n width: child.width / childZoom,\n height: child.height / childZoom,\n position: 'absolute',\n overflow: 'hidden',\n top: 0,\n left: 0\n }}\n >\n {components[child.component]?.(child, {\n isSelected,\n isMinimized: !!child.minimized\n })}\n </div>\n )}\n </div>\n );\n })}\n\n {/* Placeholder for overlay placement */}\n {overlayPlaceholder && placeholderPos && (\n <div\n className=\"rsp-overlay-placeholder\"\n style={{\n width: overlayPlaceholder.width,\n height: overlayPlaceholder.height,\n transform: `translate(${\n placeholderPos.x * viewport.zoom - viewport.scrollX + gridDims.headerWidth\n }px, ${\n placeholderPos.y * viewport.zoom - viewport.scrollY + gridDims.headerHeight\n }px) scale(${viewport.zoom})`,\n transformOrigin: '0 0'\n }}\n >\n <div className=\"rsp-overlay-placeholder-label\">\n {overlayPlaceholder.title}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n );\n }\n);\n\nSpreadsheet.displayName = 'Spreadsheet';\n",
6
6
  "import { useCallback, useRef, useState } from \"react\";\n\nexport interface ResizeObserverSize {\n width: number;\n height: number;\n}\n\n/**\n * Observes the size of an element via a callback ref.\n *\n * Returns `[size, ref]` so the consumer can spread the ref onto any element.\n * Falls back to `getBoundingClientRect` once on attach so the first paint has\n * usable dimensions even before the observer fires.\n */\nexport function useResizeObserver<T extends HTMLElement = HTMLDivElement>(): [\n ResizeObserverSize,\n (element: T | null) => void,\n] {\n const [size, setSize] = useState<ResizeObserverSize>({\n width: 0,\n height: 0,\n });\n\n const observerRef = useRef<ResizeObserver | null>(null);\n\n const ref = useCallback((element: T | null) => {\n observerRef.current?.disconnect();\n observerRef.current = null;\n\n if (!element) return;\n\n const rect = element.getBoundingClientRect();\n setSize((previous) =>\n previous.width === rect.width && previous.height === rect.height\n ? previous\n : { width: rect.width, height: rect.height },\n );\n\n if (typeof ResizeObserver === \"undefined\") return;\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (!entry) return;\n\n // `contentRect` is widely supported and sufficient here; border-box\n // sizing is not needed because the grid measures its own padding.\n const { width, height } = entry.contentRect;\n setSize((previous) =>\n previous.width === width && previous.height === height\n ? previous\n : { width, height },\n );\n });\n\n observer.observe(element);\n observerRef.current = observer;\n }, []);\n\n return [size, ref];\n}\n",
7
7
  "import { useEffect, useState } from \"react\";\n\nexport type ColorScheme = \"light\" | \"dark\";\n\n/**\n * Resolves the effective color scheme for canvas painting.\n *\n * CSS handles theming through `light-dark()`, but the 2D canvas context cannot\n * use it, so grid lines need a concrete resolved value. When an element is\n * supplied we read its computed `color-scheme`, which lets a consumer pin a\n * subtree to one mode; otherwise we fall back to the OS preference.\n */\nexport function useColorScheme(element?: HTMLElement | null): ColorScheme {\n const [scheme, setScheme] = useState<ColorScheme>(\"light\");\n\n useEffect(() => {\n if (typeof window === \"undefined\" || !window.matchMedia) return;\n\n const query = window.matchMedia(\"(prefers-color-scheme: dark)\");\n\n const resolve = (): ColorScheme => {\n if (element && typeof getComputedStyle === \"function\") {\n const declared = getComputedStyle(element).colorScheme;\n // Only an explicit single-value declaration overrides the OS setting;\n // \"light dark\" and \"normal\" mean \"follow the user preference\".\n if (declared === \"dark\") return \"dark\";\n if (declared === \"light\") return \"light\";\n }\n return query.matches ? \"dark\" : \"light\";\n };\n\n setScheme(resolve());\n\n const onChange = () => setScheme(resolve());\n query.addEventListener(\"change\", onChange);\n return () => query.removeEventListener(\"change\", onChange);\n }, [element]);\n\n return scheme;\n}\n",
8
8
  "/**\n * Contrast helpers for consumer-supplied cell backgrounds.\n *\n * The grid's default text color is theme-aware (`--rsp-text` resolves through\n * `light-dark()`), but a consumer-supplied `backgroundColor` usually is not —\n * spreadsheet fills typically come from a document model that stores one\n * literal color, e.g. `#f1f5f9`.\n *\n * Without help, a light literal fill combined with the dark theme's near-white\n * text renders as white-on-white and the cell becomes unreadable. These helpers\n * pick a readable ink for a known background instead.\n *\n * Only values we can actually parse are considered. Anything dynamic\n * (`var(...)`, `color-mix(...)`, gradients, `transparent`, unknown keywords)\n * returns `undefined` so the caller keeps the inherited themed color.\n */\n\n/** Text colors used when a background is opaque enough to classify. */\nconst DARK_INK = \"#101828\";\nconst LIGHT_INK = \"#ffffff\";\n\nconst NAMED_COLORS: Record<string, [number, number, number]> = {\n white: [255, 255, 255],\n black: [0, 0, 0],\n red: [255, 0, 0],\n green: [0, 128, 0],\n blue: [0, 0, 255],\n yellow: [255, 255, 0],\n orange: [255, 165, 0],\n purple: [128, 0, 128],\n gray: [128, 128, 128],\n grey: [128, 128, 128],\n silver: [192, 192, 192],\n};\n\ntype Rgba = { r: number; g: number; b: number; a: number };\n\nconst clamp255 = (value: number): number => Math.min(255, Math.max(0, value));\n\n/**\n * Parses hex (#rgb, #rgba, #rrggbb, #rrggbbaa), rgb()/rgba() and a small set of\n * common keywords. Returns `undefined` for anything else.\n */\nexport function parseCssColor(input: string): Rgba | undefined {\n const value = input.trim().toLowerCase();\n\n if (!value || value === \"transparent\" || value === \"currentcolor\" || value === \"inherit\") {\n return undefined;\n }\n\n // Dynamic or computed values cannot be resolved without layout.\n if (value.includes(\"var(\") || value.includes(\"color-mix(\") || value.includes(\"gradient\")) {\n return undefined;\n }\n\n const named = NAMED_COLORS[value];\n if (named) {\n return { r: named[0], g: named[1], b: named[2], a: 1 };\n }\n\n if (value.startsWith(\"#\")) {\n const hex = value.slice(1);\n\n const expand = (part: string): number => parseInt(part + part, 16);\n\n if (hex.length === 3 || hex.length === 4) {\n const r = expand(hex[0]!);\n const g = expand(hex[1]!);\n const b = expand(hex[2]!);\n const a = hex.length === 4 ? expand(hex[3]!) / 255 : 1;\n return Number.isNaN(r + g + b) ? undefined : { r, g, b, a };\n }\n\n if (hex.length === 6 || hex.length === 8) {\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n const a = hex.length === 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1;\n return Number.isNaN(r + g + b) ? undefined : { r, g, b, a };\n }\n\n return undefined;\n }\n\n const rgbMatch = value.match(/^rgba?\\(([^)]+)\\)$/);\n if (rgbMatch) {\n const parts = rgbMatch[1]!.split(/[\\s,/]+/).filter(Boolean);\n if (parts.length < 3) return undefined;\n\n const toChannel = (part: string): number =>\n part.endsWith(\"%\") ? (parseFloat(part) / 100) * 255 : parseFloat(part);\n\n const r = toChannel(parts[0]!);\n const g = toChannel(parts[1]!);\n const b = toChannel(parts[2]!);\n const alphaPart = parts[3];\n const a =\n alphaPart === undefined\n ? 1\n : alphaPart.endsWith(\"%\")\n ? parseFloat(alphaPart) / 100\n : parseFloat(alphaPart);\n\n if ([r, g, b, a].some((channel) => Number.isNaN(channel))) return undefined;\n\n return { r: clamp255(r), g: clamp255(g), b: clamp255(b), a };\n }\n\n return undefined;\n}\n\n/** Relative luminance per WCAG 2.1. */\nexport function relativeLuminance({ r, g, b }: Pick<Rgba, \"r\" | \"g\" | \"b\">): number {\n const channel = (value: number): number => {\n const srgb = value / 255;\n return srgb <= 0.03928 ? srgb / 12.92 : Math.pow((srgb + 0.055) / 1.055, 2.4);\n };\n\n return 0.2126 * channel(r) + 0.7152 * channel(g) + 0.0722 * channel(b);\n}\n\n/**\n * Returns a readable ink for `background`, or `undefined` when the background\n * is unparseable or too translucent to classify (in which case the themed\n * default should keep applying).\n */\nexport function getContrastingTextColor(background: string): string | undefined {\n const color = parseCssColor(background);\n\n // A mostly transparent fill lets the themed surface show through, so the\n // inherited themed text color remains the correct choice.\n if (!color || color.a < 0.5) return undefined;\n\n return relativeLuminance(color) > 0.45 ? DARK_INK : LIGHT_INK;\n}\n",
@@ -14,7 +14,7 @@
14
14
  "/**\n * Inline icons.\n *\n * The library intentionally ships no icon dependency, so the handful of glyphs\n * used by overlay frames are defined here as plain SVG. Paths are from the\n * Material Design icon set (Apache-2.0).\n */\nimport type { SVGProps } from \"react\";\n\ntype IconProps = Omit<SVGProps<SVGSVGElement>, \"size\"> & { size?: number };\n\nconst iconBase = (size: number): SVGProps<SVGSVGElement> => ({\n width: size,\n height: size,\n viewBox: \"0 0 24 24\",\n fill: \"currentColor\",\n \"aria-hidden\": true,\n focusable: false,\n});\n\nexport function DeleteIcon({ size = 16, ...props }: IconProps) {\n return (\n <svg {...iconBase(size)} {...props}>\n <path d=\"M6 19c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7H6v12zM19 4h-3.5l-1-1h-5l-1 1H5v2h14V4z\" />\n </svg>\n );\n}\n\nexport function GridOnIcon({ size = 16, ...props }: IconProps) {\n return (\n <svg {...iconBase(size)} {...props}>\n <path d=\"M20 2H4c-1.1 0-2 .9-2 2v16c0 1.1.9 2 2 2h16c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm0-6H4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4zm6 12h-4v-4h4v4zm0-6h-4v-4h4v4zm0-6h-4V4h4v4z\" />\n </svg>\n );\n}\n\nexport function GridOffIcon({ size = 16, ...props }: IconProps) {\n return (\n <svg {...iconBase(size)} {...props}>\n <path d=\"M8 4v1.45l2 2V4h4v4h-3.45l2 2H14v1.45l2 2V10h4v4h-3.45l2 2H20v1.45l1.71 1.71c.18-.28.29-.6.29-.96V4c0-1.1-.9-2-2-2H4.55L6.55 4H8zm12 0v4h-4V4h4zM1.27 1.27L0 2.55l2 2V20c0 1.1.9 2 2 2h15.46l2 2 1.27-1.27L1.27 1.27zM10 12.55L11.45 14H10v-1.45zm-6-6L5.45 8H4V6.55zM8 20H4v-4h4v4zm0-6H4v-4h4v4zm6 6h-4v-4h4v4zm2 0v-1.45L17.45 20H16z\" />\n </svg>\n );\n}\n",
15
15
  "import type { CSSProperties, ReactNode } from 'react';\n\n/**\n * Initial state for a GridChild component\n */\nexport interface GridChildInitial {\n /** Initial X coordinate in px */\n x: number;\n /** Initial Y coordinate in px */\n y: number;\n /** Initial width in px */\n width: number;\n /** Initial height in px */\n height: number;\n /** Initial zoom/scale (default: 1) */\n zoom?: number;\n}\n\n/**\n * Represents a child component that can be positioned within the Grid.\n * Each child has a position, size, and render function.\n */\nexport interface GridChild {\n /** X coordinate in px */\n x: number;\n /** Y coordinate in px */\n y: number;\n /** Width in px */\n width: number;\n /** Height in px */\n height: number;\n /** Zoom/scale factor for the child (default: 1) */\n zoom?: number;\n /** Whether the child is minimized */\n minimized?: boolean;\n /** Whether the child is maximized (displayed full-screen instead of in grid) */\n maximized?: boolean;\n /** Initial state for reset functionality */\n initial?: GridChildInitial;\n /** Name of the component to render */\n component: string;\n /** Unique identifier for the child */\n id: string;\n /** Display title for the child */\n title: string;\n /**\n * If true, the child will remain mounted even when outside the viewport.\n * Useful for components that need to maintain state or perform background operations.\n */\n persistent?: boolean;\n /** Whether the child can be closed */\n canClose?: boolean;\n /** Props for the component */\n props?: any;\n}\n\nexport interface ChildState {\n /** Whether the child is selected */\n isSelected: boolean;\n /** Whether the child is minimized */\n isMinimized: boolean;\n /** Whether the child is maximized */\n isMaximized: boolean;\n}\n\nexport type GridComponent = (gridChild: GridChild, state: ChildState) => ReactNode;\n\n/**\n * Configuration for a placeholder component that follows the mouse until placed.\n */\nexport interface PlaceholderConfig {\n /** Type of component being placed */\n componentType: string;\n /** Title/name for the placeholder */\n title: string;\n /** Width of the placeholder in pixels */\n width: number;\n /** Height of the placeholder in pixels */\n height: number;\n /** Callback when the placeholder is placed - receives world coordinates */\n onPlaced: (x: number, y: number) => void;\n /** Optional callback when placement is cancelled */\n onCancel?: () => void;\n}\n\n/**\n * Options for zooming to a specific area\n */\nexport interface ZoomToOptions {\n /** Target x coordinate */\n x: number;\n /** Target y coordinate */\n y: number;\n /** Target zoom level */\n zoom?: number;\n /** Whether to animate the transition (default: false) */\n animate?: boolean;\n}\n\n/**\n * Options for focusing on a child component\n */\nexport interface FocusChildOptions {\n /** ID of the child to focus */\n childId: string;\n /** Padding around the child in pixels (default: 200) */\n padding?: number;\n /** Target zoom level (default: 1) */\n zoom?: number;\n /** Whether to animate the transition (default: false) */\n animate?: boolean;\n}\n\n/**\n * Grid component ref API for programmatic control\n */\nexport interface GridRef {\n /** Zoom to a specific position and zoom level */\n zoomTo: (options: ZoomToOptions) => void;\n /** Focus on a specific child component */\n focusChild: (options: FocusChildOptions) => void;\n /** Get current viewport state */\n getViewport: () => ViewportState;\n /** Set viewport state */\n setViewport: (viewport: ViewportState) => void;\n /** Zoom in by one step */\n zoomIn: () => void;\n /** Zoom out by one step */\n zoomOut: () => void;\n /** Reset zoom to 100% */\n resetZoom: () => void;\n}\n\n/**\n * Props for the Grid component.\n */\nexport interface GridProps {\n /** Array of child components to render in the grid */\n children: GridChild[];\n /** Map of component names to their render functions */\n components: Record<string, GridComponent>;\n /** Optional CSS styles for the grid container */\n style?: CSSProperties;\n /** Size of each grid cell in pixels (default: 20) */\n gridSize?: number;\n /** ID of the currently selected child */\n selectedChildId?: string | null;\n /** Callback when a child is selected */\n onChildSelect?: (childId: string | null) => void;\n /** Callback when a component is blurred (deselected) */\n onComponentBlur?: (childId: string) => void;\n /** Callback when viewport changes - used for saving state, not for controlling the viewport */\n onViewportChange?: (viewport: ViewportState) => void;\n /** Callback when children change (for controlled mode) */\n onChildrenChange?: (children: GridChild[]) => void;\n /** Callback when a child requests to be maximized/restored */\n onMaximize?: (childId: string) => void;\n /** Initial viewport state (used only on mount, not controlled) */\n initialViewport?: ViewportState;\n /** Whether to show the background grid lines (default: true) */\n showGrid?: boolean;\n /** Grid rendering style: 'lines' for grid lines, 'dots' for dots at intersections (default: 'lines') */\n gridStyle?: 'lines' | 'dots';\n /** Placeholder configuration for component placement flow */\n placeholder?: PlaceholderConfig;\n /** Whether to show built-in zoom controls (default: true) */\n showZoomControls?: boolean;\n}\n\n/**\n * Represents the current state of the viewport including position and zoom level.\n */\nexport interface ViewportState {\n /** Current X offset of the viewport */\n x: number;\n /** Current Y offset of the viewport */\n y: number;\n /** Current zoom level (1.0 = 100%) */\n zoom: number;\n}\n\nexport type ResizeHandle =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right';\n\n// Simple viewport stream implementation\nexport class ViewportStream {\n currentViewport: ViewportState;\n\n constructor(initialViewport: ViewportState) {\n this.currentViewport = initialViewport;\n }\n\n private subscribers: ((viewport: ViewportState) => void)[] = [];\n\n subscribe(callback: (viewport: ViewportState) => void) {\n this.subscribers.push(callback);\n return () => {\n const index = this.subscribers.indexOf(callback);\n if (index > -1) {\n this.subscribers.splice(index, 1);\n }\n };\n }\n\n next(nextViewport: ViewportState) {\n this.currentViewport = nextViewport;\n this.subscribers.forEach((callback) => callback(nextViewport));\n }\n}\n",
16
16
  "import { DEFAULT_CELL_HEIGHT, DEFAULT_CELL_WIDTH } from './constants';\nimport { indexToColumn } from './utils';\n\nexport interface CellSnapAnchor {\n startCol: number;\n startRow: number;\n endCol: number;\n endRow: number;\n}\n\nexport interface CellSnapRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport type CellSnapResizeHandle =\n | 'top'\n | 'right'\n | 'bottom'\n | 'left'\n | 'top-left'\n | 'top-right'\n | 'bottom-left'\n | 'bottom-right';\n\nexport const normalizeCellSnapAnchor = (anchor: CellSnapAnchor): CellSnapAnchor => {\n const startCol = Math.max(0, Math.floor(anchor.startCol));\n const startRow = Math.max(0, Math.floor(anchor.startRow));\n\n return {\n startCol,\n startRow,\n endCol: Math.max(startCol + 1, Math.floor(anchor.endCol)),\n endRow: Math.max(startRow + 1, Math.floor(anchor.endRow))\n };\n};\n\nconst getColumnWidthByIndex = (colIndex: number, columnWidths: Map<string, number>): number => {\n const width = columnWidths.get(indexToColumn(colIndex));\n return typeof width === 'number' && Number.isFinite(width) && width > 0 ? width : DEFAULT_CELL_WIDTH;\n};\n\nconst getRowHeightByIndex = (rowIndex: number, rowHeights: Map<number, number>): number => {\n const height = rowHeights.get(rowIndex + 1);\n return typeof height === 'number' && Number.isFinite(height) && height > 0 ? height : DEFAULT_CELL_HEIGHT;\n};\n\nexport const getColumnEdgePosition = (edgeIndex: number, columnWidths: Map<string, number>): number => {\n const safeEdgeIndex = Math.max(0, Math.floor(edgeIndex));\n let x = 0;\n\n for (let colIndex = 0; colIndex < safeEdgeIndex; colIndex++) {\n x += getColumnWidthByIndex(colIndex, columnWidths);\n }\n\n return x;\n};\n\nexport const getRowEdgePosition = (edgeIndex: number, rowHeights: Map<number, number>): number => {\n const safeEdgeIndex = Math.max(0, Math.floor(edgeIndex));\n let y = 0;\n\n for (let rowIndex = 0; rowIndex < safeEdgeIndex; rowIndex++) {\n y += getRowHeightByIndex(rowIndex, rowHeights);\n }\n\n return y;\n};\n\nexport const getNearestColumnEdgeIndex = (x: number, columnWidths: Map<string, number>): number => {\n const targetX = Math.max(0, x);\n let edgeIndex = 0;\n let currentX = 0;\n\n while (true) {\n const nextX = currentX + getColumnWidthByIndex(edgeIndex, columnWidths);\n if (targetX <= nextX) {\n return targetX - currentX <= nextX - targetX ? edgeIndex : edgeIndex + 1;\n }\n\n currentX = nextX;\n edgeIndex++;\n }\n};\n\nexport const getNearestRowEdgeIndex = (y: number, rowHeights: Map<number, number>): number => {\n const targetY = Math.max(0, y);\n let edgeIndex = 0;\n let currentY = 0;\n\n while (true) {\n const nextY = currentY + getRowHeightByIndex(edgeIndex, rowHeights);\n if (targetY <= nextY) {\n return targetY - currentY <= nextY - targetY ? edgeIndex : edgeIndex + 1;\n }\n\n currentY = nextY;\n edgeIndex++;\n }\n};\n\nexport const getCellSnapAnchorFromRect = (\n rect: CellSnapRect,\n columnWidths: Map<string, number>,\n rowHeights: Map<number, number>\n): CellSnapAnchor => {\n const startCol = getNearestColumnEdgeIndex(rect.x, columnWidths);\n const startRow = getNearestRowEdgeIndex(rect.y, rowHeights);\n const endCol = getNearestColumnEdgeIndex(rect.x + Math.max(0, rect.width), columnWidths);\n const endRow = getNearestRowEdgeIndex(rect.y + Math.max(0, rect.height), rowHeights);\n\n return normalizeCellSnapAnchor({\n startCol,\n startRow,\n endCol,\n endRow\n });\n};\n\nexport const getRectFromCellSnapAnchor = (\n anchor: CellSnapAnchor,\n columnWidths: Map<string, number>,\n rowHeights: Map<number, number>\n): CellSnapRect => {\n const normalizedAnchor = normalizeCellSnapAnchor(anchor);\n const x = getColumnEdgePosition(normalizedAnchor.startCol, columnWidths);\n const y = getRowEdgePosition(normalizedAnchor.startRow, rowHeights);\n const right = getColumnEdgePosition(normalizedAnchor.endCol, columnWidths);\n const bottom = getRowEdgePosition(normalizedAnchor.endRow, rowHeights);\n\n return {\n x,\n y,\n width: right - x,\n height: bottom - y\n };\n};\n\nexport const moveCellSnapAnchorToNearestOrigin = (\n anchor: CellSnapAnchor,\n rect: CellSnapRect,\n columnWidths: Map<string, number>,\n rowHeights: Map<number, number>\n): CellSnapAnchor => {\n const normalizedAnchor = normalizeCellSnapAnchor(anchor);\n const colSpan = normalizedAnchor.endCol - normalizedAnchor.startCol;\n const rowSpan = normalizedAnchor.endRow - normalizedAnchor.startRow;\n const startCol = getNearestColumnEdgeIndex(rect.x, columnWidths);\n const startRow = getNearestRowEdgeIndex(rect.y, rowHeights);\n\n return {\n startCol,\n startRow,\n endCol: startCol + colSpan,\n endRow: startRow + rowSpan\n };\n};\n\nconst handleIncludesLeft = (handle: CellSnapResizeHandle): boolean =>\n handle === 'left' || handle === 'top-left' || handle === 'bottom-left';\n\nconst handleIncludesRight = (handle: CellSnapResizeHandle): boolean =>\n handle === 'right' || handle === 'top-right' || handle === 'bottom-right';\n\nconst handleIncludesTop = (handle: CellSnapResizeHandle): boolean =>\n handle === 'top' || handle === 'top-left' || handle === 'top-right';\n\nconst handleIncludesBottom = (handle: CellSnapResizeHandle): boolean =>\n handle === 'bottom' || handle === 'bottom-left' || handle === 'bottom-right';\n\nexport const resizeCellSnapAnchorToNearestEdges = (\n anchor: CellSnapAnchor,\n rect: CellSnapRect,\n handle: CellSnapResizeHandle,\n columnWidths: Map<string, number>,\n rowHeights: Map<number, number>\n): CellSnapAnchor => {\n const nextAnchor = normalizeCellSnapAnchor(anchor);\n\n if (handleIncludesLeft(handle)) {\n nextAnchor.startCol = getNearestColumnEdgeIndex(rect.x, columnWidths);\n }\n if (handleIncludesRight(handle)) {\n nextAnchor.endCol = getNearestColumnEdgeIndex(rect.x + Math.max(0, rect.width), columnWidths);\n }\n if (handleIncludesTop(handle)) {\n nextAnchor.startRow = getNearestRowEdgeIndex(rect.y, rowHeights);\n }\n if (handleIncludesBottom(handle)) {\n nextAnchor.endRow = getNearestRowEdgeIndex(rect.y + Math.max(0, rect.height), rowHeights);\n }\n\n if (nextAnchor.startCol >= nextAnchor.endCol) {\n if (handleIncludesLeft(handle) && !handleIncludesRight(handle)) {\n nextAnchor.startCol = Math.max(0, nextAnchor.endCol - 1);\n } else {\n nextAnchor.endCol = nextAnchor.startCol + 1;\n }\n }\n\n if (nextAnchor.startRow >= nextAnchor.endRow) {\n if (handleIncludesTop(handle) && !handleIncludesBottom(handle)) {\n nextAnchor.startRow = Math.max(0, nextAnchor.endRow - 1);\n } else {\n nextAnchor.endRow = nextAnchor.startRow + 1;\n }\n }\n\n return nextAnchor;\n};\n",
17
- "import {\n FormulaEngine,\n type CellAddress,\n type CellStyle,\n type SerializedCellValue,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n indexToColumn,\n parseCellReference,\n getCellReference,\n type RangeAddress\n} from '@ricsam/formula-engine';\n\nimport type { SelectionManager, SMArea } from '@ricsam/selection-manager';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Spreadsheet, type SpreadsheetProps } from '../spreadsheet/spreadsheet';\nimport type {\n CellRenderContext,\n SpreadsheetColumnWidths,\n SpreadsheetRowHeights\n} from '../types';\nimport type { WorkbookSelectionManager } from './workbook-selection-manager';\nimport { cn } from '../utils/cn';\nimport { useSchemeRoot } from '../utils/use-scheme-root';\nimport { type CellDataUpdate, ClipboardUtils } from '../clipboard/clipboard-manager';\nimport { normalizeBorderSides, hasAnyBorderSide } from './border-sides';\nimport { coerceCellInput, getCellDisplayText, getCellDisplayValue } from './cell-data-type';\nimport { queueCellEditError } from './cell-edit-error';\n\nconst getWrapCellStyle = (style?: CellStyle): React.CSSProperties =>\n style?.wrapText\n ? {\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n wordBreak: 'normal',\n textOverflow: 'clip',\n alignItems: 'flex-start'\n }\n : {};\n\nconst getWrapContentStyle = (style?: CellStyle): React.CSSProperties =>\n style?.wrapText\n ? {\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n wordBreak: 'normal',\n textOverflow: 'clip',\n width: '100%',\n minWidth: 0\n }\n : {};\n\nconst getBorderCellStyle = (style?: CellStyle): React.CSSProperties =>\n (() => {\n if (!style?.borderColor) {\n return {};\n }\n\n const borderSides = normalizeBorderSides(style.borderSides, true);\n if (!hasAnyBorderSide(borderSides)) {\n return {};\n }\n\n return {\n ...(borderSides.top && { borderTopColor: style.borderColor }),\n ...(borderSides.right && { borderRightColor: style.borderColor }),\n ...(borderSides.bottom && { borderBottomColor: style.borderColor }),\n ...(borderSides.left && { borderLeftColor: style.borderColor })\n };\n })();\n\n// Icon Components\nconst Edit2Icon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n);\n\nconst CopyIcon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n);\n\nconst Trash2Icon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </svg>\n);\n\nconst PlusIcon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n);\n\nconst MinusIcon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M5 12h14\" />\n </svg>\n);\n\ntype SpreadsheetLayout = {\n columnWidths?: SpreadsheetColumnWidths;\n rowHeights?: SpreadsheetRowHeights;\n};\n\ninterface FormulaSheetProps\n extends Omit<\n SpreadsheetProps,\n | 'selection'\n | 'customCellStyle'\n | 'customCellRenderer'\n | 'components'\n | 'overlayChildren'\n | 'selectedOverlayId'\n | 'onOverlaySelect'\n | 'onOverlayChildrenChange'\n | 'overlayPlaceholder'\n | 'parentSelected'\n > {\n clipboardManager?: WorkbookClipboardManager;\n sheetName: string;\n workbookName: string;\n engine: FormulaEngine;\n verboseErrors?: boolean;\n selection?: SpreadsheetProps['selection'];\n selectionManager?: WorkbookSelectionManager;\n customCellStyle?: (\n cell: CellRenderContext,\n internalStyle: React.CSSProperties\n ) => React.CSSProperties;\n customCellRenderer?: (\n cell: CellRenderContext,\n internalElement: React.ReactNode\n ) => React.ReactNode;\n // Add overlay component props\n components?: SpreadsheetProps['components'];\n overlayChildren?: SpreadsheetProps['overlayChildren'];\n selectedOverlayId?: SpreadsheetProps['selectedOverlayId'];\n onOverlaySelect?: SpreadsheetProps['onOverlaySelect'];\n onOverlayChildrenChange?: SpreadsheetProps['onOverlayChildrenChange'];\n overlayPlaceholder?: SpreadsheetProps['overlayPlaceholder'];\n /** Whether the grid child is selected (controls interactivity) */\n isSelected?: boolean;\n /** Optional toolbar to render above the sheet */\n toolbar?: React.ReactNode;\n /** When true, cells display raw formulas instead of computed values */\n showFormulas?: boolean;\n}\n\nfunction useEngine(engine: FormulaEngine): ReturnType<typeof FormulaEngine.prototype.getState> {\n const [state, setState] = useState<ReturnType<typeof FormulaEngine.prototype.getState>>(() =>\n engine.getState()\n );\n\n React.useEffect(() => {\n return engine.onUpdate(() => {\n setState(engine.getState());\n });\n }, [engine]);\n\n return state;\n}\n\nexport class WorkbookClipboardManager extends ClipboardUtils {\n constructor(private engine: FormulaEngine) {\n super();\n }\n copiedCells: CellAddress[] = [];\n signature: string = '';\n isCut: boolean = false;\n\n public triggerCopy(context: {\n workbookName: string;\n sheetName: string;\n selectionManager: SelectionManager;\n copyType: 'value' | 'formula';\n cut?: boolean;\n }): void {\n const cellData = this.engine.getSheet({\n workbookName: context.workbookName,\n sheetName: context.sheetName\n })?.content;\n if (!cellData) return;\n const extractedCells = this.extractCellsFromSelection(context.selectionManager, cellData);\n if (!extractedCells) return;\n const { width, height, cells } = extractedCells;\n const valueExportGrid = this.createExportGrid(width, height);\n const formulaExportGrid = this.createExportGrid(width, height);\n this.copiedCells = [];\n this.isCut = context.cut ?? false;\n cells.forEach(({ relative, absolute }) => {\n const cellAddress: CellAddress = {\n workbookName: context.workbookName,\n sheetName: context.sheetName,\n colIndex: absolute.columnIndex,\n rowIndex: absolute.rowIndex\n };\n this.copiedCells.push(cellAddress);\n const value = this.engine.getCellValue(cellAddress, false);\n const formula = cellData.get(getCellReference(cellAddress));\n valueExportGrid[relative.rowIndex]![relative.columnIndex] = getCellDisplayValue(value);\n formulaExportGrid[relative.rowIndex]![relative.columnIndex] = formula;\n });\n this.signature = this.getTsvString(context.copyType === 'formula' ? formulaExportGrid : valueExportGrid);\n this.writeToOsClipboard(context.copyType === 'formula' ? formulaExportGrid : valueExportGrid);\n }\n public triggerPaste(context: {\n workbookName: string;\n sheetName: string;\n selectionManager: SelectionManager;\n updates: CellDataUpdate[];\n rawString: string;\n pasteType: 'value' | 'formula';\n }): void {\n if (context.rawString === this.signature) {\n // Internal paste operation - use smartPaste to handle both copy and fill\n const selections = context.selectionManager.selections;\n if (!selections || selections.length === 0) return;\n\n // Convert each SMArea to SpreadsheetRange\n const convertSMAreaToSpreadsheetRange = (area: SMArea): SpreadsheetRange => {\n return {\n start: {\n col: area.start.col,\n row: area.start.row\n },\n end: {\n col:\n area.end.col.type === 'infinity'\n ? { type: 'infinity' as const, sign: 'positive' as const }\n : { type: 'number' as const, value: area.end.col.value },\n row:\n area.end.row.type === 'infinity'\n ? { type: 'infinity' as const, sign: 'positive' as const }\n : { type: 'number' as const, value: area.end.row.value }\n }\n };\n };\n\n const areas = selections.map(convertSMAreaToSpreadsheetRange);\n\n console.log('pasting', { cut: this.isCut });\n this.engine.smartPaste(\n this.copiedCells,\n {\n workbookName: context.workbookName,\n sheetName: context.sheetName,\n areas\n },\n {\n cut: this.isCut,\n type: context.pasteType,\n include: 'all'\n }\n );\n\n // Reset isCut after paste\n this.isCut = false;\n } else {\n // External paste operation\n context.selectionManager.saveCellValues(context.updates);\n }\n }\n}\n\nexport function FormulaSheet({\n sheetName,\n workbookName,\n engine,\n verboseErrors = false,\n selection,\n selectionManager,\n customCellStyle,\n customCellRenderer,\n onCellDataChangeError = queueCellEditError,\n // Add overlay props\n components,\n overlayChildren,\n selectedOverlayId,\n onOverlaySelect,\n onOverlayChildrenChange,\n overlayPlaceholder,\n clipboardManager: controlledClipboardManager,\n isSelected = false,\n toolbar,\n showFormulas = false,\n ...rest\n}: FormulaSheetProps) {\n const schemeRoot = useSchemeRoot();\n const [selectedArea, setSelectedArea] = useState<SMArea | null>(null);\n\n const clipboardManager = React.useMemo(\n () => controlledClipboardManager ?? new WorkbookClipboardManager(engine!),\n [controlledClipboardManager, engine]\n );\n\n const state = useEngine(engine);\n\n const sheet = state.workbooks.get(workbookName)?.sheets.get(sheetName);\n\n // Handle cell data changes from the spreadsheet\n const onCellDataChange = useCallback(\n (updatedSpreadsheet: Map<string, SerializedCellValue>) => {\n const data = new Map<string, SerializedCellValue>(updatedSpreadsheet);\n data.forEach((value, key) => {\n if (typeof value === 'string') {\n const { colIndex, rowIndex } = parseCellReference(key);\n const coercedValue = coerceCellInput(\n value,\n engine.getCellDataType({ workbookName, sheetName, colIndex, rowIndex })\n );\n if (coercedValue === undefined) {\n data.delete(key);\n } else {\n data.set(key, coercedValue);\n }\n }\n });\n engine.setSheetContent({ sheetName, workbookName }, data);\n },\n [sheetName, engine, workbookName]\n );\n\n const passedSelectionEffects = selection?.effects;\n\n // Selection manager effects for tracking cell selection\n const selectionManagerEffects = useCallback(\n (spreadsheetSelectionManager: SelectionManager) => {\n const convertSmAreaToSpreadsheetRange = (area: SMArea): SpreadsheetRange => {\n const rowEnd: SpreadsheetRangeEnd =\n area.end.row.type === 'infinity'\n ? {\n type: 'infinity',\n sign: 'positive'\n }\n : {\n type: 'number',\n value: area.end.row.value\n };\n const colEnd: SpreadsheetRangeEnd =\n area.end.col.type === 'infinity'\n ? {\n type: 'infinity',\n sign: 'positive'\n }\n : {\n type: 'number',\n value: area.end.col.value\n };\n return {\n start: {\n col: area.start.col,\n row: area.start.row\n },\n end: {\n row: rowEnd,\n col: colEnd\n }\n };\n };\n\n const cleanups = [\n spreadsheetSelectionManager.listenToCopy((cut) => {\n console.log('cut??', cut);\n clipboardManager.triggerCopy({\n workbookName,\n sheetName,\n selectionManager: spreadsheetSelectionManager,\n copyType: showFormulas ? 'formula' : 'value',\n cut\n });\n }),\n spreadsheetSelectionManager.listenToPaste(({ updates, rawString }) => {\n clipboardManager.triggerPaste({\n workbookName,\n sheetName,\n selectionManager: spreadsheetSelectionManager,\n updates,\n rawString,\n pasteType: 'formula'\n });\n }),\n spreadsheetSelectionManager.listenToFill((ev) => {\n if (ev.type === 'extend') {\n engine.autoFill(\n { sheetName, workbookName },\n convertSmAreaToSpreadsheetRange(ev.seedRange),\n [convertSmAreaToSpreadsheetRange(ev.fillRange)],\n ev.direction\n );\n } else {\n engine.clearSpreadsheetRange({\n sheetName,\n workbookName,\n range: convertSmAreaToSpreadsheetRange(ev.rangeToClear)\n });\n }\n }),\n spreadsheetSelectionManager.observeStateChange(\n (state) => {\n const currentSelection: SMArea | undefined =\n state.selections.length === 1 ? state.selections[0] : undefined;\n return currentSelection;\n },\n (selection) => {\n setSelectedArea(selection ?? null);\n }\n )\n ];\n\n const handleUndoRedoKeyDown = (event: KeyboardEvent) => {\n if (!spreadsheetSelectionManager.hasFocus) return;\n if (spreadsheetSelectionManager.isEditing.type !== 'none') return;\n\n const target = event.target;\n if (target instanceof HTMLElement) {\n const isEditableTarget =\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT' ||\n target.isContentEditable ||\n Boolean(target.closest('[contenteditable=\"true\"]'));\n\n if (isEditableTarget) return;\n }\n\n if (!event.metaKey && !event.ctrlKey) return;\n\n const key = event.key.toLowerCase();\n const isUndo = key === 'z' && !event.shiftKey;\n const isRedo = key === 'y' || (key === 'z' && event.shiftKey);\n\n if (!isUndo && !isRedo) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (isUndo) {\n engine.undo();\n } else {\n engine.redo();\n }\n };\n\n document.addEventListener('keydown', handleUndoRedoKeyDown);\n cleanups.push(() => {\n document.removeEventListener('keydown', handleUndoRedoKeyDown);\n });\n\n // Register this spreadsheet's SelectionManager with the WorkbookSelectionManager\n if (selectionManager) {\n const workbookManagerCleanup = selectionManager.add(spreadsheetSelectionManager, {\n workbookName,\n sheetName\n });\n cleanups.push(workbookManagerCleanup);\n }\n\n // Call user-provided effects if present\n let userCleanup: (() => void) | void;\n if (passedSelectionEffects) {\n userCleanup = passedSelectionEffects(spreadsheetSelectionManager);\n }\n\n return () => {\n cleanups.forEach((cleanup) => cleanup());\n if (userCleanup) {\n userCleanup();\n }\n };\n },\n [\n clipboardManager,\n engine,\n passedSelectionEffects,\n selectionManager,\n sheetName,\n showFormulas,\n workbookName\n ]\n );\n\n // If the sheet doesn't exist (e.g. during a rename where the engine has\n // updated but React hasn't re-rendered with the new sheet name yet),\n // render nothing. The next render will have the correct sheet name.\n if (!sheet) {\n return (\n <div className=\"rsp-root rsp-workbook\" {...schemeRoot}>\n {toolbar}\n <div style={{ flex: 1 }} />\n </div>\n );\n }\n\n return (\n <div className=\"rsp-root rsp-workbook\" {...schemeRoot}>\n {/* Optional Toolbar */}\n {toolbar}\n\n {/* Main spreadsheet area */}\n <div className=\"rsp-workbook-body\">\n <Spreadsheet\n disableClipboard={true}\n style={{ height: '100%', width: '100%' }}\n cellData={sheet?.content}\n onCellDataChange={onCellDataChange}\n onCellDataChangeError={onCellDataChangeError}\n {...rest}\n // Add overlay props\n components={components}\n overlayChildren={overlayChildren}\n selectedOverlayId={selectedOverlayId}\n onOverlaySelect={onOverlaySelect}\n onOverlayChildrenChange={onOverlayChildrenChange}\n overlayPlaceholder={overlayPlaceholder}\n parentSelected={isSelected}\n selection={{\n ...selection,\n effects: selectionManagerEffects\n }}\n containerProps={\n (isSelected && selectedArea\n ? {\n 'data-grid-no-interaction': 'true'\n }\n : {}) as React.HTMLAttributes<HTMLDivElement>\n }\n customCellStyle={(cell) => {\n // Check for conditional styling first\n const conditionalStyle = engine.getCellStyle({\n sheetName,\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex,\n workbookName\n });\n\n const tableInfo = engine.isCellInTable({\n sheetName,\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex,\n workbookName\n });\n\n if (!tableInfo) {\n // Not in a table, apply the engine style first and always give the\n // consumer a chance to augment it. Reference highlights, search\n // results and other transient decorations commonly target plain\n // cells, so limiting this callback to table cells makes the API\n // ineffective for those use cases.\n const style: React.CSSProperties = conditionalStyle\n ? {\n ...(conditionalStyle.backgroundColor && {\n backgroundColor: conditionalStyle.backgroundColor\n }),\n ...(conditionalStyle.color && {\n color: conditionalStyle.color\n }),\n ...(conditionalStyle.fontSize && {\n fontSize: conditionalStyle.fontSize\n }),\n ...(conditionalStyle.bold && {\n fontWeight: 'bold' as const\n }),\n ...(conditionalStyle.italic && {\n fontStyle: 'italic' as const\n }),\n ...(conditionalStyle.underline && {\n textDecoration: 'underline'\n }),\n ...getBorderCellStyle(conditionalStyle),\n ...getWrapCellStyle(conditionalStyle)\n }\n : {};\n\n return customCellStyle ? customCellStyle(cell, style) : style;\n }\n\n const isHeaderRow = cell.rowIndex === tableInfo.start.rowIndex;\n const isFirstColumn = cell.colIndex === tableInfo.start.colIndex;\n const isLastColumn = cell.colIndex === tableInfo.start.colIndex + tableInfo.headers.size - 1;\n\n // Calculate if this is the last row of the table\n const isLastRow =\n tableInfo.endRow.type === 'number' ? cell.rowIndex === tableInfo.endRow.value : false; // For infinite tables, we don't style the last row differently\n\n // Excel-like table styling. These custom properties are declared in\n // the package stylesheet (`styles.css`) and resolve through\n // `light-dark()`, so tables follow the active color scheme.\n const style: React.CSSProperties = {\n border: '1px solid var(--_rsp-table-border-light)'\n };\n\n if (isHeaderRow) {\n // Header row styling - accent theme like Excel\n style.backgroundColor = 'var(--_rsp-table-header-bg)';\n style.color = 'var(--_rsp-table-header-color)';\n style.fontWeight = 'bold';\n style.borderBottom = '2px solid var(--_rsp-table-header-border)';\n } else {\n // Data rows - alternating background\n const dataRowIndex = cell.rowIndex - tableInfo.start.rowIndex - 1;\n if (dataRowIndex % 2 === 0) {\n style.backgroundColor = 'var(--_rsp-table-even-row-bg)';\n } else {\n style.backgroundColor = 'var(--_rsp-table-odd-row-bg)';\n }\n }\n\n // Border styling\n if (isFirstColumn) {\n style.borderLeft = '2px solid var(--_rsp-table-border-color)';\n }\n if (isLastColumn) {\n style.borderRight = '2px solid var(--_rsp-table-border-color)';\n }\n if (isHeaderRow) {\n style.borderTop = '2px solid var(--_rsp-table-border-color)';\n }\n if (isLastRow) {\n style.borderBottom = '2px solid var(--_rsp-table-border-color)';\n }\n\n // Merge conditional styling with table styling\n // User custom styles can now override table header styles\n if (conditionalStyle?.backgroundColor) {\n style.backgroundColor = conditionalStyle.backgroundColor;\n }\n // Apply text color from conditional styling (overrides header white text if user wants)\n if (conditionalStyle?.color) {\n style.color = conditionalStyle.color;\n }\n // Apply font size from conditional styling\n if (conditionalStyle?.fontSize) {\n style.fontSize = conditionalStyle.fontSize;\n }\n // Apply bold from conditional styling (merge with header row bold)\n if (conditionalStyle?.bold) {\n style.fontWeight = 'bold';\n }\n // Apply italic from conditional styling\n if (conditionalStyle?.italic) {\n style.fontStyle = 'italic';\n }\n // Apply underline from conditional styling\n if (conditionalStyle?.underline) {\n style.textDecoration = 'underline';\n }\n Object.assign(style, getBorderCellStyle(conditionalStyle));\n Object.assign(style, getWrapCellStyle(conditionalStyle));\n\n if (customCellStyle) {\n return customCellStyle(cell, style);\n }\n\n return style;\n }}\n customCellRenderer={(cell) => {\n const cellRef = getCellReference({\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex\n });\n\n // When showFormulas is enabled, display the raw cell content (formula string)\n // instead of the computed value from the engine\n const value = showFormulas\n ? sheet?.content.get(cellRef)\n : engine.getCellValue(\n {\n sheetName,\n workbookName,\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex\n },\n verboseErrors\n );\n\n const conditionalStyle = engine.getCellStyle({\n sheetName,\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex,\n workbookName\n });\n\n const conditionalStyleProps: React.CSSProperties = {};\n if (conditionalStyle?.backgroundColor) {\n conditionalStyleProps.backgroundColor = conditionalStyle.backgroundColor;\n }\n if (conditionalStyle?.color) {\n conditionalStyleProps.color = conditionalStyle.color;\n }\n if (conditionalStyle?.fontSize) {\n conditionalStyleProps.fontSize = conditionalStyle.fontSize;\n }\n if (conditionalStyle?.bold) {\n conditionalStyleProps.fontWeight = 'bold';\n }\n if (conditionalStyle?.italic) {\n conditionalStyleProps.fontStyle = 'italic';\n }\n if (conditionalStyle?.underline) {\n conditionalStyleProps.textDecoration = 'underline';\n }\n Object.assign(conditionalStyleProps, getWrapContentStyle(conditionalStyle));\n\n let defaultElement: React.ReactNode;\n if (showFormulas) {\n // In show-formulas mode, always render raw content as-is (no number formatting)\n defaultElement = (\n <div\n data-conditional-background={conditionalStyle?.backgroundColor}\n data-conditional-text-color={conditionalStyle?.color}\n style={conditionalStyleProps}\n >\n {getCellDisplayText(value)}\n </div>\n );\n } else if (typeof value === 'boolean') {\n defaultElement = (\n <div\n data-conditional-background={conditionalStyle?.backgroundColor}\n data-conditional-text-color={conditionalStyle?.color}\n data-type=\"boolean\"\n style={{\n ...conditionalStyleProps,\n width: '100%',\n textAlign: 'center',\n fontFamily: \"'Courier New', monospace\"\n }}\n >\n {value ? 'TRUE' : 'FALSE'}\n </div>\n );\n } else if (typeof value === 'number') {\n // Format numbers nicely\n defaultElement = (\n <div\n data-conditional-background={conditionalStyle?.backgroundColor}\n data-conditional-text-color={conditionalStyle?.color}\n data-type=\"number\"\n style={{ ...conditionalStyleProps, width: '100%', textAlign: 'right' }}\n >\n {value.toLocaleString('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 10\n })}\n </div>\n );\n } else {\n defaultElement = (\n <div\n data-conditional-background={conditionalStyle?.backgroundColor}\n data-conditional-text-color={conditionalStyle?.color}\n style={{ ...conditionalStyleProps, width: '100%', textAlign: 'left' }}\n >\n {getCellDisplayText(value)}\n </div>\n );\n }\n\n if (customCellRenderer) {\n return customCellRenderer(cell, defaultElement);\n }\n return defaultElement;\n }}\n />\n </div>\n </div>\n );\n}\n\ninterface FormulaWorkbookProps\n extends Omit<\n SpreadsheetProps,\n | 'cellData'\n | 'onCellDataChange'\n | 'selection'\n | 'customCellStyle'\n | 'customCellRenderer'\n | 'components'\n | 'overlayChildren'\n | 'selectedOverlayId'\n | 'onOverlaySelect'\n | 'onOverlayChildrenChange'\n | 'overlayPlaceholder'\n | 'parentSelected'\n | 'columnWidths'\n | 'onColumnWidthsChange'\n | 'rowHeights'\n | 'onRowHeightsChange'\n > {\n workbookName: string;\n clipboardManager?: WorkbookClipboardManager;\n engine: FormulaEngine;\n activeSheet?: string;\n onActiveSheetChange?: (sheetName: string) => void;\n verboseErrors?: boolean;\n selection?: SpreadsheetProps['selection'];\n selectionManager?: WorkbookSelectionManager;\n customCellStyle?: (\n cell: CellRenderContext,\n internalStyle: React.CSSProperties\n ) => React.CSSProperties;\n customCellRenderer?: (\n cell: CellRenderContext,\n internalElement: React.ReactNode\n ) => React.ReactNode;\n // Add overlay component props with per-sheet support\n components?: SpreadsheetProps['components'];\n // Map of sheet name to overlay children for that sheet\n sheetOverlayChildren?: Record<string, SpreadsheetProps['overlayChildren']>;\n // Map of sheet name to selected overlay ID for that sheet\n sheetSelectedOverlayIds?: Record<string, SpreadsheetProps['selectedOverlayId']>;\n sheetLayouts?: Record<string, SpreadsheetLayout>;\n onSheetColumnWidthsChange?: (sheetName: string, columnWidths: SpreadsheetColumnWidths) => void;\n onSheetRowHeightsChange?: (sheetName: string, rowHeights: SpreadsheetRowHeights) => void;\n onOverlaySelect?: (sheetName: string, overlayId: string | null) => void;\n onOverlayChildrenChange?: (\n sheetName: string,\n children: NonNullable<SpreadsheetProps['overlayChildren']>\n ) => void;\n overlayPlaceholder?: SpreadsheetProps['overlayPlaceholder'];\n /** Whether the grid child is selected (controls interactivity) */\n isSelected?: boolean;\n /** Optional toolbar to render above the workbook */\n toolbar?: React.ReactNode;\n /** When true, cells display raw formulas instead of computed values */\n showFormulas?: boolean;\n}\n\nexport function FormulaWorkbook({\n clipboardManager: controlledClipboardManager,\n workbookName,\n engine,\n activeSheet: controlledActiveSheet,\n onActiveSheetChange,\n verboseErrors = false,\n selectionManager,\n // Add overlay props\n components,\n sheetOverlayChildren,\n sheetSelectedOverlayIds,\n sheetLayouts,\n onSheetColumnWidthsChange,\n onSheetRowHeightsChange,\n onOverlaySelect,\n onOverlayChildrenChange,\n overlayPlaceholder,\n isSelected = false,\n toolbar,\n showFormulas = false,\n ...rest\n}: FormulaWorkbookProps) {\n const schemeRoot = useSchemeRoot();\n const state = useEngine(engine);\n const [renamingSheet, setRenamingSheet] = useState<string | null>(null);\n const [newSheetName, setNewSheetName] = useState<string>('');\n const [spreadsheetZoom, setSpreadsheetZoom] = useState(1);\n const renameCommittedRef = useRef(false);\n\n const clipboardManager = React.useMemo(\n () => controlledClipboardManager ?? new WorkbookClipboardManager(engine!),\n [controlledClipboardManager, engine]\n );\n\n // Recompute on every render because the engine mutates sheet maps in place.\n // Depending on the Map reference in useMemo makes tab order stale after updates.\n const sheetNames = engine.getOrderedSheetNames(workbookName);\n\n // Internal state for uncontrolled mode\n const [internalActiveSheet, setInternalActiveSheet] = useState<string>(() => {\n return sheetNames[0] || '';\n });\n\n // Track if component is controlled\n const isControlledRef = useRef(controlledActiveSheet !== undefined);\n\n // Check for controlled/uncontrolled mode changes\n React.useEffect(() => {\n const isCurrentlyControlled = controlledActiveSheet !== undefined;\n if (isControlledRef.current !== isCurrentlyControlled) {\n console.error(\n `FormulaWorkbook: Component changed from ${isControlledRef.current ? 'controlled' : 'uncontrolled'} to ${isCurrentlyControlled ? 'controlled' : 'uncontrolled'} mode. ` +\n `A component should not switch between controlled and uncontrolled modes. ` +\n `Decide between using activeSheet and onActiveSheetChange props (controlled) or neither (uncontrolled) for the lifetime of the component.`\n );\n }\n isControlledRef.current = isCurrentlyControlled;\n }, [controlledActiveSheet]);\n\n // Use controlled value if provided, otherwise use internal state\n const activeSheet = controlledActiveSheet ?? internalActiveSheet;\n\n // Handle sheet changes\n const handleActiveSheetChange = useCallback(\n (sheetName: string) => {\n if (onActiveSheetChange) {\n // Controlled mode\n onActiveSheetChange(sheetName);\n } else {\n // Uncontrolled mode\n setInternalActiveSheet(sheetName);\n }\n },\n [onActiveSheetChange]\n );\n\n // Get overlay and layout data for the active sheet\n const activeSheetOverlayChildren = sheetOverlayChildren?.[activeSheet];\n const activeSheetSelectedOverlayId = sheetSelectedOverlayIds?.[activeSheet];\n const activeSheetColumnWidths = sheetLayouts?.[activeSheet]?.columnWidths;\n const activeSheetRowHeights = sheetLayouts?.[activeSheet]?.rowHeights;\n\n // Create sheet-specific callbacks\n const handleOverlaySelect = useCallback(\n (overlayId: string | null) => {\n onOverlaySelect?.(activeSheet, overlayId);\n },\n [onOverlaySelect, activeSheet]\n );\n\n const handleOverlayChildrenChange = useCallback(\n (children: NonNullable<SpreadsheetProps['overlayChildren']>) => {\n onOverlayChildrenChange?.(activeSheet, children);\n },\n [onOverlayChildrenChange, activeSheet]\n );\n\n const handleColumnWidthsChange = useCallback(\n (columnWidths: SpreadsheetColumnWidths) => {\n onSheetColumnWidthsChange?.(activeSheet, columnWidths);\n },\n [activeSheet, onSheetColumnWidthsChange]\n );\n\n const handleRowHeightsChange = useCallback(\n (rowHeights: SpreadsheetRowHeights) => {\n onSheetRowHeightsChange?.(activeSheet, rowHeights);\n },\n [activeSheet, onSheetRowHeightsChange]\n );\n\n // Add new sheet handler\n const addSheet = () => {\n try {\n const newSheet = engine.createSheet({\n workbookName\n });\n\n // Switch to the new sheet\n handleActiveSheetChange(newSheet.name);\n } catch (error) {\n console.error('Failed to add sheet:', error);\n }\n };\n\n // Start renaming a sheet\n const startRenaming = (sheetName: string) => {\n renameCommittedRef.current = false;\n setRenamingSheet(sheetName);\n setNewSheetName(sheetName);\n };\n\n // Cancel renaming\n const cancelRenaming = () => {\n setRenamingSheet(null);\n setNewSheetName('');\n };\n\n // Rename sheet\n const renameSheet = (oldName: string, newName: string) => {\n // Guard against double-fire (e.g. onBlur firing after onKeyDown already committed)\n if (renameCommittedRef.current) {\n cancelRenaming();\n return;\n }\n\n if (!newName.trim() || newName.trim() === oldName) {\n cancelRenaming();\n return;\n }\n\n try {\n renameCommittedRef.current = true;\n engine.renameSheet({\n workbookName,\n sheetName: oldName,\n newSheetName: newName.trim()\n });\n\n // Update active sheet if we renamed the active one\n if (activeSheet === oldName) {\n handleActiveSheetChange(newName.trim());\n }\n\n cancelRenaming();\n } catch (error) {\n console.error('Failed to rename sheet:', error);\n cancelRenaming();\n }\n };\n\n // Delete sheet\n const deleteSheet = (sheetName: string) => {\n if (sheetNames.length <= 1) {\n console.error('Cannot delete the last sheet');\n return;\n }\n\n try {\n engine.removeSheet({ workbookName, sheetName });\n\n // If we deleted the active sheet, switch to the first available sheet\n if (activeSheet === sheetName) {\n const remainingSheets = sheetNames.filter((name) => name !== sheetName);\n const nextSheet = remainingSheets[0];\n if (nextSheet) {\n handleActiveSheetChange(nextSheet);\n }\n }\n } catch (error) {\n console.error('Failed to delete sheet:', error);\n }\n };\n\n return (\n <div className=\"rsp-root rsp-workbook\" {...schemeRoot}>\n {/* Optional Toolbar */}\n {toolbar}\n\n {/* Workbook Header */}\n <div className=\"rsp-workbook-header\">\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n <span className=\"rsp-workbook-name\" data-testid={`workbook-name-${workbookName}`}>\n {workbookName}\n </span>\n </div>\n <span className=\"rsp-zoom-value\" data-testid={`sheet-count-${workbookName}`}>\n Sheets: {sheetNames.length}\n </span>\n </div>\n\n {/* Spreadsheet Content */}\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <div\n style={{\n transform: spreadsheetZoom !== 1 ? `scale(${spreadsheetZoom})` : undefined,\n transformOrigin: '0 0',\n width: spreadsheetZoom !== 1 ? `${100 / spreadsheetZoom}%` : '100%',\n height: spreadsheetZoom !== 1 ? `${100 / spreadsheetZoom}%` : '100%'\n }}\n >\n <FormulaSheet\n key={`${workbookName}-${activeSheet}`}\n sheetName={activeSheet}\n workbookName={workbookName}\n engine={engine}\n verboseErrors={verboseErrors}\n selectionManager={selectionManager}\n {...rest}\n // Pass overlay props for the active sheet\n components={components}\n overlayChildren={activeSheetOverlayChildren}\n selectedOverlayId={activeSheetSelectedOverlayId}\n columnWidths={activeSheetColumnWidths}\n onColumnWidthsChange={handleColumnWidthsChange}\n rowHeights={activeSheetRowHeights}\n onRowHeightsChange={handleRowHeightsChange}\n onOverlaySelect={handleOverlaySelect}\n onOverlayChildrenChange={handleOverlayChildrenChange}\n overlayPlaceholder={overlayPlaceholder}\n clipboardManager={clipboardManager}\n isSelected={isSelected}\n showFormulas={showFormulas}\n />\n </div>\n </div>\n\n {/* Sheet Tabs at Bottom (Excel-style) */}\n <div className=\"rsp-sheet-tabs\">\n <div className=\"rsp-sheet-tabs-scroll\">\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {sheetNames.map((sheetName) => {\n const isRenaming = renamingSheet === sheetName;\n const isActive = activeSheet === sheetName;\n\n return (\n <div key={sheetName}>\n {isRenaming ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <input\n className=\"rsp-sheet-tab-input\"\n type=\"text\"\n value={newSheetName}\n onChange={(e) => setNewSheetName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n renameSheet(sheetName, newSheetName);\n } else if (e.key === 'Escape') {\n cancelRenaming();\n }\n }}\n onBlur={() => {\n if (newSheetName.trim() && newSheetName.trim() !== sheetName) {\n renameSheet(sheetName, newSheetName);\n } else {\n cancelRenaming();\n }\n }}\n autoFocus\n data-testid={`rename-sheet-input-${sheetName}`}\n />\n </div>\n ) : (\n <div\n className={cn('rsp-sheet-tab', {\n 'rsp-sheet-tab-active': isActive\n })}\n onClick={() => handleActiveSheetChange(sheetName)}\n onDoubleClick={() => startRenaming(sheetName)}\n data-testid={`sheet-tab-${sheetName}`}\n >\n <span>{sheetName}</span>\n\n {/* Sheet actions (visible on hover, inside tab) */}\n <div className=\"sheet-tab-actions\">\n <button\n type=\"button\"\n className=\"rsp-icon-button\"\n onClick={(e) => {\n e.stopPropagation();\n startRenaming(sheetName);\n }}\n title=\"Rename Sheet\"\n data-testid={`rename-sheet-${sheetName}`}\n >\n <Edit2Icon style={{ width: 12, height: 12 }} />\n </button>\n {sheetNames.length > 1 && (\n <button\n type=\"button\"\n className=\"rsp-icon-button rsp-icon-button-delete\"\n onClick={(e) => {\n e.stopPropagation();\n if (confirm(`Are you sure you want to delete sheet \"${sheetName}\"?`)) {\n deleteSheet(sheetName);\n }\n }}\n title=\"Delete Sheet\"\n data-testid={`delete-sheet-${sheetName}`}\n >\n <Trash2Icon style={{ width: 12, height: 12 }} />\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Add Sheet Button (Excel-style, to the right) */}\n <button\n type=\"button\"\n className=\"rsp-add-sheet-button\"\n onClick={addSheet}\n title=\"Add Sheet\"\n data-testid={`add-sheet-${workbookName}`}\n >\n <PlusIcon style={{ width: 12, height: 12 }} />\n </button>\n </div>\n\n {/* Spreadsheet Zoom Controls - pinned to the right */}\n <div className=\"rsp-zoom-controls\">\n <button\n type=\"button\"\n className=\"rsp-icon-button\"\n onClick={() => setSpreadsheetZoom(Math.max(0.5, spreadsheetZoom - 0.1))}\n disabled={spreadsheetZoom <= 0.5}\n title=\"Zoom Out\"\n style={{ opacity: spreadsheetZoom <= 0.5 ? 0.5 : 1 }}\n >\n <MinusIcon style={{ width: 12, height: 12 }} />\n </button>\n <span className=\"rsp-zoom-value\">{Math.round(spreadsheetZoom * 100)}%</span>\n <button\n type=\"button\"\n className=\"rsp-icon-button\"\n onClick={() => setSpreadsheetZoom(Math.min(2, spreadsheetZoom + 0.1))}\n disabled={spreadsheetZoom >= 2}\n title=\"Zoom In\"\n style={{ opacity: spreadsheetZoom >= 2 ? 0.5 : 1 }}\n >\n <PlusIcon style={{ width: 12, height: 12 }} />\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// Export WorkbookSelectionManager\nexport { WorkbookSelectionManager } from './workbook-selection-manager';\n",
17
+ "import {\n FormulaEngine,\n type CellAddress,\n type CellStyle,\n type SerializedCellValue,\n type SpreadsheetRange,\n type SpreadsheetRangeEnd,\n indexToColumn,\n parseCellReference,\n getCellReference,\n type RangeAddress\n} from '@ricsam/formula-engine';\n\nimport type {\n SelectionManager,\n SelectionNavigationModel,\n SMCell,\n SMArea,\n SMTable\n} from '@ricsam/selection-manager';\nimport React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { Spreadsheet, type SpreadsheetProps } from '../spreadsheet/spreadsheet';\nimport type {\n CellRenderContext,\n SpreadsheetColumnWidths,\n SpreadsheetRowHeights\n} from '../types';\nimport type { WorkbookSelectionManager } from './workbook-selection-manager';\nimport { cn } from '../utils/cn';\nimport { useSchemeRoot } from '../utils/use-scheme-root';\nimport { type CellDataUpdate, ClipboardUtils } from '../clipboard/clipboard-manager';\nimport { normalizeBorderSides, hasAnyBorderSide } from './border-sides';\nimport { coerceCellInput, getCellDisplayText, getCellDisplayValue } from './cell-data-type';\nimport { queueCellEditError } from './cell-edit-error';\n\nconst getWrapCellStyle = (style?: CellStyle): React.CSSProperties =>\n style?.wrapText\n ? {\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n wordBreak: 'normal',\n textOverflow: 'clip',\n alignItems: 'flex-start'\n }\n : {};\n\nconst getWrapContentStyle = (style?: CellStyle): React.CSSProperties =>\n style?.wrapText\n ? {\n whiteSpace: 'pre-wrap',\n overflowWrap: 'anywhere',\n wordBreak: 'normal',\n textOverflow: 'clip',\n width: '100%',\n minWidth: 0\n }\n : {};\n\nconst getBorderCellStyle = (style?: CellStyle): React.CSSProperties =>\n (() => {\n if (!style?.borderColor) {\n return {};\n }\n\n const borderSides = normalizeBorderSides(style.borderSides, true);\n if (!hasAnyBorderSide(borderSides)) {\n return {};\n }\n\n return {\n ...(borderSides.top && { borderTopColor: style.borderColor }),\n ...(borderSides.right && { borderRightColor: style.borderColor }),\n ...(borderSides.bottom && { borderBottomColor: style.borderColor }),\n ...(borderSides.left && { borderLeftColor: style.borderColor })\n };\n })();\n\n// Icon Components\nconst Edit2Icon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n <path d=\"m15 5 4 4\" />\n </svg>\n);\n\nconst CopyIcon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n);\n\nconst Trash2Icon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\" />\n <path d=\"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </svg>\n);\n\nconst PlusIcon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M5 12h14\" />\n <path d=\"M12 5v14\" />\n </svg>\n);\n\nconst MinusIcon = ({ className = '', ...props }: React.SVGProps<SVGSVGElement>) => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={className}\n {...props}\n >\n <path d=\"M5 12h14\" />\n </svg>\n);\n\ntype SpreadsheetLayout = {\n columnWidths?: SpreadsheetColumnWidths;\n rowHeights?: SpreadsheetRowHeights;\n};\n\ninterface FormulaSheetProps\n extends Omit<\n SpreadsheetProps,\n | 'selection'\n | 'customCellStyle'\n | 'customCellRenderer'\n | 'components'\n | 'overlayChildren'\n | 'selectedOverlayId'\n | 'onOverlaySelect'\n | 'onOverlayChildrenChange'\n | 'overlayPlaceholder'\n | 'parentSelected'\n > {\n clipboardManager?: WorkbookClipboardManager;\n sheetName: string;\n workbookName: string;\n engine: FormulaEngine;\n verboseErrors?: boolean;\n selection?: SpreadsheetProps['selection'];\n selectionManager?: WorkbookSelectionManager;\n customCellStyle?: (\n cell: CellRenderContext,\n internalStyle: React.CSSProperties\n ) => React.CSSProperties;\n customCellRenderer?: (\n cell: CellRenderContext,\n internalElement: React.ReactNode\n ) => React.ReactNode;\n // Add overlay component props\n components?: SpreadsheetProps['components'];\n overlayChildren?: SpreadsheetProps['overlayChildren'];\n selectedOverlayId?: SpreadsheetProps['selectedOverlayId'];\n onOverlaySelect?: SpreadsheetProps['onOverlaySelect'];\n onOverlayChildrenChange?: SpreadsheetProps['onOverlayChildrenChange'];\n overlayPlaceholder?: SpreadsheetProps['overlayPlaceholder'];\n /** Whether the grid child is selected (controls interactivity) */\n isSelected?: boolean;\n /** Optional toolbar to render above the sheet */\n toolbar?: React.ReactNode;\n /** When true, cells display raw formulas instead of computed values */\n showFormulas?: boolean;\n}\n\nfunction useEngine(engine: FormulaEngine): ReturnType<typeof FormulaEngine.prototype.getState> {\n const [state, setState] = useState<ReturnType<typeof FormulaEngine.prototype.getState>>(() =>\n engine.getState()\n );\n\n React.useEffect(() => {\n return engine.onUpdate(() => {\n setState(engine.getState());\n });\n }, [engine]);\n\n return state;\n}\n\nexport class WorkbookClipboardManager extends ClipboardUtils {\n constructor(private engine: FormulaEngine) {\n super();\n }\n copiedCells: CellAddress[] = [];\n signature: string = '';\n isCut: boolean = false;\n\n public triggerCopy(context: {\n workbookName: string;\n sheetName: string;\n selectionManager: SelectionManager;\n copyType: 'value' | 'formula';\n cut?: boolean;\n }): void {\n const cellData = this.engine.getSheet({\n workbookName: context.workbookName,\n sheetName: context.sheetName\n })?.content;\n if (!cellData) return;\n const extractedCells = this.extractCellsFromSelection(context.selectionManager, cellData);\n if (!extractedCells) return;\n const { width, height, cells } = extractedCells;\n const valueExportGrid = this.createExportGrid(width, height);\n const formulaExportGrid = this.createExportGrid(width, height);\n this.copiedCells = [];\n this.isCut = context.cut ?? false;\n cells.forEach(({ relative, absolute }) => {\n const cellAddress: CellAddress = {\n workbookName: context.workbookName,\n sheetName: context.sheetName,\n colIndex: absolute.columnIndex,\n rowIndex: absolute.rowIndex\n };\n this.copiedCells.push(cellAddress);\n const value = this.engine.getCellValue(cellAddress, false);\n const formula = cellData.get(getCellReference(cellAddress));\n valueExportGrid[relative.rowIndex]![relative.columnIndex] = getCellDisplayValue(value);\n formulaExportGrid[relative.rowIndex]![relative.columnIndex] = formula;\n });\n this.signature = this.getTsvString(context.copyType === 'formula' ? formulaExportGrid : valueExportGrid);\n this.writeToOsClipboard(context.copyType === 'formula' ? formulaExportGrid : valueExportGrid);\n }\n public triggerPaste(context: {\n workbookName: string;\n sheetName: string;\n selectionManager: SelectionManager;\n updates: CellDataUpdate[];\n rawString: string;\n pasteType: 'value' | 'formula';\n }): void {\n if (context.rawString === this.signature) {\n // Internal paste operation - use smartPaste to handle both copy and fill\n const selections = context.selectionManager.selections;\n if (!selections || selections.length === 0) return;\n\n // Convert each SMArea to SpreadsheetRange\n const convertSMAreaToSpreadsheetRange = (area: SMArea): SpreadsheetRange => {\n return {\n start: {\n col: area.start.col,\n row: area.start.row\n },\n end: {\n col:\n area.end.col.type === 'infinity'\n ? { type: 'infinity' as const, sign: 'positive' as const }\n : { type: 'number' as const, value: area.end.col.value },\n row:\n area.end.row.type === 'infinity'\n ? { type: 'infinity' as const, sign: 'positive' as const }\n : { type: 'number' as const, value: area.end.row.value }\n }\n };\n };\n\n const areas = selections.map(convertSMAreaToSpreadsheetRange);\n\n console.log('pasting', { cut: this.isCut });\n this.engine.smartPaste(\n this.copiedCells,\n {\n workbookName: context.workbookName,\n sheetName: context.sheetName,\n areas\n },\n {\n cut: this.isCut,\n type: context.pasteType,\n include: 'all'\n }\n );\n\n // Reset isCut after paste\n this.isCut = false;\n } else {\n // External paste operation\n context.selectionManager.saveCellValues(context.updates);\n }\n }\n}\n\nexport function FormulaSheet({\n sheetName,\n workbookName,\n engine,\n verboseErrors = false,\n selection,\n selectionManager,\n customCellStyle,\n customCellRenderer,\n onCellDataChangeError = queueCellEditError,\n // Add overlay props\n components,\n overlayChildren,\n selectedOverlayId,\n onOverlaySelect,\n onOverlayChildrenChange,\n overlayPlaceholder,\n clipboardManager: controlledClipboardManager,\n isSelected = false,\n toolbar,\n showFormulas = false,\n ...rest\n}: FormulaSheetProps) {\n const schemeRoot = useSchemeRoot();\n const [selectedArea, setSelectedArea] = useState<SMArea | null>(null);\n\n const clipboardManager = React.useMemo(\n () => controlledClipboardManager ?? new WorkbookClipboardManager(engine!),\n [controlledClipboardManager, engine]\n );\n\n const state = useEngine(engine);\n\n const sheet = state.workbooks.get(workbookName)?.sheets.get(sheetName);\n\n const getEngineTableAt = useCallback(\n (cell: SMCell): SMTable | undefined => {\n const table = engine.isCellInTable({\n workbookName,\n sheetName,\n rowIndex: cell.row,\n colIndex: cell.col\n });\n if (!table) return undefined;\n\n const endRow =\n table.endRow.type === 'number'\n ? { type: 'number' as const, value: table.endRow.value }\n : { type: 'infinity' as const };\n const endCol = {\n type: 'number' as const,\n value: table.start.colIndex + table.headers.size - 1\n };\n const hasDataRows = endRow.type === 'infinity' || endRow.value > table.start.rowIndex;\n\n return {\n id: `${table.workbookName}/${table.name}`,\n bounds: {\n start: { row: table.start.rowIndex, col: table.start.colIndex },\n end: { row: endRow, col: endCol }\n },\n ...(hasDataRows\n ? {\n dataBounds: {\n start: {\n row: table.start.rowIndex + 1,\n col: table.start.colIndex\n },\n end: { row: endRow, col: endCol }\n }\n }\n : {})\n };\n },\n [engine, sheetName, workbookName]\n );\n const formulaNavigation = useMemo<SelectionNavigationModel>(\n () => ({\n ...selection?.navigation,\n getTableAt: selection?.navigation?.getTableAt ?? getEngineTableAt\n }),\n [getEngineTableAt, selection?.navigation]\n );\n\n // Handle cell data changes from the spreadsheet\n const onCellDataChange = useCallback(\n (updatedSpreadsheet: Map<string, SerializedCellValue>) => {\n const data = new Map<string, SerializedCellValue>(updatedSpreadsheet);\n data.forEach((value, key) => {\n if (typeof value === 'string') {\n const { colIndex, rowIndex } = parseCellReference(key);\n const coercedValue = coerceCellInput(\n value,\n engine.getCellDataType({ workbookName, sheetName, colIndex, rowIndex })\n );\n if (coercedValue === undefined) {\n data.delete(key);\n } else {\n data.set(key, coercedValue);\n }\n }\n });\n engine.setSheetContent({ sheetName, workbookName }, data);\n },\n [sheetName, engine, workbookName]\n );\n\n const passedSelectionEffects = selection?.effects;\n\n // Selection manager effects for tracking cell selection\n const selectionManagerEffects = useCallback(\n (spreadsheetSelectionManager: SelectionManager) => {\n const convertSmAreaToSpreadsheetRange = (area: SMArea): SpreadsheetRange => {\n const rowEnd: SpreadsheetRangeEnd =\n area.end.row.type === 'infinity'\n ? {\n type: 'infinity',\n sign: 'positive'\n }\n : {\n type: 'number',\n value: area.end.row.value\n };\n const colEnd: SpreadsheetRangeEnd =\n area.end.col.type === 'infinity'\n ? {\n type: 'infinity',\n sign: 'positive'\n }\n : {\n type: 'number',\n value: area.end.col.value\n };\n return {\n start: {\n col: area.start.col,\n row: area.start.row\n },\n end: {\n row: rowEnd,\n col: colEnd\n }\n };\n };\n\n const cleanups = [\n spreadsheetSelectionManager.listenToCopy((cut) => {\n console.log('cut??', cut);\n clipboardManager.triggerCopy({\n workbookName,\n sheetName,\n selectionManager: spreadsheetSelectionManager,\n copyType: showFormulas ? 'formula' : 'value',\n cut\n });\n }),\n spreadsheetSelectionManager.listenToPaste(({ updates, rawString }) => {\n clipboardManager.triggerPaste({\n workbookName,\n sheetName,\n selectionManager: spreadsheetSelectionManager,\n updates,\n rawString,\n pasteType: 'formula'\n });\n }),\n spreadsheetSelectionManager.listenToFill((ev) => {\n if (ev.type === 'extend') {\n engine.autoFill(\n { sheetName, workbookName },\n convertSmAreaToSpreadsheetRange(ev.seedRange),\n [convertSmAreaToSpreadsheetRange(ev.fillRange)],\n ev.direction\n );\n } else {\n engine.clearSpreadsheetRange({\n sheetName,\n workbookName,\n range: convertSmAreaToSpreadsheetRange(ev.rangeToClear)\n });\n }\n }),\n spreadsheetSelectionManager.observeStateChange(\n (state) => {\n const currentSelection: SMArea | undefined =\n state.selections.length === 1 ? state.selections[0] : undefined;\n return currentSelection;\n },\n (selection) => {\n setSelectedArea(selection ?? null);\n }\n )\n ];\n\n const handleUndoRedoKeyDown = (event: KeyboardEvent) => {\n if (!spreadsheetSelectionManager.hasFocus) return;\n if (spreadsheetSelectionManager.isEditing.type !== 'none') return;\n\n const target = event.target;\n if (target instanceof HTMLElement) {\n const isEditableTarget =\n target.tagName === 'INPUT' ||\n target.tagName === 'TEXTAREA' ||\n target.tagName === 'SELECT' ||\n target.isContentEditable ||\n Boolean(target.closest('[contenteditable=\"true\"]'));\n\n if (isEditableTarget) return;\n }\n\n if (!event.metaKey && !event.ctrlKey) return;\n\n const key = event.key.toLowerCase();\n const isUndo = key === 'z' && !event.shiftKey;\n const isRedo = key === 'y' || (key === 'z' && event.shiftKey);\n\n if (!isUndo && !isRedo) return;\n\n event.preventDefault();\n event.stopPropagation();\n\n if (isUndo) {\n engine.undo();\n } else {\n engine.redo();\n }\n };\n\n document.addEventListener('keydown', handleUndoRedoKeyDown);\n cleanups.push(() => {\n document.removeEventListener('keydown', handleUndoRedoKeyDown);\n });\n\n // Register this spreadsheet's SelectionManager with the WorkbookSelectionManager\n if (selectionManager) {\n const workbookManagerCleanup = selectionManager.add(spreadsheetSelectionManager, {\n workbookName,\n sheetName\n });\n cleanups.push(workbookManagerCleanup);\n }\n\n // Call user-provided effects if present\n let userCleanup: (() => void) | void;\n if (passedSelectionEffects) {\n userCleanup = passedSelectionEffects(spreadsheetSelectionManager);\n }\n\n return () => {\n cleanups.forEach((cleanup) => cleanup());\n if (userCleanup) {\n userCleanup();\n }\n };\n },\n [\n clipboardManager,\n engine,\n passedSelectionEffects,\n selectionManager,\n sheetName,\n showFormulas,\n workbookName\n ]\n );\n\n // If the sheet doesn't exist (e.g. during a rename where the engine has\n // updated but React hasn't re-rendered with the new sheet name yet),\n // render nothing. The next render will have the correct sheet name.\n if (!sheet) {\n return (\n <div className=\"rsp-root rsp-workbook\" {...schemeRoot}>\n {toolbar}\n <div style={{ flex: 1 }} />\n </div>\n );\n }\n\n return (\n <div className=\"rsp-root rsp-workbook\" {...schemeRoot}>\n {/* Optional Toolbar */}\n {toolbar}\n\n {/* Main spreadsheet area */}\n <div className=\"rsp-workbook-body\">\n <Spreadsheet\n disableClipboard={true}\n style={{ height: '100%', width: '100%' }}\n cellData={sheet?.content}\n onCellDataChange={onCellDataChange}\n onCellDataChangeError={onCellDataChangeError}\n {...rest}\n // Add overlay props\n components={components}\n overlayChildren={overlayChildren}\n selectedOverlayId={selectedOverlayId}\n onOverlaySelect={onOverlaySelect}\n onOverlayChildrenChange={onOverlayChildrenChange}\n overlayPlaceholder={overlayPlaceholder}\n parentSelected={isSelected}\n selection={{\n ...selection,\n navigation: formulaNavigation,\n effects: selectionManagerEffects\n }}\n containerProps={\n (isSelected && selectedArea\n ? {\n 'data-grid-no-interaction': 'true'\n }\n : {}) as React.HTMLAttributes<HTMLDivElement>\n }\n customCellStyle={(cell) => {\n // Check for conditional styling first\n const conditionalStyle = engine.getCellStyle({\n sheetName,\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex,\n workbookName\n });\n\n const tableInfo = engine.isCellInTable({\n sheetName,\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex,\n workbookName\n });\n\n if (!tableInfo) {\n // Not in a table, apply the engine style first and always give the\n // consumer a chance to augment it. Reference highlights, search\n // results and other transient decorations commonly target plain\n // cells, so limiting this callback to table cells makes the API\n // ineffective for those use cases.\n const style: React.CSSProperties = conditionalStyle\n ? {\n ...(conditionalStyle.backgroundColor && {\n backgroundColor: conditionalStyle.backgroundColor\n }),\n ...(conditionalStyle.color && {\n color: conditionalStyle.color\n }),\n ...(conditionalStyle.fontSize && {\n fontSize: conditionalStyle.fontSize\n }),\n ...(conditionalStyle.bold && {\n fontWeight: 'bold' as const\n }),\n ...(conditionalStyle.italic && {\n fontStyle: 'italic' as const\n }),\n ...(conditionalStyle.underline && {\n textDecoration: 'underline'\n }),\n ...getBorderCellStyle(conditionalStyle),\n ...getWrapCellStyle(conditionalStyle)\n }\n : {};\n\n return customCellStyle ? customCellStyle(cell, style) : style;\n }\n\n const isHeaderRow = cell.rowIndex === tableInfo.start.rowIndex;\n const isFirstColumn = cell.colIndex === tableInfo.start.colIndex;\n const isLastColumn = cell.colIndex === tableInfo.start.colIndex + tableInfo.headers.size - 1;\n\n // Calculate if this is the last row of the table\n const isLastRow =\n tableInfo.endRow.type === 'number' ? cell.rowIndex === tableInfo.endRow.value : false; // For infinite tables, we don't style the last row differently\n\n // Excel-like table styling. These custom properties are declared in\n // the package stylesheet (`styles.css`) and resolve through\n // `light-dark()`, so tables follow the active color scheme.\n const style: React.CSSProperties = {\n border: '1px solid var(--_rsp-table-border-light)'\n };\n\n if (isHeaderRow) {\n // Header row styling - accent theme like Excel\n style.backgroundColor = 'var(--_rsp-table-header-bg)';\n style.color = 'var(--_rsp-table-header-color)';\n style.fontWeight = 'bold';\n style.borderBottom = '2px solid var(--_rsp-table-header-border)';\n } else {\n // Data rows - alternating background\n const dataRowIndex = cell.rowIndex - tableInfo.start.rowIndex - 1;\n if (dataRowIndex % 2 === 0) {\n style.backgroundColor = 'var(--_rsp-table-even-row-bg)';\n } else {\n style.backgroundColor = 'var(--_rsp-table-odd-row-bg)';\n }\n }\n\n // Border styling\n if (isFirstColumn) {\n style.borderLeft = '2px solid var(--_rsp-table-border-color)';\n }\n if (isLastColumn) {\n style.borderRight = '2px solid var(--_rsp-table-border-color)';\n }\n if (isHeaderRow) {\n style.borderTop = '2px solid var(--_rsp-table-border-color)';\n }\n if (isLastRow) {\n style.borderBottom = '2px solid var(--_rsp-table-border-color)';\n }\n\n // Merge conditional styling with table styling\n // User custom styles can now override table header styles\n if (conditionalStyle?.backgroundColor) {\n style.backgroundColor = conditionalStyle.backgroundColor;\n }\n // Apply text color from conditional styling (overrides header white text if user wants)\n if (conditionalStyle?.color) {\n style.color = conditionalStyle.color;\n }\n // Apply font size from conditional styling\n if (conditionalStyle?.fontSize) {\n style.fontSize = conditionalStyle.fontSize;\n }\n // Apply bold from conditional styling (merge with header row bold)\n if (conditionalStyle?.bold) {\n style.fontWeight = 'bold';\n }\n // Apply italic from conditional styling\n if (conditionalStyle?.italic) {\n style.fontStyle = 'italic';\n }\n // Apply underline from conditional styling\n if (conditionalStyle?.underline) {\n style.textDecoration = 'underline';\n }\n Object.assign(style, getBorderCellStyle(conditionalStyle));\n Object.assign(style, getWrapCellStyle(conditionalStyle));\n\n if (customCellStyle) {\n return customCellStyle(cell, style);\n }\n\n return style;\n }}\n customCellRenderer={(cell) => {\n const cellRef = getCellReference({\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex\n });\n\n // When showFormulas is enabled, display the raw cell content (formula string)\n // instead of the computed value from the engine\n const value = showFormulas\n ? sheet?.content.get(cellRef)\n : engine.getCellValue(\n {\n sheetName,\n workbookName,\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex\n },\n verboseErrors\n );\n\n const conditionalStyle = engine.getCellStyle({\n sheetName,\n colIndex: cell.colIndex,\n rowIndex: cell.rowIndex,\n workbookName\n });\n\n const conditionalStyleProps: React.CSSProperties = {};\n if (conditionalStyle?.backgroundColor) {\n conditionalStyleProps.backgroundColor = conditionalStyle.backgroundColor;\n }\n if (conditionalStyle?.color) {\n conditionalStyleProps.color = conditionalStyle.color;\n }\n if (conditionalStyle?.fontSize) {\n conditionalStyleProps.fontSize = conditionalStyle.fontSize;\n }\n if (conditionalStyle?.bold) {\n conditionalStyleProps.fontWeight = 'bold';\n }\n if (conditionalStyle?.italic) {\n conditionalStyleProps.fontStyle = 'italic';\n }\n if (conditionalStyle?.underline) {\n conditionalStyleProps.textDecoration = 'underline';\n }\n Object.assign(conditionalStyleProps, getWrapContentStyle(conditionalStyle));\n\n let defaultElement: React.ReactNode;\n if (showFormulas) {\n // In show-formulas mode, always render raw content as-is (no number formatting)\n defaultElement = (\n <div\n data-conditional-background={conditionalStyle?.backgroundColor}\n data-conditional-text-color={conditionalStyle?.color}\n style={conditionalStyleProps}\n >\n {getCellDisplayText(value)}\n </div>\n );\n } else if (typeof value === 'boolean') {\n defaultElement = (\n <div\n data-conditional-background={conditionalStyle?.backgroundColor}\n data-conditional-text-color={conditionalStyle?.color}\n data-type=\"boolean\"\n style={{\n ...conditionalStyleProps,\n width: '100%',\n textAlign: 'center',\n fontFamily: \"'Courier New', monospace\"\n }}\n >\n {value ? 'TRUE' : 'FALSE'}\n </div>\n );\n } else if (typeof value === 'number') {\n // Format numbers nicely\n defaultElement = (\n <div\n data-conditional-background={conditionalStyle?.backgroundColor}\n data-conditional-text-color={conditionalStyle?.color}\n data-type=\"number\"\n style={{ ...conditionalStyleProps, width: '100%', textAlign: 'right' }}\n >\n {value.toLocaleString('en-US', {\n minimumFractionDigits: 0,\n maximumFractionDigits: 10\n })}\n </div>\n );\n } else {\n defaultElement = (\n <div\n data-conditional-background={conditionalStyle?.backgroundColor}\n data-conditional-text-color={conditionalStyle?.color}\n style={{ ...conditionalStyleProps, width: '100%', textAlign: 'left' }}\n >\n {getCellDisplayText(value)}\n </div>\n );\n }\n\n if (customCellRenderer) {\n return customCellRenderer(cell, defaultElement);\n }\n return defaultElement;\n }}\n />\n </div>\n </div>\n );\n}\n\ninterface FormulaWorkbookProps\n extends Omit<\n SpreadsheetProps,\n | 'cellData'\n | 'onCellDataChange'\n | 'selection'\n | 'customCellStyle'\n | 'customCellRenderer'\n | 'components'\n | 'overlayChildren'\n | 'selectedOverlayId'\n | 'onOverlaySelect'\n | 'onOverlayChildrenChange'\n | 'overlayPlaceholder'\n | 'parentSelected'\n | 'columnWidths'\n | 'onColumnWidthsChange'\n | 'rowHeights'\n | 'onRowHeightsChange'\n > {\n workbookName: string;\n clipboardManager?: WorkbookClipboardManager;\n engine: FormulaEngine;\n activeSheet?: string;\n onActiveSheetChange?: (sheetName: string) => void;\n verboseErrors?: boolean;\n selection?: SpreadsheetProps['selection'];\n selectionManager?: WorkbookSelectionManager;\n customCellStyle?: (\n cell: CellRenderContext,\n internalStyle: React.CSSProperties\n ) => React.CSSProperties;\n customCellRenderer?: (\n cell: CellRenderContext,\n internalElement: React.ReactNode\n ) => React.ReactNode;\n // Add overlay component props with per-sheet support\n components?: SpreadsheetProps['components'];\n // Map of sheet name to overlay children for that sheet\n sheetOverlayChildren?: Record<string, SpreadsheetProps['overlayChildren']>;\n // Map of sheet name to selected overlay ID for that sheet\n sheetSelectedOverlayIds?: Record<string, SpreadsheetProps['selectedOverlayId']>;\n sheetLayouts?: Record<string, SpreadsheetLayout>;\n onSheetColumnWidthsChange?: (sheetName: string, columnWidths: SpreadsheetColumnWidths) => void;\n onSheetRowHeightsChange?: (sheetName: string, rowHeights: SpreadsheetRowHeights) => void;\n onOverlaySelect?: (sheetName: string, overlayId: string | null) => void;\n onOverlayChildrenChange?: (\n sheetName: string,\n children: NonNullable<SpreadsheetProps['overlayChildren']>\n ) => void;\n overlayPlaceholder?: SpreadsheetProps['overlayPlaceholder'];\n /** Whether the grid child is selected (controls interactivity) */\n isSelected?: boolean;\n /** Optional toolbar to render above the workbook */\n toolbar?: React.ReactNode;\n /** When true, cells display raw formulas instead of computed values */\n showFormulas?: boolean;\n}\n\nexport function FormulaWorkbook({\n clipboardManager: controlledClipboardManager,\n workbookName,\n engine,\n activeSheet: controlledActiveSheet,\n onActiveSheetChange,\n verboseErrors = false,\n selectionManager,\n // Add overlay props\n components,\n sheetOverlayChildren,\n sheetSelectedOverlayIds,\n sheetLayouts,\n onSheetColumnWidthsChange,\n onSheetRowHeightsChange,\n onOverlaySelect,\n onOverlayChildrenChange,\n overlayPlaceholder,\n isSelected = false,\n toolbar,\n showFormulas = false,\n ...rest\n}: FormulaWorkbookProps) {\n const schemeRoot = useSchemeRoot();\n const state = useEngine(engine);\n const [renamingSheet, setRenamingSheet] = useState<string | null>(null);\n const [newSheetName, setNewSheetName] = useState<string>('');\n const [spreadsheetZoom, setSpreadsheetZoom] = useState(1);\n const renameCommittedRef = useRef(false);\n\n const clipboardManager = React.useMemo(\n () => controlledClipboardManager ?? new WorkbookClipboardManager(engine!),\n [controlledClipboardManager, engine]\n );\n\n // Recompute on every render because the engine mutates sheet maps in place.\n // Depending on the Map reference in useMemo makes tab order stale after updates.\n const sheetNames = engine.getOrderedSheetNames(workbookName);\n\n // Internal state for uncontrolled mode\n const [internalActiveSheet, setInternalActiveSheet] = useState<string>(() => {\n return sheetNames[0] || '';\n });\n\n // Track if component is controlled\n const isControlledRef = useRef(controlledActiveSheet !== undefined);\n\n // Check for controlled/uncontrolled mode changes\n React.useEffect(() => {\n const isCurrentlyControlled = controlledActiveSheet !== undefined;\n if (isControlledRef.current !== isCurrentlyControlled) {\n console.error(\n `FormulaWorkbook: Component changed from ${isControlledRef.current ? 'controlled' : 'uncontrolled'} to ${isCurrentlyControlled ? 'controlled' : 'uncontrolled'} mode. ` +\n `A component should not switch between controlled and uncontrolled modes. ` +\n `Decide between using activeSheet and onActiveSheetChange props (controlled) or neither (uncontrolled) for the lifetime of the component.`\n );\n }\n isControlledRef.current = isCurrentlyControlled;\n }, [controlledActiveSheet]);\n\n // Use controlled value if provided, otherwise use internal state\n const activeSheet = controlledActiveSheet ?? internalActiveSheet;\n\n // Handle sheet changes\n const handleActiveSheetChange = useCallback(\n (sheetName: string) => {\n if (onActiveSheetChange) {\n // Controlled mode\n onActiveSheetChange(sheetName);\n } else {\n // Uncontrolled mode\n setInternalActiveSheet(sheetName);\n }\n },\n [onActiveSheetChange]\n );\n\n // Get overlay and layout data for the active sheet\n const activeSheetOverlayChildren = sheetOverlayChildren?.[activeSheet];\n const activeSheetSelectedOverlayId = sheetSelectedOverlayIds?.[activeSheet];\n const activeSheetColumnWidths = sheetLayouts?.[activeSheet]?.columnWidths;\n const activeSheetRowHeights = sheetLayouts?.[activeSheet]?.rowHeights;\n\n // Create sheet-specific callbacks\n const handleOverlaySelect = useCallback(\n (overlayId: string | null) => {\n onOverlaySelect?.(activeSheet, overlayId);\n },\n [onOverlaySelect, activeSheet]\n );\n\n const handleOverlayChildrenChange = useCallback(\n (children: NonNullable<SpreadsheetProps['overlayChildren']>) => {\n onOverlayChildrenChange?.(activeSheet, children);\n },\n [onOverlayChildrenChange, activeSheet]\n );\n\n const handleColumnWidthsChange = useCallback(\n (columnWidths: SpreadsheetColumnWidths) => {\n onSheetColumnWidthsChange?.(activeSheet, columnWidths);\n },\n [activeSheet, onSheetColumnWidthsChange]\n );\n\n const handleRowHeightsChange = useCallback(\n (rowHeights: SpreadsheetRowHeights) => {\n onSheetRowHeightsChange?.(activeSheet, rowHeights);\n },\n [activeSheet, onSheetRowHeightsChange]\n );\n\n // Add new sheet handler\n const addSheet = () => {\n try {\n const newSheet = engine.createSheet({\n workbookName\n });\n\n // Switch to the new sheet\n handleActiveSheetChange(newSheet.name);\n } catch (error) {\n console.error('Failed to add sheet:', error);\n }\n };\n\n // Start renaming a sheet\n const startRenaming = (sheetName: string) => {\n renameCommittedRef.current = false;\n setRenamingSheet(sheetName);\n setNewSheetName(sheetName);\n };\n\n // Cancel renaming\n const cancelRenaming = () => {\n setRenamingSheet(null);\n setNewSheetName('');\n };\n\n // Rename sheet\n const renameSheet = (oldName: string, newName: string) => {\n // Guard against double-fire (e.g. onBlur firing after onKeyDown already committed)\n if (renameCommittedRef.current) {\n cancelRenaming();\n return;\n }\n\n if (!newName.trim() || newName.trim() === oldName) {\n cancelRenaming();\n return;\n }\n\n try {\n renameCommittedRef.current = true;\n engine.renameSheet({\n workbookName,\n sheetName: oldName,\n newSheetName: newName.trim()\n });\n\n // Update active sheet if we renamed the active one\n if (activeSheet === oldName) {\n handleActiveSheetChange(newName.trim());\n }\n\n cancelRenaming();\n } catch (error) {\n console.error('Failed to rename sheet:', error);\n cancelRenaming();\n }\n };\n\n // Delete sheet\n const deleteSheet = (sheetName: string) => {\n if (sheetNames.length <= 1) {\n console.error('Cannot delete the last sheet');\n return;\n }\n\n try {\n engine.removeSheet({ workbookName, sheetName });\n\n // If we deleted the active sheet, switch to the first available sheet\n if (activeSheet === sheetName) {\n const remainingSheets = sheetNames.filter((name) => name !== sheetName);\n const nextSheet = remainingSheets[0];\n if (nextSheet) {\n handleActiveSheetChange(nextSheet);\n }\n }\n } catch (error) {\n console.error('Failed to delete sheet:', error);\n }\n };\n\n return (\n <div className=\"rsp-root rsp-workbook\" {...schemeRoot}>\n {/* Optional Toolbar */}\n {toolbar}\n\n {/* Workbook Header */}\n <div className=\"rsp-workbook-header\">\n <div\n style={{\n display: 'flex',\n alignItems: 'center',\n gap: 8,\n flex: 1,\n overflow: 'hidden',\n textOverflow: 'ellipsis'\n }}\n >\n <span className=\"rsp-workbook-name\" data-testid={`workbook-name-${workbookName}`}>\n {workbookName}\n </span>\n </div>\n <span className=\"rsp-zoom-value\" data-testid={`sheet-count-${workbookName}`}>\n Sheets: {sheetNames.length}\n </span>\n </div>\n\n {/* Spreadsheet Content */}\n <div style={{ flex: 1, overflow: 'hidden' }}>\n <div\n style={{\n transform: spreadsheetZoom !== 1 ? `scale(${spreadsheetZoom})` : undefined,\n transformOrigin: '0 0',\n width: spreadsheetZoom !== 1 ? `${100 / spreadsheetZoom}%` : '100%',\n height: spreadsheetZoom !== 1 ? `${100 / spreadsheetZoom}%` : '100%'\n }}\n >\n <FormulaSheet\n key={`${workbookName}-${activeSheet}`}\n sheetName={activeSheet}\n workbookName={workbookName}\n engine={engine}\n verboseErrors={verboseErrors}\n selectionManager={selectionManager}\n {...rest}\n // Pass overlay props for the active sheet\n components={components}\n overlayChildren={activeSheetOverlayChildren}\n selectedOverlayId={activeSheetSelectedOverlayId}\n columnWidths={activeSheetColumnWidths}\n onColumnWidthsChange={handleColumnWidthsChange}\n rowHeights={activeSheetRowHeights}\n onRowHeightsChange={handleRowHeightsChange}\n onOverlaySelect={handleOverlaySelect}\n onOverlayChildrenChange={handleOverlayChildrenChange}\n overlayPlaceholder={overlayPlaceholder}\n clipboardManager={clipboardManager}\n isSelected={isSelected}\n showFormulas={showFormulas}\n />\n </div>\n </div>\n\n {/* Sheet Tabs at Bottom (Excel-style) */}\n <div className=\"rsp-sheet-tabs\">\n <div className=\"rsp-sheet-tabs-scroll\">\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n {sheetNames.map((sheetName) => {\n const isRenaming = renamingSheet === sheetName;\n const isActive = activeSheet === sheetName;\n\n return (\n <div key={sheetName}>\n {isRenaming ? (\n <div style={{ display: 'flex', alignItems: 'center', gap: 4 }}>\n <input\n className=\"rsp-sheet-tab-input\"\n type=\"text\"\n value={newSheetName}\n onChange={(e) => setNewSheetName(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n renameSheet(sheetName, newSheetName);\n } else if (e.key === 'Escape') {\n cancelRenaming();\n }\n }}\n onBlur={() => {\n if (newSheetName.trim() && newSheetName.trim() !== sheetName) {\n renameSheet(sheetName, newSheetName);\n } else {\n cancelRenaming();\n }\n }}\n autoFocus\n data-testid={`rename-sheet-input-${sheetName}`}\n />\n </div>\n ) : (\n <div\n className={cn('rsp-sheet-tab', {\n 'rsp-sheet-tab-active': isActive\n })}\n onClick={() => handleActiveSheetChange(sheetName)}\n onDoubleClick={() => startRenaming(sheetName)}\n data-testid={`sheet-tab-${sheetName}`}\n >\n <span>{sheetName}</span>\n\n {/* Sheet actions (visible on hover, inside tab) */}\n <div className=\"sheet-tab-actions\">\n <button\n type=\"button\"\n className=\"rsp-icon-button\"\n onClick={(e) => {\n e.stopPropagation();\n startRenaming(sheetName);\n }}\n title=\"Rename Sheet\"\n data-testid={`rename-sheet-${sheetName}`}\n >\n <Edit2Icon style={{ width: 12, height: 12 }} />\n </button>\n {sheetNames.length > 1 && (\n <button\n type=\"button\"\n className=\"rsp-icon-button rsp-icon-button-delete\"\n onClick={(e) => {\n e.stopPropagation();\n if (confirm(`Are you sure you want to delete sheet \"${sheetName}\"?`)) {\n deleteSheet(sheetName);\n }\n }}\n title=\"Delete Sheet\"\n data-testid={`delete-sheet-${sheetName}`}\n >\n <Trash2Icon style={{ width: 12, height: 12 }} />\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n );\n })}\n </div>\n\n {/* Add Sheet Button (Excel-style, to the right) */}\n <button\n type=\"button\"\n className=\"rsp-add-sheet-button\"\n onClick={addSheet}\n title=\"Add Sheet\"\n data-testid={`add-sheet-${workbookName}`}\n >\n <PlusIcon style={{ width: 12, height: 12 }} />\n </button>\n </div>\n\n {/* Spreadsheet Zoom Controls - pinned to the right */}\n <div className=\"rsp-zoom-controls\">\n <button\n type=\"button\"\n className=\"rsp-icon-button\"\n onClick={() => setSpreadsheetZoom(Math.max(0.5, spreadsheetZoom - 0.1))}\n disabled={spreadsheetZoom <= 0.5}\n title=\"Zoom Out\"\n style={{ opacity: spreadsheetZoom <= 0.5 ? 0.5 : 1 }}\n >\n <MinusIcon style={{ width: 12, height: 12 }} />\n </button>\n <span className=\"rsp-zoom-value\">{Math.round(spreadsheetZoom * 100)}%</span>\n <button\n type=\"button\"\n className=\"rsp-icon-button\"\n onClick={() => setSpreadsheetZoom(Math.min(2, spreadsheetZoom + 0.1))}\n disabled={spreadsheetZoom >= 2}\n title=\"Zoom In\"\n style={{ opacity: spreadsheetZoom >= 2 ? 0.5 : 1 }}\n >\n <PlusIcon style={{ width: 12, height: 12 }} />\n </button>\n </div>\n </div>\n </div>\n );\n}\n\n// Export WorkbookSelectionManager\nexport { WorkbookSelectionManager } from './workbook-selection-manager';\n",
18
18
  "import { useState } from \"react\";\nimport { useColorScheme, type ColorScheme } from \"./use-color-scheme\";\n\n/**\n * Props for a `.rsp-root` element so its light/dark tokens match the inherited\n * `color-scheme`.\n *\n * A stylesheet cannot branch on an *ancestor's* `color-scheme`, and the\n * `light-dark()` function is rewritten by some bundlers into switch variables\n * that only exist next to a `color-scheme` declaration (see `styles.css`).\n * Resolving the scheme from the mounted element and reflecting it as\n * `data-rsp-scheme` keeps the tokens correct without the component declaring\n * `color-scheme` itself, which would override a consumer's pin.\n */\nexport function useSchemeRoot(): {\n ref: (element: HTMLElement | null) => void;\n \"data-rsp-scheme\": ColorScheme;\n} {\n const [element, setElement] = useState<HTMLElement | null>(null);\n const scheme = useColorScheme(element);\n\n return { ref: setElement, \"data-rsp-scheme\": scheme };\n}\n",
19
19
  "import type { CellStyle } from \"@ricsam/formula-engine\";\n\nexport type BorderSides = NonNullable<CellStyle[\"borderSides\"]>;\n\nexport type NormalizedBorderSides = {\n top: boolean;\n right: boolean;\n bottom: boolean;\n left: boolean;\n};\n\n/**\n * Normalizes a partial border-sides record into a fully specified one.\n *\n * When `borderSides` is omitted entirely the style is interpreted as \"all\n * sides\", which matches how a plain `borderColor` is expected to behave.\n *\n * @param sides Partial per-side flags from a `CellStyle`.\n * @param defaultAllWhenUnset Value used for every side when `sides` is undefined.\n */\nexport function normalizeBorderSides(\n sides: BorderSides | undefined,\n defaultAllWhenUnset = false,\n): NormalizedBorderSides {\n if (!sides) {\n return {\n top: defaultAllWhenUnset,\n right: defaultAllWhenUnset,\n bottom: defaultAllWhenUnset,\n left: defaultAllWhenUnset,\n };\n }\n\n return {\n top: Boolean(sides.top),\n right: Boolean(sides.right),\n bottom: Boolean(sides.bottom),\n left: Boolean(sides.left),\n };\n}\n\n/** True when at least one side should be drawn. */\nexport function hasAnyBorderSide(sides: NormalizedBorderSides): boolean {\n return sides.top || sides.right || sides.bottom || sides.left;\n}\n",
20
20
  "import type { CellDataType, SerializedCellValue } from \"@ricsam/formula-engine\";\n\n/**\n * Cell input coercion and display helpers.\n *\n * The grid always hands back raw strings from the editor. These helpers turn\n * that string into the value the engine should store, honouring an explicit\n * per-cell data type when one has been set.\n */\n\nconst TRUE_LITERALS = new Set([\"true\", \"yes\"]);\nconst FALSE_LITERALS = new Set([\"false\", \"no\"]);\n\n/** Parses a numeric string, accepting `,` as a decimal separator. */\nconst parseNumeric = (value: string): number | undefined => {\n const trimmed = value.trim();\n if (trimmed === \"\") return undefined;\n\n // Accept European-style decimals, but only when there is a single comma and\n // no dot, so thousands separators are not silently mangled.\n const normalized =\n trimmed.includes(\",\") && !trimmed.includes(\".\") && trimmed.split(\",\").length === 2\n ? trimmed.replace(\",\", \".\")\n : trimmed;\n\n const parsed = Number(normalized);\n return Number.isFinite(parsed) ? parsed : undefined;\n};\n\n/**\n * Converts raw editor input into the value to store for a cell.\n *\n * - Formulas (leading `=`) are always preserved verbatim.\n * - `\"general\"` infers number/boolean, otherwise keeps the string.\n * - An explicit data type forces that interpretation, falling back to the raw\n * string when the input cannot be represented.\n * - An empty string clears the cell (`undefined`).\n */\nexport function coerceCellInput(\n value: string,\n dataType: CellDataType = \"general\",\n): SerializedCellValue {\n if (value === \"\") return undefined;\n\n // Never reinterpret a formula; the engine owns its parsing.\n if (value.startsWith(\"=\")) return value;\n\n switch (dataType) {\n case \"text\":\n return value;\n\n case \"number\": {\n const parsed = parseNumeric(value);\n return parsed === undefined ? value : parsed;\n }\n\n case \"boolean\": {\n const lower = value.trim().toLowerCase();\n if (TRUE_LITERALS.has(lower)) return true;\n if (FALSE_LITERALS.has(lower)) return false;\n return value;\n }\n\n case \"general\":\n default: {\n const lower = value.trim().toLowerCase();\n if (TRUE_LITERALS.has(lower)) return true;\n if (FALSE_LITERALS.has(lower)) return false;\n\n const parsed = parseNumeric(value);\n // Only treat it as a number when the text round-trips, so values such as\n // \"1abc\" or a leading-zero code like \"007\" stay text.\n if (parsed !== undefined && String(parsed) === value.trim()) {\n return parsed;\n }\n\n return value;\n }\n }\n}\n\n/** Formats an evaluated value for display, with thousands separators. */\nexport function getCellDisplayText(value: SerializedCellValue): string {\n if (value === undefined) return \"\";\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n if (typeof value === \"number\") {\n return value.toLocaleString(\"en-US\", {\n minimumFractionDigits: 0,\n maximumFractionDigits: 10,\n });\n }\n return String(value);\n}\n\n/** Serializes a value for the clipboard (unformatted, round-trippable). */\nexport function getCellDisplayValue(value: SerializedCellValue): string {\n if (value === undefined) return \"\";\n if (typeof value === \"boolean\") return value ? \"TRUE\" : \"FALSE\";\n return String(value);\n}\n",
@@ -23,7 +23,7 @@
23
23
  "export const ZOOM_FACTOR = 0.05; // Normal zoom speed\nexport const CONTROLLED_ZOOM_FACTOR = 0.01; // Slower zoom when holding opt/alt\n\nexport const DEFAULT_ZOOM = 1;\nexport const MIN_ZOOM = 0.5;\nexport const MAX_ZOOM = 3;\n",
24
24
  "import { useEffect } from 'react';\n\nexport const useClickAway = (ref: HTMLElement | null, callback: (away: boolean) => void) => {\n useEffect(() => {\n const handleClickAway = (event: MouseEvent) => {\n if (ref) {\n const away = !ref.contains(event.target as Node);\n callback(away);\n }\n };\n\n document.addEventListener('mousedown', handleClickAway);\n return () => {\n document.removeEventListener('mousedown', handleClickAway);\n };\n }, [ref, callback]);\n};\n"
25
25
  ],
26
- "mappings": "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",
27
- "debugId": "F4BFEDA101FB82C464756E2164756E21",
26
+ "mappings": "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",
27
+ "debugId": "22D97CA826E5512F64756E2164756E21",
28
28
  "names": []
29
29
  }