@ricsam/react-spreadsheets 0.0.0 → 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,27 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/spreadsheet/spreadsheet.tsx", "../../src/utils/use-resize-observer.ts", "../../src/utils/use-color-scheme.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/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
+ "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 { 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 * Prefers the `--rsp-gridline` custom property so themes apply to the canvas\n * as well as to the DOM, falling back to the default palette when the value is\n * unset or not directly paintable.\n */\nconst resolveGridLineColor = (\n element: HTMLElement | null,\n colorScheme: 'light' | 'dark'\n): string => {\n const fallback = colorScheme === 'dark' ? '#4b5563' : '#e1e5e9';\n\n if (!element || typeof getComputedStyle !== 'function') {\n return fallback;\n }\n\n const declared = getComputedStyle(element).getPropertyValue('--rsp-gridline').trim();\n\n // Custom properties are not resolved through `light-dark()` when read this\n // way, so only accept a value the canvas can actually paint with.\n if (!declared || declared.includes('light-dark(')) {\n return fallback;\n }\n\n return declared;\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 = 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 }}\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\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 can't use CSS `light-dark()`, so pick the grid line color\n // based on the app's current color scheme.\n // Canvas 2D cannot resolve `light-dark()`, so read the themeable custom\n // property when available and fall back to the built-in palette.\n ctx.strokeStyle = resolveGridLineColor(canvasRef.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 className={cn('rsp-root', className)} style={{ position: 'relative', ...style }} {...containerProps}>\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 <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",
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
+ "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
+ "/**\n * Minimal class name joiner.\n *\n * Deliberately dependency-free: this library ships no styling framework and\n * only needs truthy filtering + joining for CSS module class composition.\n */\nexport type ClassValue =\n | string\n | number\n | null\n | undefined\n | false\n | ClassValue[]\n | Record<string, boolean | null | undefined>;\n\nexport function cn(...values: ClassValue[]): string {\n const out: string[] = [];\n\n const walk = (value: ClassValue): void => {\n if (!value && value !== 0) return;\n\n if (typeof value === \"string\" || typeof value === \"number\") {\n out.push(String(value));\n return;\n }\n\n if (Array.isArray(value)) {\n value.forEach(walk);\n return;\n }\n\n if (typeof value === \"object\") {\n for (const [key, enabled] of Object.entries(value)) {\n if (enabled) out.push(key);\n }\n }\n };\n\n values.forEach(walk);\n\n return out.join(\" \");\n}\n",
9
+ "// Grid configuration - now infinite\n// Note: COLUMNS and ROWS arrays removed in favor of on-demand generation\n\n// Default dimensions\nexport const DEFAULT_CELL_WIDTH = 100;\nexport const DEFAULT_CELL_HEIGHT = 30;\nexport const HEADER_WIDTH = 50;\nexport const HEADER_HEIGHT = 30;\n",
10
+ "// Column utilities\nexport const columnToIndex = (col: string): number => {\n let result = 0;\n for (let i = 0; i < col.length; i++) {\n result = result * 26 + (col.charCodeAt(i) - 64); // A=1, B=2, etc.\n }\n return result - 1; // Convert to 0-based index\n};\n\nexport const indexToColumn = (index: number): string => {\n let result = '';\n let num = index + 1; // Convert to 1-based\n\n while (num > 0) {\n const remainder = (num - 1) % 26;\n result = String.fromCharCode(65 + remainder) + result;\n num = Math.floor((num - 1) / 26);\n }\n\n return result;\n};\n\nexport function getRowNumber(index: number): number {\n return index + 1;\n}\n\nexport function getCellReference({ rowIndex, colIndex }: { rowIndex: number; colIndex: number }) {\n return `${indexToColumn(colIndex)}${getRowNumber(rowIndex)}`;\n}\n\n// Convert row number to letter(s) for reversed headers (1 -> A, 2 -> B, etc.)\nexport function rowToLetter(row: number): string {\n let result = '';\n let num = row - 1; // Convert to 0-based\n\n do {\n result = String.fromCharCode(65 + (num % 26)) + result;\n num = Math.floor(num / 26) - 1;\n } while (num >= 0);\n\n return result;\n}\n\n// Convert letter(s) to row number for reversed headers (A -> 1, B -> 2, etc.)\nexport function letterToRow(letter: string): number {\n let result = 0;\n for (let i = 0; i < letter.length; i++) {\n result = result * 26 + (letter.charCodeAt(i) - 64);\n }\n return result;\n}\n\nexport const parseCellReference = (\n cellReference: string\n): {\n column: string;\n row: number;\n columnIndex: number;\n rowIndex: number;\n} => {\n const match = cellReference.match(/^([A-Z]+)(\\d+)$/);\n const column = match?.[1];\n const rowText = match?.[2];\n\n if (!column || !rowText) {\n throw new Error(`Invalid cell reference: ${cellReference}`);\n }\n\n const row = parseInt(rowText, 10);\n const columnIndex = columnToIndex(column);\n const rowIndex = row - 1; // Convert to 0-based index\n\n return {\n column,\n row,\n columnIndex,\n rowIndex\n };\n};\n\nexport function findCell(\n map: Map<string, string | number>,\n search: string\n):\n | {\n cellReference: string;\n column: string;\n row: number;\n columnIndex: number;\n rowIndex: number;\n }\n | undefined {\n for (const [key, cell] of map) {\n if (cell === search) {\n const parsed = parseCellReference(key);\n if (!parsed) {\n return undefined;\n }\n\n return {\n cellReference: cell,\n ...parsed\n };\n }\n }\n}\n\n/**\n * Returns the values that belong to the column whose header equals `header`,\n * in strict top-to-bottom order (H2, H3, H4 …).\n */\nexport function extractColumnByHeader(\n map: Map<string, string | number>,\n header: string\n): (string | number)[] {\n for (const [cell, value] of map) {\n if (value === header) {\n const parsed = parseCellReference(cell);\n if (!parsed) {\n return [];\n }\n\n return extractColumn(map, parsed.columnIndex, parsed.rowIndex + 1);\n }\n }\n\n return [];\n}\n\nexport function extractColumn(\n map: Map<string, string | number>,\n colIndex: number,\n rowIndex = 0,\n handleEmpty?: (rowIndex: number) => string | number\n): (string | number)[] {\n // ── 2. Gather rows in the same column, paired with their row numbers ───────\n const rows: [number, string | number][] = [];\n\n for (const [cell, value] of map) {\n const parsed = parseCellReference(cell);\n if (!parsed) continue;\n\n if (parsed.columnIndex === colIndex && parsed.rowIndex >= rowIndex) {\n rows.push([parsed.rowIndex, value]);\n }\n }\n\n // ── 3. Sort by the numeric row index ─────────────────────────────────────────\n rows.sort((a, b) => a[0] - b[0]); // top → bottom\n\n // ── 4. If no handleEmpty function, return simple mapping ────────────────────\n if (!handleEmpty) {\n return rows.map(([, value]) => value); // just the cell contents\n }\n\n // ── 5. Fill gaps using handleEmpty function ─────────────────────────────────\n if (rows.length === 0) {\n return []; // No data found, return empty array\n }\n\n const result: (string | number)[] = [];\n const lastRow = rows[rows.length - 1];\n if (!lastRow) {\n return [];\n }\n const maxRowIndex = lastRow[0]; // Last row index in sorted array\n const rowMap = new Map(rows); // Map row index to value for quick lookup\n\n // Fill from starting rowIndex to maxRowIndex, filling gaps as needed\n for (let currentRow = rowIndex; currentRow <= maxRowIndex; currentRow++) {\n if (rowMap.has(currentRow)) {\n result.push(rowMap.get(currentRow)!);\n } else {\n result.push(handleEmpty(currentRow));\n }\n }\n\n return result;\n}\n",
11
+ "import type { SelectionManager } from \"@ricsam/selection-manager\";\nimport type { SerializedCellValue } from \"../types\";\nimport { parseCellReference } from \"../spreadsheet/utils\";\n\nexport type CellDataUpdate = {\n rowIndex: number;\n colIndex: number;\n value: string;\n};\n\nexport interface ExtractedCells {\n width: number;\n height: number;\n cells: {\n relative: { rowIndex: number; columnIndex: number };\n absolute: { rowIndex: number; columnIndex: number };\n value: SerializedCellValue;\n key: string;\n }[];\n}\n\n/**\n * Shared clipboard helpers for grid selections.\n *\n * Subclasses decide *what* is copied (raw values, formulas, styles) while this\n * base class owns the geometry of the selection and the TSV serialization that\n * external apps such as Excel and Google Sheets expect.\n */\nexport class ClipboardUtils {\n /**\n * Flattens the current selection into a rectangular block plus per-cell\n * coordinates relative to the top-left of that block.\n */\n extractCellsFromSelection(\n selectionManager: SelectionManager,\n cellData: Map<string, SerializedCellValue>,\n ): ExtractedCells | undefined {\n const state = selectionManager.getState();\n const selection = state.selections[state.selections.length - 1];\n if (!selection) return undefined;\n\n // `end` edges are tagged unions and may be infinite. An infinite edge has\n // no meaningful clipboard extent, so clamp it to the furthest populated\n // cell instead of iterating forever.\n const finiteEndRow =\n selection.end.row.type === \"number\" ? selection.end.row.value : undefined;\n const finiteEndCol =\n selection.end.col.type === \"number\" ? selection.end.col.value : undefined;\n\n const startRow = Math.min(selection.start.row, finiteEndRow ?? selection.start.row);\n const startCol = Math.min(selection.start.col, finiteEndCol ?? selection.start.col);\n\n let endRow = startRow;\n let endCol = startCol;\n\n const cells: ExtractedCells[\"cells\"] = [];\n\n cellData.forEach((value, key) => {\n let parsed: ReturnType<typeof parseCellReference>;\n try {\n parsed = parseCellReference(key);\n } catch {\n return;\n }\n\n const { rowIndex, columnIndex } = parsed;\n if (rowIndex < startRow || columnIndex < startCol) return;\n if (finiteEndRow !== undefined && rowIndex > finiteEndRow) return;\n if (finiteEndCol !== undefined && columnIndex > finiteEndCol) return;\n\n endRow = Math.max(endRow, rowIndex);\n endCol = Math.max(endCol, columnIndex);\n\n cells.push({\n relative: {\n rowIndex: rowIndex - startRow,\n columnIndex: columnIndex - startCol,\n },\n absolute: { rowIndex, columnIndex },\n value,\n key,\n });\n });\n\n if (finiteEndRow !== undefined) endRow = finiteEndRow;\n if (finiteEndCol !== undefined) endCol = finiteEndCol;\n\n return {\n width: endCol - startCol + 1,\n height: endRow - startRow + 1,\n cells,\n };\n }\n\n createExportGrid(width: number, height: number): SerializedCellValue[][] {\n return Array.from({ length: Math.max(0, height) }, () =>\n Array.from<SerializedCellValue>({ length: Math.max(0, width) }).fill(\"\"),\n );\n }\n\n /**\n * Serializes a grid into the TSV form used on the clipboard.\n *\n * Exposed separately from {@link writeToOsClipboard} so callers can compute a\n * signature for round-trip detection (\"did this paste originate here?\")\n * without touching the system clipboard.\n */\n getTsvString(grid: SerializedCellValue[][]): string {\n return grid\n .map((row) => row.map((cell) => (cell === undefined ? \"\" : String(cell))).join(\"\\t\"))\n .join(\"\\n\");\n }\n\n /**\n * Writes a TSV representation to the OS clipboard and returns the string so\n * callers can assert on it in tests or reuse it for an internal buffer.\n */\n writeToOsClipboard(grid: SerializedCellValue[][]): string {\n const text = this.getTsvString(grid);\n\n if (\n typeof navigator !== \"undefined\" &&\n navigator.clipboard?.writeText\n ) {\n void navigator.clipboard.writeText(text).catch(() => {\n // Clipboard permissions are environment-specific; failing to write\n // should never break the copy interaction itself.\n });\n }\n\n return text;\n }\n}\n",
12
+ "import React, { useRef, useEffect, useState, useCallback } from 'react';\nimport { DeleteIcon, GridOffIcon, GridOnIcon } from './icons';\nimport { ViewportStream } from './types';\nimport type { GridChild, ResizeHandle } from './types';\n\ntype FrameChild = GridChild & {\n snapToCells?: boolean;\n};\n\ninterface FrameProps {\n child: FrameChild;\n isSelected: boolean;\n zoom: number;\n viewport$: ViewportStream;\n onMove: (deltaX: number, deltaY: number) => void;\n onResize: (deltaWidth: number, deltaHeight: number, shiftKey: boolean, handle: ResizeHandle) => void;\n onSnapToCellsToggle?: (enabled: boolean) => void;\n onReset: () => void;\n onMinimize: () => void;\n onMaximize?: () => void;\n onClose: () => void;\n onInteractionEnd?: () => void;\n}\n\nexport function Frame({\n child,\n isSelected,\n zoom,\n viewport$,\n onMove,\n onResize,\n onSnapToCellsToggle,\n onReset,\n onMinimize,\n onMaximize,\n onClose,\n onInteractionEnd\n}: FrameProps) {\n const [isDragging, setIsDragging] = useState(false);\n const [isResizing, setIsResizing] = useState<ResizeHandle | null>(null);\n const [isHoveringHandle, setIsHoveringHandle] = useState<ResizeHandle | null>(null);\n const [isHoveringFrame, setIsHoveringFrame] = useState(false);\n const titleBarRef = useRef<HTMLDivElement | null>(null);\n const onMoveRef = useRef(onMove);\n const onResizeRef = useRef(onResize);\n const onInteractionEndRef = useRef(onInteractionEnd);\n const dragStartRef = useRef({\n x: 0,\n y: 0,\n viewportX: 0,\n viewportY: 0,\n viewportZoom: 1,\n interactionScale: 1\n });\n const resizeStartRef = useRef({\n x: 0,\n y: 0,\n width: 0,\n height: 0,\n viewportX: 0,\n viewportY: 0,\n viewportZoom: 1,\n interactionScale: 1\n });\n\n useEffect(() => {\n onMoveRef.current = onMove;\n onResizeRef.current = onResize;\n onInteractionEndRef.current = onInteractionEnd;\n }, [onMove, onResize, onInteractionEnd]);\n\n const getInteractionScale = useCallback(() => {\n const renderedWidth = titleBarRef.current?.getBoundingClientRect().width;\n\n if (!renderedWidth || !Number.isFinite(renderedWidth) || child.width <= 0) {\n return zoom;\n }\n\n return renderedWidth / child.width;\n }, [child.width, zoom]);\n\n const handleMouseDown = useCallback(\n (e: React.MouseEvent) => {\n if (!isSelected) return;\n\n const viewport = viewport$.currentViewport;\n e.preventDefault();\n e.stopPropagation();\n setIsDragging(true);\n dragStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n viewportX: viewport.x,\n viewportY: viewport.y,\n viewportZoom: viewport.zoom,\n interactionScale: getInteractionScale()\n };\n },\n [getInteractionScale, isSelected, viewport$]\n );\n\n const handleResizeMouseDown = useCallback(\n (e: React.MouseEvent, handle: ResizeHandle) => {\n if (!isSelected) return;\n\n const viewport = viewport$.currentViewport;\n e.preventDefault();\n e.stopPropagation();\n setIsResizing(handle);\n resizeStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n width: child.width,\n height: child.height,\n viewportX: viewport.x,\n viewportY: viewport.y,\n viewportZoom: viewport.zoom,\n interactionScale: getInteractionScale()\n };\n },\n [getInteractionScale, isSelected, child.width, child.height, viewport$]\n );\n\n useEffect(() => {\n if (!isDragging && !isResizing) return;\n\n const handleMouseMove = (e: MouseEvent) => {\n const viewport = viewport$.currentViewport;\n if (isDragging) {\n // Calculate mouse movement delta\n const mouseDeltaX = (e.clientX - dragStartRef.current.x) / dragStartRef.current.interactionScale;\n const mouseDeltaY = (e.clientY - dragStartRef.current.y) / dragStartRef.current.interactionScale;\n\n // Calculate viewport movement delta since drag started\n const viewportDeltaX = (viewport.x - dragStartRef.current.viewportX) / viewport.zoom;\n const viewportDeltaY = (viewport.y - dragStartRef.current.viewportY) / viewport.zoom;\n\n // Total movement is mouse movement minus viewport movement (to counteract viewport panning)\n const totalDeltaX = mouseDeltaX - viewportDeltaX;\n const totalDeltaY = mouseDeltaY - viewportDeltaY;\n\n onMoveRef.current(totalDeltaX, totalDeltaY);\n dragStartRef.current = {\n x: e.clientX,\n y: e.clientY,\n viewportX: viewport.x,\n viewportY: viewport.y,\n viewportZoom: viewport.zoom,\n interactionScale: dragStartRef.current.interactionScale\n };\n } else if (isResizing) {\n // Calculate mouse movement delta for resize\n const mouseDeltaX = (e.clientX - resizeStartRef.current.x) / resizeStartRef.current.interactionScale;\n const mouseDeltaY = (e.clientY - resizeStartRef.current.y) / resizeStartRef.current.interactionScale;\n\n // Calculate viewport movement delta since resize started\n const viewportDeltaX = (viewport.x - resizeStartRef.current.viewportX) / zoom;\n const viewportDeltaY = (viewport.y - resizeStartRef.current.viewportY) / zoom;\n\n // Total movement for resize handle\n const totalDeltaX = mouseDeltaX - viewportDeltaX;\n const totalDeltaY = mouseDeltaY - viewportDeltaY;\n\n let deltaWidth = 0;\n let deltaHeight = 0;\n\n switch (isResizing) {\n case 'right':\n deltaWidth = totalDeltaX;\n break;\n case 'left':\n deltaWidth = -totalDeltaX;\n break;\n case 'bottom':\n deltaHeight = totalDeltaY;\n break;\n case 'top':\n deltaHeight = -totalDeltaY;\n break;\n case 'bottom-right':\n deltaWidth = totalDeltaX;\n deltaHeight = totalDeltaY;\n break;\n case 'bottom-left':\n deltaWidth = -totalDeltaX;\n deltaHeight = totalDeltaY;\n break;\n case 'top-right':\n deltaWidth = totalDeltaX;\n deltaHeight = -totalDeltaY;\n break;\n case 'top-left':\n deltaWidth = -totalDeltaX;\n deltaHeight = -totalDeltaY;\n break;\n }\n\n onResizeRef.current(deltaWidth, deltaHeight, e.shiftKey, isResizing);\n resizeStartRef.current.x = e.clientX;\n resizeStartRef.current.y = e.clientY;\n resizeStartRef.current.viewportX = viewport.x;\n resizeStartRef.current.viewportY = viewport.y;\n resizeStartRef.current.viewportZoom = viewport.zoom;\n }\n };\n\n const handleViewportChange = (newViewport: { x: number; y: number; zoom: number }) => {\n if (isDragging) {\n // Only apply movement corrections if zoom hasn't changed (indicating actual panning, not zoom-induced position change)\n const zoomChanged = newViewport.zoom !== dragStartRef.current.viewportZoom;\n\n if (!zoomChanged) {\n // Calculate viewport movement delta since drag started\n const viewportDeltaX = (newViewport.x - dragStartRef.current.viewportX) / newViewport.zoom;\n const viewportDeltaY = (newViewport.y - dragStartRef.current.viewportY) / newViewport.zoom;\n\n // Apply viewport movement as counter-movement to maintain relative position\n onMoveRef.current(-viewportDeltaX, -viewportDeltaY);\n }\n\n // Always update stored viewport position for next comparison\n dragStartRef.current.viewportX = newViewport.x;\n dragStartRef.current.viewportY = newViewport.y;\n dragStartRef.current.viewportZoom = newViewport.zoom;\n } else if (isResizing) {\n // For resizing, also only respond to actual panning, not zoom changes\n const zoomChanged = newViewport.zoom !== resizeStartRef.current.viewportZoom;\n\n if (!zoomChanged) {\n // Calculate viewport movement delta since resize started\n const viewportDeltaX = (newViewport.x - resizeStartRef.current.viewportX) / newViewport.zoom;\n const viewportDeltaY = (newViewport.y - resizeStartRef.current.viewportY) / newViewport.zoom;\n\n // Apply viewport movement as resize adjustments based on the active handle\n let deltaWidth = 0;\n let deltaHeight = 0;\n\n switch (isResizing) {\n case 'right':\n deltaWidth = -viewportDeltaX;\n break;\n case 'left':\n deltaWidth = viewportDeltaX;\n break;\n case 'bottom':\n deltaHeight = -viewportDeltaY;\n break;\n case 'top':\n deltaHeight = viewportDeltaY;\n break;\n case 'bottom-right':\n deltaWidth = -viewportDeltaX;\n deltaHeight = -viewportDeltaY;\n break;\n case 'bottom-left':\n deltaWidth = viewportDeltaX;\n deltaHeight = -viewportDeltaY;\n break;\n case 'top-right':\n deltaWidth = -viewportDeltaX;\n deltaHeight = viewportDeltaY;\n break;\n case 'top-left':\n deltaWidth = viewportDeltaX;\n deltaHeight = viewportDeltaY;\n break;\n }\n\n // Apply the resize adjustment to counteract viewport panning\n if (deltaWidth !== 0 || deltaHeight !== 0) {\n onResizeRef.current(deltaWidth, deltaHeight, false, isResizing);\n }\n }\n\n // Always update stored viewport position\n resizeStartRef.current.viewportX = newViewport.x;\n resizeStartRef.current.viewportY = newViewport.y;\n resizeStartRef.current.viewportZoom = newViewport.zoom;\n }\n };\n\n const handleMouseUp = () => {\n setIsDragging(false);\n setIsResizing(null);\n onInteractionEndRef.current?.();\n };\n\n // Subscribe to viewport changes\n const unsubscribe = viewport$.subscribe(handleViewportChange);\n\n document.addEventListener('mousemove', handleMouseMove);\n document.addEventListener('mouseup', handleMouseUp);\n\n return () => {\n document.removeEventListener('mousemove', handleMouseMove);\n document.removeEventListener('mouseup', handleMouseUp);\n unsubscribe();\n };\n }, [isDragging, isResizing, zoom, viewport$]);\n\n const isTextBox = child.component === 'RichText';\n const isSnappedToCells = Boolean(child.snapToCells);\n\n // Text boxes use an Excel-style selected border instead of a window title bar.\n if (!isSelected && (!child.minimized || isTextBox)) return null;\n\n const handleSize = 4;\n const textBoxHandleSize = 8;\n const textBoxEdgeSize = 8;\n const titleBarHeight = 32;\n\n const getResizeHandleStyle = (\n handle: ResizeHandle,\n baseStyle: React.CSSProperties\n ): React.CSSProperties => ({\n ...baseStyle,\n background:\n isHoveringHandle === handle || isResizing === handle\n ? 'rgba(102, 126, 234, 1)'\n : 'rgba(102, 126, 234, 0.4)',\n transition: 'all 0.2s ease-in-out',\n opacity: 1,\n // transform: isHoveringHandle === handle || isResizing === handle ? \"scale(1.1)\" : \"scale(1)\",\n zIndex: isHoveringHandle === handle || isResizing === handle ? 30 : handle.includes('-') ? 20 : 10\n });\n\n const getTextBoxResizeHandleStyle = (\n handle: ResizeHandle,\n baseStyle: React.CSSProperties\n ): React.CSSProperties => ({\n ...baseStyle,\n position: 'absolute',\n width: textBoxHandleSize,\n height: textBoxHandleSize,\n boxSizing: 'border-box',\n border: '1px solid #1a73e8',\n background: isHoveringHandle === handle || isResizing === handle ? '#e8f0fe' : '#ffffff',\n borderRadius: 1,\n pointerEvents: 'auto',\n zIndex: 30\n });\n\n const getTextBoxDragEdgeStyle = (baseStyle: React.CSSProperties): React.CSSProperties => ({\n ...baseStyle,\n position: 'absolute',\n background: 'transparent',\n cursor: isDragging ? 'grabbing' : 'move',\n pointerEvents: 'auto',\n zIndex: 20\n });\n\n if (isTextBox) {\n return (\n <div\n ref={titleBarRef}\n style={{\n position: 'absolute',\n inset: 0,\n pointerEvents: 'none',\n border: '1px solid #1a73e8',\n boxSizing: 'border-box',\n zIndex: 20\n }}\n >\n {onSnapToCellsToggle && (\n <button\n type=\"button\"\n title={isSnappedToCells ? 'Disable cell snapping' : 'Snap to cells'}\n aria-pressed={isSnappedToCells}\n onMouseDown={(ev) => {\n ev.stopPropagation();\n ev.preventDefault();\n }}\n onMouseUp={(ev) => {\n ev.stopPropagation();\n ev.preventDefault();\n }}\n onClick={(e) => {\n console.log('123');\n e.preventDefault();\n e.stopPropagation();\n onSnapToCellsToggle(!isSnappedToCells);\n }}\n style={{\n position: 'absolute',\n top: -30,\n right: 0,\n width: 26,\n height: 26,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n border: '1px solid #1a73e8',\n borderRadius: 4,\n background: isSnappedToCells ? '#e8f0fe' : '#ffffff',\n color: '#1a73e8',\n cursor: 'pointer',\n pointerEvents: 'auto',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.2)',\n zIndex: 40\n }}\n >\n {isSnappedToCells ? <GridOnIcon size={16} /> : <GridOffIcon size={16} />}\n </button>\n )}\n {child.canClose && (\n <button\n type=\"button\"\n title=\"Delete text box\"\n onMouseDown={(ev) => {\n ev.stopPropagation();\n ev.preventDefault();\n }}\n onMouseUp={(ev) => {\n ev.stopPropagation();\n ev.preventDefault();\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onClose();\n }}\n style={{\n position: 'absolute',\n top: -30,\n right: onSnapToCellsToggle ? 30 : 0,\n width: 26,\n height: 26,\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n padding: 0,\n border: '1px solid #d93025',\n borderRadius: 4,\n background: '#ffffff',\n color: '#d93025',\n cursor: 'pointer',\n pointerEvents: 'auto',\n boxShadow: '0 1px 3px rgba(0, 0, 0, 0.2)',\n zIndex: 40\n }}\n >\n <DeleteIcon size={16} />\n </button>\n )}\n <div\n style={getTextBoxDragEdgeStyle({\n top: -textBoxEdgeSize / 2,\n left: textBoxHandleSize,\n right: textBoxHandleSize,\n height: textBoxEdgeSize\n })}\n onMouseDown={handleMouseDown}\n />\n <div\n style={getTextBoxDragEdgeStyle({\n bottom: -textBoxEdgeSize / 2,\n left: textBoxHandleSize,\n right: textBoxHandleSize,\n height: textBoxEdgeSize\n })}\n onMouseDown={handleMouseDown}\n />\n <div\n style={getTextBoxDragEdgeStyle({\n top: textBoxHandleSize,\n bottom: textBoxHandleSize,\n left: -textBoxEdgeSize / 2,\n width: textBoxEdgeSize\n })}\n onMouseDown={handleMouseDown}\n />\n <div\n style={getTextBoxDragEdgeStyle({\n top: textBoxHandleSize,\n bottom: textBoxHandleSize,\n right: -textBoxEdgeSize / 2,\n width: textBoxEdgeSize\n })}\n onMouseDown={handleMouseDown}\n />\n\n <div\n style={getTextBoxResizeHandleStyle('top-left', {\n top: -textBoxHandleSize / 2,\n left: -textBoxHandleSize / 2,\n cursor: 'nw-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'top-left')}\n onMouseEnter={() => setIsHoveringHandle('top-left')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getTextBoxResizeHandleStyle('top', {\n top: -textBoxHandleSize / 2,\n left: '50%',\n marginLeft: -textBoxHandleSize / 2,\n cursor: 'n-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'top')}\n onMouseEnter={() => setIsHoveringHandle('top')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getTextBoxResizeHandleStyle('top-right', {\n top: -textBoxHandleSize / 2,\n right: -textBoxHandleSize / 2,\n cursor: 'ne-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'top-right')}\n onMouseEnter={() => setIsHoveringHandle('top-right')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getTextBoxResizeHandleStyle('right', {\n top: '50%',\n right: -textBoxHandleSize / 2,\n marginTop: -textBoxHandleSize / 2,\n cursor: 'e-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'right')}\n onMouseEnter={() => setIsHoveringHandle('right')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getTextBoxResizeHandleStyle('bottom-right', {\n bottom: -textBoxHandleSize / 2,\n right: -textBoxHandleSize / 2,\n cursor: 'se-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'bottom-right')}\n onMouseEnter={() => setIsHoveringHandle('bottom-right')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getTextBoxResizeHandleStyle('bottom', {\n bottom: -textBoxHandleSize / 2,\n left: '50%',\n marginLeft: -textBoxHandleSize / 2,\n cursor: 's-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'bottom')}\n onMouseEnter={() => setIsHoveringHandle('bottom')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getTextBoxResizeHandleStyle('bottom-left', {\n bottom: -textBoxHandleSize / 2,\n left: -textBoxHandleSize / 2,\n cursor: 'sw-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'bottom-left')}\n onMouseEnter={() => setIsHoveringHandle('bottom-left')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getTextBoxResizeHandleStyle('left', {\n top: '50%',\n left: -textBoxHandleSize / 2,\n marginTop: -textBoxHandleSize / 2,\n cursor: 'w-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'left')}\n onMouseEnter={() => setIsHoveringHandle('left')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n </div>\n );\n }\n\n return (\n <>\n {/* Title bar with modern glass morphism effect */}\n <div\n ref={titleBarRef}\n style={{\n position: 'absolute',\n top: -titleBarHeight,\n left: 0,\n right: 0,\n height: titleBarHeight,\n background:\n child.minimized && !isSelected\n ? 'linear-gradient(135deg, rgba(107, 114, 128, 0.95) 0%, rgba(75, 85, 99, 0.95) 100%)'\n : 'linear-gradient(135deg, rgba(102, 126, 234, 0.95) 0%, rgba(118, 75, 162, 0.95) 100%)',\n backdropFilter: 'blur(12px)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n borderBottom: '1px solid rgba(102, 126, 234, 0.4)',\n color: 'white',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n padding: '0 16px',\n cursor: isDragging ? 'grabbing' : 'grab',\n userSelect: 'none',\n fontSize: '13px',\n fontWeight: 600,\n letterSpacing: '0.025em',\n opacity: child.minimized && !isSelected ? 0.9 : 1,\n transition: 'all 0.3s cubic-bezier(0.4, 0, 0.2, 1)',\n boxShadow: '0 2px 8px rgba(0, 0, 0, 0.1)'\n }}\n onMouseDown={handleMouseDown}\n >\n <span\n style={{\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n textShadow: '0 1px 2px rgba(0, 0, 0, 0.3)'\n }}\n >\n {child.title}\n </span>\n <div style={{ display: 'flex', gap: '6px', alignItems: 'center' }}>\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMinimize();\n }}\n style={{\n background: 'rgba(255, 255, 255, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n borderRadius: '6px',\n color: 'white',\n cursor: 'pointer',\n padding: '4px 8px',\n fontSize: '12px',\n fontWeight: '600',\n lineHeight: 1,\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n backdropFilter: 'blur(8px)'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.2)';\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.2)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n title={child.minimized ? 'Restore' : 'Minimize'}\n >\n {child.minimized ? '□' : '−'}\n </button>\n {onMaximize && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onMaximize();\n }}\n style={{\n background: 'rgba(255, 255, 255, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n borderRadius: '6px',\n color: 'white',\n cursor: 'pointer',\n padding: '4px 8px',\n fontSize: '12px',\n fontWeight: '600',\n lineHeight: 1,\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n backdropFilter: 'blur(8px)'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.2)';\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.2)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n title={child.maximized ? 'Restore' : 'Maximize'}\n >\n {child.maximized ? '◱' : '⤢'}\n </button>\n )}\n <button\n onClick={(e) => {\n e.stopPropagation();\n onReset();\n }}\n style={{\n background: 'rgba(255, 255, 255, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n borderRadius: '6px',\n color: 'white',\n cursor: child.initial ? 'pointer' : 'auto',\n padding: '4px 8px',\n fontSize: '12px',\n fontWeight: '600',\n lineHeight: 1,\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n backdropFilter: 'blur(8px)',\n opacity: child.initial ? 1 : 0.2\n }}\n disabled={!child.initial}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.2)';\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.2)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n title=\"Reset\"\n >\n ↻\n </button>\n {child.canClose && (\n <button\n onClick={(e) => {\n e.stopPropagation();\n onClose();\n }}\n style={{\n background: 'rgba(255, 255, 255, 0.1)',\n border: '1px solid rgba(255, 255, 255, 0.2)',\n borderRadius: '6px',\n color: 'white',\n cursor: 'pointer',\n padding: '4px 8px',\n fontSize: '12px',\n fontWeight: '600',\n lineHeight: 1,\n transition: 'all 0.2s cubic-bezier(0.4, 0, 0.2, 1)',\n backdropFilter: 'blur(8px)'\n }}\n onMouseEnter={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.2)';\n e.currentTarget.style.transform = 'translateY(-1px)';\n e.currentTarget.style.boxShadow = '0 4px 12px rgba(0, 0, 0, 0.2)';\n }}\n onMouseLeave={(e) => {\n e.currentTarget.style.background = 'rgba(255, 255, 255, 0.1)';\n e.currentTarget.style.transform = 'translateY(0)';\n e.currentTarget.style.boxShadow = 'none';\n }}\n title=\"Close\"\n >\n ×\n </button>\n )}\n </div>\n </div>\n\n {/* Resize handles that integrate with the frame border */}\n {isSelected && !child.minimized && (\n <div\n onMouseEnter={() => !isResizing && !isDragging && setIsHoveringFrame(true)}\n onMouseLeave={() => !isResizing && !isDragging && setIsHoveringFrame(false)}\n >\n {/* Edge handles */}\n <div\n style={getResizeHandleStyle('top', {\n position: 'absolute',\n top: -titleBarHeight - handleSize,\n left: 0,\n right: 0,\n height: handleSize,\n cursor: 'n-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'top')}\n onMouseEnter={() => setIsHoveringHandle('top')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getResizeHandleStyle('bottom', {\n position: 'absolute',\n bottom: -handleSize,\n left: 0,\n right: 0,\n height: handleSize,\n cursor: 's-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'bottom')}\n onMouseEnter={() => setIsHoveringHandle('bottom')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getResizeHandleStyle('left', {\n position: 'absolute',\n top: -titleBarHeight,\n left: -handleSize,\n bottom: 0,\n width: handleSize,\n cursor: 'w-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'left')}\n onMouseEnter={() => setIsHoveringHandle('left')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getResizeHandleStyle('right', {\n position: 'absolute',\n top: -titleBarHeight,\n right: -handleSize,\n bottom: 0,\n width: handleSize,\n cursor: 'e-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'right')}\n onMouseEnter={() => setIsHoveringHandle('right')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n\n {/* Corner handles - rendered on top */}\n <div\n style={getResizeHandleStyle('top-left', {\n position: 'absolute',\n top: -titleBarHeight - handleSize,\n left: -handleSize,\n width: handleSize,\n height: handleSize,\n cursor: 'nw-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'top-left')}\n onMouseEnter={() => setIsHoveringHandle('top-left')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getResizeHandleStyle('top-right', {\n position: 'absolute',\n top: -titleBarHeight - handleSize,\n right: -handleSize,\n width: handleSize,\n height: handleSize,\n cursor: 'ne-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'top-right')}\n onMouseEnter={() => setIsHoveringHandle('top-right')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getResizeHandleStyle('bottom-left', {\n position: 'absolute',\n bottom: -handleSize,\n left: -handleSize,\n width: handleSize,\n height: handleSize,\n cursor: 'sw-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'bottom-left')}\n onMouseEnter={() => setIsHoveringHandle('bottom-left')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n <div\n style={getResizeHandleStyle('bottom-right', {\n position: 'absolute',\n bottom: -handleSize,\n right: -handleSize,\n width: handleSize,\n height: handleSize,\n cursor: 'se-resize'\n })}\n onMouseDown={(e) => handleResizeMouseDown(e, 'bottom-right')}\n onMouseEnter={() => setIsHoveringHandle('bottom-right')}\n onMouseLeave={() => setIsHoveringHandle(null)}\n />\n </div>\n )}\n </>\n );\n}\n",
13
+ "/**\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",
14
+ "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",
15
+ "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",
16
+ "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 { 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 [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\">\n {toolbar}\n <div style={{ flex: 1 }} />\n </div>\n );\n }\n\n return (\n <div className=\"rsp-root rsp-workbook\">\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, just apply conditional styling if any\n if (conditionalStyle) {\n return {\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 return {};\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 using CSS variables for dark mode support\n const style: React.CSSProperties = {\n border: '1px solid var(--table-border-light)'\n };\n\n if (isHeaderRow) {\n // Header row styling - blue theme like Excel\n style.backgroundColor = 'var(--table-header-bg)';\n style.color = 'var(--table-header-color)';\n style.fontWeight = 'bold';\n style.borderBottom = '2px solid var(--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(--table-even-row-bg)';\n } else {\n style.backgroundColor = 'var(--table-odd-row-bg)';\n }\n }\n\n // Border styling\n if (isFirstColumn) {\n style.borderLeft = '2px solid var(--table-border-color)';\n }\n if (isLastColumn) {\n style.borderRight = '2px solid var(--table-border-color)';\n }\n if (isHeaderRow) {\n style.borderTop = '2px solid var(--table-border-color)';\n }\n if (isLastRow) {\n style.borderBottom = '2px solid var(--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 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\">\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 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",
18
+ "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",
19
+ "/**\n * Cell edit error reporting.\n *\n * The original component reported rejected edits through an app-specific\n * snackbar. A reusable library must not own UI for that, so errors are routed\n * through a subscribable sink instead: by default they are logged, and a host\n * app can subscribe to render them however it likes.\n */\n\nexport type CellEditErrorListener = (error: unknown) => void;\n\nconst listeners = new Set<CellEditErrorListener>();\n\n/**\n * Subscribes to cell edit errors (e.g. the engine rejecting a formula).\n *\n * @returns An unsubscribe function.\n */\nexport function onCellEditError(listener: CellEditErrorListener): () => void {\n listeners.add(listener);\n return () => {\n listeners.delete(listener);\n };\n}\n\n/**\n * Default `onCellDataChangeError` handler.\n *\n * Notifies subscribers; if there are none it falls back to `console.error` so\n * failures are never silently swallowed during development.\n */\nexport function queueCellEditError(error: unknown): void {\n if (listeners.size === 0) {\n console.error(\"Cell edit rejected:\", error);\n return;\n }\n\n listeners.forEach((listener) => {\n try {\n listener(error);\n } catch (listenerError) {\n console.error(\"Cell edit error listener threw:\", listenerError);\n }\n });\n}\n",
20
+ "import type { RangeAddress, SpreadsheetRange, SpreadsheetRangeEnd } from '@ricsam/formula-engine';\nimport { indexToColumn, getCellReference } from '@ricsam/formula-engine';\nimport type { SelectionManager, SMArea } from '@ricsam/selection-manager';\n\ninterface ManagerContext {\n workbookName: string;\n sheetName: string;\n}\n\nexport class WorkbookSelectionManager {\n private managers = new Map<SelectionManager, ManagerContext>();\n private lastFocusedManager: { sm: SelectionManager; context: ManagerContext } | null = null;\n private listeners = new Set<(selections: RangeAddress[]) => void>();\n private cleanupFunctions = new Map<SelectionManager, () => void>();\n\n private smAreaToSpreadsheetRange(area: SMArea): SpreadsheetRange {\n const rowEnd: SpreadsheetRangeEnd =\n area.end.row.type === 'infinity'\n ? { type: 'infinity', sign: 'positive' }\n : { type: 'number', value: area.end.row.value };\n\n const colEnd: SpreadsheetRangeEnd =\n area.end.col.type === 'infinity'\n ? { type: 'infinity', sign: 'positive' }\n : { type: 'number', 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 /**\n * Register a SelectionManager with its workbook/sheet context\n * Returns a cleanup function to unregister\n */\n add(manager: SelectionManager, context: ManagerContext): () => void {\n this.managers.set(manager, context);\n\n // Listen to focus changes\n const focusCleanup = manager.observeStateChange(\n (state) => state.hasFocus,\n (hasFocus) => {\n if (hasFocus) {\n this.lastFocusedManager = { sm: manager, context };\n this.emitChange();\n }\n }\n );\n\n // Listen to selection changes\n const selectionCleanup = manager.observeStateChange(\n (state) => JSON.stringify(state.selections),\n (selectionsJson) => {\n const selections = JSON.parse(selectionsJson);\n if (selections && selections.length > 0) {\n this.lastFocusedManager = { sm: manager, context };\n this.emitChange();\n }\n }\n );\n\n // Store combined cleanup function\n const cleanup = () => {\n focusCleanup();\n selectionCleanup();\n this.managers.delete(manager);\n this.cleanupFunctions.delete(manager);\n if (this.lastFocusedManager?.sm === manager) {\n this.lastFocusedManager = null;\n }\n };\n\n this.cleanupFunctions.set(manager, cleanup);\n return cleanup;\n }\n\n /**\n * Get the SelectionManager that was last focused or had selection activity\n */\n getLastFocusedSelectionManager(): { sm: SelectionManager; context: ManagerContext } | null {\n return this.lastFocusedManager;\n }\n\n /**\n * Get all current selections from the last focused manager.\n */\n getSelections(): RangeAddress[] {\n if (!this.lastFocusedManager) {\n return [];\n }\n\n const { sm, context } = this.lastFocusedManager;\n const state = sm.getState();\n\n return state.selections.map((area) => ({\n workbookName: context.workbookName,\n sheetName: context.sheetName,\n range: this.smAreaToSpreadsheetRange(area)\n }));\n }\n\n /**\n * Get the last/primary selection from the last focused manager\n */\n getLastSelection(): RangeAddress | null {\n const selections = this.getSelections();\n return selections[selections.length - 1] ?? null;\n }\n\n /**\n * Subscribe to selection changes\n * Returns cleanup function\n */\n onSelectionChange(callback: (selections: RangeAddress[]) => void): () => void {\n this.listeners.add(callback);\n return () => {\n this.listeners.delete(callback);\n };\n }\n\n /**\n * Format the last selection as a range string\n * e.g., \"[Workbook]Sheet!A1:C10\" or \"[Workbook]'My Sheet'!A1:INFINITY\"\n */\n formatLastSelectionAsRange(): string {\n const lastSelection = this.getLastSelection();\n if (!lastSelection) {\n return '';\n }\n\n const { workbookName, sheetName, range } = lastSelection;\n\n // Convert start position to Excel notation\n const startCol = indexToColumn(range.start.col);\n const startRow = range.start.row + 1; // Convert to 1-based\n\n // Convert end position to Excel notation\n let endCol: string;\n let endRow: string;\n\n // Handle end column\n if (range.end.col.type === 'infinity') {\n endCol = '∞';\n } else {\n endCol = indexToColumn(range.end.col.value);\n }\n\n // Handle end row\n if (range.end.row.type === 'infinity') {\n endRow = '∞';\n } else {\n endRow = String(range.end.row.value + 1); // Convert to 1-based\n }\n\n // Build range string based on what's infinite\n let rangeStr: string;\n const isColInfinity = range.end.col.type === 'infinity';\n const isRowInfinity = range.end.row.type === 'infinity';\n\n if (isColInfinity && isRowInfinity) {\n // Both infinite: A5:INFINITY\n rangeStr = `${startCol}${startRow}:INFINITY`;\n } else if (isColInfinity) {\n // Column infinite: A5:10 (row-bounded)\n rangeStr = `${startCol}${startRow}:${endRow}`;\n } else if (isRowInfinity) {\n // Row infinite: A5:C (col-bounded)\n rangeStr = `${startCol}${startRow}:${endCol}`;\n } else {\n // Closed rectangle: A5:C10\n rangeStr = `${startCol}${startRow}:${endCol}${endRow}`;\n }\n\n // Quote sheet name if it contains spaces or special characters\n const needsQuotes = /[ '!]/.test(sheetName);\n const sheetRef = needsQuotes ? `'${sheetName.replace(/'/g, \"''\")}'` : sheetName;\n\n // Return formatted string: [Workbook]Sheet!Range\n return `[${workbookName}]${sheetRef}!${rangeStr}`;\n }\n\n /**\n * Blur all selection managers (remove focus from all)\n * This should be called when the component loses focus\n */\n blur(): void {\n this.managers.forEach((context, manager) => {\n manager.clearSelections();\n manager.blur();\n });\n // Clear the last focused manager and emit change to notify listeners\n this.lastFocusedManager = null;\n this.emitChange();\n }\n\n /**\n * Focus the selection manager for a specific workbook (first sheet found).\n * This is useful when programmatically switching focus, e.g., after maximizing a window.\n */\n focusWorkbook(workbookName: string): void {\n for (const [manager, context] of this.managers) {\n if (context.workbookName === workbookName) {\n manager.focus();\n this.lastFocusedManager = { sm: manager, context };\n this.emitChange();\n return;\n }\n }\n }\n\n /**\n * Focus the selection manager for a specific sheet without changing the cell selection.\n */\n focusSheet(workbookName: string, sheetName: string): boolean {\n for (const [manager, context] of this.managers) {\n if (context.workbookName === workbookName && context.sheetName === sheetName) {\n manager.focus();\n this.lastFocusedManager = { sm: manager, context };\n this.emitChange();\n return true;\n }\n }\n return false;\n }\n\n /**\n * Focus a specific cell in a specific workbook and sheet.\n * Finds the matching SelectionManager, sets its selection to the given cell,\n * and focuses it.\n *\n * @returns true if the cell was successfully focused, false if no matching\n * manager was found (e.g. the sheet is not currently rendered).\n */\n focusCell(workbookName: string, sheetName: string, row: number, col: number): boolean {\n for (const [manager, context] of this.managers) {\n if (context.workbookName === workbookName && context.sheetName === sheetName) {\n const selection: SMArea = {\n start: { row, col },\n end: {\n row: { type: 'number' as const, value: row },\n col: { type: 'number' as const, value: col }\n }\n };\n manager.setState({ selections: [selection] });\n manager.focus();\n this.lastFocusedManager = { sm: manager, context };\n this.emitChange();\n return true;\n }\n }\n return false;\n }\n\n /**\n * Notify all listeners of selection change\n */\n private emitChange(): void {\n const currentSelection = this.getLastSelection();\n const selections = currentSelection ? [currentSelection] : [];\n this.listeners.forEach((listener) => {\n listener(selections);\n });\n }\n}\n",
21
+ "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",
22
+ "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"
23
+ ],
24
+ "mappings": "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",
25
+ "debugId": "2D3DCCBBF4E8DCA364756E2164756E21",
26
+ "names": []
27
+ }