@nuptechs/nup-xlsx-preview 1.0.2 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapters/react.d.cts +1 -1
- package/dist/adapters/react.d.ts +1 -1
- package/dist/adapters/vanilla.d.cts +1 -1
- package/dist/adapters/vanilla.d.ts +1 -1
- package/dist/adapters/vue.cjs +4 -4
- package/dist/adapters/vue.cjs.map +1 -1
- package/dist/adapters/vue.d.cts +1 -1
- package/dist/adapters/vue.d.ts +1 -1
- package/dist/adapters/vue.js +4 -4
- package/dist/adapters/vue.js.map +1 -1
- package/dist/index.cjs +10 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +10 -10
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/virtual-scroll.ts","../src/utils/cell-utils.ts","../src/core/selection.ts","../src/core/keyboard.ts","../src/core/merge-handler.ts","../src/core/clipboard.ts","../src/core/search.ts","../src/core/resize.ts","../src/core/themes.ts","../src/utils/style-mapper.ts","../src/adapters/react.tsx","../src/adapters/vanilla.ts"],"names":["VirtualScroll","config","rows","cols","rowHeights","colWidths","defaultRowHeight","defaultColWidth","overscan","frozenRows","frozenCols","i","h","w","positions","target","low","high","mid","start","end","scrollTop","scrollLeft","viewportHeight","viewportWidth","absoluteScrollTop","absoluteScrollLeft","startRowRaw","endRowRaw","startColRaw","endColRaw","startRow","endRow","startCol","endCol","row","col","width","oldWidth","delta","cellTop","cellLeft","colIndexToLetter","result","n","letterToColIndex","letters","upper","coordsToCellRef","cellRefToCoords","ref","match","parseRange","rangeRef","startRef","endRef","formatCellValue","value","type","isFormula","SelectionHandler","sheet","onChange","event","shiftKey","ctrlKey","metaKey","cellRef","coords","range","newRange","minRow","maxRow","minCol","maxCol","cells","cellRefs","r","rowCells","c","KeyboardHandler","selection","virtualScroll","callbacks","action","key","ctrl","current","newRow","newCol","sel","vs","MergeHandler","mergeStrings","mergeStr","merge","getCellRect","topLeft","bottomRight","ClipboardHandler","data","blob","textBlob","textRows","textCells","cell","text","htmlRows","htmlCells","html","styles","str","textarea","SearchHandler","query","options","caseSensitive","regex","matchWholeCell","pattern","escaped","patternStr","results","a","b","colStr","rowNum","ResizeHandler","minWidth","maxWidth","colIndex","clientX","currentWidth","newWidth","themes","getTheme","name","applyTheme","element","theme","style","getThemeClass","BORDER_STYLE_MAP","formatBorder","border","color","applyTint","hexColor","tint","hex","g","newR","newG","newB","styleToCss","css","font","decorations","fill","bgColor","align","cssToStyleString","entries","v","resolveStyle","styleRef","workbook","getCellStyle","cellStyle","refStyle","NupSpreadsheetPreview","forwardRef","props","activeSheetProp","themeProp","height","className","showHeaders","showGridLines","showSheetTabs","selectable","resizable","searchable","copyable","keyboardNavigation","ariaLabel","onCellClick","onCellDoubleClick","onCellRightClick","onSelectionChange","onSheetChange","onColumnResize","onScroll","onSearch","onCopy","containerRef","useRef","scrollRef","activeSheet","setActiveSheet","useState","scrollState","setScrollState","viewportSize","setViewportSize","setSelection","searchResults","setSearchResults","searchQuery","setSearchQuery","forceUpdate","setForceUpdate","themeConfig","useMemo","idx","selectionHandler","mergeHandler","searchHandler","clipboardHandler","resizeHandler","f","keyboardHandler","pos","useLayoutEffect","el","observer","entry","useEffect","handleScroll","useCallback","e","handleCellClick","handleCellDoubleClick","handleCellRightClick","handleKeyDown","handleSheetChange","index","handleSearch","handleResizeStart","useImperativeHandle","headerHeight","headerWidth","rect","isSelected","isAnchor","isSearchResult","s","isSearchCurrent","cellClassName","jsx","colHeaders","jsxs","rowHeaders","selectionBorder","startRect","endRect","themeClass","next","createSpreadsheetPreview","container","initialActiveSheet","_searchable","_frozenRows","_frozenCols","getSheet","getThemeConfig","initHandlers","render","scrollContainer","spreadsheet","content","headerRowInner","headerColInner","sheetTabs","resizeObserver","cellsHtml","classes","escapeHtml","colHeadersHtml","rowHeadersHtml","sheetIndex"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Virtual Scroll Engine\n * High-performance O(1) lookups using pre-computed positions and binary search\n */\n\nimport type { VisibleRange, CellRect } from '../types';\n\nexport interface VirtualScrollConfig {\n rows: number;\n cols: number;\n rowHeights: Record<number, number>;\n colWidths: Record<number, number>;\n defaultRowHeight?: number;\n defaultColWidth?: number;\n overscan?: number;\n frozenRows?: number;\n frozenCols?: number;\n}\n\nexport interface FrozenInfo {\n rows: number;\n cols: number;\n frozenRowsHeight: number;\n frozenColsWidth: number;\n}\n\nexport class VirtualScroll {\n private rowPositions: number[];\n private colPositions: number[];\n private rowHeightCache: number[];\n private colWidthCache: number[];\n \n public totalHeight: number;\n public totalWidth: number;\n public overscan: number;\n public rowCount: number;\n public colCount: number;\n public frozenRows: number;\n public frozenCols: number;\n public frozenRowsHeight: number;\n public frozenColsWidth: number;\n\n constructor(config: VirtualScrollConfig) {\n const {\n rows,\n cols,\n rowHeights,\n colWidths,\n defaultRowHeight = 24,\n defaultColWidth = 100,\n overscan = 5,\n frozenRows = 0,\n frozenCols = 0,\n } = config;\n \n this.frozenRows = frozenRows;\n this.frozenCols = frozenCols;\n\n this.rowCount = rows;\n this.colCount = cols;\n this.overscan = overscan;\n\n // Pre-compute row positions and heights\n this.rowPositions = new Array(rows + 1);\n this.rowHeightCache = new Array(rows);\n this.rowPositions[0] = 0;\n \n for (let i = 0; i < rows; i++) {\n const h = rowHeights[i] ?? defaultRowHeight;\n this.rowHeightCache[i] = h;\n this.rowPositions[i + 1] = this.rowPositions[i] + h;\n }\n this.totalHeight = this.rowPositions[rows];\n \n // Calculate frozen rows height\n this.frozenRowsHeight = frozenRows > 0 ? (this.rowPositions[frozenRows] ?? 0) : 0;\n\n // Pre-compute col positions and widths\n this.colPositions = new Array(cols + 1);\n this.colWidthCache = new Array(cols);\n this.colPositions[0] = 0;\n \n for (let i = 0; i < cols; i++) {\n const w = colWidths[i] ?? defaultColWidth;\n this.colWidthCache[i] = w;\n this.colPositions[i + 1] = this.colPositions[i] + w;\n }\n this.totalWidth = this.colPositions[cols];\n \n // Calculate frozen cols width\n this.frozenColsWidth = frozenCols > 0 ? (this.colPositions[frozenCols] ?? 0) : 0;\n }\n\n /**\n * Get frozen pane info\n */\n getFrozenInfo(): FrozenInfo {\n return {\n rows: this.frozenRows,\n cols: this.frozenCols,\n frozenRowsHeight: this.frozenRowsHeight,\n frozenColsWidth: this.frozenColsWidth,\n };\n }\n\n /**\n * Binary search to find index at a given scroll position\n * O(log n) lookup\n */\n private binarySearch(positions: number[], target: number): number {\n let low = 0;\n let high = positions.length - 2;\n\n while (low <= high) {\n const mid = (low + high) >>> 1;\n const start = positions[mid];\n const end = positions[mid + 1];\n\n if (target >= start && target < end) {\n return mid;\n } else if (target < start) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n\n return Math.max(0, Math.min(low, positions.length - 2));\n }\n\n /**\n * Get visible range given scroll position and viewport dimensions\n * Returns the scrollable (non-frozen) visible range\n * Frozen rows/cols are rendered separately by the adapter\n */\n getVisibleRange(\n scrollTop: number,\n scrollLeft: number,\n viewportHeight: number,\n viewportWidth: number\n ): VisibleRange {\n // The scroll position is relative to the scrollable content (after frozen area)\n // So we add frozenRowsHeight to get the actual position in the full data\n const absoluteScrollTop = scrollTop + this.frozenRowsHeight;\n const absoluteScrollLeft = scrollLeft + this.frozenColsWidth;\n \n // Find start/end rows\n const startRowRaw = this.binarySearch(this.rowPositions, absoluteScrollTop);\n const endRowRaw = this.binarySearch(this.rowPositions, absoluteScrollTop + Math.max(0, viewportHeight));\n\n // Find start/end cols\n const startColRaw = this.binarySearch(this.colPositions, absoluteScrollLeft);\n const endColRaw = this.binarySearch(this.colPositions, absoluteScrollLeft + Math.max(0, viewportWidth));\n\n // Apply overscan for smoother scrolling, but don't go below frozen boundary\n const startRow = Math.max(this.frozenRows, startRowRaw - this.overscan);\n const endRow = Math.min(this.rowCount - 1, endRowRaw + this.overscan);\n const startCol = Math.max(this.frozenCols, startColRaw - this.overscan);\n const endCol = Math.min(this.colCount - 1, endColRaw + this.overscan);\n\n return { startRow, endRow, startCol, endCol };\n }\n\n /**\n * Get frozen rows range (always visible)\n */\n getFrozenRowsRange(): { startRow: number; endRow: number } | null {\n if (this.frozenRows === 0) return null;\n return { startRow: 0, endRow: this.frozenRows - 1 };\n }\n\n /**\n * Get frozen cols range (always visible)\n */\n getFrozenColsRange(): { startCol: number; endCol: number } | null {\n if (this.frozenCols === 0) return null;\n return { startCol: 0, endCol: this.frozenCols - 1 };\n }\n\n /**\n * Get cell rectangle for absolute positioning\n */\n getCellRect(row: number, col: number): CellRect {\n return {\n top: this.rowPositions[row] ?? 0,\n left: this.colPositions[col] ?? 0,\n width: this.colWidthCache[col] ?? 100,\n height: this.rowHeightCache[row] ?? 24,\n };\n }\n\n /**\n * Get row height\n */\n getRowHeight(row: number): number {\n return this.rowHeightCache[row] ?? 24;\n }\n\n /**\n * Get column width\n */\n getColWidth(col: number): number {\n return this.colWidthCache[col] ?? 100;\n }\n\n /**\n * Update column width (for resize)\n */\n setColWidth(col: number, width: number): void {\n if (col < 0 || col >= this.colCount) return;\n \n const oldWidth = this.colWidthCache[col];\n const delta = width - oldWidth;\n \n this.colWidthCache[col] = width;\n \n // Update positions for all subsequent columns\n for (let i = col + 1; i <= this.colCount; i++) {\n this.colPositions[i] += delta;\n }\n \n this.totalWidth += delta;\n }\n\n /**\n * Find row/col at a given pixel position\n */\n getIndexAtPosition(scrollTop: number, scrollLeft: number): { row: number; col: number } {\n return {\n row: this.binarySearch(this.rowPositions, scrollTop),\n col: this.binarySearch(this.colPositions, scrollLeft),\n };\n }\n\n /**\n * Scroll offset to bring a cell into view\n */\n getScrollToPosition(\n row: number,\n col: number,\n viewportHeight: number,\n viewportWidth: number\n ): { scrollTop: number; scrollLeft: number } {\n const cellTop = this.rowPositions[row] ?? 0;\n const cellLeft = this.colPositions[col] ?? 0;\n \n return {\n scrollTop: Math.max(0, cellTop - viewportHeight / 2),\n scrollLeft: Math.max(0, cellLeft - viewportWidth / 2),\n };\n }\n}\n","/**\n * Cell Utilities\n * Helper functions for cell reference parsing and formatting\n */\n\n/**\n * Convert column index (0-based) to letter(s) (A, B, ..., Z, AA, AB, ...)\n */\nexport function colIndexToLetter(col: number): string {\n let result = '';\n let n = col;\n \n while (n >= 0) {\n result = String.fromCharCode((n % 26) + 65) + result;\n n = Math.floor(n / 26) - 1;\n }\n \n return result;\n}\n\n/**\n * Convert column letter(s) to index (0-based)\n */\nexport function letterToColIndex(letters: string): number {\n let col = 0;\n const upper = letters.toUpperCase();\n \n for (let i = 0; i < upper.length; i++) {\n col = col * 26 + (upper.charCodeAt(i) - 64);\n }\n \n return col - 1;\n}\n\n/**\n * Convert row/col coordinates to cell reference (e.g., 0, 0 -> \"A1\")\n */\nexport function coordsToCellRef(row: number, col: number): string {\n return `${colIndexToLetter(col)}${row + 1}`;\n}\n\n/**\n * Parse cell reference to row/col coordinates (e.g., \"A1\" -> { row: 0, col: 0 })\n */\nexport function cellRefToCoords(ref: string): { row: number; col: number } | null {\n const match = ref.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) return null;\n \n const col = letterToColIndex(match[1]);\n const row = parseInt(match[2], 10) - 1;\n \n if (row < 0 || col < 0) return null;\n \n return { row, col };\n}\n\n/**\n * Parse range reference (e.g., \"A1:B2\")\n */\nexport function parseRange(rangeRef: string): {\n start: { row: number; col: number };\n end: { row: number; col: number };\n} | null {\n const [startRef, endRef] = rangeRef.split(':');\n if (!startRef) return null;\n \n const start = cellRefToCoords(startRef);\n if (!start) return null;\n \n if (!endRef) {\n return { start, end: start };\n }\n \n const end = cellRefToCoords(endRef);\n if (!end) return null;\n \n return {\n start: {\n row: Math.min(start.row, end.row),\n col: Math.min(start.col, end.col),\n },\n end: {\n row: Math.max(start.row, end.row),\n col: Math.max(start.col, end.col),\n },\n };\n}\n\n/**\n * Format number for display\n */\nexport function formatCellValue(value: unknown, type?: string): string {\n if (value === null || value === undefined) return '';\n \n if (type === 'n' && typeof value === 'number') {\n // Check if integer\n if (Number.isInteger(value)) {\n return value.toLocaleString();\n }\n // Format with 2 decimal places\n return value.toLocaleString(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n }\n \n return String(value);\n}\n\n/**\n * Check if a string looks like a formula\n */\nexport function isFormula(value: string): boolean {\n return typeof value === 'string' && value.startsWith('=');\n}\n","/**\n * Selection Handler\n * Supports click, Shift+Click, Ctrl+Click, and drag selection\n */\n\nimport type { SelectionRange, NupCell, NupWorksheet } from '../types';\nimport { cellRefToCoords, coordsToCellRef } from '../utils/cell-utils';\n\nexport interface SelectionState {\n anchor: { row: number; col: number } | null;\n focus: { row: number; col: number } | null;\n ranges: SelectionRange[];\n}\n\nexport class SelectionHandler {\n private state: SelectionState;\n private sheet: NupWorksheet;\n private onChange: ((selection: SelectionRange | null) => void) | null;\n\n constructor(sheet: NupWorksheet, onChange?: (selection: SelectionRange | null) => void) {\n this.sheet = sheet;\n this.onChange = onChange ?? null;\n this.state = {\n anchor: null,\n focus: null,\n ranges: [],\n };\n }\n\n /**\n * Handle cell click\n */\n handleClick(\n row: number,\n col: number,\n event: { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean }\n ): void {\n const { shiftKey, ctrlKey, metaKey } = event;\n\n if (shiftKey && this.state.anchor) {\n // Extend selection from anchor to clicked cell\n this.state.focus = { row, col };\n this.updateRanges();\n } else if (ctrlKey || metaKey) {\n // Add new selection range (multi-select)\n this.state.anchor = { row, col };\n this.state.focus = { row, col };\n this.state.ranges.push(this.createRange(this.state.anchor, this.state.focus));\n } else {\n // Single cell selection\n this.state.anchor = { row, col };\n this.state.focus = { row, col };\n this.state.ranges = [this.createRange(this.state.anchor, this.state.focus)];\n }\n\n this.notifyChange();\n }\n\n /**\n * Handle drag selection\n */\n handleDrag(row: number, col: number): void {\n if (!this.state.anchor) return;\n \n this.state.focus = { row, col };\n this.updateRanges();\n this.notifyChange();\n }\n\n /**\n * Select a specific cell by reference (e.g., \"A1\")\n */\n selectCell(cellRef: string): void {\n const coords = cellRefToCoords(cellRef);\n if (!coords) return;\n\n this.state.anchor = coords;\n this.state.focus = coords;\n this.state.ranges = [this.createRange(coords, coords)];\n this.notifyChange();\n }\n\n /**\n * Select a range\n */\n selectRange(startRef: string, endRef: string): void {\n const start = cellRefToCoords(startRef);\n const end = cellRefToCoords(endRef);\n if (!start || !end) return;\n\n this.state.anchor = start;\n this.state.focus = end;\n this.state.ranges = [this.createRange(start, end)];\n this.notifyChange();\n }\n\n /**\n * Select all cells\n */\n selectAll(): void {\n this.state.anchor = { row: 0, col: 0 };\n this.state.focus = { row: this.sheet.rowCount - 1, col: this.sheet.colCount - 1 };\n this.state.ranges = [this.createRange(this.state.anchor, this.state.focus)];\n this.notifyChange();\n }\n\n /**\n * Clear selection\n */\n clear(): void {\n this.state.anchor = null;\n this.state.focus = null;\n this.state.ranges = [];\n this.notifyChange();\n }\n\n /**\n * Get current selection\n */\n getSelection(): SelectionRange | null {\n if (this.state.ranges.length === 0) return null;\n return this.state.ranges[0];\n }\n\n /**\n * Get all selections (for multi-select)\n */\n getAllSelections(): SelectionRange[] {\n return [...this.state.ranges];\n }\n\n /**\n * Check if a cell is selected\n */\n isCellSelected(row: number, col: number): boolean {\n return this.state.ranges.some(range => \n row >= range.start.row && row <= range.end.row &&\n col >= range.start.col && col <= range.end.col\n );\n }\n\n /**\n * Check if a cell is the anchor (main selected cell)\n */\n isAnchor(row: number, col: number): boolean {\n return this.state.anchor?.row === row && this.state.anchor?.col === col;\n }\n\n /**\n * Update sheet reference\n */\n setSheet(sheet: NupWorksheet): void {\n this.sheet = sheet;\n this.clear();\n }\n\n private updateRanges(): void {\n if (!this.state.anchor || !this.state.focus) return;\n \n // Replace last range with updated selection\n const newRange = this.createRange(this.state.anchor, this.state.focus);\n if (this.state.ranges.length > 0) {\n this.state.ranges[this.state.ranges.length - 1] = newRange;\n } else {\n this.state.ranges.push(newRange);\n }\n }\n\n private createRange(\n start: { row: number; col: number },\n end: { row: number; col: number }\n ): SelectionRange {\n // Normalize so start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n const cells: (NupCell | null)[][] = [];\n const cellRefs: string[] = [];\n\n for (let r = minRow; r <= maxRow; r++) {\n const rowCells: (NupCell | null)[] = [];\n for (let c = minCol; c <= maxCol; c++) {\n const ref = coordsToCellRef(r, c);\n cellRefs.push(ref);\n rowCells.push(this.sheet.cells[ref] ?? null);\n }\n cells.push(rowCells);\n }\n\n return {\n start: { row: minRow, col: minCol },\n end: { row: maxRow, col: maxCol },\n cells,\n cellRefs,\n };\n }\n\n private notifyChange(): void {\n if (this.onChange) {\n this.onChange(this.getSelection());\n }\n }\n}\n","/**\n * Keyboard Navigation Handler\n * WCAG AA compliant keyboard navigation for spreadsheet\n */\n\nimport type { SelectionHandler } from './selection';\nimport type { VirtualScroll } from './virtual-scroll';\n\nexport interface KeyboardConfig {\n enabled: boolean;\n wrapNavigation?: boolean;\n tabBehavior?: 'cell' | 'element';\n}\n\nexport type KeyboardAction =\n | 'move-up'\n | 'move-down'\n | 'move-left'\n | 'move-right'\n | 'move-page-up'\n | 'move-page-down'\n | 'move-home'\n | 'move-end'\n | 'move-ctrl-home'\n | 'move-ctrl-end'\n | 'select-all'\n | 'copy'\n | 'extend-up'\n | 'extend-down'\n | 'extend-left'\n | 'extend-right';\n\nexport class KeyboardHandler {\n private selection: SelectionHandler;\n private virtualScroll: VirtualScroll;\n private config: KeyboardConfig;\n private onScroll: ((row: number, col: number) => void) | null;\n private onCopy: (() => void) | null;\n\n constructor(\n selection: SelectionHandler,\n virtualScroll: VirtualScroll,\n config: KeyboardConfig,\n callbacks?: {\n onScroll?: (row: number, col: number) => void;\n onCopy?: () => void;\n }\n ) {\n this.selection = selection;\n this.virtualScroll = virtualScroll;\n this.config = config;\n this.onScroll = callbacks?.onScroll ?? null;\n this.onCopy = callbacks?.onCopy ?? null;\n }\n\n /**\n * Handle keydown event\n * Returns true if event was handled\n */\n handleKeyDown(event: KeyboardEvent): boolean {\n if (!this.config.enabled) return false;\n\n const action = this.getAction(event);\n if (!action) return false;\n\n event.preventDefault();\n this.executeAction(action);\n return true;\n }\n\n private getAction(event: KeyboardEvent): KeyboardAction | null {\n const { key, shiftKey, ctrlKey, metaKey } = event;\n const ctrl = ctrlKey || metaKey;\n\n // Copy\n if (ctrl && key === 'c') return 'copy';\n \n // Select all\n if (ctrl && key === 'a') return 'select-all';\n\n // Navigation with Shift (extend selection)\n if (shiftKey) {\n switch (key) {\n case 'ArrowUp': return 'extend-up';\n case 'ArrowDown': return 'extend-down';\n case 'ArrowLeft': return 'extend-left';\n case 'ArrowRight': return 'extend-right';\n }\n }\n\n // Ctrl navigation\n if (ctrl) {\n switch (key) {\n case 'Home': return 'move-ctrl-home';\n case 'End': return 'move-ctrl-end';\n }\n }\n\n // Basic navigation\n switch (key) {\n case 'ArrowUp': return 'move-up';\n case 'ArrowDown': return 'move-down';\n case 'ArrowLeft': return 'move-left';\n case 'ArrowRight': return 'move-right';\n case 'PageUp': return 'move-page-up';\n case 'PageDown': return 'move-page-down';\n case 'Home': return 'move-home';\n case 'End': return 'move-end';\n case 'Tab': return shiftKey ? 'move-left' : 'move-right';\n case 'Enter': return shiftKey ? 'move-up' : 'move-down';\n }\n\n return null;\n }\n\n private executeAction(action: KeyboardAction): void {\n const current = this.selection.getSelection();\n if (!current && !['select-all', 'move-ctrl-home'].includes(action)) {\n // No selection, start at A1\n this.selection.selectCell('A1');\n this.scrollToSelection();\n return;\n }\n\n const { row, col } = current?.start ?? { row: 0, col: 0 };\n let newRow = row;\n let newCol = col;\n\n switch (action) {\n case 'move-up':\n newRow = Math.max(0, row - 1);\n break;\n case 'move-down':\n newRow = Math.min(this.virtualScroll.rowCount - 1, row + 1);\n break;\n case 'move-left':\n newCol = Math.max(0, col - 1);\n break;\n case 'move-right':\n newCol = Math.min(this.virtualScroll.colCount - 1, col + 1);\n break;\n case 'move-page-up':\n newRow = Math.max(0, row - 20);\n break;\n case 'move-page-down':\n newRow = Math.min(this.virtualScroll.rowCount - 1, row + 20);\n break;\n case 'move-home':\n newCol = 0;\n break;\n case 'move-end':\n newCol = this.virtualScroll.colCount - 1;\n break;\n case 'move-ctrl-home':\n newRow = 0;\n newCol = 0;\n break;\n case 'move-ctrl-end':\n newRow = this.virtualScroll.rowCount - 1;\n newCol = this.virtualScroll.colCount - 1;\n break;\n case 'select-all':\n this.selection.selectAll();\n return;\n case 'copy':\n this.onCopy?.();\n return;\n case 'extend-up':\n case 'extend-down':\n case 'extend-left':\n case 'extend-right':\n this.extendSelection(action);\n return;\n }\n\n // Move selection\n this.selection.handleClick(newRow, newCol, { shiftKey: false, ctrlKey: false, metaKey: false });\n this.scrollToSelection();\n }\n\n private extendSelection(action: KeyboardAction): void {\n const current = this.selection.getSelection();\n if (!current) return;\n\n let { row, col } = current.end;\n\n switch (action) {\n case 'extend-up':\n row = Math.max(0, row - 1);\n break;\n case 'extend-down':\n row = Math.min(this.virtualScroll.rowCount - 1, row + 1);\n break;\n case 'extend-left':\n col = Math.max(0, col - 1);\n break;\n case 'extend-right':\n col = Math.min(this.virtualScroll.colCount - 1, col + 1);\n break;\n }\n\n this.selection.handleDrag(row, col);\n this.scrollToSelection();\n }\n\n private scrollToSelection(): void {\n const sel = this.selection.getSelection();\n if (!sel || !this.onScroll) return;\n \n this.onScroll(sel.start.row, sel.start.col);\n }\n\n /**\n * Update references\n */\n setVirtualScroll(vs: VirtualScroll): void {\n this.virtualScroll = vs;\n }\n\n setSelection(sel: SelectionHandler): void {\n this.selection = sel;\n }\n}\n","/**\n * Merge Cells Handler\n * Parses and manages merged cell regions\n */\n\nimport type { MergeInfo, CellRect } from '../types';\nimport { cellRefToCoords } from '../utils/cell-utils';\n\nexport class MergeHandler {\n private merges: MergeInfo[];\n private mergeMap: Map<string, MergeInfo>;\n\n constructor(mergeStrings: string[] = []) {\n this.merges = [];\n this.mergeMap = new Map();\n this.parseMerges(mergeStrings);\n }\n\n /**\n * Parse merge strings like \"A1:B2\" into structured data\n */\n private parseMerges(mergeStrings: string[]): void {\n for (const mergeStr of mergeStrings) {\n const [startRef, endRef] = mergeStr.split(':');\n if (!startRef || !endRef) continue;\n\n const start = cellRefToCoords(startRef);\n const end = cellRefToCoords(endRef);\n if (!start || !end) continue;\n\n const merge: MergeInfo = {\n startRow: Math.min(start.row, end.row),\n startCol: Math.min(start.col, end.col),\n endRow: Math.max(start.row, end.row),\n endCol: Math.max(start.col, end.col),\n cellRef: startRef,\n };\n\n this.merges.push(merge);\n\n // Map all cells in merge to the merge info\n for (let r = merge.startRow; r <= merge.endRow; r++) {\n for (let c = merge.startCol; c <= merge.endCol; c++) {\n const key = `${r},${c}`;\n this.mergeMap.set(key, merge);\n }\n }\n }\n }\n\n /**\n * Check if a cell is part of a merge\n */\n getMergeAt(row: number, col: number): MergeInfo | null {\n return this.mergeMap.get(`${row},${col}`) ?? null;\n }\n\n /**\n * Check if this cell is the top-left of a merge (the \"master\" cell)\n */\n isMergeMaster(row: number, col: number): boolean {\n const merge = this.getMergeAt(row, col);\n if (!merge) return false;\n return merge.startRow === row && merge.startCol === col;\n }\n\n /**\n * Check if this cell should be hidden (part of merge but not master)\n */\n isMergeHidden(row: number, col: number): boolean {\n const merge = this.getMergeAt(row, col);\n if (!merge) return false;\n return !(merge.startRow === row && merge.startCol === col);\n }\n\n /**\n * Get the master cell for a merged region\n */\n getMergeMaster(row: number, col: number): { row: number; col: number } | null {\n const merge = this.getMergeAt(row, col);\n if (!merge) return null;\n return { row: merge.startRow, col: merge.startCol };\n }\n\n /**\n * Get merged cell rectangle (spans multiple cells)\n */\n getMergeRect(\n row: number,\n col: number,\n getCellRect: (r: number, c: number) => CellRect\n ): CellRect | null {\n const merge = this.getMergeAt(row, col);\n if (!merge || !this.isMergeMaster(row, col)) return null;\n\n const topLeft = getCellRect(merge.startRow, merge.startCol);\n const bottomRight = getCellRect(merge.endRow, merge.endCol);\n\n return {\n top: topLeft.top,\n left: topLeft.left,\n width: bottomRight.left + bottomRight.width - topLeft.left,\n height: bottomRight.top + bottomRight.height - topLeft.top,\n };\n }\n\n /**\n * Get all merges\n */\n getAllMerges(): MergeInfo[] {\n return [...this.merges];\n }\n\n /**\n * Get merges visible in a range\n */\n getVisibleMerges(\n startRow: number,\n endRow: number,\n startCol: number,\n endCol: number\n ): MergeInfo[] {\n return this.merges.filter(merge =>\n merge.endRow >= startRow &&\n merge.startRow <= endRow &&\n merge.endCol >= startCol &&\n merge.startCol <= endCol\n );\n }\n\n /**\n * Update with new merge strings\n */\n update(mergeStrings: string[]): void {\n this.merges = [];\n this.mergeMap.clear();\n this.parseMerges(mergeStrings);\n }\n}\n","/**\n * Clipboard Handler\n * Copy selected cells to clipboard with text and HTML formats\n */\n\nimport type { SelectionRange, NupCell, ClipboardData } from '../types';\n\nexport class ClipboardHandler {\n /**\n * Copy selection to clipboard\n */\n async copyToClipboard(selection: SelectionRange): Promise<ClipboardData> {\n const data = this.formatSelection(selection);\n\n try {\n // Modern Clipboard API\n if (navigator.clipboard && typeof ClipboardItem !== 'undefined') {\n const blob = new Blob([data.html], { type: 'text/html' });\n const textBlob = new Blob([data.text], { type: 'text/plain' });\n \n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': blob,\n 'text/plain': textBlob,\n }),\n ]);\n } else {\n // Fallback to execCommand\n await this.copyWithExecCommand(data.text);\n }\n } catch (err) {\n // Final fallback\n await this.copyWithExecCommand(data.text);\n }\n\n return data;\n }\n\n /**\n * Format selection as text (TSV) and HTML table\n */\n formatSelection(selection: SelectionRange): ClipboardData {\n const { cells } = selection;\n \n // Text format: Tab-separated values\n const textRows: string[] = [];\n for (const row of cells) {\n const textCells = row.map(cell => this.getCellValue(cell));\n textRows.push(textCells.join('\\t'));\n }\n const text = textRows.join('\\n');\n\n // HTML format: Table with inline styles\n const htmlRows: string[] = [];\n for (const row of cells) {\n const htmlCells = row.map(cell => {\n const value = this.escapeHtml(this.getCellValue(cell));\n const style = this.getCellStyle(cell);\n return `<td style=\"${style}\">${value}</td>`;\n });\n htmlRows.push(`<tr>${htmlCells.join('')}</tr>`);\n }\n \n const html = `\n <table style=\"border-collapse: collapse; font-family: Arial, sans-serif; font-size: 12px;\">\n <tbody>\n ${htmlRows.join('\\n')}\n </tbody>\n </table>\n `.trim();\n\n return { text, html, cells };\n }\n\n private getCellValue(cell: NupCell | null): string {\n if (!cell || cell.v === undefined || cell.v === null) return '';\n return String(cell.v);\n }\n\n private getCellStyle(cell: NupCell | null): string {\n const styles: string[] = [\n 'border: 1px solid #ccc',\n 'padding: 4px 8px',\n ];\n\n // Add basic styling based on cell type\n if (cell?.t === 'n') {\n styles.push('text-align: right');\n }\n\n return styles.join('; ');\n }\n\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n private async copyWithExecCommand(text: string): Promise<void> {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n document.body.appendChild(textarea);\n textarea.select();\n \n try {\n document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n }\n}\n","/**\n * Search Handler\n * Search and highlight cells matching a query\n */\n\nimport type { NupWorksheet, SearchResult } from '../types';\n\nexport interface SearchOptions {\n caseSensitive?: boolean;\n regex?: boolean;\n matchWholeCell?: boolean;\n}\n\nexport class SearchHandler {\n private sheet: NupWorksheet;\n private results: SearchResult[];\n private currentIndex: number;\n\n constructor(sheet: NupWorksheet) {\n this.sheet = sheet;\n this.results = [];\n this.currentIndex = -1;\n }\n\n /**\n * Search for a query in the sheet\n */\n search(query: string, options: SearchOptions = {}): SearchResult[] {\n if (!query) {\n this.results = [];\n this.currentIndex = -1;\n return [];\n }\n\n const { caseSensitive = false, regex = false, matchWholeCell = false } = options;\n\n let pattern: RegExp;\n try {\n if (regex) {\n pattern = new RegExp(query, caseSensitive ? 'g' : 'gi');\n } else {\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const patternStr = matchWholeCell ? `^${escaped}$` : escaped;\n pattern = new RegExp(patternStr, caseSensitive ? 'g' : 'gi');\n }\n } catch {\n // Invalid regex, treat as literal\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n pattern = new RegExp(escaped, caseSensitive ? 'g' : 'gi');\n }\n\n const results: SearchResult[] = [];\n\n // Iterate through all cells\n for (const [cellRef, cell] of Object.entries(this.sheet.cells)) {\n if (cell.v === undefined || cell.v === null) continue;\n\n const value = String(cell.v);\n pattern.lastIndex = 0;\n const match = pattern.exec(value);\n\n if (match) {\n const coords = this.parseCellRef(cellRef);\n if (coords) {\n results.push({\n row: coords.row,\n col: coords.col,\n cellRef,\n value,\n matchStart: match.index,\n matchEnd: match.index + match[0].length,\n });\n }\n }\n }\n\n // Sort by row, then column\n results.sort((a, b) => {\n if (a.row !== b.row) return a.row - b.row;\n return a.col - b.col;\n });\n\n this.results = results;\n this.currentIndex = results.length > 0 ? 0 : -1;\n\n return results;\n }\n\n /**\n * Get next search result\n */\n next(): SearchResult | null {\n if (this.results.length === 0) return null;\n this.currentIndex = (this.currentIndex + 1) % this.results.length;\n return this.results[this.currentIndex];\n }\n\n /**\n * Get previous search result\n */\n previous(): SearchResult | null {\n if (this.results.length === 0) return null;\n this.currentIndex = (this.currentIndex - 1 + this.results.length) % this.results.length;\n return this.results[this.currentIndex];\n }\n\n /**\n * Get current result\n */\n current(): SearchResult | null {\n if (this.currentIndex < 0 || this.currentIndex >= this.results.length) {\n return null;\n }\n return this.results[this.currentIndex];\n }\n\n /**\n * Get all results\n */\n getResults(): SearchResult[] {\n return [...this.results];\n }\n\n /**\n * Get result count\n */\n getCount(): number {\n return this.results.length;\n }\n\n /**\n * Get current index (1-based for display)\n */\n getCurrentIndex(): number {\n return this.currentIndex + 1;\n }\n\n /**\n * Check if a cell is a search result\n */\n isResult(row: number, col: number): boolean {\n return this.results.some(r => r.row === row && r.col === col);\n }\n\n /**\n * Check if a cell is the current result\n */\n isCurrent(row: number, col: number): boolean {\n const current = this.current();\n return current?.row === row && current?.col === col;\n }\n\n /**\n * Clear search\n */\n clear(): void {\n this.results = [];\n this.currentIndex = -1;\n }\n\n /**\n * Update sheet reference\n */\n setSheet(sheet: NupWorksheet): void {\n this.sheet = sheet;\n this.clear();\n }\n\n private parseCellRef(ref: string): { row: number; col: number } | null {\n const match = ref.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) return null;\n\n const colStr = match[1].toUpperCase();\n const rowNum = parseInt(match[2], 10) - 1;\n\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n col -= 1;\n\n return { row: rowNum, col };\n }\n}\n","/**\n * Column Resize Handler\n * Drag-to-resize column widths\n */\n\nimport type { VirtualScroll } from './virtual-scroll';\n\nexport interface ResizeState {\n isResizing: boolean;\n colIndex: number;\n startX: number;\n startWidth: number;\n}\n\nexport class ResizeHandler {\n private state: ResizeState | null = null;\n private virtualScroll: VirtualScroll;\n private onChange: ((colIndex: number, width: number) => void) | null;\n private minWidth: number;\n private maxWidth: number;\n\n constructor(\n virtualScroll: VirtualScroll,\n onChange?: (colIndex: number, width: number) => void,\n minWidth = 30,\n maxWidth = 500\n ) {\n this.virtualScroll = virtualScroll;\n this.onChange = onChange ?? null;\n this.minWidth = minWidth;\n this.maxWidth = maxWidth;\n }\n\n /**\n * Start resize operation\n */\n startResize(colIndex: number, clientX: number): void {\n const currentWidth = this.virtualScroll.getColWidth(colIndex);\n \n this.state = {\n isResizing: true,\n colIndex,\n startX: clientX,\n startWidth: currentWidth,\n };\n\n // Add global event listeners\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n /**\n * Handle mouse move during resize\n */\n private handleMouseMove = (event: MouseEvent): void => {\n if (!this.state) return;\n\n const delta = event.clientX - this.state.startX;\n const newWidth = Math.min(\n this.maxWidth,\n Math.max(this.minWidth, this.state.startWidth + delta)\n );\n\n this.virtualScroll.setColWidth(this.state.colIndex, newWidth);\n this.onChange?.(this.state.colIndex, newWidth);\n };\n\n /**\n * End resize operation\n */\n private handleMouseUp = (): void => {\n this.cleanup();\n };\n\n /**\n * Check if currently resizing\n */\n isResizing(): boolean {\n return this.state?.isResizing ?? false;\n }\n\n /**\n * Get current resize column\n */\n getResizeColumn(): number | null {\n return this.state?.colIndex ?? null;\n }\n\n /**\n * Cancel resize\n */\n cancel(): void {\n if (this.state) {\n // Restore original width\n this.virtualScroll.setColWidth(this.state.colIndex, this.state.startWidth);\n this.onChange?.(this.state.colIndex, this.state.startWidth);\n }\n this.cleanup();\n }\n\n /**\n * Cleanup event listeners\n */\n private cleanup(): void {\n document.removeEventListener('mousemove', this.handleMouseMove);\n document.removeEventListener('mouseup', this.handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.state = null;\n }\n\n /**\n * Update virtual scroll reference\n */\n setVirtualScroll(vs: VirtualScroll): void {\n this.virtualScroll = vs;\n }\n\n /**\n * Destroy handler\n */\n destroy(): void {\n this.cleanup();\n }\n}\n","/**\n * Theme Definitions (JS version)\n * For programmatic theme access\n */\n\nimport type { NupThemeConfig } from '../types';\n\nexport const themes = {\n default: {\n name: 'default',\n colors: {\n background: '#ffffff',\n foreground: '#202124',\n grid: '#e0e0e0',\n headerBackground: '#f8f9fa',\n headerForeground: '#5f6368',\n selectionBorder: '#1a73e8',\n selectionBackground: 'rgba(26, 115, 232, 0.08)',\n frozenBorder: '#dadce0',\n },\n fonts: {\n family: \"'Google Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n excel: {\n name: 'excel',\n colors: {\n background: '#ffffff',\n foreground: '#000000',\n grid: '#d4d4d4',\n headerBackground: '#f0f0f0',\n headerForeground: '#000000',\n selectionBorder: '#217346',\n selectionBackground: 'rgba(33, 115, 70, 0.1)',\n frozenBorder: '#9bc2e6',\n },\n fonts: {\n family: \"'Calibri', 'Segoe UI', sans-serif\",\n size: '11px',\n headerSize: '11px',\n },\n },\n\n modern: {\n name: 'modern',\n colors: {\n background: '#fafafa',\n foreground: '#18181b',\n grid: '#e4e4e7',\n headerBackground: '#f4f4f5',\n headerForeground: '#71717a',\n selectionBorder: '#3b82f6',\n selectionBackground: 'rgba(59, 130, 246, 0.08)',\n frozenBorder: '#a1a1aa',\n },\n fonts: {\n family: \"'Inter', -apple-system, BlinkMacSystemFont, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n minimal: {\n name: 'minimal',\n colors: {\n background: '#ffffff',\n foreground: '#27272a',\n grid: '#f4f4f5',\n headerBackground: '#ffffff',\n headerForeground: '#a1a1aa',\n selectionBorder: '#18181b',\n selectionBackground: 'rgba(24, 24, 27, 0.04)',\n frozenBorder: '#e4e4e7',\n },\n fonts: {\n family: \"'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n dark: {\n name: 'dark',\n colors: {\n background: '#1e1e1e',\n foreground: '#d4d4d4',\n grid: '#3c3c3c',\n headerBackground: '#252526',\n headerForeground: '#858585',\n selectionBorder: '#0078d4',\n selectionBackground: 'rgba(0, 120, 212, 0.2)',\n frozenBorder: '#4a4a4a',\n },\n fonts: {\n family: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n midnight: {\n name: 'midnight',\n colors: {\n background: '#0d1117',\n foreground: '#c9d1d9',\n grid: '#21262d',\n headerBackground: '#161b22',\n headerForeground: '#8b949e',\n selectionBorder: '#58a6ff',\n selectionBackground: 'rgba(88, 166, 255, 0.15)',\n frozenBorder: '#30363d',\n },\n fonts: {\n family: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n accessible: {\n name: 'accessible',\n colors: {\n background: '#ffffff',\n foreground: '#000000',\n grid: '#000000',\n headerBackground: '#e6e6e6',\n headerForeground: '#000000',\n selectionBorder: '#0000ff',\n selectionBackground: 'rgba(0, 0, 255, 0.15)',\n frozenBorder: '#000000',\n },\n fonts: {\n family: \"Arial, Helvetica, sans-serif\",\n size: '14px',\n headerSize: '12px',\n },\n },\n} as const satisfies Record<string, NupThemeConfig>;\n\nexport type ThemeName = keyof typeof themes;\n\n/**\n * Get theme by name\n */\nexport function getTheme(name: ThemeName): NupThemeConfig {\n return themes[name] ?? themes.default;\n}\n\n/**\n * Apply theme CSS variables to an element\n */\nexport function applyTheme(element: HTMLElement, theme: NupThemeConfig): void {\n const style = element.style;\n \n style.setProperty('--nup-background', theme.colors.background);\n style.setProperty('--nup-foreground', theme.colors.foreground);\n style.setProperty('--nup-grid', theme.colors.grid);\n style.setProperty('--nup-header-bg', theme.colors.headerBackground);\n style.setProperty('--nup-header-fg', theme.colors.headerForeground);\n style.setProperty('--nup-selection-border', theme.colors.selectionBorder);\n style.setProperty('--nup-selection-bg', theme.colors.selectionBackground);\n style.setProperty('--nup-frozen-border', theme.colors.frozenBorder);\n style.setProperty('--nup-font-family', theme.fonts.family);\n style.setProperty('--nup-font-size', theme.fonts.size);\n}\n\n/**\n * Get theme class name\n */\nexport function getThemeClass(name: ThemeName): string {\n return `nup-theme-${name}`;\n}\n","/**\n * Style Mapper\n * Converts NupCellStyle to CSS properties\n */\n\nimport type { NupCellStyle, NupCellBorder, NupWorkbook } from '../types';\n\nexport interface CellCSSProperties {\n fontFamily?: string;\n fontSize?: string;\n fontWeight?: string;\n fontStyle?: string;\n textDecoration?: string;\n color?: string;\n backgroundColor?: string;\n textAlign?: string;\n verticalAlign?: string;\n whiteSpace?: string;\n paddingLeft?: string;\n borderTop?: string;\n borderRight?: string;\n borderBottom?: string;\n borderLeft?: string;\n transform?: string;\n}\n\nconst BORDER_STYLE_MAP: Record<string, string> = {\n thin: '1px solid',\n medium: '2px solid',\n thick: '3px solid',\n dashed: '1px dashed',\n dotted: '1px dotted',\n double: '3px double',\n};\n\nfunction formatBorder(border?: NupCellBorder): string | undefined {\n if (!border || !border.style) return undefined;\n const style = BORDER_STYLE_MAP[border.style] || '1px solid';\n const color = border.color || '#000000';\n return `${style} ${color}`;\n}\n\nfunction applyTint(hexColor: string, tint: number): string {\n const hex = hexColor.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n \n let newR: number, newG: number, newB: number;\n \n if (tint < 0) {\n newR = Math.round(r * (1 + tint));\n newG = Math.round(g * (1 + tint));\n newB = Math.round(b * (1 + tint));\n } else {\n newR = Math.round(r + (255 - r) * tint);\n newG = Math.round(g + (255 - g) * tint);\n newB = Math.round(b + (255 - b) * tint);\n }\n \n return `#${newR.toString(16).padStart(2, '0')}${newG.toString(16).padStart(2, '0')}${newB.toString(16).padStart(2, '0')}`;\n}\n\n/**\n * Convert NupCellStyle to CSS properties object\n */\nexport function styleToCss(style?: NupCellStyle): CellCSSProperties {\n if (!style) return {};\n \n const css: CellCSSProperties = {};\n \n if (style.font) {\n const font = style.font;\n if (font.name) css.fontFamily = font.name;\n if (font.size) css.fontSize = `${font.size}pt`;\n if (font.bold) css.fontWeight = 'bold';\n if (font.italic) css.fontStyle = 'italic';\n if (font.color) css.color = font.color;\n \n const decorations: string[] = [];\n if (font.underline) decorations.push('underline');\n if (font.strike) decorations.push('line-through');\n if (decorations.length > 0) {\n css.textDecoration = decorations.join(' ');\n }\n }\n \n if (style.fill) {\n const fill = style.fill;\n if (fill.color) {\n let bgColor = fill.color;\n if (fill.tint !== undefined && fill.tint !== 0) {\n bgColor = applyTint(bgColor, fill.tint);\n }\n css.backgroundColor = bgColor;\n }\n }\n \n if (style.alignment) {\n const align = style.alignment;\n if (align.horizontal) css.textAlign = align.horizontal;\n if (align.vertical) {\n css.verticalAlign = align.vertical === 'middle' ? 'middle' : align.vertical;\n }\n if (align.wrapText) css.whiteSpace = 'pre-wrap';\n if (align.indent) css.paddingLeft = `${align.indent * 8}px`;\n if (align.rotation) css.transform = `rotate(${align.rotation}deg)`;\n }\n \n if (style.border) {\n const border = style.border;\n css.borderTop = formatBorder(border.top);\n css.borderRight = formatBorder(border.right);\n css.borderBottom = formatBorder(border.bottom);\n css.borderLeft = formatBorder(border.left);\n }\n \n return css;\n}\n\n/**\n * Convert CSS properties object to inline style string\n */\nexport function cssToStyleString(css: CellCSSProperties): string {\n const entries = Object.entries(css).filter(([, v]) => v !== undefined);\n if (entries.length === 0) return '';\n \n return entries.map(([key, value]) => {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${cssKey}: ${value}`;\n }).join('; ');\n}\n\n/**\n * Resolve style from workbook styles registry\n */\nexport function resolveStyle(\n styleRef: number | string | undefined,\n workbook: NupWorkbook\n): NupCellStyle | undefined {\n if (styleRef === undefined) return undefined;\n if (!workbook.styles) return undefined;\n \n const styles = workbook.styles as Record<string, NupCellStyle>;\n return styles[String(styleRef)];\n}\n\n/**\n * Get computed style for a cell (inline style + workbook style)\n */\nexport function getCellStyle(\n cellStyle?: NupCellStyle,\n styleRef?: number | string,\n workbook?: NupWorkbook\n): NupCellStyle | undefined {\n const refStyle = workbook ? resolveStyle(styleRef, workbook) : undefined;\n \n if (!cellStyle && !refStyle) return undefined;\n if (!cellStyle) return refStyle;\n if (!refStyle) return cellStyle;\n \n return {\n ...refStyle,\n ...cellStyle,\n font: { ...refStyle.font, ...cellStyle.font },\n fill: { ...refStyle.fill, ...cellStyle.fill },\n border: { ...refStyle.border, ...cellStyle.border },\n alignment: { ...refStyle.alignment, ...cellStyle.alignment },\n };\n}\n","/**\n * React 18 Adapter\n * @aspect/nup-xlsx-preview React wrapper\n */\n\nimport {\n useRef,\n useState,\n useEffect,\n useLayoutEffect,\n useMemo,\n useCallback,\n useImperativeHandle,\n forwardRef,\n type CSSProperties,\n type ReactNode,\n} from 'react';\n\nimport type {\n PreviewConfig,\n PreviewEvents,\n PreviewInstance,\n NupWorkbook,\n NupThemeConfig,\n SelectionRange,\n SearchResult,\n} from '../types';\n\nimport { VirtualScroll } from '../core/virtual-scroll';\nimport { SelectionHandler } from '../core/selection';\nimport { KeyboardHandler } from '../core/keyboard';\nimport { MergeHandler } from '../core/merge-handler';\nimport { ClipboardHandler } from '../core/clipboard';\nimport { SearchHandler } from '../core/search';\nimport { ResizeHandler } from '../core/resize';\nimport { themes, applyTheme, getThemeClass, type ThemeName } from '../core/themes';\nimport { colIndexToLetter, coordsToCellRef, cellRefToCoords } from '../utils/cell-utils';\n\nexport interface NupSpreadsheetPreviewProps extends Omit<Partial<PreviewConfig>, 'theme'>, PreviewEvents {\n workbook: NupWorkbook;\n activeSheet?: number;\n theme?: NupThemeConfig | ThemeName;\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n}\n\nexport const NupSpreadsheetPreview = forwardRef<PreviewInstance, NupSpreadsheetPreviewProps>(\n function NupSpreadsheetPreview(props, ref) {\n const {\n workbook,\n activeSheet: activeSheetProp = 0,\n theme: themeProp = 'default',\n width = '100%',\n height = '400px',\n className = '',\n style = {},\n showHeaders = true,\n showGridLines = true,\n showSheetTabs = true,\n selectable = true,\n resizable = true,\n searchable = false,\n copyable = true,\n keyboardNavigation = true,\n frozenRows = 0,\n frozenCols = 0,\n overscan = 5,\n defaultRowHeight = 24,\n defaultColWidth = 100,\n ariaLabel = 'Spreadsheet',\n onCellClick,\n onCellDoubleClick,\n onCellRightClick,\n onSelectionChange,\n onSheetChange,\n onColumnResize,\n onScroll,\n onSearch,\n onCopy,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n \n const [activeSheet, setActiveSheet] = useState(activeSheetProp);\n const [scrollState, setScrollState] = useState({ top: 0, left: 0 });\n const [viewportSize, setViewportSize] = useState({ width: 0, height: 0 });\n const [selection, setSelection] = useState<SelectionRange | null>(null);\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [searchQuery, setSearchQuery] = useState('');\n const [forceUpdate, setForceUpdate] = useState(0);\n\n const sheet = workbook.sheets[activeSheet] ?? workbook.sheets[0];\n \n // Resolve theme\n const themeConfig = useMemo(() => {\n if (typeof themeProp === 'string') {\n return themes[themeProp as ThemeName] ?? themes.default;\n }\n return themeProp;\n }, [themeProp]);\n\n // Initialize handlers\n const virtualScroll = useMemo(() => {\n const rowHeights: Record<number, number> = {};\n const colWidths: Record<number, number> = {};\n \n Object.entries(sheet.rows).forEach(([idx, row]) => {\n if (row.h) rowHeights[parseInt(idx)] = row.h;\n });\n \n Object.entries(sheet.cols).forEach(([idx, col]) => {\n if (col.w) colWidths[parseInt(idx)] = col.w;\n });\n\n return new VirtualScroll({\n rows: sheet.rowCount,\n cols: sheet.colCount,\n rowHeights,\n colWidths,\n defaultRowHeight,\n defaultColWidth,\n overscan,\n frozenRows,\n frozenCols,\n });\n }, [sheet, defaultRowHeight, defaultColWidth, overscan, frozenRows, frozenCols, forceUpdate]);\n\n const selectionHandler = useMemo(() => {\n return new SelectionHandler(sheet, (sel) => {\n setSelection(sel);\n onSelectionChange?.(sel);\n });\n }, [sheet, onSelectionChange]);\n\n const mergeHandler = useMemo(() => {\n return new MergeHandler(sheet.merges ?? []);\n }, [sheet.merges]);\n\n const searchHandler = useMemo(() => {\n return new SearchHandler(sheet);\n }, [sheet]);\n\n const clipboardHandler = useMemo(() => new ClipboardHandler(), []);\n\n const resizeHandler = useMemo(() => {\n return new ResizeHandler(virtualScroll, (colIndex, width) => {\n setForceUpdate(f => f + 1);\n onColumnResize?.(colIndex, width);\n });\n }, [virtualScroll, onColumnResize]);\n\n const keyboardHandler = useMemo(() => {\n return new KeyboardHandler(selectionHandler, virtualScroll, { enabled: keyboardNavigation }, {\n onScroll: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportSize.height, viewportSize.width);\n scrollRef.current?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n onCopy: async () => {\n const sel = selectionHandler.getSelection();\n if (sel && copyable) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n });\n }, [selectionHandler, virtualScroll, keyboardNavigation, copyable, viewportSize, clipboardHandler, onCopy]);\n\n // Viewport resize observer\n useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setViewportSize({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n });\n }\n });\n\n observer.observe(el);\n setViewportSize({ width: el.clientWidth, height: el.clientHeight });\n\n return () => observer.disconnect();\n }, []);\n\n // Apply theme\n useEffect(() => {\n if (containerRef.current) {\n applyTheme(containerRef.current, themeConfig);\n }\n }, [themeConfig]);\n\n // Sync active sheet\n useEffect(() => {\n setActiveSheet(activeSheetProp);\n }, [activeSheetProp]);\n\n // Handle scroll\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollLeft } = e.currentTarget;\n setScrollState({ top: scrollTop, left: scrollLeft });\n\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportSize.height, viewportSize.width);\n onScroll?.({\n scrollTop,\n scrollLeft,\n visibleRows: { start: range.startRow, end: range.endRow },\n visibleCols: { start: range.startCol, end: range.endCol },\n });\n }, [virtualScroll, viewportSize, onScroll]);\n\n // Handle cell click\n const handleCellClick = useCallback((row: number, col: number, e: React.MouseEvent) => {\n if (!selectable) return;\n\n const cellRef = coordsToCellRef(row, col);\n const cell = sheet.cells[cellRef] ?? null;\n\n selectionHandler.handleClick(row, col, {\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n });\n\n onCellClick?.({\n cell,\n row,\n col,\n cellRef,\n originalEvent: e.nativeEvent,\n });\n }, [selectable, sheet, selectionHandler, onCellClick]);\n\n // Handle double click\n const handleCellDoubleClick = useCallback((row: number, col: number, e: React.MouseEvent) => {\n const cellRef = coordsToCellRef(row, col);\n const cell = sheet.cells[cellRef] ?? null;\n\n onCellDoubleClick?.({\n cell,\n row,\n col,\n cellRef,\n originalEvent: e.nativeEvent,\n });\n }, [sheet, onCellDoubleClick]);\n\n // Handle right click\n const handleCellRightClick = useCallback((row: number, col: number, e: React.MouseEvent) => {\n e.preventDefault();\n const cellRef = coordsToCellRef(row, col);\n const cell = sheet.cells[cellRef] ?? null;\n\n onCellRightClick?.({\n cell,\n row,\n col,\n cellRef,\n originalEvent: e.nativeEvent,\n });\n }, [sheet, onCellRightClick]);\n\n // Handle keyboard\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n keyboardHandler.handleKeyDown(e.nativeEvent);\n }, [keyboardHandler]);\n\n // Handle sheet change\n const handleSheetChange = useCallback((index: number) => {\n setActiveSheet(index);\n selectionHandler.clear();\n onSheetChange?.(index);\n }, [selectionHandler, onSheetChange]);\n\n // Handle search\n const handleSearch = useCallback((query: string) => {\n setSearchQuery(query);\n const results = searchHandler.search(query);\n setSearchResults(results);\n onSearch?.(results);\n }, [searchHandler, onSearch]);\n\n // Handle column resize\n const handleResizeStart = useCallback((colIndex: number, e: React.MouseEvent) => {\n if (!resizable) return;\n e.preventDefault();\n e.stopPropagation();\n resizeHandler.startResize(colIndex, e.clientX);\n }, [resizable, resizeHandler]);\n\n // Expose instance methods\n useImperativeHandle(ref, () => ({\n scrollTo: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportSize.height, viewportSize.width);\n scrollRef.current?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n scrollToCell: (cellRef) => {\n const coords = cellRefToCoords(cellRef);\n if (coords) {\n const pos = virtualScroll.getScrollToPosition(coords.row, coords.col, viewportSize.height, viewportSize.width);\n scrollRef.current?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n }\n },\n select: (range) => {\n setSelection(range);\n },\n selectCell: (cellRef) => {\n selectionHandler.selectCell(cellRef);\n },\n selectAll: () => {\n selectionHandler.selectAll();\n },\n clearSelection: () => {\n selectionHandler.clear();\n },\n getSelection: () => selection,\n setActiveSheet: handleSheetChange,\n getActiveSheet: () => activeSheet,\n search: (query) => {\n handleSearch(query);\n return searchHandler.getResults();\n },\n highlightResults: (results) => {\n setSearchResults(results);\n },\n clearHighlights: () => {\n setSearchResults([]);\n setSearchQuery('');\n },\n getWorkbook: () => workbook,\n getVisibleCells: () => {\n const range = virtualScroll.getVisibleRange(scrollState.top, scrollState.left, viewportSize.height, viewportSize.width);\n const cells: (typeof sheet.cells[string] | null)[][] = [];\n for (let r = range.startRow; r <= range.endRow; r++) {\n const row: (typeof sheet.cells[string] | null)[] = [];\n for (let c = range.startCol; c <= range.endCol; c++) {\n row.push(sheet.cells[coordsToCellRef(r, c)] ?? null);\n }\n cells.push(row);\n }\n return cells;\n },\n getCellAt: (row, col) => sheet.cells[coordsToCellRef(row, col)] ?? null,\n copySelection: async () => {\n const sel = selectionHandler.getSelection();\n if (sel) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n setColumnWidth: (col, width) => {\n virtualScroll.setColWidth(col, width);\n setForceUpdate(f => f + 1);\n },\n autoFitColumn: () => { /* TODO: measure text */ },\n autoFitAllColumns: () => { /* TODO: measure text */ },\n refresh: () => setForceUpdate(f => f + 1),\n destroy: () => {\n resizeHandler.destroy();\n },\n }), [\n virtualScroll, viewportSize, selectionHandler, searchHandler, clipboardHandler,\n handleSheetChange, handleSearch, activeSheet, selection, workbook, sheet,\n scrollState, resizeHandler, onCopy\n ]);\n\n // Calculate visible range\n const headerHeight = showHeaders ? 24 : 0;\n const headerWidth = showHeaders ? 40 : 0;\n const range = virtualScroll.getVisibleRange(\n scrollState.top,\n scrollState.left,\n viewportSize.height,\n viewportSize.width\n );\n\n // Render cells\n const cells: ReactNode[] = [];\n for (let r = range.startRow; r <= range.endRow; r++) {\n for (let c = range.startCol; c <= range.endCol; c++) {\n // Skip hidden merged cells\n if (mergeHandler.isMergeHidden(r, c)) continue;\n\n const rect = mergeHandler.getMergeRect(r, c, (row, col) => virtualScroll.getCellRect(row, col))\n ?? virtualScroll.getCellRect(r, c);\n \n const cellRef = coordsToCellRef(r, c);\n const cell = sheet.cells[cellRef];\n const isSelected = selectionHandler.isCellSelected(r, c);\n const isAnchor = selectionHandler.isAnchor(r, c);\n const isSearchResult = searchResults.some(s => s.row === r && s.col === c);\n const isSearchCurrent = searchHandler.isCurrent(r, c);\n\n let cellClassName = 'nup-cell';\n if (cell?.t === 'n') cellClassName += ' nup-cell-number';\n if (isSelected) cellClassName += ' nup-cell-selected';\n if (isAnchor) cellClassName += ' nup-cell-anchor';\n if (isSearchResult) cellClassName += ' nup-cell-search-result';\n if (isSearchCurrent) cellClassName += ' nup-cell-search-current';\n\n cells.push(\n <div\n key={`${r}-${c}`}\n className={cellClassName}\n style={{\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n }}\n onClick={(e) => handleCellClick(r, c, e)}\n onDoubleClick={(e) => handleCellDoubleClick(r, c, e)}\n onContextMenu={(e) => handleCellRightClick(r, c, e)}\n data-row={r}\n data-col={c}\n data-cell-ref={cellRef}\n role=\"gridcell\"\n aria-rowindex={r + 1}\n aria-colindex={c + 1}\n tabIndex={isAnchor ? 0 : -1}\n >\n {cell?.v !== undefined && cell?.v !== null ? String(cell.v) : ''}\n </div>\n );\n }\n }\n\n // Render column headers\n const colHeaders: ReactNode[] = [];\n if (showHeaders) {\n for (let c = range.startCol; c <= range.endCol; c++) {\n const rect = virtualScroll.getCellRect(0, c);\n const isSelected = selection && c >= selection.start.col && c <= selection.end.col;\n\n colHeaders.push(\n <div\n key={`ch-${c}`}\n className={`nup-header nup-header-col${isSelected ? ' nup-header-selected' : ''}`}\n style={{\n left: rect.left,\n width: rect.width,\n height: headerHeight,\n }}\n >\n {colIndexToLetter(c)}\n {resizable && (\n <div\n className=\"nup-resize-handle\"\n onMouseDown={(e) => handleResizeStart(c, e)}\n />\n )}\n </div>\n );\n }\n }\n\n // Render row headers\n const rowHeaders: ReactNode[] = [];\n if (showHeaders) {\n for (let r = range.startRow; r <= range.endRow; r++) {\n const rect = virtualScroll.getCellRect(r, 0);\n const isSelected = selection && r >= selection.start.row && r <= selection.end.row;\n\n rowHeaders.push(\n <div\n key={`rh-${r}`}\n className={`nup-header nup-header-row${isSelected ? ' nup-header-selected' : ''}`}\n style={{\n top: rect.top,\n width: headerWidth,\n height: rect.height,\n }}\n >\n {r + 1}\n </div>\n );\n }\n }\n\n // Selection border overlay\n let selectionBorder: ReactNode = null;\n if (selection) {\n const startRect = virtualScroll.getCellRect(selection.start.row, selection.start.col);\n const endRect = virtualScroll.getCellRect(selection.end.row, selection.end.col);\n\n selectionBorder = (\n <div\n className=\"nup-selection-border\"\n style={{\n top: startRect.top,\n left: startRect.left,\n width: endRect.left + endRect.width - startRect.left,\n height: endRect.top + endRect.height - startRect.top,\n }}\n />\n );\n }\n\n const themeClass = typeof themeProp === 'string' ? getThemeClass(themeProp as ThemeName) : '';\n\n return (\n <div\n ref={containerRef}\n className={`nup-spreadsheet ${themeClass} ${className} ${!showGridLines ? 'nup-no-gridlines' : ''}`}\n style={{ width, height, ...style }}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n role=\"grid\"\n aria-label={ariaLabel}\n aria-rowcount={sheet.rowCount}\n aria-colcount={sheet.colCount}\n >\n {/* Search Bar */}\n {searchable && (\n <div className=\"nup-search-bar\">\n <input\n type=\"search\"\n className=\"nup-search-input\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => handleSearch(e.target.value)}\n aria-label=\"Search in spreadsheet\"\n />\n {searchResults.length > 0 && (\n <span className=\"nup-search-count\">\n {searchHandler.getCurrentIndex()} of {searchResults.length}\n </span>\n )}\n <button\n className=\"nup-search-btn\"\n onClick={() => {\n const next = searchHandler.next();\n if (next) {\n const pos = virtualScroll.getScrollToPosition(next.row, next.col, viewportSize.height, viewportSize.width);\n scrollRef.current?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n }\n }}\n aria-label=\"Next result\"\n >\n Next\n </button>\n </div>\n )}\n\n {/* Corner */}\n {showHeaders && (\n <div className=\"nup-corner\" style={{ width: headerWidth, height: headerHeight }} />\n )}\n\n {/* Column Headers */}\n {showHeaders && (\n <div\n className=\"nup-header-row-container\"\n style={{\n position: 'absolute',\n top: 0,\n left: headerWidth,\n right: 0,\n height: headerHeight,\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n position: 'relative',\n width: virtualScroll.totalWidth,\n height: headerHeight,\n transform: `translateX(${-scrollState.left}px)`,\n }}\n >\n {colHeaders}\n </div>\n </div>\n )}\n\n {/* Row Headers */}\n {showHeaders && (\n <div\n className=\"nup-header-col-container\"\n style={{\n position: 'absolute',\n top: headerHeight,\n left: 0,\n bottom: showSheetTabs ? 32 : 0,\n width: headerWidth,\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n position: 'relative',\n width: headerWidth,\n height: virtualScroll.totalHeight,\n transform: `translateY(${-scrollState.top}px)`,\n }}\n >\n {rowHeaders}\n </div>\n </div>\n )}\n\n {/* Main Scroll Area */}\n <div\n ref={scrollRef}\n className=\"nup-scroll-container\"\n style={{\n top: headerHeight,\n left: headerWidth,\n right: 0,\n bottom: showSheetTabs ? 32 : 0,\n }}\n onScroll={handleScroll}\n >\n <div\n className=\"nup-content\"\n style={{\n width: virtualScroll.totalWidth,\n height: virtualScroll.totalHeight,\n }}\n >\n {cells}\n {selectionBorder}\n </div>\n </div>\n\n {/* Sheet Tabs */}\n {showSheetTabs && workbook.sheets.length > 1 && (\n <div className=\"nup-sheet-tabs\">\n {workbook.sheets.map((s, i) => (\n <button\n key={s.id}\n className={`nup-sheet-tab${i === activeSheet ? ' nup-sheet-tab-active' : ''}`}\n onClick={() => handleSheetChange(i)}\n >\n {s.name}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n }\n);\n\nexport default NupSpreadsheetPreview;\n","/**\n * Vanilla JS Adapter\n * @aspect/nup-xlsx-preview Vanilla JS API\n */\n\nimport type {\n PreviewConfig,\n PreviewEvents,\n PreviewInstance,\n NupWorkbook,\n NupThemeConfig,\n SelectionRange,\n SearchResult,\n} from '../types';\n\nimport { VirtualScroll } from '../core/virtual-scroll';\nimport { SelectionHandler } from '../core/selection';\nimport { KeyboardHandler } from '../core/keyboard';\nimport { MergeHandler } from '../core/merge-handler';\nimport { ClipboardHandler } from '../core/clipboard';\nimport { SearchHandler } from '../core/search';\nimport { ResizeHandler } from '../core/resize';\nimport { themes, applyTheme, getThemeClass, type ThemeName } from '../core/themes';\nimport { colIndexToLetter, coordsToCellRef, cellRefToCoords } from '../utils/cell-utils';\n\nexport interface CreatePreviewOptions extends Partial<PreviewConfig>, PreviewEvents {\n workbook: NupWorkbook;\n}\n\nexport function createSpreadsheetPreview(\n container: HTMLElement | string,\n options: CreatePreviewOptions\n): PreviewInstance {\n const el = typeof container === 'string'\n ? document.querySelector<HTMLElement>(container)\n : container;\n\n if (!el) {\n throw new Error('Container element not found');\n }\n\n const {\n workbook,\n activeSheet: initialActiveSheet = 0,\n theme: themeProp = 'default',\n width = '100%',\n height = '400px',\n showHeaders = true,\n showGridLines = true,\n showSheetTabs = true,\n selectable = true,\n resizable = true,\n searchable: _searchable = false,\n copyable = true,\n keyboardNavigation = true,\n frozenRows: _frozenRows = 0,\n frozenCols: _frozenCols = 0,\n overscan = 5,\n defaultRowHeight = 24,\n defaultColWidth = 100,\n ariaLabel = 'Spreadsheet',\n onCellClick,\n onCellDoubleClick,\n onCellRightClick,\n onSelectionChange,\n onSheetChange,\n onColumnResize,\n onScroll,\n onSearch,\n onCopy,\n } = options;\n\n // State\n let activeSheet = initialActiveSheet;\n let scrollTop = 0;\n let scrollLeft = 0;\n let viewportWidth = 0;\n let viewportHeight = 0;\n let selection: SelectionRange | null = null;\n let searchResults: SearchResult[] = [];\n\n // Get current sheet\n const getSheet = () => workbook.sheets[activeSheet] ?? workbook.sheets[0];\n\n // Get theme config\n const getThemeConfig = (): NupThemeConfig => {\n if (typeof themeProp === 'string') {\n return themes[themeProp as ThemeName] ?? themes.default;\n }\n return themeProp;\n };\n\n // Initialize handlers\n let virtualScroll: VirtualScroll;\n let selectionHandler: SelectionHandler;\n let mergeHandler: MergeHandler;\n let searchHandler: SearchHandler;\n let clipboardHandler: ClipboardHandler;\n let resizeHandler: ResizeHandler;\n let keyboardHandler: KeyboardHandler;\n\n const initHandlers = () => {\n const sheet = getSheet();\n const rowHeights: Record<number, number> = {};\n const colWidths: Record<number, number> = {};\n\n Object.entries(sheet.rows).forEach(([idx, row]) => {\n if (row.h) rowHeights[parseInt(idx)] = row.h;\n });\n\n Object.entries(sheet.cols).forEach(([idx, col]) => {\n if (col.w) colWidths[parseInt(idx)] = col.w;\n });\n\n virtualScroll = new VirtualScroll({\n rows: sheet.rowCount,\n cols: sheet.colCount,\n rowHeights,\n colWidths,\n defaultRowHeight,\n defaultColWidth,\n overscan,\n });\n\n selectionHandler = new SelectionHandler(sheet, (sel) => {\n selection = sel;\n onSelectionChange?.(sel);\n render();\n });\n\n mergeHandler = new MergeHandler(sheet.merges ?? []);\n searchHandler = new SearchHandler(sheet);\n clipboardHandler = new ClipboardHandler();\n\n resizeHandler = new ResizeHandler(virtualScroll, (colIndex, w) => {\n onColumnResize?.(colIndex, w);\n render();\n });\n\n keyboardHandler = new KeyboardHandler(\n selectionHandler,\n virtualScroll,\n { enabled: keyboardNavigation },\n {\n onScroll: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportHeight, viewportWidth);\n scrollContainer?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n onCopy: async () => {\n const sel = selectionHandler.getSelection();\n if (sel && copyable) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n }\n );\n };\n\n // Create DOM structure\n const headerHeight = showHeaders ? 24 : 0;\n const headerWidth = showHeaders ? 40 : 0;\n\n const themeClass = typeof themeProp === 'string' ? getThemeClass(themeProp as ThemeName) : '';\n\n el.innerHTML = `\n <div class=\"nup-spreadsheet ${themeClass} ${!showGridLines ? 'nup-no-gridlines' : ''}\"\n style=\"width: ${typeof width === 'number' ? width + 'px' : width}; height: ${typeof height === 'number' ? height + 'px' : height};\"\n tabindex=\"0\"\n role=\"grid\"\n aria-label=\"${ariaLabel}\">\n ${showHeaders ? `<div class=\"nup-corner\" style=\"width: ${headerWidth}px; height: ${headerHeight}px;\"></div>` : ''}\n ${showHeaders ? `\n <div class=\"nup-header-row-container\" style=\"position: absolute; top: 0; left: ${headerWidth}px; right: 0; height: ${headerHeight}px; overflow: hidden;\">\n <div class=\"nup-header-row-inner\" style=\"position: relative; height: ${headerHeight}px;\"></div>\n </div>\n <div class=\"nup-header-col-container\" style=\"position: absolute; top: ${headerHeight}px; left: 0; bottom: ${showSheetTabs ? '32px' : '0'}; width: ${headerWidth}px; overflow: hidden;\">\n <div class=\"nup-header-col-inner\" style=\"position: relative; width: ${headerWidth}px;\"></div>\n </div>\n ` : ''}\n <div class=\"nup-scroll-container\" style=\"top: ${headerHeight}px; left: ${headerWidth}px; right: 0; bottom: ${showSheetTabs ? '32px' : '0'};\">\n <div class=\"nup-content\"></div>\n </div>\n ${showSheetTabs && workbook.sheets.length > 1 ? '<div class=\"nup-sheet-tabs\"></div>' : ''}\n </div>\n `;\n\n const spreadsheet = el.querySelector<HTMLElement>('.nup-spreadsheet')!;\n const scrollContainer = el.querySelector<HTMLElement>('.nup-scroll-container')!;\n const content = el.querySelector<HTMLElement>('.nup-content')!;\n const headerRowInner = el.querySelector<HTMLElement>('.nup-header-row-inner');\n const headerColInner = el.querySelector<HTMLElement>('.nup-header-col-inner');\n const sheetTabs = el.querySelector<HTMLElement>('.nup-sheet-tabs');\n\n // Apply theme\n applyTheme(spreadsheet, getThemeConfig());\n\n // Initialize\n initHandlers();\n\n // Resize observer\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n viewportWidth = entry.contentRect.width;\n viewportHeight = entry.contentRect.height;\n render();\n }\n });\n resizeObserver.observe(scrollContainer);\n viewportWidth = scrollContainer.clientWidth;\n viewportHeight = scrollContainer.clientHeight;\n\n // Scroll handler\n scrollContainer.addEventListener('scroll', () => {\n scrollTop = scrollContainer.scrollTop;\n scrollLeft = scrollContainer.scrollLeft;\n\n if (headerRowInner) {\n headerRowInner.style.transform = `translateX(${-scrollLeft}px)`;\n }\n if (headerColInner) {\n headerColInner.style.transform = `translateY(${-scrollTop}px)`;\n }\n\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportHeight, viewportWidth);\n onScroll?.({\n scrollTop,\n scrollLeft,\n visibleRows: { start: range.startRow, end: range.endRow },\n visibleCols: { start: range.startCol, end: range.endCol },\n });\n\n render();\n });\n\n // Keyboard handler\n spreadsheet.addEventListener('keydown', (e) => {\n keyboardHandler.handleKeyDown(e);\n });\n\n // Render function\n const render = () => {\n const sheet = getSheet();\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportHeight, viewportWidth);\n\n // Set content size\n content.style.width = `${virtualScroll.totalWidth}px`;\n content.style.height = `${virtualScroll.totalHeight}px`;\n\n if (headerRowInner) {\n headerRowInner.style.width = `${virtualScroll.totalWidth}px`;\n }\n if (headerColInner) {\n headerColInner.style.height = `${virtualScroll.totalHeight}px`;\n }\n\n // Render cells\n let cellsHtml = '';\n for (let r = range.startRow; r <= range.endRow; r++) {\n for (let c = range.startCol; c <= range.endCol; c++) {\n if (mergeHandler.isMergeHidden(r, c)) continue;\n\n const rect = mergeHandler.getMergeRect(r, c, (row, col) => virtualScroll.getCellRect(row, col))\n ?? virtualScroll.getCellRect(r, c);\n\n const cellRef = coordsToCellRef(r, c);\n const cell = sheet.cells[cellRef];\n const isSelected = selectionHandler.isCellSelected(r, c);\n const isAnchor = selectionHandler.isAnchor(r, c);\n const isSearchResult = searchResults.some(s => s.row === r && s.col === c);\n\n const classes = [\n 'nup-cell',\n cell?.t === 'n' ? 'nup-cell-number' : '',\n isSelected ? 'nup-cell-selected' : '',\n isAnchor ? 'nup-cell-anchor' : '',\n isSearchResult ? 'nup-cell-search-result' : '',\n ].filter(Boolean).join(' ');\n\n const value = cell?.v !== undefined && cell?.v !== null ? String(cell.v) : '';\n\n cellsHtml += `\n <div class=\"${classes}\"\n style=\"top: ${rect.top}px; left: ${rect.left}px; width: ${rect.width}px; height: ${rect.height}px;\"\n data-row=\"${r}\" data-col=\"${c}\" data-cell-ref=\"${cellRef}\">\n ${escapeHtml(value)}\n </div>\n `;\n }\n }\n\n // Selection border\n if (selection) {\n const startRect = virtualScroll.getCellRect(selection.start.row, selection.start.col);\n const endRect = virtualScroll.getCellRect(selection.end.row, selection.end.col);\n cellsHtml += `\n <div class=\"nup-selection-border\"\n style=\"top: ${startRect.top}px; left: ${startRect.left}px; width: ${endRect.left + endRect.width - startRect.left}px; height: ${endRect.top + endRect.height - startRect.top}px;\">\n </div>\n `;\n }\n\n content.innerHTML = cellsHtml;\n\n // Render headers\n if (showHeaders && headerRowInner) {\n let colHeadersHtml = '';\n for (let c = range.startCol; c <= range.endCol; c++) {\n const rect = virtualScroll.getCellRect(0, c);\n const isSelected = selection && c >= selection.start.col && c <= selection.end.col;\n colHeadersHtml += `\n <div class=\"nup-header nup-header-col ${isSelected ? 'nup-header-selected' : ''}\"\n style=\"left: ${rect.left}px; width: ${rect.width}px; height: ${headerHeight}px;\">\n ${colIndexToLetter(c)}\n ${resizable ? '<div class=\"nup-resize-handle\" data-col=\"' + c + '\"></div>' : ''}\n </div>\n `;\n }\n headerRowInner.innerHTML = colHeadersHtml;\n }\n\n if (showHeaders && headerColInner) {\n let rowHeadersHtml = '';\n for (let r = range.startRow; r <= range.endRow; r++) {\n const rect = virtualScroll.getCellRect(r, 0);\n const isSelected = selection && r >= selection.start.row && r <= selection.end.row;\n rowHeadersHtml += `\n <div class=\"nup-header nup-header-row ${isSelected ? 'nup-header-selected' : ''}\"\n style=\"top: ${rect.top}px; width: ${headerWidth}px; height: ${rect.height}px;\">\n ${r + 1}\n </div>\n `;\n }\n headerColInner.innerHTML = rowHeadersHtml;\n }\n\n // Render sheet tabs\n if (sheetTabs && workbook.sheets.length > 1) {\n sheetTabs.innerHTML = workbook.sheets.map((s, i) => `\n <button class=\"nup-sheet-tab ${i === activeSheet ? 'nup-sheet-tab-active' : ''}\" data-sheet=\"${i}\">\n ${escapeHtml(s.name)}\n </button>\n `).join('');\n }\n };\n\n // Cell click handler\n content.addEventListener('click', (e) => {\n if (!selectable) return;\n\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-cell');\n if (!target) return;\n\n const row = parseInt(target.dataset.row ?? '0');\n const col = parseInt(target.dataset.col ?? '0');\n const cellRef = target.dataset.cellRef ?? '';\n\n selectionHandler.handleClick(row, col, {\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n });\n\n onCellClick?.({\n cell: getSheet().cells[cellRef] ?? null,\n row,\n col,\n cellRef,\n originalEvent: e,\n });\n });\n\n // Double click handler\n content.addEventListener('dblclick', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-cell');\n if (!target) return;\n\n const row = parseInt(target.dataset.row ?? '0');\n const col = parseInt(target.dataset.col ?? '0');\n const cellRef = target.dataset.cellRef ?? '';\n\n onCellDoubleClick?.({\n cell: getSheet().cells[cellRef] ?? null,\n row,\n col,\n cellRef,\n originalEvent: e,\n });\n });\n\n // Right click handler\n content.addEventListener('contextmenu', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-cell');\n if (!target) return;\n\n e.preventDefault();\n\n const row = parseInt(target.dataset.row ?? '0');\n const col = parseInt(target.dataset.col ?? '0');\n const cellRef = target.dataset.cellRef ?? '';\n\n onCellRightClick?.({\n cell: getSheet().cells[cellRef] ?? null,\n row,\n col,\n cellRef,\n originalEvent: e,\n });\n });\n\n // Sheet tab click handler\n sheetTabs?.addEventListener('click', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-sheet-tab');\n if (!target) return;\n\n const sheetIndex = parseInt(target.dataset.sheet ?? '0');\n activeSheet = sheetIndex;\n initHandlers();\n onSheetChange?.(sheetIndex);\n render();\n });\n\n // Resize handle handler\n if (resizable && headerRowInner) {\n headerRowInner.addEventListener('mousedown', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-resize-handle');\n if (!target) return;\n\n const col = parseInt(target.dataset.col ?? '0');\n resizeHandler.startResize(col, e.clientX);\n });\n }\n\n // Initial render\n render();\n\n // Return instance\n const instance: PreviewInstance = {\n scrollTo: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportHeight, viewportWidth);\n scrollContainer.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n scrollToCell: (cellRef) => {\n const coords = cellRefToCoords(cellRef);\n if (coords) {\n const pos = virtualScroll.getScrollToPosition(coords.row, coords.col, viewportHeight, viewportWidth);\n scrollContainer.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n }\n },\n select: (range) => {\n selection = range;\n render();\n },\n selectCell: (cellRef) => {\n selectionHandler.selectCell(cellRef);\n },\n selectAll: () => {\n selectionHandler.selectAll();\n },\n clearSelection: () => {\n selectionHandler.clear();\n },\n getSelection: () => selection,\n setActiveSheet: (index) => {\n activeSheet = index;\n initHandlers();\n onSheetChange?.(index);\n render();\n },\n getActiveSheet: () => activeSheet,\n search: (query) => {\n const results = searchHandler.search(query);\n searchResults = results;\n onSearch?.(results);\n render();\n return results;\n },\n highlightResults: (results) => {\n searchResults = results;\n render();\n },\n clearHighlights: () => {\n searchResults = [];\n render();\n },\n getWorkbook: () => workbook,\n getVisibleCells: () => {\n const sheet = getSheet();\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportHeight, viewportWidth);\n const cells: (typeof sheet.cells[string] | null)[][] = [];\n for (let r = range.startRow; r <= range.endRow; r++) {\n const row: (typeof sheet.cells[string] | null)[] = [];\n for (let c = range.startCol; c <= range.endCol; c++) {\n row.push(sheet.cells[coordsToCellRef(r, c)] ?? null);\n }\n cells.push(row);\n }\n return cells;\n },\n getCellAt: (row, col) => getSheet().cells[coordsToCellRef(row, col)] ?? null,\n copySelection: async () => {\n const sel = selectionHandler.getSelection();\n if (sel) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n setColumnWidth: (col, w) => {\n virtualScroll.setColWidth(col, w);\n render();\n },\n autoFitColumn: () => {},\n autoFitAllColumns: () => {},\n refresh: () => render(),\n destroy: () => {\n resizeObserver.disconnect();\n resizeHandler.destroy();\n el.innerHTML = '';\n },\n };\n\n return instance;\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nexport default createSpreadsheetPreview;\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/virtual-scroll.ts","../src/utils/cell-utils.ts","../src/core/selection.ts","../src/core/keyboard.ts","../src/core/merge-handler.ts","../src/core/clipboard.ts","../src/core/search.ts","../src/core/resize.ts","../src/core/themes.ts","../src/utils/style-mapper.ts","../src/adapters/react.tsx","../src/adapters/vanilla.ts"],"names":["VirtualScroll","config","rows","cols","rowHeights","colWidths","defaultRowHeight","defaultColWidth","overscan","frozenRows","frozenCols","i","h","w","positions","target","low","high","mid","start","end","scrollTop","scrollLeft","viewportHeight","viewportWidth","absoluteScrollTop","absoluteScrollLeft","startRowRaw","endRowRaw","startColRaw","endColRaw","startRow","endRow","startCol","endCol","row","col","width","oldWidth","delta","cellTop","cellLeft","colIndexToLetter","result","n","letterToColIndex","letters","upper","coordsToCellRef","cellRefToCoords","ref","match","parseRange","rangeRef","startRef","endRef","formatCellValue","value","type","isFormula","SelectionHandler","sheet","onChange","event","shiftKey","ctrlKey","metaKey","cellRef","coords","range","newRange","minRow","maxRow","minCol","maxCol","cells","cellRefs","r","rowCells","c","KeyboardHandler","selection","virtualScroll","callbacks","action","key","ctrl","current","newRow","newCol","sel","vs","MergeHandler","mergeStrings","mergeStr","merge","getCellRect","topLeft","bottomRight","ClipboardHandler","data","blob","textBlob","textRows","textCells","cell","text","htmlRows","htmlCells","html","styles","str","textarea","SearchHandler","query","options","caseSensitive","regex","matchWholeCell","pattern","escaped","patternStr","results","a","b","colStr","rowNum","ResizeHandler","minWidth","maxWidth","colIndex","clientX","currentWidth","newWidth","themes","getTheme","name","applyTheme","element","theme","style","getThemeClass","BORDER_STYLE_MAP","formatBorder","border","color","applyTint","hexColor","tint","hex","g","newR","newG","newB","styleToCss","css","font","decorations","fill","bgColor","align","cssToStyleString","entries","v","resolveStyle","styleRef","workbook","getCellStyle","cellStyle","refStyle","NupSpreadsheetPreview","forwardRef","props","activeSheetProp","themeProp","height","className","showHeaders","showGridLines","showSheetTabs","selectable","resizable","searchable","copyable","keyboardNavigation","ariaLabel","onCellClick","onCellDoubleClick","onCellRightClick","onSelectionChange","onSheetChange","onColumnResize","onScroll","onSearch","onCopy","containerRef","useRef","scrollRef","activeSheet","setActiveSheet","useState","scrollState","setScrollState","viewportSize","setViewportSize","setSelection","searchResults","setSearchResults","searchQuery","setSearchQuery","forceUpdate","setForceUpdate","themeConfig","useMemo","idx","selectionHandler","mergeHandler","searchHandler","clipboardHandler","resizeHandler","f","keyboardHandler","pos","useLayoutEffect","el","observer","entry","useEffect","handleScroll","useCallback","e","handleCellClick","handleCellDoubleClick","handleCellRightClick","handleKeyDown","handleSheetChange","index","handleSearch","handleResizeStart","useImperativeHandle","headerHeight","headerWidth","rect","isSelected","isAnchor","isSearchResult","s","isSearchCurrent","cellClassName","jsx","colHeaders","jsxs","rowHeaders","selectionBorder","startRect","endRect","themeClass","next","createSpreadsheetPreview","container","initialActiveSheet","_searchable","_frozenRows","_frozenCols","getSheet","getThemeConfig","initHandlers","render","scrollContainer","spreadsheet","content","headerRowInner","headerColInner","sheetTabs","resizeObserver","cellsHtml","classes","escapeHtml","colHeadersHtml","rowHeadersHtml","sheetIndex"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Virtual Scroll Engine\n * High-performance O(1) lookups using pre-computed positions and binary search\n */\n\nimport type { VisibleRange, CellRect } from '../types';\n\nexport interface VirtualScrollConfig {\n rows: number;\n cols: number;\n rowHeights: Record<number, number>;\n colWidths: Record<number, number>;\n defaultRowHeight?: number;\n defaultColWidth?: number;\n overscan?: number;\n frozenRows?: number;\n frozenCols?: number;\n}\n\nexport interface FrozenInfo {\n rows: number;\n cols: number;\n frozenRowsHeight: number;\n frozenColsWidth: number;\n}\n\nexport class VirtualScroll {\n private rowPositions: number[];\n private colPositions: number[];\n private rowHeightCache: number[];\n private colWidthCache: number[];\n \n public totalHeight: number;\n public totalWidth: number;\n public overscan: number;\n public rowCount: number;\n public colCount: number;\n public frozenRows: number;\n public frozenCols: number;\n public frozenRowsHeight: number;\n public frozenColsWidth: number;\n\n constructor(config: VirtualScrollConfig) {\n const {\n rows,\n cols,\n rowHeights,\n colWidths,\n defaultRowHeight = 24,\n defaultColWidth = 100,\n overscan = 5,\n frozenRows = 0,\n frozenCols = 0,\n } = config;\n \n this.frozenRows = frozenRows;\n this.frozenCols = frozenCols;\n\n this.rowCount = rows;\n this.colCount = cols;\n this.overscan = overscan;\n\n // Pre-compute row positions and heights\n this.rowPositions = new Array(rows + 1);\n this.rowHeightCache = new Array(rows);\n this.rowPositions[0] = 0;\n \n for (let i = 0; i < rows; i++) {\n const h = rowHeights[i] ?? defaultRowHeight;\n this.rowHeightCache[i] = h;\n this.rowPositions[i + 1] = this.rowPositions[i] + h;\n }\n this.totalHeight = this.rowPositions[rows];\n \n // Calculate frozen rows height\n this.frozenRowsHeight = frozenRows > 0 ? (this.rowPositions[frozenRows] ?? 0) : 0;\n\n // Pre-compute col positions and widths\n this.colPositions = new Array(cols + 1);\n this.colWidthCache = new Array(cols);\n this.colPositions[0] = 0;\n \n for (let i = 0; i < cols; i++) {\n const w = colWidths[i] ?? defaultColWidth;\n this.colWidthCache[i] = w;\n this.colPositions[i + 1] = this.colPositions[i] + w;\n }\n this.totalWidth = this.colPositions[cols];\n \n // Calculate frozen cols width\n this.frozenColsWidth = frozenCols > 0 ? (this.colPositions[frozenCols] ?? 0) : 0;\n }\n\n /**\n * Get frozen pane info\n */\n getFrozenInfo(): FrozenInfo {\n return {\n rows: this.frozenRows,\n cols: this.frozenCols,\n frozenRowsHeight: this.frozenRowsHeight,\n frozenColsWidth: this.frozenColsWidth,\n };\n }\n\n /**\n * Binary search to find index at a given scroll position\n * O(log n) lookup\n */\n private binarySearch(positions: number[], target: number): number {\n let low = 0;\n let high = positions.length - 2;\n\n while (low <= high) {\n const mid = (low + high) >>> 1;\n const start = positions[mid];\n const end = positions[mid + 1];\n\n if (target >= start && target < end) {\n return mid;\n } else if (target < start) {\n high = mid - 1;\n } else {\n low = mid + 1;\n }\n }\n\n return Math.max(0, Math.min(low, positions.length - 2));\n }\n\n /**\n * Get visible range given scroll position and viewport dimensions\n * Returns the scrollable (non-frozen) visible range\n * Frozen rows/cols are rendered separately by the adapter\n */\n getVisibleRange(\n scrollTop: number,\n scrollLeft: number,\n viewportHeight: number,\n viewportWidth: number\n ): VisibleRange {\n // The scroll position is relative to the scrollable content (after frozen area)\n // So we add frozenRowsHeight to get the actual position in the full data\n const absoluteScrollTop = scrollTop + this.frozenRowsHeight;\n const absoluteScrollLeft = scrollLeft + this.frozenColsWidth;\n \n // Find start/end rows\n const startRowRaw = this.binarySearch(this.rowPositions, absoluteScrollTop);\n const endRowRaw = this.binarySearch(this.rowPositions, absoluteScrollTop + Math.max(0, viewportHeight));\n\n // Find start/end cols\n const startColRaw = this.binarySearch(this.colPositions, absoluteScrollLeft);\n const endColRaw = this.binarySearch(this.colPositions, absoluteScrollLeft + Math.max(0, viewportWidth));\n\n // Apply overscan for smoother scrolling, but don't go below frozen boundary\n const startRow = Math.max(this.frozenRows, startRowRaw - this.overscan);\n const endRow = Math.min(this.rowCount - 1, endRowRaw + this.overscan);\n const startCol = Math.max(this.frozenCols, startColRaw - this.overscan);\n const endCol = Math.min(this.colCount - 1, endColRaw + this.overscan);\n\n return { startRow, endRow, startCol, endCol };\n }\n\n /**\n * Get frozen rows range (always visible)\n */\n getFrozenRowsRange(): { startRow: number; endRow: number } | null {\n if (this.frozenRows === 0) return null;\n return { startRow: 0, endRow: this.frozenRows - 1 };\n }\n\n /**\n * Get frozen cols range (always visible)\n */\n getFrozenColsRange(): { startCol: number; endCol: number } | null {\n if (this.frozenCols === 0) return null;\n return { startCol: 0, endCol: this.frozenCols - 1 };\n }\n\n /**\n * Get cell rectangle for absolute positioning\n */\n getCellRect(row: number, col: number): CellRect {\n return {\n top: this.rowPositions[row] ?? 0,\n left: this.colPositions[col] ?? 0,\n width: this.colWidthCache[col] ?? 100,\n height: this.rowHeightCache[row] ?? 24,\n };\n }\n\n /**\n * Get row height\n */\n getRowHeight(row: number): number {\n return this.rowHeightCache[row] ?? 24;\n }\n\n /**\n * Get column width\n */\n getColWidth(col: number): number {\n return this.colWidthCache[col] ?? 100;\n }\n\n /**\n * Update column width (for resize)\n */\n setColWidth(col: number, width: number): void {\n if (col < 0 || col >= this.colCount) return;\n \n const oldWidth = this.colWidthCache[col];\n const delta = width - oldWidth;\n \n this.colWidthCache[col] = width;\n \n // Update positions for all subsequent columns\n for (let i = col + 1; i <= this.colCount; i++) {\n this.colPositions[i] += delta;\n }\n \n this.totalWidth += delta;\n }\n\n /**\n * Find row/col at a given pixel position\n */\n getIndexAtPosition(scrollTop: number, scrollLeft: number): { row: number; col: number } {\n return {\n row: this.binarySearch(this.rowPositions, scrollTop),\n col: this.binarySearch(this.colPositions, scrollLeft),\n };\n }\n\n /**\n * Scroll offset to bring a cell into view\n */\n getScrollToPosition(\n row: number,\n col: number,\n viewportHeight: number,\n viewportWidth: number\n ): { scrollTop: number; scrollLeft: number } {\n const cellTop = this.rowPositions[row] ?? 0;\n const cellLeft = this.colPositions[col] ?? 0;\n \n return {\n scrollTop: Math.max(0, cellTop - viewportHeight / 2),\n scrollLeft: Math.max(0, cellLeft - viewportWidth / 2),\n };\n }\n}\n","/**\n * Cell Utilities\n * Helper functions for cell reference parsing and formatting\n */\n\n/**\n * Convert column index (0-based) to letter(s) (A, B, ..., Z, AA, AB, ...)\n */\nexport function colIndexToLetter(col: number): string {\n let result = '';\n let n = col;\n \n while (n >= 0) {\n result = String.fromCharCode((n % 26) + 65) + result;\n n = Math.floor(n / 26) - 1;\n }\n \n return result;\n}\n\n/**\n * Convert column letter(s) to index (0-based)\n */\nexport function letterToColIndex(letters: string): number {\n let col = 0;\n const upper = letters.toUpperCase();\n \n for (let i = 0; i < upper.length; i++) {\n col = col * 26 + (upper.charCodeAt(i) - 64);\n }\n \n return col - 1;\n}\n\n/**\n * Convert row/col coordinates to cell reference (e.g., 0, 0 -> \"A1\")\n */\nexport function coordsToCellRef(row: number, col: number): string {\n return `${colIndexToLetter(col)}${row + 1}`;\n}\n\n/**\n * Parse cell reference to row/col coordinates (e.g., \"A1\" -> { row: 0, col: 0 })\n */\nexport function cellRefToCoords(ref: string): { row: number; col: number } | null {\n const match = ref.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) return null;\n \n const col = letterToColIndex(match[1]);\n const row = parseInt(match[2], 10) - 1;\n \n if (row < 0 || col < 0) return null;\n \n return { row, col };\n}\n\n/**\n * Parse range reference (e.g., \"A1:B2\")\n */\nexport function parseRange(rangeRef: string): {\n start: { row: number; col: number };\n end: { row: number; col: number };\n} | null {\n const [startRef, endRef] = rangeRef.split(':');\n if (!startRef) return null;\n \n const start = cellRefToCoords(startRef);\n if (!start) return null;\n \n if (!endRef) {\n return { start, end: start };\n }\n \n const end = cellRefToCoords(endRef);\n if (!end) return null;\n \n return {\n start: {\n row: Math.min(start.row, end.row),\n col: Math.min(start.col, end.col),\n },\n end: {\n row: Math.max(start.row, end.row),\n col: Math.max(start.col, end.col),\n },\n };\n}\n\n/**\n * Format number for display\n */\nexport function formatCellValue(value: unknown, type?: string): string {\n if (value === null || value === undefined) return '';\n \n if (type === 'n' && typeof value === 'number') {\n // Check if integer\n if (Number.isInteger(value)) {\n return value.toLocaleString();\n }\n // Format with 2 decimal places\n return value.toLocaleString(undefined, {\n minimumFractionDigits: 0,\n maximumFractionDigits: 2,\n });\n }\n \n return String(value);\n}\n\n/**\n * Check if a string looks like a formula\n */\nexport function isFormula(value: string): boolean {\n return typeof value === 'string' && value.startsWith('=');\n}\n","/**\n * Selection Handler\n * Supports click, Shift+Click, Ctrl+Click, and drag selection\n */\n\nimport type { SelectionRange, NupCell, NupWorksheet } from '../types';\nimport { cellRefToCoords, coordsToCellRef } from '../utils/cell-utils';\n\nexport interface SelectionState {\n anchor: { row: number; col: number } | null;\n focus: { row: number; col: number } | null;\n ranges: SelectionRange[];\n}\n\nexport class SelectionHandler {\n private state: SelectionState;\n private sheet: NupWorksheet;\n private onChange: ((selection: SelectionRange | null) => void) | null;\n\n constructor(sheet: NupWorksheet, onChange?: (selection: SelectionRange | null) => void) {\n this.sheet = sheet;\n this.onChange = onChange ?? null;\n this.state = {\n anchor: null,\n focus: null,\n ranges: [],\n };\n }\n\n /**\n * Handle cell click\n */\n handleClick(\n row: number,\n col: number,\n event: { shiftKey: boolean; ctrlKey: boolean; metaKey: boolean }\n ): void {\n const { shiftKey, ctrlKey, metaKey } = event;\n\n if (shiftKey && this.state.anchor) {\n // Extend selection from anchor to clicked cell\n this.state.focus = { row, col };\n this.updateRanges();\n } else if (ctrlKey || metaKey) {\n // Add new selection range (multi-select)\n this.state.anchor = { row, col };\n this.state.focus = { row, col };\n this.state.ranges.push(this.createRange(this.state.anchor, this.state.focus));\n } else {\n // Single cell selection\n this.state.anchor = { row, col };\n this.state.focus = { row, col };\n this.state.ranges = [this.createRange(this.state.anchor, this.state.focus)];\n }\n\n this.notifyChange();\n }\n\n /**\n * Handle drag selection\n */\n handleDrag(row: number, col: number): void {\n if (!this.state.anchor) return;\n \n this.state.focus = { row, col };\n this.updateRanges();\n this.notifyChange();\n }\n\n /**\n * Select a specific cell by reference (e.g., \"A1\")\n */\n selectCell(cellRef: string): void {\n const coords = cellRefToCoords(cellRef);\n if (!coords) return;\n\n this.state.anchor = coords;\n this.state.focus = coords;\n this.state.ranges = [this.createRange(coords, coords)];\n this.notifyChange();\n }\n\n /**\n * Select a range\n */\n selectRange(startRef: string, endRef: string): void {\n const start = cellRefToCoords(startRef);\n const end = cellRefToCoords(endRef);\n if (!start || !end) return;\n\n this.state.anchor = start;\n this.state.focus = end;\n this.state.ranges = [this.createRange(start, end)];\n this.notifyChange();\n }\n\n /**\n * Select all cells\n */\n selectAll(): void {\n this.state.anchor = { row: 0, col: 0 };\n this.state.focus = { row: this.sheet.rowCount - 1, col: this.sheet.colCount - 1 };\n this.state.ranges = [this.createRange(this.state.anchor, this.state.focus)];\n this.notifyChange();\n }\n\n /**\n * Clear selection\n */\n clear(): void {\n this.state.anchor = null;\n this.state.focus = null;\n this.state.ranges = [];\n this.notifyChange();\n }\n\n /**\n * Get current selection\n */\n getSelection(): SelectionRange | null {\n if (this.state.ranges.length === 0) return null;\n return this.state.ranges[0];\n }\n\n /**\n * Get all selections (for multi-select)\n */\n getAllSelections(): SelectionRange[] {\n return [...this.state.ranges];\n }\n\n /**\n * Check if a cell is selected\n */\n isCellSelected(row: number, col: number): boolean {\n return this.state.ranges.some(range => \n row >= range.start.row && row <= range.end.row &&\n col >= range.start.col && col <= range.end.col\n );\n }\n\n /**\n * Check if a cell is the anchor (main selected cell)\n */\n isAnchor(row: number, col: number): boolean {\n return this.state.anchor?.row === row && this.state.anchor?.col === col;\n }\n\n /**\n * Update sheet reference\n */\n setSheet(sheet: NupWorksheet): void {\n this.sheet = sheet;\n this.clear();\n }\n\n private updateRanges(): void {\n if (!this.state.anchor || !this.state.focus) return;\n \n // Replace last range with updated selection\n const newRange = this.createRange(this.state.anchor, this.state.focus);\n if (this.state.ranges.length > 0) {\n this.state.ranges[this.state.ranges.length - 1] = newRange;\n } else {\n this.state.ranges.push(newRange);\n }\n }\n\n private createRange(\n start: { row: number; col: number },\n end: { row: number; col: number }\n ): SelectionRange {\n // Normalize so start <= end\n const minRow = Math.min(start.row, end.row);\n const maxRow = Math.max(start.row, end.row);\n const minCol = Math.min(start.col, end.col);\n const maxCol = Math.max(start.col, end.col);\n\n const cells: (NupCell | null)[][] = [];\n const cellRefs: string[] = [];\n\n for (let r = minRow; r <= maxRow; r++) {\n const rowCells: (NupCell | null)[] = [];\n for (let c = minCol; c <= maxCol; c++) {\n const ref = coordsToCellRef(r, c);\n cellRefs.push(ref);\n rowCells.push(this.sheet.cells[ref] ?? null);\n }\n cells.push(rowCells);\n }\n\n return {\n start: { row: minRow, col: minCol },\n end: { row: maxRow, col: maxCol },\n cells,\n cellRefs,\n };\n }\n\n private notifyChange(): void {\n if (this.onChange) {\n this.onChange(this.getSelection());\n }\n }\n}\n","/**\n * Keyboard Navigation Handler\n * WCAG AA compliant keyboard navigation for spreadsheet\n */\n\nimport type { SelectionHandler } from './selection';\nimport type { VirtualScroll } from './virtual-scroll';\n\nexport interface KeyboardConfig {\n enabled: boolean;\n wrapNavigation?: boolean;\n tabBehavior?: 'cell' | 'element';\n}\n\nexport type KeyboardAction =\n | 'move-up'\n | 'move-down'\n | 'move-left'\n | 'move-right'\n | 'move-page-up'\n | 'move-page-down'\n | 'move-home'\n | 'move-end'\n | 'move-ctrl-home'\n | 'move-ctrl-end'\n | 'select-all'\n | 'copy'\n | 'extend-up'\n | 'extend-down'\n | 'extend-left'\n | 'extend-right';\n\nexport class KeyboardHandler {\n private selection: SelectionHandler;\n private virtualScroll: VirtualScroll;\n private config: KeyboardConfig;\n private onScroll: ((row: number, col: number) => void) | null;\n private onCopy: (() => void) | null;\n\n constructor(\n selection: SelectionHandler,\n virtualScroll: VirtualScroll,\n config: KeyboardConfig,\n callbacks?: {\n onScroll?: (row: number, col: number) => void;\n onCopy?: () => void;\n }\n ) {\n this.selection = selection;\n this.virtualScroll = virtualScroll;\n this.config = config;\n this.onScroll = callbacks?.onScroll ?? null;\n this.onCopy = callbacks?.onCopy ?? null;\n }\n\n /**\n * Handle keydown event\n * Returns true if event was handled\n */\n handleKeyDown(event: KeyboardEvent): boolean {\n if (!this.config.enabled) return false;\n\n const action = this.getAction(event);\n if (!action) return false;\n\n event.preventDefault();\n this.executeAction(action);\n return true;\n }\n\n private getAction(event: KeyboardEvent): KeyboardAction | null {\n const { key, shiftKey, ctrlKey, metaKey } = event;\n const ctrl = ctrlKey || metaKey;\n\n // Copy\n if (ctrl && key === 'c') return 'copy';\n \n // Select all\n if (ctrl && key === 'a') return 'select-all';\n\n // Navigation with Shift (extend selection)\n if (shiftKey) {\n switch (key) {\n case 'ArrowUp': return 'extend-up';\n case 'ArrowDown': return 'extend-down';\n case 'ArrowLeft': return 'extend-left';\n case 'ArrowRight': return 'extend-right';\n }\n }\n\n // Ctrl navigation\n if (ctrl) {\n switch (key) {\n case 'Home': return 'move-ctrl-home';\n case 'End': return 'move-ctrl-end';\n }\n }\n\n // Basic navigation\n switch (key) {\n case 'ArrowUp': return 'move-up';\n case 'ArrowDown': return 'move-down';\n case 'ArrowLeft': return 'move-left';\n case 'ArrowRight': return 'move-right';\n case 'PageUp': return 'move-page-up';\n case 'PageDown': return 'move-page-down';\n case 'Home': return 'move-home';\n case 'End': return 'move-end';\n case 'Tab': return shiftKey ? 'move-left' : 'move-right';\n case 'Enter': return shiftKey ? 'move-up' : 'move-down';\n }\n\n return null;\n }\n\n private executeAction(action: KeyboardAction): void {\n const current = this.selection.getSelection();\n if (!current && !['select-all', 'move-ctrl-home'].includes(action)) {\n // No selection, start at A1\n this.selection.selectCell('A1');\n this.scrollToSelection();\n return;\n }\n\n const { row, col } = current?.start ?? { row: 0, col: 0 };\n let newRow = row;\n let newCol = col;\n\n switch (action) {\n case 'move-up':\n newRow = Math.max(0, row - 1);\n break;\n case 'move-down':\n newRow = Math.min(this.virtualScroll.rowCount - 1, row + 1);\n break;\n case 'move-left':\n newCol = Math.max(0, col - 1);\n break;\n case 'move-right':\n newCol = Math.min(this.virtualScroll.colCount - 1, col + 1);\n break;\n case 'move-page-up':\n newRow = Math.max(0, row - 20);\n break;\n case 'move-page-down':\n newRow = Math.min(this.virtualScroll.rowCount - 1, row + 20);\n break;\n case 'move-home':\n newCol = 0;\n break;\n case 'move-end':\n newCol = this.virtualScroll.colCount - 1;\n break;\n case 'move-ctrl-home':\n newRow = 0;\n newCol = 0;\n break;\n case 'move-ctrl-end':\n newRow = this.virtualScroll.rowCount - 1;\n newCol = this.virtualScroll.colCount - 1;\n break;\n case 'select-all':\n this.selection.selectAll();\n return;\n case 'copy':\n this.onCopy?.();\n return;\n case 'extend-up':\n case 'extend-down':\n case 'extend-left':\n case 'extend-right':\n this.extendSelection(action);\n return;\n }\n\n // Move selection\n this.selection.handleClick(newRow, newCol, { shiftKey: false, ctrlKey: false, metaKey: false });\n this.scrollToSelection();\n }\n\n private extendSelection(action: KeyboardAction): void {\n const current = this.selection.getSelection();\n if (!current) return;\n\n let { row, col } = current.end;\n\n switch (action) {\n case 'extend-up':\n row = Math.max(0, row - 1);\n break;\n case 'extend-down':\n row = Math.min(this.virtualScroll.rowCount - 1, row + 1);\n break;\n case 'extend-left':\n col = Math.max(0, col - 1);\n break;\n case 'extend-right':\n col = Math.min(this.virtualScroll.colCount - 1, col + 1);\n break;\n }\n\n this.selection.handleDrag(row, col);\n this.scrollToSelection();\n }\n\n private scrollToSelection(): void {\n const sel = this.selection.getSelection();\n if (!sel || !this.onScroll) return;\n \n this.onScroll(sel.start.row, sel.start.col);\n }\n\n /**\n * Update references\n */\n setVirtualScroll(vs: VirtualScroll): void {\n this.virtualScroll = vs;\n }\n\n setSelection(sel: SelectionHandler): void {\n this.selection = sel;\n }\n}\n","/**\n * Merge Cells Handler\n * Parses and manages merged cell regions\n */\n\nimport type { MergeInfo, CellRect } from '../types';\nimport { cellRefToCoords } from '../utils/cell-utils';\n\nexport class MergeHandler {\n private merges: MergeInfo[];\n private mergeMap: Map<string, MergeInfo>;\n\n constructor(mergeStrings: string[] = []) {\n this.merges = [];\n this.mergeMap = new Map();\n this.parseMerges(mergeStrings);\n }\n\n /**\n * Parse merge strings like \"A1:B2\" into structured data\n */\n private parseMerges(mergeStrings: string[]): void {\n for (const mergeStr of mergeStrings) {\n const [startRef, endRef] = mergeStr.split(':');\n if (!startRef || !endRef) continue;\n\n const start = cellRefToCoords(startRef);\n const end = cellRefToCoords(endRef);\n if (!start || !end) continue;\n\n const merge: MergeInfo = {\n startRow: Math.min(start.row, end.row),\n startCol: Math.min(start.col, end.col),\n endRow: Math.max(start.row, end.row),\n endCol: Math.max(start.col, end.col),\n cellRef: startRef,\n };\n\n this.merges.push(merge);\n\n // Map all cells in merge to the merge info\n for (let r = merge.startRow; r <= merge.endRow; r++) {\n for (let c = merge.startCol; c <= merge.endCol; c++) {\n const key = `${r},${c}`;\n this.mergeMap.set(key, merge);\n }\n }\n }\n }\n\n /**\n * Check if a cell is part of a merge\n */\n getMergeAt(row: number, col: number): MergeInfo | null {\n return this.mergeMap.get(`${row},${col}`) ?? null;\n }\n\n /**\n * Check if this cell is the top-left of a merge (the \"master\" cell)\n */\n isMergeMaster(row: number, col: number): boolean {\n const merge = this.getMergeAt(row, col);\n if (!merge) return false;\n return merge.startRow === row && merge.startCol === col;\n }\n\n /**\n * Check if this cell should be hidden (part of merge but not master)\n */\n isMergeHidden(row: number, col: number): boolean {\n const merge = this.getMergeAt(row, col);\n if (!merge) return false;\n return !(merge.startRow === row && merge.startCol === col);\n }\n\n /**\n * Get the master cell for a merged region\n */\n getMergeMaster(row: number, col: number): { row: number; col: number } | null {\n const merge = this.getMergeAt(row, col);\n if (!merge) return null;\n return { row: merge.startRow, col: merge.startCol };\n }\n\n /**\n * Get merged cell rectangle (spans multiple cells)\n */\n getMergeRect(\n row: number,\n col: number,\n getCellRect: (r: number, c: number) => CellRect\n ): CellRect | null {\n const merge = this.getMergeAt(row, col);\n if (!merge || !this.isMergeMaster(row, col)) return null;\n\n const topLeft = getCellRect(merge.startRow, merge.startCol);\n const bottomRight = getCellRect(merge.endRow, merge.endCol);\n\n return {\n top: topLeft.top,\n left: topLeft.left,\n width: bottomRight.left + bottomRight.width - topLeft.left,\n height: bottomRight.top + bottomRight.height - topLeft.top,\n };\n }\n\n /**\n * Get all merges\n */\n getAllMerges(): MergeInfo[] {\n return [...this.merges];\n }\n\n /**\n * Get merges visible in a range\n */\n getVisibleMerges(\n startRow: number,\n endRow: number,\n startCol: number,\n endCol: number\n ): MergeInfo[] {\n return this.merges.filter(merge =>\n merge.endRow >= startRow &&\n merge.startRow <= endRow &&\n merge.endCol >= startCol &&\n merge.startCol <= endCol\n );\n }\n\n /**\n * Update with new merge strings\n */\n update(mergeStrings: string[]): void {\n this.merges = [];\n this.mergeMap.clear();\n this.parseMerges(mergeStrings);\n }\n}\n","/**\n * Clipboard Handler\n * Copy selected cells to clipboard with text and HTML formats\n */\n\nimport type { SelectionRange, NupCell, ClipboardData } from '../types';\n\nexport class ClipboardHandler {\n /**\n * Copy selection to clipboard\n */\n async copyToClipboard(selection: SelectionRange): Promise<ClipboardData> {\n const data = this.formatSelection(selection);\n\n try {\n // Modern Clipboard API\n if (navigator.clipboard && typeof ClipboardItem !== 'undefined') {\n const blob = new Blob([data.html], { type: 'text/html' });\n const textBlob = new Blob([data.text], { type: 'text/plain' });\n \n await navigator.clipboard.write([\n new ClipboardItem({\n 'text/html': blob,\n 'text/plain': textBlob,\n }),\n ]);\n } else {\n // Fallback to execCommand\n await this.copyWithExecCommand(data.text);\n }\n } catch (err) {\n // Final fallback\n await this.copyWithExecCommand(data.text);\n }\n\n return data;\n }\n\n /**\n * Format selection as text (TSV) and HTML table\n */\n formatSelection(selection: SelectionRange): ClipboardData {\n const { cells } = selection;\n \n // Text format: Tab-separated values\n const textRows: string[] = [];\n for (const row of cells) {\n const textCells = row.map(cell => this.getCellValue(cell));\n textRows.push(textCells.join('\\t'));\n }\n const text = textRows.join('\\n');\n\n // HTML format: Table with inline styles\n const htmlRows: string[] = [];\n for (const row of cells) {\n const htmlCells = row.map(cell => {\n const value = this.escapeHtml(this.getCellValue(cell));\n const style = this.getCellStyle(cell);\n return `<td style=\"${style}\">${value}</td>`;\n });\n htmlRows.push(`<tr>${htmlCells.join('')}</tr>`);\n }\n \n const html = `\n <table style=\"border-collapse: collapse; font-family: Arial, sans-serif; font-size: 12px;\">\n <tbody>\n ${htmlRows.join('\\n')}\n </tbody>\n </table>\n `.trim();\n\n return { text, html, cells };\n }\n\n private getCellValue(cell: NupCell | null): string {\n if (!cell || cell.v === undefined || cell.v === null) return '';\n return String(cell.v);\n }\n\n private getCellStyle(cell: NupCell | null): string {\n const styles: string[] = [\n 'border: 1px solid #ccc',\n 'padding: 4px 8px',\n ];\n\n // Add basic styling based on cell type\n if (cell?.t === 'n') {\n styles.push('text-align: right');\n }\n\n return styles.join('; ');\n }\n\n private escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''');\n }\n\n private async copyWithExecCommand(text: string): Promise<void> {\n const textarea = document.createElement('textarea');\n textarea.value = text;\n textarea.style.position = 'fixed';\n textarea.style.left = '-9999px';\n document.body.appendChild(textarea);\n textarea.select();\n \n try {\n document.execCommand('copy');\n } finally {\n document.body.removeChild(textarea);\n }\n }\n}\n","/**\n * Search Handler\n * Search and highlight cells matching a query\n */\n\nimport type { NupWorksheet, SearchResult } from '../types';\n\nexport interface SearchOptions {\n caseSensitive?: boolean;\n regex?: boolean;\n matchWholeCell?: boolean;\n}\n\nexport class SearchHandler {\n private sheet: NupWorksheet;\n private results: SearchResult[];\n private currentIndex: number;\n\n constructor(sheet: NupWorksheet) {\n this.sheet = sheet;\n this.results = [];\n this.currentIndex = -1;\n }\n\n /**\n * Search for a query in the sheet\n */\n search(query: string, options: SearchOptions = {}): SearchResult[] {\n if (!query) {\n this.results = [];\n this.currentIndex = -1;\n return [];\n }\n\n const { caseSensitive = false, regex = false, matchWholeCell = false } = options;\n\n let pattern: RegExp;\n try {\n if (regex) {\n pattern = new RegExp(query, caseSensitive ? 'g' : 'gi');\n } else {\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const patternStr = matchWholeCell ? `^${escaped}$` : escaped;\n pattern = new RegExp(patternStr, caseSensitive ? 'g' : 'gi');\n }\n } catch {\n // Invalid regex, treat as literal\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n pattern = new RegExp(escaped, caseSensitive ? 'g' : 'gi');\n }\n\n const results: SearchResult[] = [];\n\n // Iterate through all cells\n for (const [cellRef, cell] of Object.entries(this.sheet.cells)) {\n if (cell.v === undefined || cell.v === null) continue;\n\n const value = String(cell.v);\n pattern.lastIndex = 0;\n const match = pattern.exec(value);\n\n if (match) {\n const coords = this.parseCellRef(cellRef);\n if (coords) {\n results.push({\n row: coords.row,\n col: coords.col,\n cellRef,\n value,\n matchStart: match.index,\n matchEnd: match.index + match[0].length,\n });\n }\n }\n }\n\n // Sort by row, then column\n results.sort((a, b) => {\n if (a.row !== b.row) return a.row - b.row;\n return a.col - b.col;\n });\n\n this.results = results;\n this.currentIndex = results.length > 0 ? 0 : -1;\n\n return results;\n }\n\n /**\n * Get next search result\n */\n next(): SearchResult | null {\n if (this.results.length === 0) return null;\n this.currentIndex = (this.currentIndex + 1) % this.results.length;\n return this.results[this.currentIndex];\n }\n\n /**\n * Get previous search result\n */\n previous(): SearchResult | null {\n if (this.results.length === 0) return null;\n this.currentIndex = (this.currentIndex - 1 + this.results.length) % this.results.length;\n return this.results[this.currentIndex];\n }\n\n /**\n * Get current result\n */\n current(): SearchResult | null {\n if (this.currentIndex < 0 || this.currentIndex >= this.results.length) {\n return null;\n }\n return this.results[this.currentIndex];\n }\n\n /**\n * Get all results\n */\n getResults(): SearchResult[] {\n return [...this.results];\n }\n\n /**\n * Get result count\n */\n getCount(): number {\n return this.results.length;\n }\n\n /**\n * Get current index (1-based for display)\n */\n getCurrentIndex(): number {\n return this.currentIndex + 1;\n }\n\n /**\n * Check if a cell is a search result\n */\n isResult(row: number, col: number): boolean {\n return this.results.some(r => r.row === row && r.col === col);\n }\n\n /**\n * Check if a cell is the current result\n */\n isCurrent(row: number, col: number): boolean {\n const current = this.current();\n return current?.row === row && current?.col === col;\n }\n\n /**\n * Clear search\n */\n clear(): void {\n this.results = [];\n this.currentIndex = -1;\n }\n\n /**\n * Update sheet reference\n */\n setSheet(sheet: NupWorksheet): void {\n this.sheet = sheet;\n this.clear();\n }\n\n private parseCellRef(ref: string): { row: number; col: number } | null {\n const match = ref.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) return null;\n\n const colStr = match[1].toUpperCase();\n const rowNum = parseInt(match[2], 10) - 1;\n\n let col = 0;\n for (let i = 0; i < colStr.length; i++) {\n col = col * 26 + (colStr.charCodeAt(i) - 64);\n }\n col -= 1;\n\n return { row: rowNum, col };\n }\n}\n","/**\n * Column Resize Handler\n * Drag-to-resize column widths\n */\n\nimport type { VirtualScroll } from './virtual-scroll';\n\nexport interface ResizeState {\n isResizing: boolean;\n colIndex: number;\n startX: number;\n startWidth: number;\n}\n\nexport class ResizeHandler {\n private state: ResizeState | null = null;\n private virtualScroll: VirtualScroll;\n private onChange: ((colIndex: number, width: number) => void) | null;\n private minWidth: number;\n private maxWidth: number;\n\n constructor(\n virtualScroll: VirtualScroll,\n onChange?: (colIndex: number, width: number) => void,\n minWidth = 30,\n maxWidth = 500\n ) {\n this.virtualScroll = virtualScroll;\n this.onChange = onChange ?? null;\n this.minWidth = minWidth;\n this.maxWidth = maxWidth;\n }\n\n /**\n * Start resize operation\n */\n startResize(colIndex: number, clientX: number): void {\n const currentWidth = this.virtualScroll.getColWidth(colIndex);\n \n this.state = {\n isResizing: true,\n colIndex,\n startX: clientX,\n startWidth: currentWidth,\n };\n\n // Add global event listeners\n document.addEventListener('mousemove', this.handleMouseMove);\n document.addEventListener('mouseup', this.handleMouseUp);\n document.body.style.cursor = 'col-resize';\n document.body.style.userSelect = 'none';\n }\n\n /**\n * Handle mouse move during resize\n */\n private handleMouseMove = (event: MouseEvent): void => {\n if (!this.state) return;\n\n const delta = event.clientX - this.state.startX;\n const newWidth = Math.min(\n this.maxWidth,\n Math.max(this.minWidth, this.state.startWidth + delta)\n );\n\n this.virtualScroll.setColWidth(this.state.colIndex, newWidth);\n this.onChange?.(this.state.colIndex, newWidth);\n };\n\n /**\n * End resize operation\n */\n private handleMouseUp = (): void => {\n this.cleanup();\n };\n\n /**\n * Check if currently resizing\n */\n isResizing(): boolean {\n return this.state?.isResizing ?? false;\n }\n\n /**\n * Get current resize column\n */\n getResizeColumn(): number | null {\n return this.state?.colIndex ?? null;\n }\n\n /**\n * Cancel resize\n */\n cancel(): void {\n if (this.state) {\n // Restore original width\n this.virtualScroll.setColWidth(this.state.colIndex, this.state.startWidth);\n this.onChange?.(this.state.colIndex, this.state.startWidth);\n }\n this.cleanup();\n }\n\n /**\n * Cleanup event listeners\n */\n private cleanup(): void {\n document.removeEventListener('mousemove', this.handleMouseMove);\n document.removeEventListener('mouseup', this.handleMouseUp);\n document.body.style.cursor = '';\n document.body.style.userSelect = '';\n this.state = null;\n }\n\n /**\n * Update virtual scroll reference\n */\n setVirtualScroll(vs: VirtualScroll): void {\n this.virtualScroll = vs;\n }\n\n /**\n * Destroy handler\n */\n destroy(): void {\n this.cleanup();\n }\n}\n","/**\n * Theme Definitions (JS version)\n * For programmatic theme access\n */\n\nimport type { NupThemeConfig } from '../types';\n\nexport const themes = {\n default: {\n name: 'default',\n colors: {\n background: '#ffffff',\n foreground: '#202124',\n grid: '#e0e0e0',\n headerBackground: '#f8f9fa',\n headerForeground: '#5f6368',\n selectionBorder: '#1a73e8',\n selectionBackground: 'rgba(26, 115, 232, 0.08)',\n frozenBorder: '#dadce0',\n },\n fonts: {\n family: \"'Google Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n excel: {\n name: 'excel',\n colors: {\n background: '#ffffff',\n foreground: '#000000',\n grid: '#d4d4d4',\n headerBackground: '#f0f0f0',\n headerForeground: '#000000',\n selectionBorder: '#217346',\n selectionBackground: 'rgba(33, 115, 70, 0.1)',\n frozenBorder: '#9bc2e6',\n },\n fonts: {\n family: \"'Calibri', 'Segoe UI', sans-serif\",\n size: '11px',\n headerSize: '11px',\n },\n },\n\n modern: {\n name: 'modern',\n colors: {\n background: '#fafafa',\n foreground: '#18181b',\n grid: '#e4e4e7',\n headerBackground: '#f4f4f5',\n headerForeground: '#71717a',\n selectionBorder: '#3b82f6',\n selectionBackground: 'rgba(59, 130, 246, 0.08)',\n frozenBorder: '#a1a1aa',\n },\n fonts: {\n family: \"'Inter', -apple-system, BlinkMacSystemFont, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n minimal: {\n name: 'minimal',\n colors: {\n background: '#ffffff',\n foreground: '#27272a',\n grid: '#f4f4f5',\n headerBackground: '#ffffff',\n headerForeground: '#a1a1aa',\n selectionBorder: '#18181b',\n selectionBackground: 'rgba(24, 24, 27, 0.04)',\n frozenBorder: '#e4e4e7',\n },\n fonts: {\n family: \"'SF Pro Display', -apple-system, BlinkMacSystemFont, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n dark: {\n name: 'dark',\n colors: {\n background: '#1e1e1e',\n foreground: '#d4d4d4',\n grid: '#3c3c3c',\n headerBackground: '#252526',\n headerForeground: '#858585',\n selectionBorder: '#0078d4',\n selectionBackground: 'rgba(0, 120, 212, 0.2)',\n frozenBorder: '#4a4a4a',\n },\n fonts: {\n family: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n midnight: {\n name: 'midnight',\n colors: {\n background: '#0d1117',\n foreground: '#c9d1d9',\n grid: '#21262d',\n headerBackground: '#161b22',\n headerForeground: '#8b949e',\n selectionBorder: '#58a6ff',\n selectionBackground: 'rgba(88, 166, 255, 0.15)',\n frozenBorder: '#30363d',\n },\n fonts: {\n family: \"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif\",\n size: '13px',\n headerSize: '11px',\n },\n },\n\n accessible: {\n name: 'accessible',\n colors: {\n background: '#ffffff',\n foreground: '#000000',\n grid: '#000000',\n headerBackground: '#e6e6e6',\n headerForeground: '#000000',\n selectionBorder: '#0000ff',\n selectionBackground: 'rgba(0, 0, 255, 0.15)',\n frozenBorder: '#000000',\n },\n fonts: {\n family: \"Arial, Helvetica, sans-serif\",\n size: '14px',\n headerSize: '12px',\n },\n },\n} as const satisfies Record<string, NupThemeConfig>;\n\nexport type ThemeName = keyof typeof themes;\n\n/**\n * Get theme by name\n */\nexport function getTheme(name: ThemeName): NupThemeConfig {\n return themes[name] ?? themes.default;\n}\n\n/**\n * Apply theme CSS variables to an element\n */\nexport function applyTheme(element: HTMLElement, theme: NupThemeConfig): void {\n const style = element.style;\n \n style.setProperty('--nup-background', theme.colors.background);\n style.setProperty('--nup-foreground', theme.colors.foreground);\n style.setProperty('--nup-grid', theme.colors.grid);\n style.setProperty('--nup-header-bg', theme.colors.headerBackground);\n style.setProperty('--nup-header-fg', theme.colors.headerForeground);\n style.setProperty('--nup-selection-border', theme.colors.selectionBorder);\n style.setProperty('--nup-selection-bg', theme.colors.selectionBackground);\n style.setProperty('--nup-frozen-border', theme.colors.frozenBorder);\n style.setProperty('--nup-font-family', theme.fonts.family);\n style.setProperty('--nup-font-size', theme.fonts.size);\n}\n\n/**\n * Get theme class name\n */\nexport function getThemeClass(name: ThemeName): string {\n return `nup-theme-${name}`;\n}\n","/**\n * Style Mapper\n * Converts NupCellStyle to CSS properties\n */\n\nimport type { NupCellStyle, NupCellBorder, NupWorkbook } from '../types';\n\nexport interface CellCSSProperties {\n fontFamily?: string;\n fontSize?: string;\n fontWeight?: string;\n fontStyle?: string;\n textDecoration?: string;\n color?: string;\n backgroundColor?: string;\n textAlign?: string;\n verticalAlign?: string;\n whiteSpace?: string;\n paddingLeft?: string;\n borderTop?: string;\n borderRight?: string;\n borderBottom?: string;\n borderLeft?: string;\n transform?: string;\n}\n\nconst BORDER_STYLE_MAP: Record<string, string> = {\n thin: '1px solid',\n medium: '2px solid',\n thick: '3px solid',\n dashed: '1px dashed',\n dotted: '1px dotted',\n double: '3px double',\n};\n\nfunction formatBorder(border?: NupCellBorder): string | undefined {\n if (!border || !border.style) return undefined;\n const style = BORDER_STYLE_MAP[border.style] || '1px solid';\n const color = border.color || '#000000';\n return `${style} ${color}`;\n}\n\nfunction applyTint(hexColor: string, tint: number): string {\n const hex = hexColor.replace('#', '');\n const r = parseInt(hex.substring(0, 2), 16);\n const g = parseInt(hex.substring(2, 4), 16);\n const b = parseInt(hex.substring(4, 6), 16);\n \n let newR: number, newG: number, newB: number;\n \n if (tint < 0) {\n newR = Math.round(r * (1 + tint));\n newG = Math.round(g * (1 + tint));\n newB = Math.round(b * (1 + tint));\n } else {\n newR = Math.round(r + (255 - r) * tint);\n newG = Math.round(g + (255 - g) * tint);\n newB = Math.round(b + (255 - b) * tint);\n }\n \n return `#${newR.toString(16).padStart(2, '0')}${newG.toString(16).padStart(2, '0')}${newB.toString(16).padStart(2, '0')}`;\n}\n\n/**\n * Convert NupCellStyle to CSS properties object\n */\nexport function styleToCss(style?: NupCellStyle): CellCSSProperties {\n if (!style) return {};\n \n const css: CellCSSProperties = {};\n \n if (style.font) {\n const font = style.font;\n if (font.name) css.fontFamily = font.name;\n if (font.size) css.fontSize = `${font.size}pt`;\n if (font.bold) css.fontWeight = 'bold';\n if (font.italic) css.fontStyle = 'italic';\n if (font.color) css.color = font.color;\n \n const decorations: string[] = [];\n if (font.underline) decorations.push('underline');\n if (font.strike) decorations.push('line-through');\n if (decorations.length > 0) {\n css.textDecoration = decorations.join(' ');\n }\n }\n \n if (style.fill) {\n const fill = style.fill;\n if (fill.color) {\n let bgColor = fill.color;\n if (fill.tint !== undefined && fill.tint !== 0) {\n bgColor = applyTint(bgColor, fill.tint);\n }\n css.backgroundColor = bgColor;\n }\n }\n \n if (style.alignment) {\n const align = style.alignment;\n if (align.horizontal) css.textAlign = align.horizontal;\n if (align.vertical) {\n css.verticalAlign = align.vertical === 'middle' ? 'middle' : align.vertical;\n }\n if (align.wrapText) css.whiteSpace = 'pre-wrap';\n if (align.indent) css.paddingLeft = `${align.indent * 8}px`;\n if (align.rotation) css.transform = `rotate(${align.rotation}deg)`;\n }\n \n if (style.border) {\n const border = style.border;\n css.borderTop = formatBorder(border.top);\n css.borderRight = formatBorder(border.right);\n css.borderBottom = formatBorder(border.bottom);\n css.borderLeft = formatBorder(border.left);\n }\n \n return css;\n}\n\n/**\n * Convert CSS properties object to inline style string\n */\nexport function cssToStyleString(css: CellCSSProperties): string {\n const entries = Object.entries(css).filter(([, v]) => v !== undefined);\n if (entries.length === 0) return '';\n \n return entries.map(([key, value]) => {\n const cssKey = key.replace(/([A-Z])/g, '-$1').toLowerCase();\n return `${cssKey}: ${value}`;\n }).join('; ');\n}\n\n/**\n * Resolve style from workbook styles registry\n */\nexport function resolveStyle(\n styleRef: number | string | undefined,\n workbook: NupWorkbook\n): NupCellStyle | undefined {\n if (styleRef === undefined) return undefined;\n if (!workbook.styles) return undefined;\n \n // Try numeric key first, then string\n return workbook.styles[styleRef] ?? workbook.styles[String(styleRef)];\n}\n\n/**\n * Get computed style for a cell (inline style + workbook style)\n */\nexport function getCellStyle(\n cellStyle?: NupCellStyle,\n styleRef?: number | string,\n workbook?: NupWorkbook\n): NupCellStyle | undefined {\n const refStyle = workbook ? resolveStyle(styleRef, workbook) : undefined;\n \n if (!cellStyle && !refStyle) return undefined;\n if (!cellStyle) return refStyle;\n if (!refStyle) return cellStyle;\n \n return {\n ...refStyle,\n ...cellStyle,\n font: { ...refStyle.font, ...cellStyle.font },\n fill: { ...refStyle.fill, ...cellStyle.fill },\n border: { ...refStyle.border, ...cellStyle.border },\n alignment: { ...refStyle.alignment, ...cellStyle.alignment },\n };\n}\n","/**\n * React 18 Adapter\n * @aspect/nup-xlsx-preview React wrapper\n */\n\nimport {\n useRef,\n useState,\n useEffect,\n useLayoutEffect,\n useMemo,\n useCallback,\n useImperativeHandle,\n forwardRef,\n type CSSProperties,\n type ReactNode,\n} from 'react';\n\nimport type {\n PreviewConfig,\n PreviewEvents,\n PreviewInstance,\n NupWorkbook,\n NupThemeConfig,\n SelectionRange,\n SearchResult,\n} from '../types';\n\nimport { VirtualScroll } from '../core/virtual-scroll';\nimport { SelectionHandler } from '../core/selection';\nimport { KeyboardHandler } from '../core/keyboard';\nimport { MergeHandler } from '../core/merge-handler';\nimport { ClipboardHandler } from '../core/clipboard';\nimport { SearchHandler } from '../core/search';\nimport { ResizeHandler } from '../core/resize';\nimport { themes, applyTheme, getThemeClass, type ThemeName } from '../core/themes';\nimport { colIndexToLetter, coordsToCellRef, cellRefToCoords } from '../utils/cell-utils';\n\nexport interface NupSpreadsheetPreviewProps extends Omit<Partial<PreviewConfig>, 'theme'>, PreviewEvents {\n workbook: NupWorkbook;\n activeSheet?: number;\n theme?: NupThemeConfig | ThemeName;\n width?: number | string;\n height?: number | string;\n className?: string;\n style?: CSSProperties;\n}\n\nexport const NupSpreadsheetPreview = forwardRef<PreviewInstance, NupSpreadsheetPreviewProps>(\n function NupSpreadsheetPreview(props, ref) {\n const {\n workbook,\n activeSheet: activeSheetProp = 0,\n theme: themeProp = 'default',\n width = '100%',\n height = '400px',\n className = '',\n style = {},\n showHeaders = true,\n showGridLines = true,\n showSheetTabs = true,\n selectable = true,\n resizable = true,\n searchable = false,\n copyable = true,\n keyboardNavigation = true,\n frozenRows = 0,\n frozenCols = 0,\n overscan = 5,\n defaultRowHeight = 24,\n defaultColWidth = 100,\n ariaLabel = 'Spreadsheet',\n onCellClick,\n onCellDoubleClick,\n onCellRightClick,\n onSelectionChange,\n onSheetChange,\n onColumnResize,\n onScroll,\n onSearch,\n onCopy,\n } = props;\n\n const containerRef = useRef<HTMLDivElement>(null);\n const scrollRef = useRef<HTMLDivElement>(null);\n \n const [activeSheet, setActiveSheet] = useState(activeSheetProp);\n const [scrollState, setScrollState] = useState({ top: 0, left: 0 });\n const [viewportSize, setViewportSize] = useState({ width: 0, height: 0 });\n const [selection, setSelection] = useState<SelectionRange | null>(null);\n const [searchResults, setSearchResults] = useState<SearchResult[]>([]);\n const [searchQuery, setSearchQuery] = useState('');\n const [forceUpdate, setForceUpdate] = useState(0);\n\n const sheet = workbook.sheets[activeSheet] ?? workbook.sheets[0];\n \n // Resolve theme\n const themeConfig = useMemo(() => {\n if (typeof themeProp === 'string') {\n return themes[themeProp as ThemeName] ?? themes.default;\n }\n return themeProp;\n }, [themeProp]);\n\n // Initialize handlers\n const virtualScroll = useMemo(() => {\n const rowHeights: Record<number, number> = {};\n const colWidths: Record<number, number> = {};\n \n Object.entries(sheet.rows).forEach(([idx, row]) => {\n if (row.h) rowHeights[parseInt(idx)] = row.h;\n });\n \n Object.entries(sheet.cols).forEach(([idx, col]) => {\n if (col.w) colWidths[parseInt(idx)] = col.w;\n });\n\n return new VirtualScroll({\n rows: sheet.rowCount,\n cols: sheet.colCount,\n rowHeights,\n colWidths,\n defaultRowHeight,\n defaultColWidth,\n overscan,\n frozenRows,\n frozenCols,\n });\n }, [sheet, defaultRowHeight, defaultColWidth, overscan, frozenRows, frozenCols, forceUpdate]);\n\n const selectionHandler = useMemo(() => {\n return new SelectionHandler(sheet, (sel) => {\n setSelection(sel);\n onSelectionChange?.(sel);\n });\n }, [sheet, onSelectionChange]);\n\n const mergeHandler = useMemo(() => {\n return new MergeHandler(sheet.merges ?? []);\n }, [sheet.merges]);\n\n const searchHandler = useMemo(() => {\n return new SearchHandler(sheet);\n }, [sheet]);\n\n const clipboardHandler = useMemo(() => new ClipboardHandler(), []);\n\n const resizeHandler = useMemo(() => {\n return new ResizeHandler(virtualScroll, (colIndex, width) => {\n setForceUpdate(f => f + 1);\n onColumnResize?.(colIndex, width);\n });\n }, [virtualScroll, onColumnResize]);\n\n const keyboardHandler = useMemo(() => {\n return new KeyboardHandler(selectionHandler, virtualScroll, { enabled: keyboardNavigation }, {\n onScroll: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportSize.height, viewportSize.width);\n scrollRef.current?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n onCopy: async () => {\n const sel = selectionHandler.getSelection();\n if (sel && copyable) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n });\n }, [selectionHandler, virtualScroll, keyboardNavigation, copyable, viewportSize, clipboardHandler, onCopy]);\n\n // Viewport resize observer\n useLayoutEffect(() => {\n const el = scrollRef.current;\n if (!el) return;\n\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n setViewportSize({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n });\n }\n });\n\n observer.observe(el);\n setViewportSize({ width: el.clientWidth, height: el.clientHeight });\n\n return () => observer.disconnect();\n }, []);\n\n // Apply theme\n useEffect(() => {\n if (containerRef.current) {\n applyTheme(containerRef.current, themeConfig);\n }\n }, [themeConfig]);\n\n // Sync active sheet\n useEffect(() => {\n setActiveSheet(activeSheetProp);\n }, [activeSheetProp]);\n\n // Handle scroll\n const handleScroll = useCallback((e: React.UIEvent<HTMLDivElement>) => {\n const { scrollTop, scrollLeft } = e.currentTarget;\n setScrollState({ top: scrollTop, left: scrollLeft });\n\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportSize.height, viewportSize.width);\n onScroll?.({\n scrollTop,\n scrollLeft,\n visibleRows: { start: range.startRow, end: range.endRow },\n visibleCols: { start: range.startCol, end: range.endCol },\n });\n }, [virtualScroll, viewportSize, onScroll]);\n\n // Handle cell click\n const handleCellClick = useCallback((row: number, col: number, e: React.MouseEvent) => {\n if (!selectable) return;\n\n const cellRef = coordsToCellRef(row, col);\n const cell = sheet.cells[cellRef] ?? null;\n\n selectionHandler.handleClick(row, col, {\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n });\n\n onCellClick?.({\n cell,\n row,\n col,\n cellRef,\n originalEvent: e.nativeEvent,\n });\n }, [selectable, sheet, selectionHandler, onCellClick]);\n\n // Handle double click\n const handleCellDoubleClick = useCallback((row: number, col: number, e: React.MouseEvent) => {\n const cellRef = coordsToCellRef(row, col);\n const cell = sheet.cells[cellRef] ?? null;\n\n onCellDoubleClick?.({\n cell,\n row,\n col,\n cellRef,\n originalEvent: e.nativeEvent,\n });\n }, [sheet, onCellDoubleClick]);\n\n // Handle right click\n const handleCellRightClick = useCallback((row: number, col: number, e: React.MouseEvent) => {\n e.preventDefault();\n const cellRef = coordsToCellRef(row, col);\n const cell = sheet.cells[cellRef] ?? null;\n\n onCellRightClick?.({\n cell,\n row,\n col,\n cellRef,\n originalEvent: e.nativeEvent,\n });\n }, [sheet, onCellRightClick]);\n\n // Handle keyboard\n const handleKeyDown = useCallback((e: React.KeyboardEvent) => {\n keyboardHandler.handleKeyDown(e.nativeEvent);\n }, [keyboardHandler]);\n\n // Handle sheet change\n const handleSheetChange = useCallback((index: number) => {\n setActiveSheet(index);\n selectionHandler.clear();\n onSheetChange?.(index);\n }, [selectionHandler, onSheetChange]);\n\n // Handle search\n const handleSearch = useCallback((query: string) => {\n setSearchQuery(query);\n const results = searchHandler.search(query);\n setSearchResults(results);\n onSearch?.(results);\n }, [searchHandler, onSearch]);\n\n // Handle column resize\n const handleResizeStart = useCallback((colIndex: number, e: React.MouseEvent) => {\n if (!resizable) return;\n e.preventDefault();\n e.stopPropagation();\n resizeHandler.startResize(colIndex, e.clientX);\n }, [resizable, resizeHandler]);\n\n // Expose instance methods\n useImperativeHandle(ref, () => ({\n scrollTo: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportSize.height, viewportSize.width);\n scrollRef.current?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n scrollToCell: (cellRef) => {\n const coords = cellRefToCoords(cellRef);\n if (coords) {\n const pos = virtualScroll.getScrollToPosition(coords.row, coords.col, viewportSize.height, viewportSize.width);\n scrollRef.current?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n }\n },\n select: (range) => {\n setSelection(range);\n },\n selectCell: (cellRef) => {\n selectionHandler.selectCell(cellRef);\n },\n selectAll: () => {\n selectionHandler.selectAll();\n },\n clearSelection: () => {\n selectionHandler.clear();\n },\n getSelection: () => selection,\n setActiveSheet: handleSheetChange,\n getActiveSheet: () => activeSheet,\n search: (query) => {\n handleSearch(query);\n return searchHandler.getResults();\n },\n highlightResults: (results) => {\n setSearchResults(results);\n },\n clearHighlights: () => {\n setSearchResults([]);\n setSearchQuery('');\n },\n getWorkbook: () => workbook,\n getVisibleCells: () => {\n const range = virtualScroll.getVisibleRange(scrollState.top, scrollState.left, viewportSize.height, viewportSize.width);\n const cells: (typeof sheet.cells[string] | null)[][] = [];\n for (let r = range.startRow; r <= range.endRow; r++) {\n const row: (typeof sheet.cells[string] | null)[] = [];\n for (let c = range.startCol; c <= range.endCol; c++) {\n row.push(sheet.cells[coordsToCellRef(r, c)] ?? null);\n }\n cells.push(row);\n }\n return cells;\n },\n getCellAt: (row, col) => sheet.cells[coordsToCellRef(row, col)] ?? null,\n copySelection: async () => {\n const sel = selectionHandler.getSelection();\n if (sel) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n setColumnWidth: (col, width) => {\n virtualScroll.setColWidth(col, width);\n setForceUpdate(f => f + 1);\n },\n autoFitColumn: () => { /* TODO: measure text */ },\n autoFitAllColumns: () => { /* TODO: measure text */ },\n refresh: () => setForceUpdate(f => f + 1),\n destroy: () => {\n resizeHandler.destroy();\n },\n }), [\n virtualScroll, viewportSize, selectionHandler, searchHandler, clipboardHandler,\n handleSheetChange, handleSearch, activeSheet, selection, workbook, sheet,\n scrollState, resizeHandler, onCopy\n ]);\n\n // Calculate visible range\n const headerHeight = showHeaders ? 24 : 0;\n const headerWidth = showHeaders ? 40 : 0;\n const range = virtualScroll.getVisibleRange(\n scrollState.top,\n scrollState.left,\n viewportSize.height,\n viewportSize.width\n );\n\n // Render cells\n const cells: ReactNode[] = [];\n for (let r = range.startRow; r <= range.endRow; r++) {\n for (let c = range.startCol; c <= range.endCol; c++) {\n // Skip hidden merged cells\n if (mergeHandler.isMergeHidden(r, c)) continue;\n\n const rect = mergeHandler.getMergeRect(r, c, (row, col) => virtualScroll.getCellRect(row, col))\n ?? virtualScroll.getCellRect(r, c);\n \n const cellRef = coordsToCellRef(r, c);\n const cell = sheet.cells[cellRef];\n const isSelected = selectionHandler.isCellSelected(r, c);\n const isAnchor = selectionHandler.isAnchor(r, c);\n const isSearchResult = searchResults.some(s => s.row === r && s.col === c);\n const isSearchCurrent = searchHandler.isCurrent(r, c);\n\n let cellClassName = 'nup-cell';\n if (cell?.t === 'n') cellClassName += ' nup-cell-number';\n if (isSelected) cellClassName += ' nup-cell-selected';\n if (isAnchor) cellClassName += ' nup-cell-anchor';\n if (isSearchResult) cellClassName += ' nup-cell-search-result';\n if (isSearchCurrent) cellClassName += ' nup-cell-search-current';\n\n cells.push(\n <div\n key={`${r}-${c}`}\n className={cellClassName}\n style={{\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n }}\n onClick={(e) => handleCellClick(r, c, e)}\n onDoubleClick={(e) => handleCellDoubleClick(r, c, e)}\n onContextMenu={(e) => handleCellRightClick(r, c, e)}\n data-row={r}\n data-col={c}\n data-cell-ref={cellRef}\n role=\"gridcell\"\n aria-rowindex={r + 1}\n aria-colindex={c + 1}\n tabIndex={isAnchor ? 0 : -1}\n >\n {cell?.v !== undefined && cell?.v !== null ? String(cell.v) : ''}\n </div>\n );\n }\n }\n\n // Render column headers\n const colHeaders: ReactNode[] = [];\n if (showHeaders) {\n for (let c = range.startCol; c <= range.endCol; c++) {\n const rect = virtualScroll.getCellRect(0, c);\n const isSelected = selection && c >= selection.start.col && c <= selection.end.col;\n\n colHeaders.push(\n <div\n key={`ch-${c}`}\n className={`nup-header nup-header-col${isSelected ? ' nup-header-selected' : ''}`}\n style={{\n left: rect.left,\n width: rect.width,\n height: headerHeight,\n }}\n >\n {colIndexToLetter(c)}\n {resizable && (\n <div\n className=\"nup-resize-handle\"\n onMouseDown={(e) => handleResizeStart(c, e)}\n />\n )}\n </div>\n );\n }\n }\n\n // Render row headers\n const rowHeaders: ReactNode[] = [];\n if (showHeaders) {\n for (let r = range.startRow; r <= range.endRow; r++) {\n const rect = virtualScroll.getCellRect(r, 0);\n const isSelected = selection && r >= selection.start.row && r <= selection.end.row;\n\n rowHeaders.push(\n <div\n key={`rh-${r}`}\n className={`nup-header nup-header-row${isSelected ? ' nup-header-selected' : ''}`}\n style={{\n top: rect.top,\n width: headerWidth,\n height: rect.height,\n }}\n >\n {r + 1}\n </div>\n );\n }\n }\n\n // Selection border overlay\n let selectionBorder: ReactNode = null;\n if (selection) {\n const startRect = virtualScroll.getCellRect(selection.start.row, selection.start.col);\n const endRect = virtualScroll.getCellRect(selection.end.row, selection.end.col);\n\n selectionBorder = (\n <div\n className=\"nup-selection-border\"\n style={{\n top: startRect.top,\n left: startRect.left,\n width: endRect.left + endRect.width - startRect.left,\n height: endRect.top + endRect.height - startRect.top,\n }}\n />\n );\n }\n\n const themeClass = typeof themeProp === 'string' ? getThemeClass(themeProp as ThemeName) : '';\n\n return (\n <div\n ref={containerRef}\n className={`nup-spreadsheet ${themeClass} ${className} ${!showGridLines ? 'nup-no-gridlines' : ''}`}\n style={{ width, height, ...style }}\n tabIndex={0}\n onKeyDown={handleKeyDown}\n role=\"grid\"\n aria-label={ariaLabel}\n aria-rowcount={sheet.rowCount}\n aria-colcount={sheet.colCount}\n >\n {/* Search Bar */}\n {searchable && (\n <div className=\"nup-search-bar\">\n <input\n type=\"search\"\n className=\"nup-search-input\"\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={(e) => handleSearch(e.target.value)}\n aria-label=\"Search in spreadsheet\"\n />\n {searchResults.length > 0 && (\n <span className=\"nup-search-count\">\n {searchHandler.getCurrentIndex()} of {searchResults.length}\n </span>\n )}\n <button\n className=\"nup-search-btn\"\n onClick={() => {\n const next = searchHandler.next();\n if (next) {\n const pos = virtualScroll.getScrollToPosition(next.row, next.col, viewportSize.height, viewportSize.width);\n scrollRef.current?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n }\n }}\n aria-label=\"Next result\"\n >\n Next\n </button>\n </div>\n )}\n\n {/* Corner */}\n {showHeaders && (\n <div className=\"nup-corner\" style={{ width: headerWidth, height: headerHeight }} />\n )}\n\n {/* Column Headers */}\n {showHeaders && (\n <div\n className=\"nup-header-row-container\"\n style={{\n position: 'absolute',\n top: 0,\n left: headerWidth,\n right: 0,\n height: headerHeight,\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n position: 'relative',\n width: virtualScroll.totalWidth,\n height: headerHeight,\n transform: `translateX(${-scrollState.left}px)`,\n }}\n >\n {colHeaders}\n </div>\n </div>\n )}\n\n {/* Row Headers */}\n {showHeaders && (\n <div\n className=\"nup-header-col-container\"\n style={{\n position: 'absolute',\n top: headerHeight,\n left: 0,\n bottom: showSheetTabs ? 32 : 0,\n width: headerWidth,\n overflow: 'hidden',\n }}\n >\n <div\n style={{\n position: 'relative',\n width: headerWidth,\n height: virtualScroll.totalHeight,\n transform: `translateY(${-scrollState.top}px)`,\n }}\n >\n {rowHeaders}\n </div>\n </div>\n )}\n\n {/* Main Scroll Area */}\n <div\n ref={scrollRef}\n className=\"nup-scroll-container\"\n style={{\n top: headerHeight,\n left: headerWidth,\n right: 0,\n bottom: showSheetTabs ? 32 : 0,\n }}\n onScroll={handleScroll}\n >\n <div\n className=\"nup-content\"\n style={{\n width: virtualScroll.totalWidth,\n height: virtualScroll.totalHeight,\n }}\n >\n {cells}\n {selectionBorder}\n </div>\n </div>\n\n {/* Sheet Tabs */}\n {showSheetTabs && workbook.sheets.length > 1 && (\n <div className=\"nup-sheet-tabs\">\n {workbook.sheets.map((s, i) => (\n <button\n key={s.id}\n className={`nup-sheet-tab${i === activeSheet ? ' nup-sheet-tab-active' : ''}`}\n onClick={() => handleSheetChange(i)}\n >\n {s.name}\n </button>\n ))}\n </div>\n )}\n </div>\n );\n }\n);\n\nexport default NupSpreadsheetPreview;\n","/**\n * Vanilla JS Adapter\n * @aspect/nup-xlsx-preview Vanilla JS API\n */\n\nimport type {\n PreviewConfig,\n PreviewEvents,\n PreviewInstance,\n NupWorkbook,\n NupThemeConfig,\n SelectionRange,\n SearchResult,\n} from '../types';\n\nimport { VirtualScroll } from '../core/virtual-scroll';\nimport { SelectionHandler } from '../core/selection';\nimport { KeyboardHandler } from '../core/keyboard';\nimport { MergeHandler } from '../core/merge-handler';\nimport { ClipboardHandler } from '../core/clipboard';\nimport { SearchHandler } from '../core/search';\nimport { ResizeHandler } from '../core/resize';\nimport { themes, applyTheme, getThemeClass, type ThemeName } from '../core/themes';\nimport { colIndexToLetter, coordsToCellRef, cellRefToCoords } from '../utils/cell-utils';\n\nexport interface CreatePreviewOptions extends Partial<PreviewConfig>, PreviewEvents {\n workbook: NupWorkbook;\n}\n\nexport function createSpreadsheetPreview(\n container: HTMLElement | string,\n options: CreatePreviewOptions\n): PreviewInstance {\n const el = typeof container === 'string'\n ? document.querySelector<HTMLElement>(container)\n : container;\n\n if (!el) {\n throw new Error('Container element not found');\n }\n\n const {\n workbook,\n activeSheet: initialActiveSheet = 0,\n theme: themeProp = 'default',\n width = '100%',\n height = '400px',\n showHeaders = true,\n showGridLines = true,\n showSheetTabs = true,\n selectable = true,\n resizable = true,\n searchable: _searchable = false,\n copyable = true,\n keyboardNavigation = true,\n frozenRows: _frozenRows = 0,\n frozenCols: _frozenCols = 0,\n overscan = 5,\n defaultRowHeight = 24,\n defaultColWidth = 100,\n ariaLabel = 'Spreadsheet',\n onCellClick,\n onCellDoubleClick,\n onCellRightClick,\n onSelectionChange,\n onSheetChange,\n onColumnResize,\n onScroll,\n onSearch,\n onCopy,\n } = options;\n\n // State\n let activeSheet = initialActiveSheet;\n let scrollTop = 0;\n let scrollLeft = 0;\n let viewportWidth = 0;\n let viewportHeight = 0;\n let selection: SelectionRange | null = null;\n let searchResults: SearchResult[] = [];\n\n // Get current sheet\n const getSheet = () => workbook.sheets[activeSheet] ?? workbook.sheets[0];\n\n // Get theme config\n const getThemeConfig = (): NupThemeConfig => {\n if (typeof themeProp === 'string') {\n return themes[themeProp as ThemeName] ?? themes.default;\n }\n return themeProp;\n };\n\n // Initialize handlers\n let virtualScroll: VirtualScroll;\n let selectionHandler: SelectionHandler;\n let mergeHandler: MergeHandler;\n let searchHandler: SearchHandler;\n let clipboardHandler: ClipboardHandler;\n let resizeHandler: ResizeHandler;\n let keyboardHandler: KeyboardHandler;\n\n const initHandlers = () => {\n const sheet = getSheet();\n const rowHeights: Record<number, number> = {};\n const colWidths: Record<number, number> = {};\n\n Object.entries(sheet.rows).forEach(([idx, row]) => {\n if (row.h) rowHeights[parseInt(idx)] = row.h;\n });\n\n Object.entries(sheet.cols).forEach(([idx, col]) => {\n if (col.w) colWidths[parseInt(idx)] = col.w;\n });\n\n virtualScroll = new VirtualScroll({\n rows: sheet.rowCount,\n cols: sheet.colCount,\n rowHeights,\n colWidths,\n defaultRowHeight,\n defaultColWidth,\n overscan,\n });\n\n selectionHandler = new SelectionHandler(sheet, (sel) => {\n selection = sel;\n onSelectionChange?.(sel);\n render();\n });\n\n mergeHandler = new MergeHandler(sheet.merges ?? []);\n searchHandler = new SearchHandler(sheet);\n clipboardHandler = new ClipboardHandler();\n\n resizeHandler = new ResizeHandler(virtualScroll, (colIndex, w) => {\n onColumnResize?.(colIndex, w);\n render();\n });\n\n keyboardHandler = new KeyboardHandler(\n selectionHandler,\n virtualScroll,\n { enabled: keyboardNavigation },\n {\n onScroll: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportHeight, viewportWidth);\n scrollContainer?.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n onCopy: async () => {\n const sel = selectionHandler.getSelection();\n if (sel && copyable) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n }\n );\n };\n\n // Create DOM structure\n const headerHeight = showHeaders ? 24 : 0;\n const headerWidth = showHeaders ? 40 : 0;\n\n const themeClass = typeof themeProp === 'string' ? getThemeClass(themeProp as ThemeName) : '';\n\n el.innerHTML = `\n <div class=\"nup-spreadsheet ${themeClass} ${!showGridLines ? 'nup-no-gridlines' : ''}\"\n style=\"width: ${typeof width === 'number' ? width + 'px' : width}; height: ${typeof height === 'number' ? height + 'px' : height};\"\n tabindex=\"0\"\n role=\"grid\"\n aria-label=\"${ariaLabel}\">\n ${showHeaders ? `<div class=\"nup-corner\" style=\"width: ${headerWidth}px; height: ${headerHeight}px;\"></div>` : ''}\n ${showHeaders ? `\n <div class=\"nup-header-row-container\" style=\"position: absolute; top: 0; left: ${headerWidth}px; right: 0; height: ${headerHeight}px; overflow: hidden;\">\n <div class=\"nup-header-row-inner\" style=\"position: relative; height: ${headerHeight}px;\"></div>\n </div>\n <div class=\"nup-header-col-container\" style=\"position: absolute; top: ${headerHeight}px; left: 0; bottom: ${showSheetTabs ? '32px' : '0'}; width: ${headerWidth}px; overflow: hidden;\">\n <div class=\"nup-header-col-inner\" style=\"position: relative; width: ${headerWidth}px;\"></div>\n </div>\n ` : ''}\n <div class=\"nup-scroll-container\" style=\"top: ${headerHeight}px; left: ${headerWidth}px; right: 0; bottom: ${showSheetTabs ? '32px' : '0'};\">\n <div class=\"nup-content\"></div>\n </div>\n ${showSheetTabs && workbook.sheets.length > 1 ? '<div class=\"nup-sheet-tabs\"></div>' : ''}\n </div>\n `;\n\n const spreadsheet = el.querySelector<HTMLElement>('.nup-spreadsheet')!;\n const scrollContainer = el.querySelector<HTMLElement>('.nup-scroll-container')!;\n const content = el.querySelector<HTMLElement>('.nup-content')!;\n const headerRowInner = el.querySelector<HTMLElement>('.nup-header-row-inner');\n const headerColInner = el.querySelector<HTMLElement>('.nup-header-col-inner');\n const sheetTabs = el.querySelector<HTMLElement>('.nup-sheet-tabs');\n\n // Apply theme\n applyTheme(spreadsheet, getThemeConfig());\n\n // Initialize\n initHandlers();\n\n // Resize observer\n const resizeObserver = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) {\n viewportWidth = entry.contentRect.width;\n viewportHeight = entry.contentRect.height;\n render();\n }\n });\n resizeObserver.observe(scrollContainer);\n viewportWidth = scrollContainer.clientWidth;\n viewportHeight = scrollContainer.clientHeight;\n\n // Scroll handler\n scrollContainer.addEventListener('scroll', () => {\n scrollTop = scrollContainer.scrollTop;\n scrollLeft = scrollContainer.scrollLeft;\n\n if (headerRowInner) {\n headerRowInner.style.transform = `translateX(${-scrollLeft}px)`;\n }\n if (headerColInner) {\n headerColInner.style.transform = `translateY(${-scrollTop}px)`;\n }\n\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportHeight, viewportWidth);\n onScroll?.({\n scrollTop,\n scrollLeft,\n visibleRows: { start: range.startRow, end: range.endRow },\n visibleCols: { start: range.startCol, end: range.endCol },\n });\n\n render();\n });\n\n // Keyboard handler\n spreadsheet.addEventListener('keydown', (e) => {\n keyboardHandler.handleKeyDown(e);\n });\n\n // Render function\n const render = () => {\n const sheet = getSheet();\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportHeight, viewportWidth);\n\n // Set content size\n content.style.width = `${virtualScroll.totalWidth}px`;\n content.style.height = `${virtualScroll.totalHeight}px`;\n\n if (headerRowInner) {\n headerRowInner.style.width = `${virtualScroll.totalWidth}px`;\n }\n if (headerColInner) {\n headerColInner.style.height = `${virtualScroll.totalHeight}px`;\n }\n\n // Render cells\n let cellsHtml = '';\n for (let r = range.startRow; r <= range.endRow; r++) {\n for (let c = range.startCol; c <= range.endCol; c++) {\n if (mergeHandler.isMergeHidden(r, c)) continue;\n\n const rect = mergeHandler.getMergeRect(r, c, (row, col) => virtualScroll.getCellRect(row, col))\n ?? virtualScroll.getCellRect(r, c);\n\n const cellRef = coordsToCellRef(r, c);\n const cell = sheet.cells[cellRef];\n const isSelected = selectionHandler.isCellSelected(r, c);\n const isAnchor = selectionHandler.isAnchor(r, c);\n const isSearchResult = searchResults.some(s => s.row === r && s.col === c);\n\n const classes = [\n 'nup-cell',\n cell?.t === 'n' ? 'nup-cell-number' : '',\n isSelected ? 'nup-cell-selected' : '',\n isAnchor ? 'nup-cell-anchor' : '',\n isSearchResult ? 'nup-cell-search-result' : '',\n ].filter(Boolean).join(' ');\n\n const value = cell?.v !== undefined && cell?.v !== null ? String(cell.v) : '';\n\n cellsHtml += `\n <div class=\"${classes}\"\n style=\"top: ${rect.top}px; left: ${rect.left}px; width: ${rect.width}px; height: ${rect.height}px;\"\n data-row=\"${r}\" data-col=\"${c}\" data-cell-ref=\"${cellRef}\">\n ${escapeHtml(value)}\n </div>\n `;\n }\n }\n\n // Selection border\n if (selection) {\n const startRect = virtualScroll.getCellRect(selection.start.row, selection.start.col);\n const endRect = virtualScroll.getCellRect(selection.end.row, selection.end.col);\n cellsHtml += `\n <div class=\"nup-selection-border\"\n style=\"top: ${startRect.top}px; left: ${startRect.left}px; width: ${endRect.left + endRect.width - startRect.left}px; height: ${endRect.top + endRect.height - startRect.top}px;\">\n </div>\n `;\n }\n\n content.innerHTML = cellsHtml;\n\n // Render headers\n if (showHeaders && headerRowInner) {\n let colHeadersHtml = '';\n for (let c = range.startCol; c <= range.endCol; c++) {\n const rect = virtualScroll.getCellRect(0, c);\n const isSelected = selection && c >= selection.start.col && c <= selection.end.col;\n colHeadersHtml += `\n <div class=\"nup-header nup-header-col ${isSelected ? 'nup-header-selected' : ''}\"\n style=\"left: ${rect.left}px; width: ${rect.width}px; height: ${headerHeight}px;\">\n ${colIndexToLetter(c)}\n ${resizable ? '<div class=\"nup-resize-handle\" data-col=\"' + c + '\"></div>' : ''}\n </div>\n `;\n }\n headerRowInner.innerHTML = colHeadersHtml;\n }\n\n if (showHeaders && headerColInner) {\n let rowHeadersHtml = '';\n for (let r = range.startRow; r <= range.endRow; r++) {\n const rect = virtualScroll.getCellRect(r, 0);\n const isSelected = selection && r >= selection.start.row && r <= selection.end.row;\n rowHeadersHtml += `\n <div class=\"nup-header nup-header-row ${isSelected ? 'nup-header-selected' : ''}\"\n style=\"top: ${rect.top}px; width: ${headerWidth}px; height: ${rect.height}px;\">\n ${r + 1}\n </div>\n `;\n }\n headerColInner.innerHTML = rowHeadersHtml;\n }\n\n // Render sheet tabs\n if (sheetTabs && workbook.sheets.length > 1) {\n sheetTabs.innerHTML = workbook.sheets.map((s, i) => `\n <button class=\"nup-sheet-tab ${i === activeSheet ? 'nup-sheet-tab-active' : ''}\" data-sheet=\"${i}\">\n ${escapeHtml(s.name)}\n </button>\n `).join('');\n }\n };\n\n // Cell click handler\n content.addEventListener('click', (e) => {\n if (!selectable) return;\n\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-cell');\n if (!target) return;\n\n const row = parseInt(target.dataset.row ?? '0');\n const col = parseInt(target.dataset.col ?? '0');\n const cellRef = target.dataset.cellRef ?? '';\n\n selectionHandler.handleClick(row, col, {\n shiftKey: e.shiftKey,\n ctrlKey: e.ctrlKey,\n metaKey: e.metaKey,\n });\n\n onCellClick?.({\n cell: getSheet().cells[cellRef] ?? null,\n row,\n col,\n cellRef,\n originalEvent: e,\n });\n });\n\n // Double click handler\n content.addEventListener('dblclick', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-cell');\n if (!target) return;\n\n const row = parseInt(target.dataset.row ?? '0');\n const col = parseInt(target.dataset.col ?? '0');\n const cellRef = target.dataset.cellRef ?? '';\n\n onCellDoubleClick?.({\n cell: getSheet().cells[cellRef] ?? null,\n row,\n col,\n cellRef,\n originalEvent: e,\n });\n });\n\n // Right click handler\n content.addEventListener('contextmenu', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-cell');\n if (!target) return;\n\n e.preventDefault();\n\n const row = parseInt(target.dataset.row ?? '0');\n const col = parseInt(target.dataset.col ?? '0');\n const cellRef = target.dataset.cellRef ?? '';\n\n onCellRightClick?.({\n cell: getSheet().cells[cellRef] ?? null,\n row,\n col,\n cellRef,\n originalEvent: e,\n });\n });\n\n // Sheet tab click handler\n sheetTabs?.addEventListener('click', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-sheet-tab');\n if (!target) return;\n\n const sheetIndex = parseInt(target.dataset.sheet ?? '0');\n activeSheet = sheetIndex;\n initHandlers();\n onSheetChange?.(sheetIndex);\n render();\n });\n\n // Resize handle handler\n if (resizable && headerRowInner) {\n headerRowInner.addEventListener('mousedown', (e) => {\n const target = (e.target as HTMLElement).closest<HTMLElement>('.nup-resize-handle');\n if (!target) return;\n\n const col = parseInt(target.dataset.col ?? '0');\n resizeHandler.startResize(col, e.clientX);\n });\n }\n\n // Initial render\n render();\n\n // Return instance\n const instance: PreviewInstance = {\n scrollTo: (row, col) => {\n const pos = virtualScroll.getScrollToPosition(row, col, viewportHeight, viewportWidth);\n scrollContainer.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n },\n scrollToCell: (cellRef) => {\n const coords = cellRefToCoords(cellRef);\n if (coords) {\n const pos = virtualScroll.getScrollToPosition(coords.row, coords.col, viewportHeight, viewportWidth);\n scrollContainer.scrollTo({ top: pos.scrollTop, left: pos.scrollLeft, behavior: 'smooth' });\n }\n },\n select: (range) => {\n selection = range;\n render();\n },\n selectCell: (cellRef) => {\n selectionHandler.selectCell(cellRef);\n },\n selectAll: () => {\n selectionHandler.selectAll();\n },\n clearSelection: () => {\n selectionHandler.clear();\n },\n getSelection: () => selection,\n setActiveSheet: (index) => {\n activeSheet = index;\n initHandlers();\n onSheetChange?.(index);\n render();\n },\n getActiveSheet: () => activeSheet,\n search: (query) => {\n const results = searchHandler.search(query);\n searchResults = results;\n onSearch?.(results);\n render();\n return results;\n },\n highlightResults: (results) => {\n searchResults = results;\n render();\n },\n clearHighlights: () => {\n searchResults = [];\n render();\n },\n getWorkbook: () => workbook,\n getVisibleCells: () => {\n const sheet = getSheet();\n const range = virtualScroll.getVisibleRange(scrollTop, scrollLeft, viewportHeight, viewportWidth);\n const cells: (typeof sheet.cells[string] | null)[][] = [];\n for (let r = range.startRow; r <= range.endRow; r++) {\n const row: (typeof sheet.cells[string] | null)[] = [];\n for (let c = range.startCol; c <= range.endCol; c++) {\n row.push(sheet.cells[coordsToCellRef(r, c)] ?? null);\n }\n cells.push(row);\n }\n return cells;\n },\n getCellAt: (row, col) => getSheet().cells[coordsToCellRef(row, col)] ?? null,\n copySelection: async () => {\n const sel = selectionHandler.getSelection();\n if (sel) {\n const data = await clipboardHandler.copyToClipboard(sel);\n onCopy?.(data);\n }\n },\n setColumnWidth: (col, w) => {\n virtualScroll.setColWidth(col, w);\n render();\n },\n autoFitColumn: () => {},\n autoFitAllColumns: () => {},\n refresh: () => render(),\n destroy: () => {\n resizeObserver.disconnect();\n resizeHandler.destroy();\n el.innerHTML = '';\n },\n };\n\n return instance;\n}\n\nfunction escapeHtml(str: string): string {\n return str\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\nexport default createSpreadsheetPreview;\n"]}
|