@nuptechs/nup-xlsx-preview 1.1.2-debug → 1.1.3
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.cjs +3 -3
- package/dist/adapters/react.cjs.map +1 -1
- package/dist/adapters/react.js +3 -3
- package/dist/adapters/react.js.map +1 -1
- package/dist/adapters/vanilla.cjs +21 -21
- package/dist/adapters/vanilla.cjs.map +1 -1
- package/dist/adapters/vanilla.js +21 -21
- package/dist/adapters/vanilla.js.map +1 -1
- package/dist/adapters/vue.cjs +3 -3
- package/dist/adapters/vue.cjs.map +1 -1
- package/dist/adapters/vue.js +3 -3
- package/dist/adapters/vue.js.map +1 -1
- package/dist/index.cjs +20 -20
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +20 -20
- package/dist/index.js.map +1 -1
- package/dist/styles/base.css +23 -8
- package/dist/styles/index.css +23 -8
- package/package.json +1 -1
|
@@ -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/adapters/vanilla.ts"],"names":["VirtualScroll","config","rows","cols","rowHeights","colWidths","defaultRowHeight","defaultColWidth","overscan","frozenRows","frozenCols","i","h","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","SelectionHandler","sheet","onChange","event","shiftKey","ctrlKey","metaKey","cellRef","coords","startRef","endRef","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","value","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","applyTheme","element","theme","style","getThemeClass","name","createSpreadsheetPreview","container","el","workbook","initialActiveSheet","themeProp","height","showHeaders","showGridLines","showSheetTabs","selectable","resizable","_searchable","copyable","keyboardNavigation","_frozenRows","_frozenCols","ariaLabel","onCellClick","onCellDoubleClick","onCellRightClick","onSelectionChange","onSheetChange","onColumnResize","onScroll","onSearch","onCopy","activeSheet","searchResults","getSheet","getThemeConfig","selectionHandler","mergeHandler","searchHandler","clipboardHandler","resizeHandler","keyboardHandler","initHandlers","idx","render","w","pos","scrollContainer","headerHeight","headerWidth","themeClass","spreadsheet","content","headerRowInner","headerColInner","sheetTabs","resizeObserver","entries","entry","e","cellsHtml","rect","isSelected","isAnchor","isSearchResult","s","classes","escapeHtml","startRect","endRect","colHeadersHtml","rowHeadersHtml","sheetIndex","index","vanilla_default"],"mappings":"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","file":"vanilla.cjs","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 * 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/vanilla.ts"],"names":["VirtualScroll","config","rows","cols","rowHeights","colWidths","defaultRowHeight","defaultColWidth","overscan","frozenRows","frozenCols","i","h","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","SelectionHandler","sheet","onChange","event","shiftKey","ctrlKey","metaKey","cellRef","coords","startRef","endRef","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","value","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","applyTheme","element","theme","style","getThemeClass","name","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","hasVisibleBorders","isVisible","getCellStyle","cellStyle","refStyle","createSpreadsheetPreview","container","el","initialActiveSheet","themeProp","height","showHeaders","showGridLines","showSheetTabs","selectable","resizable","_searchable","copyable","keyboardNavigation","_frozenRows","_frozenCols","ariaLabel","onCellClick","onCellDoubleClick","onCellRightClick","onSelectionChange","onSheetChange","onColumnResize","onScroll","onSearch","onCopy","activeSheet","searchResults","getSheet","getThemeConfig","selectionHandler","mergeHandler","searchHandler","clipboardHandler","resizeHandler","keyboardHandler","initHandlers","idx","render","w","pos","scrollContainer","headerHeight","headerWidth","themeClass","spreadsheet","content","headerRowInner","headerColInner","sheetTabs","resizeObserver","entry","e","cellsHtml","rect","isSelected","isAnchor","isSearchResult","s","cssStyles","hasBorder","isMergeMaster","classes","inlineStyles","escapeHtml","startRect","endRect","colHeadersHtml","rowHeadersHtml","sheetIndex","index","vanilla_default"],"mappings":"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","file":"vanilla.cjs","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 // Check if ANY border is defined\n const hasBorder = border.top || border.right || border.bottom || border.left;\n if (hasBorder) {\n // When any border is defined, normalize all edges: defined -> CSS, undefined -> 'none'\n // This ensures partial borders don't inherit default gridlines\n css.borderTop = formatBorder(border.top) || 'none';\n css.borderRight = formatBorder(border.right) || 'none';\n css.borderBottom = formatBorder(border.bottom) || 'none';\n css.borderLeft = formatBorder(border.left) || 'none';\n }\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 * Check if a cell has visible Excel borders (not 'none')\n * Used to determine if default gridlines should be hidden\n */\nexport function hasVisibleBorders(css: CellCSSProperties): boolean {\n const isVisible = (border?: string) => border && border !== 'none';\n return !!(isVisible(css.borderTop) || isVisible(css.borderRight) || \n isVisible(css.borderBottom) || isVisible(css.borderLeft));\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 * 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';\nimport { getCellStyle, styleToCss, cssToStyleString, hasVisibleBorders } from '../utils/style-mapper';\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 cellStyle = getCellStyle(cell?.style, cell?.s, workbook);\n const cssStyles = styleToCss(cellStyle);\n // Check for visible borders (not 'none') to determine if default gridlines should be hidden\n const hasBorder = hasVisibleBorders(cssStyles);\n const isMergeMaster = mergeHandler.isMergeMaster(r, 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 hasBorder ? 'nup-has-border' : '',\n isMergeMaster ? 'nup-cell-merge-master' : '',\n ].filter(Boolean).join(' ');\n\n const value = cell?.v !== undefined && cell?.v !== null ? String(cell.v) : '';\n const inlineStyles = cssToStyleString(cssStyles);\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; ${inlineStyles}\"\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"]}
|