@reogrid/pro 0.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/pro.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/app/domIds.ts","../src/app/styles.ts","../src/core/worksheet/gridDefaults.ts","../src/core/cell/selectionRange.ts","../src/core/formula/formulaEngine.ts","../src/core/style/cellStyle.ts","../src/core/style/numberFormat.ts","../src/core/worksheet/cellKey.ts","../src/core/worksheet/gridGeometry.ts","../src/core/border/types.ts","../src/core/border/borderManager.ts","../src/core/merge/mergeManager.ts","../src/core/worksheet/worksheet.ts","../src/render/sheetRenderer.ts","../src/render/viewports.ts","../src/io/unzip.ts","../src/io/xml.ts","../src/io/xlsx.ts","../src/io/xlsxImporter.ts","../src/io/zipWriter.ts","../src/io/xlsxWriter.ts","../src/core/worksheet/handles.ts","../src/core/worksheet/canvasWorksheet.ts","../src/render/controllers/pointerController.ts","../src/render/editor/cellEditor.ts","../src/render/controllers/keyboardController.ts","../src/render/layers/imageLayer.ts","../src/index.ts","../src/pro/index.ts"],"sourcesContent":["export const WORKSPACE_ID = 'reogrid-workspace';\nexport const CANVAS_ID = 'reogrid-canvas';\n","const DEFAULT_STYLE_ID = 'reogrid-base-styles';\nconst FONT_LINK_ID = 'reogrid-font-roboto';\nconst FONT_STYLESHEET_URL =\n 'https://fonts.googleapis.com/css2?family=Roboto:wght@400;500;700&display=swap';\n\nexport const WORKSPACE_CLASS = 'reogrid-workspace';\nexport const WORKBOOK_CLASS = 'workbook';\nexport const WORKSHEET_CONTAINER_CLASS = 'worksheet-container';\nexport const GRID_SCROLL_CLASS = 'grid-scroll';\nexport const GRID_SPACER_CLASS = 'grid-spacer';\nexport const GRID_LAYER_CLASS = 'grid-layer';\n\nconst BASE_STYLES = `\n.${WORKSPACE_CLASS} {\n position: relative;\n overflow: hidden;\n background: #e2e8f0;\n display: flex;\n flex-direction: column;\n}\n\n.${WORKSPACE_CLASS} .${WORKBOOK_CLASS} {\n flex: 1;\n display: flex;\n flex-direction: column;\n position: relative;\n}\n\n.${WORKSPACE_CLASS} .${WORKSHEET_CONTAINER_CLASS} {\n flex: 1;\n position: relative;\n background: #ffffff;\n overflow: hidden;\n}\n\n.${WORKSPACE_CLASS} .${GRID_SCROLL_CLASS} {\n position: absolute;\n inset: 0;\n overflow: auto;\n overscroll-behavior: contain;\n background: transparent;\n z-index: 2;\n}\n\n.${WORKSPACE_CLASS} .${GRID_SPACER_CLASS} {\n width: 100%;\n height: 100%;\n min-width: 100%;\n min-height: 100%;\n pointer-events: none;\n}\n\n.${WORKSPACE_CLASS} canvas.${GRID_LAYER_CLASS} {\n position: absolute;\n inset: 0;\n z-index: 1;\n background: transparent;\n}\n`.trim();\n\nexport function ensureWorkspaceStyles(styleId: string = DEFAULT_STYLE_ID): void {\n if (typeof document === 'undefined') {\n return;\n }\n ensureFontStyles();\n if (document.getElementById(styleId)) {\n return;\n }\n const style = document.createElement('style');\n style.id = styleId;\n style.textContent = BASE_STYLES;\n document.head.appendChild(style);\n}\n\nfunction ensureFontStyles(): void {\n if (document.getElementById(FONT_LINK_ID)) {\n return;\n }\n const link = document.createElement('link');\n link.id = FONT_LINK_ID;\n link.rel = 'stylesheet';\n link.href = FONT_STYLESHEET_URL;\n document.head.appendChild(link);\n}\n","export const DEFAULT_ROWS = 40;\nexport const DEFAULT_COLUMNS = 26;\nexport const DEFAULT_COLUMN_WIDTH = 80;\nexport const DEFAULT_ROW_HEIGHT = 22;\nexport const HEADER_COLUMN_WIDTH = 60;\nexport const HEADER_ROW_HEIGHT = 24;\n","import type { Worksheet } from '../worksheet/worksheet';\nimport type { RangeRect } from '../worksheet/types';\n\ntype SelectionBounds = RangeRect & {\n topRow: number;\n bottomRow: number;\n leftColumn: number;\n rightColumn: number;\n};\n\nexport class SelectionRange {\nprivate readonly worksheet: Worksheet;\n\n private startRow: number | null = null;\n\n private startColumn: number | null = null;\n\n private endRow: number | null = null;\n\n private endColumn: number | null = null;\n\n private anchorBounds: { top: number; bottom: number; left: number; right: number } | null = null;\n\n constructor(worksheet: Worksheet) {\n this.worksheet = worksheet;\n this.reset();\n }\n\n reset(): void {\n this.startRow = null;\n this.startColumn = null;\n this.endRow = null;\n this.endColumn = null;\n this.anchorBounds = null;\n }\n\n begin(row: number, column: number): void {\n const clamped = this.clampCell(row, column);\n const bounds = this.worksheet.getCellMergeBounds(clamped.row, clamped.column);\n this.startRow = bounds.topRow;\n this.startColumn = bounds.leftColumn;\n this.endRow = bounds.bottomRow;\n this.endColumn = bounds.rightColumn;\n this.anchorBounds = {\n top: bounds.topRow,\n bottom: bounds.bottomRow,\n left: bounds.leftColumn,\n right: bounds.rightColumn,\n };\n }\n\n update(row: number, column: number): void {\n if (!this.isActive() || !this.anchorBounds) {\n return;\n }\n\n const clamped = this.clampCell(row, column);\n const target = this.worksheet.getCellMergeBounds(clamped.row, clamped.column);\n const union = {\n top: Math.min(this.anchorBounds.top, target.topRow),\n bottom: Math.max(this.anchorBounds.bottom, target.bottomRow),\n left: Math.min(this.anchorBounds.left, target.leftColumn),\n right: Math.max(this.anchorBounds.right, target.rightColumn),\n };\n\n const bounds = this.worksheet.expandSelectionWithMergedCells({\n top: union.top,\n bottom: union.bottom,\n left: union.left,\n right: union.right,\n });\n this.startRow = bounds.top;\n this.startColumn = bounds.left;\n this.endRow = bounds.bottom;\n this.endColumn = bounds.right;\n }\n\n isActive(): boolean {\n return this.startRow !== null && this.startColumn !== null;\n }\n\n clampCell(row: number, column: number): { row: number; column: number } {\n const clampedRow = Math.min(Math.max(row, 0), this.worksheet.rows - 1);\n const clampedColumn = Math.min(Math.max(column, 0), this.worksheet.columns - 1);\n return { row: clampedRow, column: clampedColumn };\n }\n\n setRange(startRow: number, startColumn: number, endRow: number, endColumn: number): void {\n const start = this.clampCell(startRow, startColumn);\n const end = this.clampCell(endRow, endColumn);\n this.startRow = start.row;\n this.startColumn = start.column;\n this.endRow = end.row;\n this.endColumn = end.column;\n this.anchorBounds = {\n top: start.row,\n bottom: start.row,\n left: start.column,\n right: start.column,\n };\n }\n\n selectRows(startRow: number, endRow: number = startRow): void {\n const top = Math.min(startRow, endRow);\n const bottom = Math.max(startRow, endRow);\n const expanded = this.worksheet.expandSelectionWithMergedCells({\n top,\n bottom,\n left: 0,\n right: this.worksheet.columns - 1,\n });\n this.setRange(expanded.top, expanded.left, expanded.bottom, expanded.right);\n }\n\n selectColumns(startColumn: number, endColumn: number = startColumn): void {\n const left = Math.min(startColumn, endColumn);\n const right = Math.max(startColumn, endColumn);\n const expanded = this.worksheet.expandSelectionWithMergedCells({\n top: 0,\n bottom: this.worksheet.rows - 1,\n left,\n right,\n });\n this.setRange(expanded.top, expanded.left, expanded.bottom, expanded.right);\n }\n\n selectAll(): void {\n this.setRange(0, 0, this.worksheet.rows - 1, this.worksheet.columns - 1);\n }\n\n getNormalizedBounds(): SelectionBounds | null {\n if (!this.isActive() || this.startRow === null || this.startColumn === null || this.endRow === null || this.endColumn === null) {\n return null;\n }\n\n const topRow = Math.min(this.startRow, this.endRow);\n const bottomRow = Math.max(this.startRow, this.endRow);\n const leftColumn = Math.min(this.startColumn, this.endColumn);\n const rightColumn = Math.max(this.startColumn, this.endColumn);\n\n const rect = this.worksheet.getRangeRect(topRow, leftColumn, bottomRow, rightColumn);\n return { ...rect, topRow, leftColumn, bottomRow, rightColumn };\n }\n\n draw(ctx: CanvasRenderingContext2D): void {\n const bounds = this.getNormalizedBounds();\n if (!bounds) {\n return;\n }\n\n ctx.save();\n ctx.fillStyle = 'rgba(33, 150, 243, 0.2)';\n ctx.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);\n\n const pixelRatio = this.worksheet.getPixelRatio();\n const inset = 0.5 / pixelRatio;\n ctx.strokeStyle = '#2196f3';\n ctx.lineWidth = 2 / pixelRatio;\n ctx.strokeRect(\n bounds.x + inset,\n bounds.y + inset,\n Math.max(0, bounds.width - inset * 2),\n Math.max(0, bounds.height - inset * 2),\n );\n ctx.restore();\n }\n\n getActiveCell(): { row: number; column: number } | null {\n if (this.startRow === null || this.startColumn === null) {\n return null;\n }\n return { row: this.startRow, column: this.startColumn };\n }\n\n moveActiveCell(rowDelta: number, columnDelta: number): { row: number; column: number } {\n const current = this.getActiveCell() ?? { row: 0, column: 0 };\n const currentRange = this.worksheet.getMergedRange(current.row, current.column);\n let baseRow = current.row;\n let baseColumn = current.column;\n if (currentRange) {\n if (rowDelta > 0) {\n baseRow = currentRange.bottomRow;\n } else if (rowDelta < 0) {\n baseRow = currentRange.topRow;\n }\n if (columnDelta > 0) {\n baseColumn = currentRange.rightColumn;\n } else if (columnDelta < 0) {\n baseColumn = currentRange.leftColumn;\n }\n }\n const next = this.clampCell(baseRow + rowDelta, baseColumn + columnDelta);\n const bounds = this.worksheet.expandSelectionWithMergedCells({\n top: next.row,\n bottom: next.row,\n left: next.column,\n right: next.column,\n });\n this.startRow = bounds.top;\n this.startColumn = bounds.left;\n this.endRow = bounds.bottom;\n this.endColumn = bounds.right;\n this.anchorBounds = {\n top: bounds.top,\n bottom: bounds.bottom,\n left: bounds.left,\n right: bounds.right,\n };\n return { row: this.startRow, column: this.startColumn };\n }\n}\n","import type { Worksheet } from '../worksheet/worksheet';\n\ntype TokenType =\n | 'number'\n | 'identifier'\n | 'plus'\n | 'minus'\n | 'multiply'\n | 'divide'\n | 'lparen'\n | 'rparen'\n | 'comma'\n | 'colon'\n | 'eof';\n\ninterface Token {\n type: TokenType;\n value?: string;\n}\n\nexport class FormulaEngine {\n private readonly worksheet: Worksheet;\n\n constructor(worksheet: Worksheet) {\n this.worksheet = worksheet;\n }\n\n getDisplayValue(row: number, column: number): string {\n const raw = this.worksheet.getCellInput(row, column);\n if (!raw || raw.length === 0) {\n return '';\n }\n\n if (!raw.startsWith('=')) {\n return raw;\n }\n\n const expression = raw.slice(1);\n try {\n const value = this.evaluateExpression(expression, row, column, new Set());\n if (typeof value === 'number') {\n return Number.isFinite(value) ? String(value) : '#ERR';\n }\n return value ?? '';\n } catch (error) {\n if (error instanceof Error && error.message === 'CYCLE') {\n return '#CYCLE!';\n }\n return '#ERR';\n }\n }\n\n private evaluateExpression(\n expression: string,\n row: number,\n column: number,\n visited: Set<string>,\n ): number | string {\n const lexer = new Lexer(expression);\n const parser = new Parser(lexer, (refRow, refCol) => this.getCellNumericValue(refRow, refCol, visited));\n const value = parser.parseExpression();\n if (parser.currentToken.type !== 'eof') {\n throw new Error('Unexpected token');\n }\n return value;\n }\n\n private getCellNumericValue(row: number, column: number, visited: Set<string>): number {\n const key = `${row}:${column}`;\n if (visited.has(key)) {\n throw new Error('CYCLE');\n }\n visited.add(key);\n\n const raw = this.worksheet.getCellInput(row, column);\n let result: number;\n if (!raw || raw.length === 0) {\n result = 0;\n } else if (raw.startsWith('=')) {\n const value = this.evaluateExpression(raw.slice(1), row, column, visited);\n result = coerceToNumber(value);\n } else {\n result = coerceToNumber(raw);\n }\n\n visited.delete(key);\n return result;\n }\n}\n\nclass Lexer {\n private readonly input: string;\n\n private position = 0;\n\n constructor(input: string) {\n this.input = input.trim();\n }\n\n nextToken(): Token {\n this.skipWhitespace();\n if (this.position >= this.input.length) {\n return { type: 'eof' };\n }\n\n const char = this.currentChar();\n if (isDigit(char) || (char === '.' && isDigit(this.peekChar()))) {\n return this.readNumber();\n }\n if (isAlpha(char)) {\n return this.readIdentifier();\n }\n\n this.position += 1;\n switch (char) {\n case '+':\n return { type: 'plus' };\n case '-':\n return { type: 'minus' };\n case '*':\n return { type: 'multiply' };\n case '/':\n return { type: 'divide' };\n case '(':\n return { type: 'lparen' };\n case ')':\n return { type: 'rparen' };\n case ',':\n return { type: 'comma' };\n case ':':\n return { type: 'colon' };\n default:\n throw new Error(`Unexpected character: ${char}`);\n }\n }\n\n private readNumber(): Token {\n const start = this.position;\n while (isDigit(this.currentChar())) {\n this.position += 1;\n }\n if (this.currentChar() === '.' && isDigit(this.peekChar())) {\n this.position += 1;\n while (isDigit(this.currentChar())) {\n this.position += 1;\n }\n }\n const value = this.input.slice(start, this.position);\n return { type: 'number', value };\n }\n\n private readIdentifier(): Token {\n const start = this.position;\n while (isAlphaNumeric(this.currentChar())) {\n this.position += 1;\n }\n const value = this.input.slice(start, this.position);\n return { type: 'identifier', value };\n }\n\n private skipWhitespace(): void {\n while (this.position < this.input.length && /\\s/.test(this.currentChar())) {\n this.position += 1;\n }\n }\n\n private currentChar(): string {\n if (this.position >= this.input.length) {\n return '';\n }\n return this.input[this.position];\n }\n\n private peekChar(): string {\n const index = this.position + 1;\n if (index >= this.input.length) {\n return '';\n }\n return this.input[index];\n }\n}\n\nclass Parser {\n private readonly lexer: Lexer;\n\n private readonly referenceResolver: (row: number, column: number) => number;\n\n public currentToken: Token;\n\n private lookaheadToken: Token;\n\n constructor(lexer: Lexer, referenceResolver: (row: number, column: number) => number) {\n this.lexer = lexer;\n this.referenceResolver = referenceResolver;\n this.currentToken = this.lexer.nextToken();\n this.lookaheadToken = this.lexer.nextToken();\n }\n\n parseExpression(): number {\n let value = this.parseTerm();\n while (this.currentToken.type === 'plus' || this.currentToken.type === 'minus') {\n const operator = this.currentToken.type;\n this.eat(operator);\n const nextTerm = this.parseTerm();\n value = operator === 'plus' ? value + nextTerm : value - nextTerm;\n }\n return value;\n }\n\n private parseTerm(): number {\n let value = this.parseFactor();\n while (this.currentToken.type === 'multiply' || this.currentToken.type === 'divide') {\n const operator = this.currentToken.type;\n this.eat(operator);\n const nextFactor = this.parseFactor();\n value = operator === 'multiply' ? value * nextFactor : value / nextFactor;\n }\n return value;\n }\n\n private parseFactor(): number {\n if (this.currentToken.type === 'plus') {\n this.eat('plus');\n return this.parseFactor();\n }\n if (this.currentToken.type === 'minus') {\n this.eat('minus');\n return -this.parseFactor();\n }\n return this.parsePrimary();\n }\n\n private parsePrimary(): number {\n switch (this.currentToken.type) {\n case 'number': {\n const value = parseFloat(this.currentToken.value ?? '0');\n this.eat('number');\n return value;\n }\n case 'identifier': {\n const identifier = this.currentToken.value ?? '';\n this.eat('identifier');\n if (this.currentToken.type === 'lparen') {\n return this.parseFunctionCall(identifier);\n }\n const reference = parseCellReference(identifier);\n if (!reference) {\n throw new Error(`Invalid reference: ${identifier}`);\n }\n return this.referenceResolver(reference.row, reference.column);\n }\n case 'lparen': {\n this.eat('lparen');\n const value = this.parseExpression();\n this.eat('rparen');\n return value;\n }\n default:\n throw new Error('Unexpected token in expression');\n }\n }\n\n private parseFunctionCall(name: string): number {\n this.eat('lparen');\n const args: number[] = [];\n if (this.currentToken.type !== 'rparen') {\n args.push(...this.parseFunctionArgumentValues());\n while (this.currentToken.type === 'comma') {\n this.eat('comma');\n args.push(...this.parseFunctionArgumentValues());\n }\n }\n this.eat('rparen');\n switch (name.toUpperCase()) {\n case 'SUM':\n return args.reduce((acc, value) => acc + value, 0);\n case 'AVERAGE':\n return args.length ? args.reduce((acc, value) => acc + value, 0) / args.length : 0;\n default:\n throw new Error(`Unsupported function: ${name}`);\n }\n }\n\n private parseFunctionArgumentValues(): number[] {\n if (this.currentToken.type === 'identifier' && this.lookaheadToken.type === 'colon') {\n const startRef = parseCellReference(this.currentToken.value ?? '');\n if (!startRef) {\n throw new Error(`Invalid reference: ${this.currentToken.value ?? ''}`);\n }\n this.eat('identifier');\n this.eat('colon');\n if (this.currentToken.type !== 'identifier') {\n throw new Error('Expected cell reference after \":\"');\n }\n const endRef = parseCellReference(this.currentToken.value ?? '');\n if (!endRef) {\n throw new Error(`Invalid reference: ${this.currentToken.value ?? ''}`);\n }\n this.eat('identifier');\n return this.expandRange(startRef, endRef);\n }\n\n return [this.parseExpression()];\n }\n\n private expandRange(\n start: { row: number; column: number },\n end: { row: number; column: number },\n ): number[] {\n const values: number[] = [];\n const startRow = Math.min(start.row, end.row);\n const endRow = Math.max(start.row, end.row);\n const startColumn = Math.min(start.column, end.column);\n const endColumn = Math.max(start.column, end.column);\n\n for (let r = startRow; r <= endRow; r += 1) {\n for (let c = startColumn; c <= endColumn; c += 1) {\n values.push(this.referenceResolver(r, c));\n }\n }\n\n return values;\n }\n\n private eat(type: TokenType): void {\n if (this.currentToken.type !== type) {\n throw new Error(`Expected token ${type}, got ${this.currentToken.type}`);\n }\n this.currentToken = this.lookaheadToken;\n this.lookaheadToken = this.lexer.nextToken();\n }\n}\n\nfunction isDigit(char: string): boolean {\n return /[0-9]/.test(char);\n}\n\nfunction isAlpha(char: string): boolean {\n return /[a-zA-Z]/.test(char);\n}\n\nfunction isAlphaNumeric(char: string): boolean {\n return /[a-zA-Z0-9]/.test(char);\n}\n\nfunction parseCellReference(identifier: string): { row: number; column: number } | null {\n const match = /^([A-Za-z]+)([0-9]+)$/.exec(identifier);\n if (!match) {\n return null;\n }\n const [, columnLabel, rowPart] = match;\n const column = columnLabel\n .toUpperCase()\n .split('')\n .reduce((acc, char) => acc * 26 + (char.charCodeAt(0) - 64), 0);\n return { row: parseInt(rowPart, 10) - 1, column: column - 1 };\n}\n\nfunction coerceToNumber(value: unknown): number {\n if (typeof value === 'number') {\n return value;\n }\n if (typeof value === 'string') {\n const parsed = parseFloat(value);\n return Number.isNaN(parsed) ? 0 : parsed;\n }\n return 0;\n}\n","export type TextAlign = 'left' | 'center' | 'right';\nexport type VerticalAlign = 'top' | 'middle' | 'bottom';\nexport type TextWrapMode = 'none' | 'wrap' | 'break-word';\n\nexport interface CellStyle {\n fontFamily: string;\n fontSize: number;\n bold: boolean;\n italic: boolean;\n underline: boolean;\n backgroundColor: string;\n color: string;\n textAlign: TextAlign;\n verticalAlign: VerticalAlign;\n textWrapMode: TextWrapMode;\n}\n\nexport const DEFAULT_CELL_STYLE: CellStyle = {\n fontFamily: 'Arial',\n fontSize: 10,\n bold: false,\n italic: false,\n underline: false,\n backgroundColor: '#ffffff',\n color: '#2c3e50',\n textAlign: 'left',\n verticalAlign: 'bottom',\n textWrapMode: 'none',\n};\n","export function formatNumberWithFormat(value: number, formatCode: string): string | null {\n if (!formatCode || formatCode.toLowerCase() === 'general') {\n return null;\n }\n const sections = formatCode.split(';');\n let section = sections[0] ?? formatCode;\n let workingValue = value;\n if (value < 0 && sections.length > 1) {\n section = sections[1] ?? section;\n workingValue = Math.abs(value);\n } else if (value === 0 && sections.length > 2 && sections[2]) {\n section = sections[2];\n workingValue = 0;\n }\n if (isDateFormatSection(section)) {\n return formatDateSection(workingValue, section);\n }\n return applyNumberFormatSection(workingValue, section);\n}\n\nfunction applyNumberFormatSection(value: number, section: string): string | null {\n if (!section) {\n return null;\n }\n if (/[eE][+-]?0+/.test(section)) {\n return null;\n }\n let sanitized = sanitizeFormatSection(section);\n const placeholders = [...sanitized.matchAll(/[0#?]/g)];\n if (!placeholders.length) {\n return null;\n }\n const firstIndex = placeholders[0].index ?? 0;\n const lastIndex = placeholders[placeholders.length - 1].index ?? firstIndex;\n const prefix = sanitized.slice(0, firstIndex);\n const suffix = sanitized.slice(lastIndex + 1);\n const core = sanitized.slice(firstIndex, lastIndex + 1);\n if (!core) {\n return null;\n }\n const hasPercent = section.includes('%');\n let workingValue = value;\n if (hasPercent) {\n workingValue *= 100;\n }\n const { useGrouping, minFraction, maxFraction } = extractNumericPattern(core);\n try {\n const formatter = new Intl.NumberFormat(undefined, {\n useGrouping,\n minimumFractionDigits: minFraction,\n maximumFractionDigits: maxFraction,\n });\n const formattedNumber = formatter.format(workingValue);\n return `${prefix}${formattedNumber}${suffix}`;\n } catch {\n return null;\n }\n}\n\nfunction sanitizeFormatSection(section: string): string {\n let sanitized = section;\n sanitized = sanitized.replace(/\\[\\$([^-\\]]+)(?:-[^\\]]+)?\\]/g, '$1');\n sanitized = sanitized.replace(/\\[[^\\]]+\\]/g, '');\n sanitized = sanitized.replace(/\"([^\"]*)\"/g, '$1');\n sanitized = sanitized.replace(/_./g, '');\n sanitized = sanitized.replace(/\\*./g, '');\n sanitized = sanitized.replace(/\\\\(.)/g, '$1');\n return sanitized;\n}\n\nfunction extractNumericPattern(core: string): {\n useGrouping: boolean;\n minFraction: number;\n maxFraction: number;\n} {\n const decimalPoint = core.indexOf('.');\n let integerPart = core;\n let fractionPart = '';\n if (decimalPoint >= 0) {\n integerPart = core.slice(0, decimalPoint);\n fractionPart = core.slice(decimalPoint + 1);\n }\n const useGrouping = integerPart.includes(',');\n const normalizedFraction = fractionPart.replace(/[^0#?]/g, '');\n const minFraction = (normalizedFraction.match(/0/g) ?? []).length;\n const maxFraction = normalizedFraction.length;\n return {\n useGrouping,\n minFraction,\n maxFraction: Math.max(minFraction, maxFraction),\n };\n}\n\nfunction isDateFormatSection(section: string): boolean {\n const stripped = stripLiterals(section).toLowerCase();\n if (!stripped) {\n return false;\n }\n if (stripped.includes('am/pm') || stripped.includes('a/p')) {\n return true;\n }\n if (/[yd]/.test(stripped)) {\n return true;\n }\n if (/[hs]/.test(stripped) && stripped.includes('m')) {\n return true;\n }\n return false;\n}\n\nfunction stripLiterals(section: string): string {\n let result = '';\n for (let i = 0; i < section.length; i += 1) {\n const char = section[i];\n if (char === '\"') {\n while (i + 1 < section.length && section[i + 1] !== '\"') {\n i += 1;\n }\n continue;\n }\n if (char === '\\\\') {\n i += 1;\n continue;\n }\n if (char === '[') {\n while (i + 1 < section.length && section[i + 1] !== ']') {\n i += 1;\n }\n continue;\n }\n if (char === '_') {\n i += 1;\n continue;\n }\n if (char === '*') {\n i += 1;\n continue;\n }\n result += char;\n }\n return result;\n}\n\nconst MONTH_NAMES = [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n];\n\nconst MONTH_NAMES_SHORT = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\nconst DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\nconst DAY_NAMES_SHORT = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n\nfunction formatDateSection(value: number, section: string): string | null {\n const date = excelSerialToDate(value);\n if (!date) {\n return null;\n }\n const lowerSection = section.toLowerCase();\n const hasAmPm = lowerSection.includes('am/pm') || lowerSection.includes('a/p');\n let result = '';\n let i = 0;\n while (i < section.length) {\n const char = section[i];\n if (char === '\"') {\n const end = section.indexOf('\"', i + 1);\n if (end === -1) {\n break;\n }\n result += section.slice(i + 1, end);\n i = end + 1;\n continue;\n }\n if (char === '\\\\') {\n if (i + 1 < section.length) {\n result += section[i + 1];\n i += 2;\n } else {\n i += 1;\n }\n continue;\n }\n if (char === '[') {\n const end = section.indexOf(']', i + 1);\n i = end === -1 ? section.length : end + 1;\n continue;\n }\n const token = matchDateToken(section, i);\n if (token) {\n result += applyDateToken(token, date, hasAmPm);\n i += token.length;\n continue;\n }\n const lower = section.slice(i).toLowerCase();\n if (lower.startsWith('am/pm')) {\n result += date.getHours() >= 12 ? 'PM' : 'AM';\n i += 5;\n continue;\n }\n if (lower.startsWith('a/p')) {\n result += date.getHours() >= 12 ? 'P' : 'A';\n i += 3;\n continue;\n }\n result += char;\n i += 1;\n }\n return result;\n}\n\nfunction matchDateToken(section: string, index: number): string | null {\n const candidates = [\n 'yyyy',\n 'yyy',\n 'yy',\n 'y',\n 'mmmm',\n 'mmm',\n 'mm',\n 'm',\n 'dddd',\n 'ddd',\n 'dd',\n 'd',\n 'hh',\n 'h',\n 'ss',\n 's',\n ];\n for (const token of candidates) {\n if (section.length - index < token.length) {\n continue;\n }\n const slice = section.slice(index, index + token.length);\n if (slice.toLowerCase() === token.toLowerCase()) {\n return slice;\n }\n }\n return null;\n}\n\nfunction applyDateToken(token: string, date: Date, hasAmPm: boolean): string {\n const lower = token.toLowerCase();\n switch (lower) {\n case 'yyyy':\n return String(date.getFullYear()).padStart(token.length, '0');\n case 'yyy':\n case 'yy':\n return String(date.getFullYear()).slice(-token.length).padStart(token.length, '0');\n case 'y':\n return String(date.getFullYear() % 10);\n case 'mmmm':\n return MONTH_NAMES[date.getMonth()];\n case 'mmm':\n return MONTH_NAMES_SHORT[date.getMonth()];\n case 'mm':\n case 'm': {\n const month = date.getMonth() + 1;\n return lower === 'mm' ? String(month).padStart(2, '0') : String(month);\n }\n case 'dddd':\n return DAY_NAMES[date.getDay()];\n case 'ddd':\n return DAY_NAMES_SHORT[date.getDay()];\n case 'dd':\n case 'd': {\n const day = date.getDate();\n return lower === 'dd' ? String(day).padStart(2, '0') : String(day);\n }\n case 'hh':\n case 'h': {\n let hours = date.getHours();\n if (hasAmPm) {\n hours = hours % 12;\n if (hours === 0) {\n hours = 12;\n }\n }\n const value = lower === 'hh' ? String(hours).padStart(2, '0') : String(hours);\n return value;\n }\n case 'ss':\n case 's': {\n const seconds = date.getSeconds();\n const value = lower === 'ss' ? String(seconds).padStart(2, '0') : String(seconds);\n return value;\n }\n default:\n return token;\n }\n}\n\nfunction excelSerialToDate(serial: number): Date | null {\n if (!Number.isFinite(serial)) {\n return null;\n }\n const millisecondsPerDay = 24 * 60 * 60 * 1000;\n const epoch = Date.UTC(1899, 11, 30);\n let wholeDays = Math.trunc(serial);\n let fractional = serial - wholeDays;\n if (serial < 0 && fractional !== 0) {\n wholeDays -= 1;\n fractional = serial - wholeDays;\n }\n if (wholeDays >= 60) {\n wholeDays -= 1;\n }\n const ms = epoch + wholeDays * millisecondsPerDay + Math.round(fractional * millisecondsPerDay);\n return new Date(ms);\n}\n","export function cellKey(row: number, column: number): string {\n return `${row}:${column}`;\n}\n\nexport function parseCellKey(key: string): { row: number; column: number } | null {\n const [rowStr, columnStr] = key.split(':');\n const row = Number(rowStr);\n const column = Number(columnStr);\n if (!Number.isFinite(row) || !Number.isFinite(column)) {\n return null;\n }\n return { row, column };\n}\n","import type { RangeRect } from './types';\n\n/** Builds a cumulative boundary array from a list of sizes. Result has length sizes.length + 1. */\nexport function buildBoundaries(sizes: number[]): number[] {\n const boundaries = [0];\n let acc = 0;\n for (let i = 0; i < sizes.length; i += 1) {\n acc += sizes[i];\n boundaries.push(acc);\n }\n return boundaries;\n}\n\n/** Returns the index (0-based) of the segment containing `offset`, or null if out of range. */\nexport function getIndexAtOffset(offset: number, boundaries: number[]): number | null {\n for (let i = 0; i < boundaries.length - 1; i += 1) {\n if (offset >= boundaries[i] && offset < boundaries[i + 1]) {\n return i;\n }\n }\n return null;\n}\n\n/**\n * Binary-searches for the segment index that contains `offset`.\n * `count` is the number of segments (boundaries.length - 1).\n * Clamps to [0, count - 1].\n */\nexport function findIndexByOffset(offset: number, count: number, boundaries: number[]): number {\n if (count === 0) {\n return 0;\n }\n const total = boundaries[boundaries.length - 1] ?? 0;\n const clamped = Math.min(Math.max(0, offset), Math.max(0, total - 1e-3));\n let low = 0;\n let high = count - 1;\n while (low <= high) {\n const mid = (low + high) >> 1;\n if (clamped < boundaries[mid]) {\n high = mid - 1;\n } else if (clamped >= boundaries[mid + 1]) {\n low = mid + 1;\n } else {\n return mid;\n }\n }\n return Math.max(0, Math.min(count - 1, low));\n}\n\n/** Computes x/y/width/height of a cell range in canvas coordinates. */\nexport function computeRangeRect(\n topRow: number,\n leftColumn: number,\n bottomRow: number,\n rightColumn: number,\n columnBoundaries: readonly number[],\n rowBoundaries: readonly number[],\n headerColumnWidth: number,\n headerRowHeight: number,\n scrollX: number,\n scrollY: number,\n): RangeRect {\n const x = headerColumnWidth - scrollX + columnBoundaries[leftColumn];\n const y = headerRowHeight - scrollY + rowBoundaries[topRow];\n const width = columnBoundaries[rightColumn + 1] - columnBoundaries[leftColumn];\n const height = rowBoundaries[bottomRow + 1] - rowBoundaries[topRow];\n return { x, y, width, height };\n}\n","export type BorderSide = 'top' | 'right' | 'bottom' | 'left';\nexport type RangeBorderSide = BorderSide | 'outside';\n\nexport type BorderLineStyle = 'solid' | 'dashed' | 'dotted';\n\nexport interface BorderLineOptions {\n style: BorderLineStyle;\n color?: string;\n width?: number;\n}\n\nexport interface CellBorderDefinition {\n top?: BorderLine;\n right?: BorderLine;\n bottom?: BorderLine;\n left?: BorderLine;\n}\n\nexport interface BorderLine {\n style: BorderLineStyle;\n color: string;\n width: number;\n appliedAt?: number;\n}\n\nexport const ALL_BORDER_SIDES: BorderSide[] = ['top', 'right', 'bottom', 'left'];\nexport const DEFAULT_BORDER_COLOR = '#1f2933';\nexport const DEFAULT_BORDER_WIDTH = 1;\n","import type {\n BorderSide,\n RangeBorderSide,\n CellBorderDefinition,\n BorderLine,\n BorderLineOptions,\n} from './types';\nimport { ALL_BORDER_SIDES, DEFAULT_BORDER_COLOR, DEFAULT_BORDER_WIDTH } from './types';\nimport { cellKey, parseCellKey } from '../worksheet/cellKey';\n\nexport class BorderManager {\n private readonly data: Map<string, CellBorderDefinition> = new Map();\n private sequence = 0;\n\n constructor(\n private readonly getRows: () => number,\n private readonly getColumns: () => number,\n ) {}\n\n get size(): number {\n return this.data.size;\n }\n\n entries(): Iterable<[string, CellBorderDefinition]> {\n return this.data;\n }\n\n getCell(row: number, column: number): CellBorderDefinition | undefined {\n return this.data.get(cellKey(row, column));\n }\n\n applyAll(borders: Map<string, CellBorderDefinition>): void {\n this.data.clear();\n this.sequence = 0;\n for (const [key, border] of borders) {\n const cloned: CellBorderDefinition = {};\n if (border.top) {\n cloned.top = { ...border.top, appliedAt: this.nextSequence() };\n }\n if (border.right) {\n cloned.right = { ...border.right, appliedAt: this.nextSequence() };\n }\n if (border.bottom) {\n cloned.bottom = { ...border.bottom, appliedAt: this.nextSequence() };\n }\n if (border.left) {\n cloned.left = { ...border.left, appliedAt: this.nextSequence() };\n }\n this.data.set(key, cloned);\n }\n }\n\n setRange(\n topRow: number,\n leftColumn: number,\n bottomRow: number,\n rightColumn: number,\n border: BorderLineOptions,\n sides?: RangeBorderSide[],\n ): void {\n const line = this.normalizeLine(border);\n const normalizedSides = this.normalizeSides(sides ?? ALL_BORDER_SIDES);\n if (!normalizedSides.length) {\n return;\n }\n\n const bounds = this.normalizeBounds(topRow, leftColumn, bottomRow, rightColumn);\n if (!bounds) {\n return;\n }\n\n if (normalizedSides.includes('top')) {\n for (let col = bounds.left; col <= bounds.right; col += 1) {\n this.assignBorder(bounds.top, col, 'top', line);\n }\n }\n if (normalizedSides.includes('bottom')) {\n for (let col = bounds.left; col <= bounds.right; col += 1) {\n this.assignBorder(bounds.bottom, col, 'bottom', line);\n }\n }\n if (normalizedSides.includes('left')) {\n for (let row = bounds.top; row <= bounds.bottom; row += 1) {\n this.assignBorder(row, bounds.left, 'left', line);\n }\n }\n if (normalizedSides.includes('right')) {\n for (let row = bounds.top; row <= bounds.bottom; row += 1) {\n this.assignBorder(row, bounds.right, 'right', line);\n }\n }\n }\n\n pruneOutsideGrid(): void {\n for (const key of Array.from(this.data.keys())) {\n const pos = parseCellKey(key);\n if (!pos || !this.isCellInBounds(pos.row, pos.column)) {\n this.data.delete(key);\n }\n }\n }\n\n private assignBorder(row: number, column: number, side: BorderSide, line: BorderLine): void {\n if (line.width <= 0) {\n this.removeBorderSide(row, column, side);\n this.removeAdjacentBorder(row, column, side);\n return;\n }\n const border = this.getOrCreate(row, column);\n border[side] = { ...line, appliedAt: this.nextSequence() };\n }\n\n private removeBorderSide(row: number, column: number, side: BorderSide): void {\n if (!this.isCellInBounds(row, column)) {\n return;\n }\n const key = cellKey(row, column);\n const existing = this.data.get(key);\n if (!existing || existing[side] === undefined) {\n return;\n }\n delete existing[side];\n if (!existing.top && !existing.right && !existing.bottom && !existing.left) {\n this.data.delete(key);\n }\n }\n\n private removeAdjacentBorder(row: number, column: number, side: BorderSide): void {\n const adjacent = this.getAdjacentCell(row, column, side);\n if (!adjacent) {\n return;\n }\n this.removeBorderSide(adjacent.row, adjacent.column, this.oppositeSide(side));\n }\n\n private getAdjacentCell(\n row: number,\n column: number,\n side: BorderSide,\n ): { row: number; column: number } | null {\n const rows = this.getRows();\n const columns = this.getColumns();\n switch (side) {\n case 'top':\n return row > 0 ? { row: row - 1, column } : null;\n case 'bottom':\n return row < rows - 1 ? { row: row + 1, column } : null;\n case 'left':\n return column > 0 ? { row, column: column - 1 } : null;\n case 'right':\n return column < columns - 1 ? { row, column: column + 1 } : null;\n default:\n return null;\n }\n }\n\n private oppositeSide(side: BorderSide): BorderSide {\n switch (side) {\n case 'top':\n return 'bottom';\n case 'bottom':\n return 'top';\n case 'left':\n return 'right';\n case 'right':\n default:\n return 'left';\n }\n }\n\n private getOrCreate(row: number, column: number): CellBorderDefinition {\n const key = cellKey(row, column);\n const existing = this.data.get(key);\n if (existing) {\n return existing;\n }\n const created: CellBorderDefinition = {};\n this.data.set(key, created);\n return created;\n }\n\n private normalizeLine(border: BorderLineOptions): BorderLine {\n return {\n style: border.style,\n color: border.color ?? DEFAULT_BORDER_COLOR,\n width: border.width ?? DEFAULT_BORDER_WIDTH,\n };\n }\n\n private normalizeSides(sides: RangeBorderSide[]): BorderSide[] {\n if (!sides.length) {\n return [...ALL_BORDER_SIDES];\n }\n const resolved = new Set<BorderSide>();\n for (const side of sides) {\n if (side === 'outside') {\n for (const actual of ALL_BORDER_SIDES) {\n resolved.add(actual);\n }\n continue;\n }\n resolved.add(side);\n }\n return Array.from(resolved);\n }\n\n private normalizeBounds(\n topRow: number,\n leftColumn: number,\n bottomRow: number,\n rightColumn: number,\n ): { top: number; left: number; bottom: number; right: number } | null {\n const rows = this.getRows();\n const columns = this.getColumns();\n if (rows === 0 || columns === 0) {\n return null;\n }\n const clampRow = (r: number) => Math.min(Math.max(Math.floor(r), 0), rows - 1);\n const clampCol = (c: number) => Math.min(Math.max(Math.floor(c), 0), columns - 1);\n const r1 = clampRow(topRow);\n const r2 = clampRow(bottomRow);\n const c1 = clampCol(leftColumn);\n const c2 = clampCol(rightColumn);\n return { top: Math.min(r1, r2), bottom: Math.max(r1, r2), left: Math.min(c1, c2), right: Math.max(c1, c2) };\n }\n\n private isCellInBounds(row: number, column: number): boolean {\n return row >= 0 && row < this.getRows() && column >= 0 && column < this.getColumns();\n }\n\n private nextSequence(): number {\n this.sequence += 1;\n return this.sequence;\n }\n}\n","import type { MergedCellRange } from '../cell/types';\nimport { cellKey, parseCellKey } from '../worksheet/cellKey';\n\nexport class MergeManager {\n /** Maps every cell key in a merged range to that range's descriptor. */\n private readonly cells: Map<string, MergedCellRange> = new Map();\n\n /** Maps only anchor (top-left) cell keys to their merged range descriptor. */\n private readonly anchors: Map<string, MergedCellRange> = new Map();\n\n constructor(\n private readonly getRows: () => number,\n private readonly getColumns: () => number,\n ) {}\n\n get anchorCount(): number {\n return this.anchors.size;\n }\n\n iterateAnchors(): IterableIterator<MergedCellRange> {\n return this.anchors.values();\n }\n\n get(row: number, column: number): MergedCellRange | null {\n return this.cells.get(cellKey(row, column)) ?? null;\n }\n\n isAnchor(row: number, column: number): boolean {\n return this.anchors.has(cellKey(row, column));\n }\n\n getBounds(row: number, column: number): {\n topRow: number;\n bottomRow: number;\n leftColumn: number;\n rightColumn: number;\n } {\n const merged = this.get(row, column);\n if (merged) {\n return { ...merged };\n }\n const rows = this.getRows();\n const columns = this.getColumns();\n if (rows === 0 || columns === 0) {\n return { topRow: row, bottomRow: row, leftColumn: column, rightColumn: column };\n }\n const clampedRow = Math.min(Math.max(Math.floor(row), 0), rows - 1);\n const clampedCol = Math.min(Math.max(Math.floor(column), 0), columns - 1);\n return {\n topRow: clampedRow,\n bottomRow: clampedRow,\n leftColumn: clampedCol,\n rightColumn: clampedCol,\n };\n }\n\n setAll(ranges: Iterable<MergedCellRange>): void {\n this.cells.clear();\n this.anchors.clear();\n for (const range of ranges) {\n const normalized = this.normalizeRange(range);\n if (normalized) {\n this.applyRange(normalized);\n }\n }\n }\n\n add(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): void {\n const normalized = this.normalizeRange({ topRow, leftColumn, bottomRow, rightColumn });\n if (!normalized) {\n return;\n }\n this.removeOverlapping(normalized);\n this.applyRange(normalized);\n }\n\n remove(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): boolean {\n const bounds = this.normalizeBounds(topRow, leftColumn, bottomRow, rightColumn);\n if (!bounds) {\n return false;\n }\n return this.removeOverlapping({\n topRow: bounds.top,\n bottomRow: bounds.bottom,\n leftColumn: bounds.left,\n rightColumn: bounds.right,\n });\n }\n\n clear(): boolean {\n if (this.cells.size === 0 && this.anchors.size === 0) {\n return false;\n }\n this.cells.clear();\n this.anchors.clear();\n return true;\n }\n\n expandSelection(bounds: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n }): { top: number; bottom: number; left: number; right: number } {\n if (!this.anchors.size) {\n return { ...bounds };\n }\n let expanded = { ...bounds };\n let changed = false;\n do {\n changed = false;\n const selectionRange: MergedCellRange = {\n topRow: expanded.top,\n bottomRow: expanded.bottom,\n leftColumn: expanded.left,\n rightColumn: expanded.right,\n };\n for (const merged of this.anchors.values()) {\n if (!this.rangesOverlap(merged, selectionRange)) {\n continue;\n }\n const nextTop = Math.min(expanded.top, merged.topRow);\n const nextBottom = Math.max(expanded.bottom, merged.bottomRow);\n const nextLeft = Math.min(expanded.left, merged.leftColumn);\n const nextRight = Math.max(expanded.right, merged.rightColumn);\n if (\n nextTop !== expanded.top ||\n nextBottom !== expanded.bottom ||\n nextLeft !== expanded.left ||\n nextRight !== expanded.right\n ) {\n expanded = { top: nextTop, bottom: nextBottom, left: nextLeft, right: nextRight };\n changed = true;\n }\n }\n } while (changed);\n return expanded;\n }\n\n getMergedLineGaps(): {\n horizontal: Map<number, Array<{ startColumnBoundary: number; endColumnBoundary: number }>>;\n vertical: Map<number, Array<{ startRowBoundary: number; endRowBoundary: number }>>;\n } {\n const horizontal = new Map<\n number,\n Array<{ startColumnBoundary: number; endColumnBoundary: number }>\n >();\n const vertical = new Map<\n number,\n Array<{ startRowBoundary: number; endRowBoundary: number }>\n >();\n\n if (!this.anchors.size) {\n return { horizontal, vertical };\n }\n\n for (const range of this.anchors.values()) {\n if (range.bottomRow > range.topRow) {\n for (let row = range.topRow + 1; row <= range.bottomRow; row += 1) {\n let list = horizontal.get(row);\n if (!list) {\n list = [];\n horizontal.set(row, list);\n }\n list.push({\n startColumnBoundary: range.leftColumn,\n endColumnBoundary: range.rightColumn + 1,\n });\n }\n }\n if (range.rightColumn > range.leftColumn) {\n for (let column = range.leftColumn + 1; column <= range.rightColumn; column += 1) {\n let list = vertical.get(column);\n if (!list) {\n list = [];\n vertical.set(column, list);\n }\n list.push({\n startRowBoundary: range.topRow,\n endRowBoundary: range.bottomRow + 1,\n });\n }\n }\n }\n\n return { horizontal, vertical };\n }\n\n pruneOutsideGrid(): void {\n if (!this.anchors.size) {\n return;\n }\n const rows = this.getRows();\n const columns = this.getColumns();\n const toRemove: MergedCellRange[] = [];\n for (const range of this.anchors.values()) {\n if (\n range.topRow < 0 ||\n range.leftColumn < 0 ||\n range.bottomRow >= rows ||\n range.rightColumn >= columns\n ) {\n toRemove.push(range);\n }\n }\n for (const range of toRemove) {\n this.removeRange(range);\n }\n }\n\n allAnchors(): MergedCellRange[] {\n return Array.from(this.anchors.values());\n }\n\n private applyRange(range: MergedCellRange): void {\n const stored: MergedCellRange = { ...range };\n this.anchors.set(cellKey(stored.topRow, stored.leftColumn), stored);\n for (let r = stored.topRow; r <= stored.bottomRow; r += 1) {\n for (let c = stored.leftColumn; c <= stored.rightColumn; c += 1) {\n this.cells.set(cellKey(r, c), stored);\n }\n }\n }\n\n private removeRange(range: MergedCellRange): void {\n this.anchors.delete(cellKey(range.topRow, range.leftColumn));\n for (let r = range.topRow; r <= range.bottomRow; r += 1) {\n for (let c = range.leftColumn; c <= range.rightColumn; c += 1) {\n this.cells.delete(cellKey(r, c));\n }\n }\n }\n\n private removeOverlapping(range: MergedCellRange): boolean {\n const toRemove: MergedCellRange[] = [];\n for (const existing of this.anchors.values()) {\n if (this.rangesOverlap(existing, range)) {\n toRemove.push(existing);\n }\n }\n if (!toRemove.length) {\n return false;\n }\n for (const merged of toRemove) {\n this.removeRange(merged);\n }\n return true;\n }\n\n private rangesOverlap(a: MergedCellRange, b: MergedCellRange): boolean {\n return !(\n a.bottomRow < b.topRow ||\n a.topRow > b.bottomRow ||\n a.rightColumn < b.leftColumn ||\n a.leftColumn > b.rightColumn\n );\n }\n\n private normalizeRange(range: MergedCellRange): MergedCellRange | null {\n const bounds = this.normalizeBounds(\n range.topRow,\n range.leftColumn,\n range.bottomRow,\n range.rightColumn,\n );\n if (!bounds) {\n return null;\n }\n if (bounds.top === bounds.bottom && bounds.left === bounds.right) {\n return null;\n }\n return {\n topRow: bounds.top,\n bottomRow: bounds.bottom,\n leftColumn: bounds.left,\n rightColumn: bounds.right,\n };\n }\n\n private normalizeBounds(\n topRow: number,\n leftColumn: number,\n bottomRow: number,\n rightColumn: number,\n ): { top: number; left: number; bottom: number; right: number } | null {\n const rows = this.getRows();\n const columns = this.getColumns();\n if (rows === 0 || columns === 0) {\n return null;\n }\n const clampRow = (r: number) => Math.min(Math.max(Math.floor(r), 0), rows - 1);\n const clampCol = (c: number) => Math.min(Math.max(Math.floor(c), 0), columns - 1);\n const r1 = clampRow(topRow);\n const r2 = clampRow(bottomRow);\n const c1 = clampCol(leftColumn);\n const c2 = clampCol(rightColumn);\n return { top: Math.min(r1, r2), bottom: Math.max(r1, r2), left: Math.min(c1, c2), right: Math.max(c1, c2) };\n }\n}\n\n/** Prunes map entries whose keys are not valid cell positions within the given grid bounds. */\nexport function pruneMapOutsideGrid(\n map: Map<string, unknown>,\n rows: number,\n columns: number,\n): void {\n for (const key of Array.from(map.keys())) {\n const pos = parseCellKey(key);\n if (!pos || pos.row < 0 || pos.row >= rows || pos.column < 0 || pos.column >= columns) {\n map.delete(key);\n }\n }\n}\n","import {\n DEFAULT_COLUMNS,\n DEFAULT_ROWS,\n DEFAULT_COLUMN_WIDTH,\n DEFAULT_ROW_HEIGHT,\n HEADER_COLUMN_WIDTH,\n HEADER_ROW_HEIGHT,\n} from './gridDefaults';\nimport { SelectionRange } from '../cell/selectionRange';\nimport { FormulaEngine } from '../formula/formulaEngine';\nimport type { RangeRect, HitTestResult } from './types';\nimport {\n DEFAULT_CELL_STYLE,\n type CellStyle,\n type TextAlign,\n type TextWrapMode,\n type VerticalAlign,\n} from '../style/cellStyle';\nimport { formatNumberWithFormat } from '../style/numberFormat';\nimport type { CellInputValue, MergedCellRange } from '../cell/types';\nimport type { BorderLineOptions, RangeBorderSide, CellBorderDefinition } from '../border/types';\nimport type { RichTextRun } from '../../types/richText';\nimport { cellKey, parseCellKey } from './cellKey';\nimport { buildBoundaries, getIndexAtOffset, findIndexByOffset, computeRangeRect } from './gridGeometry';\nimport { BorderManager } from '../border/borderManager';\nimport { MergeManager, pruneMapOutsideGrid } from '../merge/mergeManager';\n\nexport const MIN_COLUMN_WIDTH = 24;\nexport const MIN_ROW_HEIGHT = 18;\nexport const HEADER_RESIZE_TOLERANCE = 4;\nexport const CELL_TEXT_PADDING = 4;\n\ntype SelectionChangeListener = (cell: { row: number; column: number } | null) => void;\ntype CellValueChangeListener = (payload: { row: number; column: number; value: string }) => void;\ntype ViewportSizeListener = (size: { width: number; height: number }) => void;\ntype ScrollChangeListener = (offset: { x: number; y: number }) => void;\n\nexport type WorksheetExportCell = {\n row: number;\n column: number;\n value?: string;\n style?: CellStyle;\n};\n\nexport interface WorksheetExportSnapshot {\n cells: WorksheetExportCell[];\n merges: MergedCellRange[];\n columnWidths: number[];\n rowHeights: number[];\n rows: number;\n columns: number;\n}\n\nexport class Worksheet {\n protected pixelRatio = 1;\n\n private readonly pointToPixelRatio = 96 / 72;\n\n protected viewportWidth = 0;\n\n protected viewportHeight = 0;\n\n public rows: number;\n\n public columns: number;\n\n public readonly columnWidths: number[];\n\n private readonly columnCustomWidths: boolean[];\n\n public readonly rowHeights: number[];\n\n private readonly rowCustomHeights: boolean[];\n\n private columnBoundaries: number[];\n\n private rowBoundaries: number[];\n\n public headerColumnWidth: number;\n\n public headerRowHeight: number;\n\n public readonly selection: SelectionRange;\n\n private readonly cellInputs: Map<string, string>;\n\n private readonly cellRichText: Map<string, RichTextRun[]>;\n\n private readonly cellDisplayOverrides: Map<string, string>;\n\n private readonly cellNumberFormats: Map<string, string>;\n\n private readonly cellFormatting: Map<string, Partial<CellStyle>>;\n\n protected readonly borders: BorderManager;\n\n protected readonly merges: MergeManager;\n\n private readonly selectionChangeListeners: Set<SelectionChangeListener> = new Set();\n\n private readonly cellValueListeners: Set<CellValueChangeListener> = new Set();\n\n private readonly viewportSizeListeners: Set<ViewportSizeListener> = new Set();\n\n private readonly scrollListeners: Set<ScrollChangeListener> = new Set();\n\n private readonly structureListeners: Set<() => void> = new Set();\n\n private readonly defaultStyle: CellStyle = { ...DEFAULT_CELL_STYLE };\n\n private _showGridLines = true;\n\n protected resizeGuide: { type: 'column' | 'row'; position: number } | null = null;\n\n private readonly formulaEngine: FormulaEngine;\n\n protected scrollX = 0;\n\n protected scrollY = 0;\n\n private contentWidth = 0;\n\n private contentHeight = 0;\n\n constructor() {\n this.rows = DEFAULT_ROWS;\n this.columns = DEFAULT_COLUMNS;\n this.columnWidths = new Array(this.columns).fill(DEFAULT_COLUMN_WIDTH);\n this.columnCustomWidths = new Array(this.columns).fill(false);\n this.rowHeights = new Array(this.rows).fill(DEFAULT_ROW_HEIGHT);\n this.rowCustomHeights = new Array(this.rows).fill(false);\n this.columnBoundaries = [];\n this.rowBoundaries = [];\n\n this.headerColumnWidth = HEADER_COLUMN_WIDTH;\n this.headerRowHeight = HEADER_ROW_HEIGHT;\n\n this.selection = new SelectionRange(this);\n\n this.cellInputs = new Map();\n this.cellRichText = new Map();\n this.cellDisplayOverrides = new Map();\n this.cellNumberFormats = new Map();\n this.cellFormatting = new Map();\n\n this.borders = new BorderManager(() => this.rows, () => this.columns);\n this.merges = new MergeManager(() => this.rows, () => this.columns);\n\n this.formulaEngine = new FormulaEngine(this);\n }\n\n public render(): void {\n // Override in rendering subclasses.\n }\n\n // ---------------------------------------------------------------------------\n // Scroll & viewport\n // ---------------------------------------------------------------------------\n\n getScrollContentSize(): { width: number; height: number } {\n this.ensureBoundaries();\n return {\n width: this.headerColumnWidth + this.contentWidth,\n height: this.headerRowHeight + this.contentHeight,\n };\n }\n\n getScrollOffset(): { x: number; y: number } {\n return { x: this.scrollX, y: this.scrollY };\n }\n\n setScrollOffset(x: number, y: number): void {\n const clamped = this.clampScrollOffset(x, y);\n if (clamped.x === this.scrollX && clamped.y === this.scrollY) {\n return;\n }\n this.scrollX = clamped.x;\n this.scrollY = clamped.y;\n this.emitScrollChange();\n this.render();\n }\n\n onViewportSizeChange(listener: ViewportSizeListener): () => void {\n this.viewportSizeListeners.add(listener);\n return () => {\n this.viewportSizeListeners.delete(listener);\n };\n }\n\n onScrollChange(listener: ScrollChangeListener): () => void {\n this.scrollListeners.add(listener);\n return () => {\n this.scrollListeners.delete(listener);\n };\n }\n\n onStructureChange(listener: () => void): () => void {\n this.structureListeners.add(listener);\n return () => {\n this.structureListeners.delete(listener);\n };\n }\n\n // ---------------------------------------------------------------------------\n // Hit testing & geometry\n // ---------------------------------------------------------------------------\n\n getCellFromPoint(x: number, y: number): { row: number; column: number } | null {\n const hit = this.hitTest(x, y);\n if (hit && hit.type === 'cell') {\n return { row: hit.row, column: hit.column };\n }\n return null;\n }\n\n hitTest(x: number, y: number): HitTestResult | null {\n if (x < 0 || y < 0) {\n return null;\n }\n\n this.ensureBoundaries();\n\n const bodyLeft = this.headerColumnWidth;\n const bodyTop = this.headerRowHeight;\n const bodyRight = bodyLeft + this.getBodyViewportWidth();\n const bodyBottom = bodyTop + this.getBodyViewportHeight();\n\n const withinBodyX = x >= bodyLeft && x < bodyRight;\n const withinBodyY = y >= bodyTop && y < bodyBottom;\n\n if (withinBodyX && withinBodyY) {\n const bodyX = x - bodyLeft + this.scrollX;\n const bodyY = y - bodyTop + this.scrollY;\n const column = getIndexAtOffset(bodyX, this.columnBoundaries);\n const row = getIndexAtOffset(bodyY, this.rowBoundaries);\n if (column !== null && row !== null) {\n const merged = this.getMergedRange(row, column);\n if (merged) {\n return { type: 'cell', row: merged.topRow, column: merged.leftColumn };\n }\n return { type: 'cell', row, column };\n }\n return null;\n }\n\n const withinColumnHeaders =\n y >= 0 && y < this.headerRowHeight && x >= bodyLeft && x < bodyRight;\n if (withinColumnHeaders) {\n const bodyX = x - bodyLeft + this.scrollX;\n const column = getIndexAtOffset(bodyX, this.columnBoundaries);\n if (column !== null) {\n return { type: 'column-header', column };\n }\n }\n\n const withinRowHeaders =\n x >= 0 && x < this.headerColumnWidth && y >= bodyTop && y < bodyBottom;\n if (withinRowHeaders) {\n const bodyY = y - bodyTop + this.scrollY;\n const row = getIndexAtOffset(bodyY, this.rowBoundaries);\n if (row !== null) {\n return { type: 'row-header', row };\n }\n }\n\n const withinCorner =\n x >= 0 && x < this.headerColumnWidth && y >= 0 && y < this.headerRowHeight;\n if (withinCorner) {\n return { type: 'corner' };\n }\n\n return null;\n }\n\n updateBoundaries(): void {\n const previousWidth = this.contentWidth;\n const previousHeight = this.contentHeight;\n this.columnBoundaries = buildBoundaries(this.columnWidths);\n this.rowBoundaries = buildBoundaries(this.rowHeights);\n this.contentWidth =\n this.columnBoundaries.length > 0\n ? this.columnBoundaries[this.columnBoundaries.length - 1]\n : 0;\n this.contentHeight =\n this.rowBoundaries.length > 0 ? this.rowBoundaries[this.rowBoundaries.length - 1] : 0;\n if (this.contentWidth !== previousWidth || this.contentHeight !== previousHeight) {\n this.emitViewportSizeChange();\n this.clampScrollOffsetInPlace();\n }\n }\n\n ensureBoundaries(): void {\n if (!this.columnBoundaries.length || !this.rowBoundaries.length) {\n this.updateBoundaries();\n }\n }\n\n protected getColumnBoundaries(): readonly number[] {\n return this.columnBoundaries;\n }\n\n protected getRowBoundaries(): readonly number[] {\n return this.rowBoundaries;\n }\n\n protected getColumnWidths(): readonly number[] {\n return this.columnWidths;\n }\n\n protected getRowHeights(): readonly number[] {\n return this.rowHeights;\n }\n\n protected getCellBorders(): Iterable<[string, CellBorderDefinition]> {\n return this.borders.entries();\n }\n\n public getBodyViewportWidth(): number {\n return Math.max(0, this.viewportWidth - this.headerColumnWidth);\n }\n\n public getBodyViewportHeight(): number {\n return Math.max(0, this.viewportHeight - this.headerRowHeight);\n }\n\n private clampScrollOffset(x: number, y: number): { x: number; y: number } {\n const maxX = Math.max(0, this.contentWidth - this.getBodyViewportWidth());\n const maxY = Math.max(0, this.contentHeight - this.getBodyViewportHeight());\n return {\n x: Math.min(Math.max(0, x), maxX),\n y: Math.min(Math.max(0, y), maxY),\n };\n }\n\n protected clampScrollOffsetInPlace(): void {\n const clamped = this.clampScrollOffset(this.scrollX, this.scrollY);\n if (clamped.x !== this.scrollX || clamped.y !== this.scrollY) {\n this.scrollX = clamped.x;\n this.scrollY = clamped.y;\n this.emitScrollChange();\n }\n }\n\n getRangeRect(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): RangeRect {\n this.ensureBoundaries();\n return computeRangeRect(\n topRow,\n leftColumn,\n bottomRow,\n rightColumn,\n this.columnBoundaries,\n this.rowBoundaries,\n this.headerColumnWidth,\n this.headerRowHeight,\n this.scrollX,\n this.scrollY,\n );\n }\n\n getCellRect(row: number, column: number): RangeRect {\n const bounds = this.getCellMergeBounds(row, column);\n return this.getRangeRect(bounds.topRow, bounds.leftColumn, bounds.bottomRow, bounds.rightColumn);\n }\n\n public getVisibleRowRange(padding = 1): { start: number; end: number } {\n if (this.rows === 0) {\n return { start: 0, end: -1 };\n }\n const bodyHeight = this.getBodyViewportHeight();\n const start = findIndexByOffset(this.scrollY, this.rows, this.rowBoundaries);\n const end = findIndexByOffset(this.scrollY + bodyHeight, this.rows, this.rowBoundaries);\n return {\n start: Math.max(0, start - padding),\n end: Math.min(this.rows - 1, end + padding),\n };\n }\n\n public getVisibleColumnRange(padding = 1): { start: number; end: number } {\n if (this.columns === 0) {\n return { start: 0, end: -1 };\n }\n const bodyWidth = this.getBodyViewportWidth();\n const start = findIndexByOffset(this.scrollX, this.columns, this.columnBoundaries);\n const end = findIndexByOffset(this.scrollX + bodyWidth, this.columns, this.columnBoundaries);\n return {\n start: Math.max(0, start - padding),\n end: Math.min(this.columns - 1, end + padding),\n };\n }\n\n public getVisibleRowIndices(): number[] {\n const padded = this.getVisibleRowRange();\n const viewportRows = this.getVisibleRowRange(0);\n const viewportCols = this.getVisibleColumnRange(0);\n const rows = new Set<number>();\n for (let r = padded.start; r <= padded.end; r += 1) {\n rows.add(r);\n }\n if (this.merges.anchorCount > 0) {\n for (const merged of this.merges.iterateAnchors()) {\n const overlapsViewport =\n merged.bottomRow >= viewportRows.start &&\n merged.topRow <= viewportRows.end &&\n merged.rightColumn >= viewportCols.start &&\n merged.leftColumn <= viewportCols.end;\n const anchorOutsidePadded = merged.topRow < padded.start || merged.topRow > padded.end;\n if (overlapsViewport && anchorOutsidePadded) {\n rows.add(merged.topRow);\n }\n }\n }\n return Array.from(rows).sort((a, b) => a - b);\n }\n\n public getVisibleColumnIndices(): number[] {\n const padded = this.getVisibleColumnRange();\n const viewportCols = this.getVisibleColumnRange(0);\n const viewportRows = this.getVisibleRowRange(0);\n const columns = new Set<number>();\n for (let c = padded.start; c <= padded.end; c += 1) {\n columns.add(c);\n }\n if (this.merges.anchorCount > 0) {\n for (const merged of this.merges.iterateAnchors()) {\n const overlapsViewport =\n merged.bottomRow >= viewportRows.start &&\n merged.topRow <= viewportRows.end &&\n merged.rightColumn >= viewportCols.start &&\n merged.leftColumn <= viewportCols.end;\n const anchorOutsidePadded =\n merged.leftColumn < padded.start || merged.leftColumn > padded.end;\n if (overlapsViewport && anchorOutsidePadded) {\n columns.add(merged.leftColumn);\n }\n }\n }\n return Array.from(columns).sort((a, b) => a - b);\n }\n\n getColumnResizeHandle(x: number, y: number, tolerance = HEADER_RESIZE_TOLERANCE): number | null {\n if (y < 0 || y > this.headerRowHeight) {\n return null;\n }\n if (x < this.headerColumnWidth) {\n return null;\n }\n this.ensureBoundaries();\n for (let i = 1; i < this.columnBoundaries.length; i += 1) {\n const boundaryX = this.headerColumnWidth + this.columnBoundaries[i];\n if (Math.abs(boundaryX - x) <= tolerance) {\n return Math.min(i - 1, this.columns - 1);\n }\n }\n return null;\n }\n\n getRowResizeHandle(x: number, y: number, tolerance = HEADER_RESIZE_TOLERANCE): number | null {\n if (x < 0 || x > this.headerColumnWidth) {\n return null;\n }\n if (y < this.headerRowHeight) {\n return null;\n }\n this.ensureBoundaries();\n for (let i = 1; i < this.rowBoundaries.length; i += 1) {\n const boundaryY = this.headerRowHeight + this.rowBoundaries[i];\n if (Math.abs(boundaryY - y) <= tolerance) {\n return Math.min(i - 1, this.rows - 1);\n }\n }\n return null;\n }\n\n getColumnStart(column: number): number {\n this.ensureBoundaries();\n const clamped = Math.max(0, Math.min(column, this.columnBoundaries.length - 1));\n return this.headerColumnWidth + this.columnBoundaries[clamped];\n }\n\n getRowStart(row: number): number {\n this.ensureBoundaries();\n const clamped = Math.max(0, Math.min(row, this.rowBoundaries.length - 1));\n return this.headerRowHeight + this.rowBoundaries[clamped];\n }\n\n // ---------------------------------------------------------------------------\n // Cell data\n // ---------------------------------------------------------------------------\n\n getCellInput(row: number, column: number): string | undefined {\n return this.cellInputs.get(cellKey(row, column));\n }\n\n protected getRichTextRuns(row: number, column: number): RichTextRun[] | undefined {\n return this.cellRichText.get(cellKey(row, column));\n }\n\n setCellInput(row: number, column: number, value: string): void {\n const merged = this.getMergedRange(row, column);\n const targetRow = merged ? merged.topRow : row;\n const targetColumn = merged ? merged.leftColumn : column;\n const key = cellKey(targetRow, targetColumn);\n this.cellRichText.delete(key);\n if (value.length === 0) {\n this.cellInputs.delete(key);\n } else {\n this.cellInputs.set(key, value);\n }\n this.updateCellDisplayValue(targetRow, targetColumn);\n this.render();\n this.emitCellValueChange(targetRow, targetColumn);\n }\n\n loadCells(cells: Iterable<CellInputValue>): void {\n this.cellInputs.clear();\n this.cellRichText.clear();\n this.cellDisplayOverrides.clear();\n this.cellNumberFormats.clear();\n this.cellFormatting.clear();\n const changedCells: CellInputValue[] = [];\n for (const cell of cells) {\n if (!this.isCellInBounds(cell.row, cell.column)) {\n continue;\n }\n const normalized = cell.value ?? '';\n const hasValue = normalized.length > 0;\n const hasFormatting =\n !!cell.style || !!cell.displayValue || !!cell.richText?.length || !!cell.numberFormat;\n if (!hasValue && !hasFormatting) {\n continue;\n }\n const key = cellKey(cell.row, cell.column);\n if (hasValue) {\n this.cellInputs.set(key, normalized);\n }\n if (cell.richText && cell.richText.length > 0) {\n this.cellRichText.set(\n key,\n cell.richText.map((run) => ({ ...run })),\n );\n }\n if (cell.numberFormat) {\n this.cellNumberFormats.set(key, cell.numberFormat);\n }\n this.updateCellDisplayValue(cell.row, cell.column, cell.displayValue);\n if (cell.style) {\n this.setCellFormatting(cell.row, cell.column, cell.style);\n }\n if (hasValue) {\n changedCells.push({ row: cell.row, column: cell.column, value: normalized });\n }\n }\n this.render();\n for (const cell of changedCells) {\n this.emitCellValueChange(cell.row, cell.column);\n }\n const active = this.selection.getActiveCell();\n if (active) {\n this.emitCellValueChange(active.row, active.column);\n }\n }\n\n private updateCellDisplayValue(row: number, column: number, fallback?: string): void {\n const key = cellKey(row, column);\n const raw = this.cellInputs.get(key);\n const formatCode = this.cellNumberFormats.get(key);\n let display: string | null | undefined;\n if (formatCode && raw !== undefined) {\n const numeric = Number(raw);\n if (Number.isFinite(numeric)) {\n display = formatNumberWithFormat(numeric, formatCode);\n }\n }\n if ((display === null || display === undefined) && fallback !== undefined) {\n display = fallback;\n }\n if (display && display.length > 0) {\n this.cellDisplayOverrides.set(key, display);\n } else {\n this.cellDisplayOverrides.delete(key);\n }\n }\n\n protected getCellText(row: number, column: number): string | null {\n const key = cellKey(row, column);\n if (this.cellDisplayOverrides.has(key)) {\n const display = this.cellDisplayOverrides.get(key) ?? '';\n return display.length ? display : null;\n }\n const value = this.formulaEngine.getDisplayValue(row, column);\n return value && value.length > 0 ? value : null;\n }\n\n // ---------------------------------------------------------------------------\n // Cell style\n // ---------------------------------------------------------------------------\n\n getComputedCellStyle(row: number, column: number): CellStyle {\n const key = cellKey(row, column);\n const formatting = this.cellFormatting.get(key);\n return {\n fontFamily: formatting?.fontFamily ?? this.defaultStyle.fontFamily,\n fontSize: formatting?.fontSize ?? this.defaultStyle.fontSize,\n bold: formatting?.bold ?? this.defaultStyle.bold,\n italic: formatting?.italic ?? this.defaultStyle.italic,\n underline: formatting?.underline ?? this.defaultStyle.underline,\n backgroundColor: formatting?.backgroundColor ?? this.defaultStyle.backgroundColor,\n color: formatting?.color ?? this.defaultStyle.color,\n textAlign: formatting?.textAlign ?? this.defaultStyle.textAlign,\n verticalAlign: formatting?.verticalAlign ?? this.defaultStyle.verticalAlign,\n textWrapMode: formatting?.textWrapMode ?? this.defaultStyle.textWrapMode,\n };\n }\n\n getActiveCellStyle(): CellStyle {\n const active = this.selection.getActiveCell();\n if (!active) {\n return { ...this.defaultStyle };\n }\n return this.getComputedCellStyle(active.row, active.column);\n }\n\n getDefaultCellStyle(): CellStyle {\n return { ...this.defaultStyle };\n }\n\n setCellStyle(row: number, column: number, style: Partial<CellStyle>): void {\n if (!this.isCellInBounds(row, column)) {\n throw new Error(`Cell (${row}, ${column}) is outside of the worksheet bounds.`);\n }\n this.setCellFormatting(row, column, style);\n this.render();\n }\n\n private setCellFormatting(row: number, column: number, style: Partial<CellStyle>): void {\n const key = cellKey(row, column);\n const existing = this.cellFormatting.get(key) ?? {};\n const next: Partial<CellStyle> = { ...existing, ...style };\n const cleaned: Partial<CellStyle> = {};\n if (next.fontFamily !== undefined) { cleaned.fontFamily = next.fontFamily; }\n if (next.fontSize !== undefined) { cleaned.fontSize = next.fontSize; }\n if (next.bold !== undefined) { cleaned.bold = next.bold; }\n if (next.italic !== undefined) { cleaned.italic = next.italic; }\n if (next.underline !== undefined) { cleaned.underline = next.underline; }\n if (next.backgroundColor !== undefined) { cleaned.backgroundColor = next.backgroundColor; }\n if (next.color !== undefined) { cleaned.color = next.color; }\n if (next.textAlign !== undefined) { cleaned.textAlign = next.textAlign; }\n if (next.verticalAlign !== undefined) { cleaned.verticalAlign = next.verticalAlign; }\n if (next.textWrapMode !== undefined) { cleaned.textWrapMode = next.textWrapMode; }\n const hasFormatting = Object.keys(cleaned).length > 0;\n if (!hasFormatting) {\n this.cellFormatting.delete(key);\n } else {\n this.cellFormatting.set(key, cleaned);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Selection style operations\n // ---------------------------------------------------------------------------\n\n setSelectionFontFamily(fontFamily: string): void {\n this.applyToSelection((row, column) => { this.setCellFormatting(row, column, { fontFamily }); });\n this.render();\n }\n\n setSelectionFontSize(fontSize: number): void {\n this.applyToSelection((row, column) => { this.setCellFormatting(row, column, { fontSize }); });\n this.render();\n }\n\n setSelectionFontBold(enabled: boolean): void {\n this.applyToSelection((row, column) => { this.setCellFormatting(row, column, { bold: enabled }); });\n this.render();\n }\n\n setSelectionFontItalic(enabled: boolean): void {\n this.applyToSelection((row, column) => { this.setCellFormatting(row, column, { italic: enabled }); });\n this.render();\n }\n\n setSelectionUnderline(enabled: boolean): void {\n this.applyToSelection((row, column) => { this.setCellFormatting(row, column, { underline: enabled }); });\n this.render();\n }\n\n setSelectionBackgroundColor(color: string): void {\n this.applyToSelection((row, column) => { this.setCellFormatting(row, column, { backgroundColor: color }); });\n this.render();\n }\n\n setSelectionHorizontalAlignment(alignment: TextAlign): void {\n this.applyToSelection((row, column) => { this.setCellFormatting(row, column, { textAlign: alignment }); });\n this.render();\n }\n\n setSelectionVerticalAlignment(alignment: VerticalAlign): void {\n this.applyToSelection((row, column) => { this.setCellFormatting(row, column, { verticalAlign: alignment }); });\n this.render();\n }\n\n setSelectionTextWrapMode(mode: TextWrapMode): void {\n this.applyToSelection((row, column) => { this.setCellFormatting(row, column, { textWrapMode: mode }); });\n this.render();\n }\n\n setRangeBackgroundColor(\n topRow: number,\n leftColumn: number,\n bottomRow: number,\n rightColumn: number,\n color: string,\n ): void {\n const bounds = this.normalizeRangeBounds(topRow, leftColumn, bottomRow, rightColumn);\n if (!bounds) {\n return;\n }\n for (let r = bounds.top; r <= bounds.bottom; r += 1) {\n for (let c = bounds.left; c <= bounds.right; c += 1) {\n this.setCellFormatting(r, c, { backgroundColor: color });\n }\n }\n this.render();\n }\n\n // ---------------------------------------------------------------------------\n // Selection\n // ---------------------------------------------------------------------------\n\n setSelectionRange(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): void {\n const bounds = this.normalizeRangeBounds(topRow, leftColumn, bottomRow, rightColumn);\n if (!bounds) {\n return;\n }\n const expanded = this.merges.expandSelection(bounds);\n this.selection.setRange(expanded.top, expanded.left, expanded.bottom, expanded.right);\n this.render();\n this.notifySelectionChanged();\n }\n\n onSelectionChange(listener: SelectionChangeListener): () => void {\n this.selectionChangeListeners.add(listener);\n return () => {\n this.selectionChangeListeners.delete(listener);\n };\n }\n\n onCellValueChange(listener: CellValueChangeListener): () => void {\n this.cellValueListeners.add(listener);\n return () => {\n this.cellValueListeners.delete(listener);\n };\n }\n\n notifySelectionChanged(): void {\n this.emitSelectionChange();\n }\n\n isActiveCell(row: number, column: number): boolean {\n const active = this.selection.getActiveCell();\n return !!active && active.row === row && active.column === column;\n }\n\n private applyToSelection(callback: (row: number, column: number) => void): void {\n const bounds = this.selection.getNormalizedBounds();\n if (!bounds) {\n const active = this.selection.getActiveCell();\n if (active) {\n callback(active.row, active.column);\n return;\n }\n this.selection.begin(0, 0);\n this.emitSelectionChange();\n callback(0, 0);\n return;\n }\n for (let r = bounds.topRow; r <= bounds.bottomRow; r += 1) {\n for (let c = bounds.leftColumn; c <= bounds.rightColumn; c += 1) {\n callback(r, c);\n }\n }\n }\n\n // ---------------------------------------------------------------------------\n // Merge management (delegates to MergeManager)\n // ---------------------------------------------------------------------------\n\n setMergedRanges(ranges: Iterable<MergedCellRange>): void {\n this.merges.setAll(ranges);\n this.render();\n }\n\n mergeCells(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): void {\n this.merges.add(topRow, leftColumn, bottomRow, rightColumn);\n this.render();\n }\n\n unmergeCells(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): void {\n if (this.merges.remove(topRow, leftColumn, bottomRow, rightColumn)) {\n this.render();\n }\n }\n\n clearMergedRanges(): void {\n if (this.merges.clear()) {\n this.render();\n }\n }\n\n getMergedRange(row: number, column: number): MergedCellRange | null {\n return this.merges.get(row, column);\n }\n\n isMergedCellAnchor(row: number, column: number): boolean {\n return this.merges.isAnchor(row, column);\n }\n\n getCellMergeBounds(row: number, column: number): {\n topRow: number;\n bottomRow: number;\n leftColumn: number;\n rightColumn: number;\n } {\n return this.merges.getBounds(row, column);\n }\n\n expandSelectionWithMergedCells(bounds: {\n top: number;\n bottom: number;\n left: number;\n right: number;\n }): { top: number; bottom: number; left: number; right: number } {\n return this.merges.expandSelection(bounds);\n }\n\n protected getMergedLineGaps(): {\n horizontal: Map<number, Array<{ startColumnBoundary: number; endColumnBoundary: number }>>;\n vertical: Map<number, Array<{ startRowBoundary: number; endRowBoundary: number }>>;\n } {\n return this.merges.getMergedLineGaps();\n }\n\n // ---------------------------------------------------------------------------\n // Border management (delegates to BorderManager)\n // ---------------------------------------------------------------------------\n\n getCellBorder(row: number, column: number): CellBorderDefinition | undefined {\n return this.borders.getCell(row, column);\n }\n\n applyCellBorders(borders: Map<string, CellBorderDefinition>): void {\n this.borders.applyAll(borders);\n this.render();\n }\n\n setRangeBorder(\n topRow: number,\n leftColumn: number,\n bottomRow: number,\n rightColumn: number,\n border: BorderLineOptions,\n sides?: RangeBorderSide[],\n ): void {\n this.borders.setRange(topRow, leftColumn, bottomRow, rightColumn, border, sides);\n this.render();\n }\n\n // ---------------------------------------------------------------------------\n // Column/row sizing\n // ---------------------------------------------------------------------------\n\n getColumnWidth(column: number): number {\n if (column < 0 || column >= this.columns) {\n return DEFAULT_COLUMN_WIDTH;\n }\n return this.columnWidths[column];\n }\n\n setColumnWidth(column: number, width: number): void {\n if (column < 0 || column >= this.columns) {\n return;\n }\n const normalizedWidth = Math.max(MIN_COLUMN_WIDTH, width);\n if (this.columnWidths[column] === normalizedWidth) {\n return;\n }\n this.columnWidths[column] = normalizedWidth;\n this.columnCustomWidths[column] = true;\n this.render();\n this.emitStructureChange();\n }\n\n getRowHeight(row: number): number {\n if (row < 0 || row >= this.rows) {\n return DEFAULT_ROW_HEIGHT;\n }\n return this.rowHeights[row];\n }\n\n setRowHeight(row: number, height: number): void {\n if (row < 0 || row >= this.rows) {\n return;\n }\n const normalizedHeight = Math.max(MIN_ROW_HEIGHT, height);\n if (this.rowHeights[row] === normalizedHeight) {\n return;\n }\n this.rowHeights[row] = normalizedHeight;\n this.rowCustomHeights[row] = true;\n this.render();\n this.emitStructureChange();\n }\n\n applyColumnWidths(\n widths: Map<number, number>,\n options?: { customColumns?: Set<number>; enforceMinColumnWidth?: boolean },\n ): void {\n let changed = false;\n for (let column = 0; column < this.columns; column += 1) {\n const width = widths.get(column);\n const minWidth = options?.enforceMinColumnWidth ?? true ? MIN_COLUMN_WIDTH : 0;\n const normalized = Math.max(minWidth, width ?? DEFAULT_COLUMN_WIDTH);\n if (this.columnWidths[column] !== normalized) {\n this.columnWidths[column] = normalized;\n changed = true;\n }\n if (options?.customColumns) {\n this.columnCustomWidths[column] = options.customColumns.has(column);\n }\n }\n if (changed) {\n this.updateBoundaries();\n this.emitStructureChange();\n }\n }\n\n applyRowHeights(heights: Map<number, number>, options?: { customRows?: Set<number> }): void {\n let changed = false;\n for (let row = 0; row < this.rows; row += 1) {\n const height = heights.get(row);\n const normalized = Math.max(MIN_ROW_HEIGHT, height ?? DEFAULT_ROW_HEIGHT);\n if (this.rowHeights[row] !== normalized) {\n this.rowHeights[row] = normalized;\n if (options?.customRows?.has(row)) {\n this.rowCustomHeights[row] = true;\n }\n changed = true;\n } else if (options?.customRows?.has(row)) {\n this.rowCustomHeights[row] = true;\n }\n }\n if (changed) {\n this.updateBoundaries();\n this.emitStructureChange();\n }\n }\n\n autoFitColumns(options: { columns?: number[]; respectCustomWidth?: boolean } = {}): void {\n const respectCustom = options.respectCustomWidth ?? true;\n const targetColumns =\n options.columns ?? Array.from({ length: this.columns }, (_, index) => index);\n let changed = false;\n for (const column of targetColumns) {\n if (column < 0 || column >= this.columns) {\n continue;\n }\n if (respectCustom && this.columnCustomWidths[column]) {\n continue;\n }\n const measured = this.measureColumnWidth(column);\n const normalized = Math.max(MIN_COLUMN_WIDTH, measured);\n if (Math.abs(normalized - this.columnWidths[column]) > 0.5) {\n this.columnWidths[column] = normalized;\n this.columnCustomWidths[column] = true;\n changed = true;\n }\n }\n if (changed) {\n this.updateBoundaries();\n this.emitStructureChange();\n this.render();\n }\n }\n\n autoFitRows(options: { rows?: number[]; respectCustomHeight?: boolean } = {}): void {\n const respectCustom = options.respectCustomHeight ?? true;\n const targetRows =\n options.rows ?? Array.from({ length: this.rows }, (_, index) => index);\n let changed = false;\n for (const row of targetRows) {\n if (row < 0 || row >= this.rows) {\n continue;\n }\n if (respectCustom && this.rowCustomHeights[row]) {\n continue;\n }\n const measured = this.measureRowHeight(row);\n const normalized = Math.max(DEFAULT_ROW_HEIGHT, measured);\n if (Math.abs(normalized - this.rowHeights[row]) > 0.5) {\n this.rowHeights[row] = normalized;\n changed = true;\n }\n }\n if (changed) {\n this.updateBoundaries();\n this.emitStructureChange();\n this.render();\n }\n }\n\n protected measureColumnWidth(_column: number): number {\n return MIN_COLUMN_WIDTH;\n }\n\n protected measureRowHeight(_row: number): number {\n return DEFAULT_ROW_HEIGHT;\n }\n\n protected measureCellContentHeight(_row: number, _column: number, _style: CellStyle): number {\n return 0;\n }\n\n protected measureCellContentWidth(_row: number, _column: number, _style: CellStyle): number {\n return MIN_COLUMN_WIDTH;\n }\n\n // ---------------------------------------------------------------------------\n // Grid size\n // ---------------------------------------------------------------------------\n\n setGridSize(rows: number, columns: number): void {\n const normalizedRows = Math.max(1, Math.floor(rows));\n const normalizedColumns = Math.max(1, Math.floor(columns));\n if (normalizedRows === this.rows && normalizedColumns === this.columns) {\n return;\n }\n this.rows = normalizedRows;\n this.columns = normalizedColumns;\n\n this.ensureArrayLength(this.columnWidths, normalizedColumns, DEFAULT_COLUMN_WIDTH);\n this.ensureArrayLength(this.columnCustomWidths, normalizedColumns, false);\n this.ensureArrayLength(this.rowHeights, normalizedRows, DEFAULT_ROW_HEIGHT);\n this.ensureArrayLength(this.rowCustomHeights, normalizedRows, false);\n\n this.updateBoundaries();\n this.pruneCellDataOutsideGrid();\n this.merges.pruneOutsideGrid();\n this.clampSelectionToBounds();\n\n this.render();\n this.emitStructureChange();\n }\n\n // ---------------------------------------------------------------------------\n // Grid lines & resize guide\n // ---------------------------------------------------------------------------\n\n setShowGridLines(visible: boolean): void {\n if (this._showGridLines === visible) {\n return;\n }\n this._showGridLines = visible;\n this.render();\n }\n\n getShowGridLines(): boolean {\n return this._showGridLines;\n }\n\n protected shouldRenderGridLines(): boolean {\n return this._showGridLines;\n }\n\n setResizeGuide(\n guide: { type: 'column' | 'row'; position: number } | null,\n shouldRender = true,\n ): void {\n const existing = this.resizeGuide;\n const guidesMatch =\n existing !== null &&\n guide !== null &&\n existing.type === guide.type &&\n Math.abs(existing.position - guide.position) <= 1e-3;\n const shouldUpdate = !guidesMatch && guide !== existing;\n if (shouldUpdate) {\n this.resizeGuide = guide;\n } else if (guide === null && existing !== null) {\n this.resizeGuide = null;\n }\n if (shouldRender && (shouldUpdate || (guide === null && existing !== null))) {\n this.render();\n }\n }\n\n // ---------------------------------------------------------------------------\n // Unit conversion\n // ---------------------------------------------------------------------------\n\n getPixelRatio(): number {\n return this.pixelRatio;\n }\n\n pointsToPixels(points: number): number {\n if (!Number.isFinite(points)) {\n return this.pointToPixelRatio;\n }\n return Math.max(1, points * this.pointToPixelRatio);\n }\n\n // ---------------------------------------------------------------------------\n // Export\n // ---------------------------------------------------------------------------\n\n public getExportSnapshot(): WorksheetExportSnapshot {\n const cells = new Map<string, WorksheetExportCell>();\n const defaultStyle = this.getDefaultCellStyle();\n\n const getCellEntry = (row: number, column: number): WorksheetExportCell => {\n const key = cellKey(row, column);\n let entry = cells.get(key);\n if (!entry) {\n entry = { row, column };\n cells.set(key, entry);\n }\n return entry;\n };\n\n const styleMatchesDefault = (style: CellStyle): boolean =>\n style.fontFamily === defaultStyle.fontFamily &&\n style.fontSize === defaultStyle.fontSize &&\n style.bold === defaultStyle.bold &&\n style.italic === defaultStyle.italic &&\n style.underline === defaultStyle.underline &&\n style.backgroundColor === defaultStyle.backgroundColor &&\n style.color === defaultStyle.color &&\n style.textAlign === defaultStyle.textAlign &&\n style.verticalAlign === defaultStyle.verticalAlign &&\n style.textWrapMode === defaultStyle.textWrapMode;\n\n for (const [key, value] of this.cellInputs) {\n const position = parseCellKey(key);\n if (!position || !this.isCellInBounds(position.row, position.column)) {\n continue;\n }\n getCellEntry(position.row, position.column).value = value;\n }\n\n for (const key of this.cellFormatting.keys()) {\n const position = parseCellKey(key);\n if (!position || !this.isCellInBounds(position.row, position.column)) {\n continue;\n }\n const computedStyle = this.getComputedCellStyle(position.row, position.column);\n if (styleMatchesDefault(computedStyle)) {\n continue;\n }\n getCellEntry(position.row, position.column).style = computedStyle;\n }\n\n return {\n cells: Array.from(cells.values()),\n merges: this.merges.allAnchors().map((range) => ({ ...range })),\n columnWidths: [...this.columnWidths],\n rowHeights: [...this.rowHeights],\n rows: this.rows,\n columns: this.columns,\n };\n }\n\n // ---------------------------------------------------------------------------\n // Protected helpers (used by subclasses and SheetRendererContext)\n // ---------------------------------------------------------------------------\n\n protected parseCellKey(key: string): { row: number; column: number } | null {\n return parseCellKey(key);\n }\n\n // ---------------------------------------------------------------------------\n // Private helpers\n // ---------------------------------------------------------------------------\n\n private isCellInBounds(row: number, column: number): boolean {\n return row >= 0 && row < this.rows && column >= 0 && column < this.columns;\n }\n\n private clampRow(row: number): number {\n return Math.min(Math.max(Math.floor(row), 0), this.rows - 1);\n }\n\n private clampColumn(column: number): number {\n return Math.min(Math.max(Math.floor(column), 0), this.columns - 1);\n }\n\n normalizeRangeBounds(\n topRow: number,\n leftColumn: number,\n bottomRow: number,\n rightColumn: number,\n ): { top: number; left: number; bottom: number; right: number } | null {\n if (this.rows === 0 || this.columns === 0) {\n return null;\n }\n const r1 = this.clampRow(topRow);\n const r2 = this.clampRow(bottomRow);\n const c1 = this.clampColumn(leftColumn);\n const c2 = this.clampColumn(rightColumn);\n return {\n top: Math.min(r1, r2),\n bottom: Math.max(r1, r2),\n left: Math.min(c1, c2),\n right: Math.max(c1, c2),\n };\n }\n\n private clampSelectionToBounds(): void {\n const bounds = this.selection.getNormalizedBounds();\n if (bounds) {\n const topRow = Math.min(bounds.topRow, this.rows - 1);\n const bottomRow = Math.min(bounds.bottomRow, this.rows - 1);\n const leftColumn = Math.min(bounds.leftColumn, this.columns - 1);\n const rightColumn = Math.min(bounds.rightColumn, this.columns - 1);\n this.selection.setRange(topRow, leftColumn, bottomRow, rightColumn);\n return;\n }\n const active = this.selection.getActiveCell();\n if (active && !this.isCellInBounds(active.row, active.column)) {\n this.selection.begin(0, 0);\n }\n }\n\n private pruneCellDataOutsideGrid(): void {\n pruneMapOutsideGrid(this.cellInputs, this.rows, this.columns);\n pruneMapOutsideGrid(this.cellRichText, this.rows, this.columns);\n pruneMapOutsideGrid(this.cellDisplayOverrides, this.rows, this.columns);\n pruneMapOutsideGrid(this.cellNumberFormats, this.rows, this.columns);\n pruneMapOutsideGrid(this.cellFormatting, this.rows, this.columns);\n this.borders.pruneOutsideGrid();\n }\n\n private ensureArrayLength<T>(array: T[], target: number, fillValue: T): void {\n if (array.length > target) {\n array.length = target;\n return;\n }\n while (array.length < target) {\n array.push(fillValue);\n }\n }\n\n // ---------------------------------------------------------------------------\n // Event emission\n // ---------------------------------------------------------------------------\n\n private emitSelectionChange(): void {\n const active = this.selection.getActiveCell();\n for (const listener of this.selectionChangeListeners) {\n listener(active ? { ...active } : null);\n }\n }\n\n private emitCellValueChange(row: number, column: number): void {\n const value = this.getCellInput(row, column) ?? '';\n for (const listener of this.cellValueListeners) {\n listener({ row, column, value });\n }\n }\n\n private emitViewportSizeChange(): void {\n const size = this.getScrollContentSize();\n for (const listener of this.viewportSizeListeners) {\n listener({ ...size });\n }\n }\n\n private emitScrollChange(): void {\n const offset = { x: this.scrollX, y: this.scrollY };\n for (const listener of this.scrollListeners) {\n listener({ ...offset });\n }\n }\n\n private emitStructureChange(): void {\n for (const listener of this.structureListeners) {\n listener();\n }\n }\n}\n","import type { RangeRect } from '../core/worksheet/types';\nimport type { CellStyle, TextAlign } from '../core/style/cellStyle';\nimport type { RichTextRun } from '../types/richText';\nimport type { MergedCellRange } from '../core/cell/types';\nimport type { CellBorderDefinition, BorderLine, BorderLineStyle } from '../core/border/types';\nimport type { CellsViewport, WorksheetViewports } from './viewports';\n\ntype RichTextLine = { runs: ResolvedRichRun[]; width: number; lineHeight: number; ascent: number };\ntype ResolvedRichRun = {\n text: string;\n fontFamily: string;\n fontSize: number;\n bold: boolean;\n italic: boolean;\n color: string;\n underline: boolean;\n};\n\ntype PendingHorizontalEdge = {\n boundaryIndex: number;\n fromColumn: number;\n toColumn: number;\n line: BorderLine;\n};\n\ntype PendingVerticalEdge = {\n boundaryIndex: number;\n fromRow: number;\n toRow: number;\n line: BorderLine;\n};\n\ntype MergedLineGaps = {\n horizontal: Map<number, Array<{ startColumnBoundary: number; endColumnBoundary: number }>>;\n vertical: Map<number, Array<{ startRowBoundary: number; endRowBoundary: number }>>;\n};\n\nexport interface SheetRendererContext {\n getContext(): CanvasRenderingContext2D;\n getPixelRatio(): number;\n getBodyViewportWidth(): number;\n getBodyViewportHeight(): number;\n getHeaderColumnWidth(): number;\n getHeaderRowHeight(): number;\n getScrollOffset(): { x: number; y: number };\n getColumnBoundaries(): readonly number[];\n getRowBoundaries(): readonly number[];\n getColumnWidths(): readonly number[];\n getRowHeights(): readonly number[];\n getVisibleColumnRange(padding: number): { start: number; end: number };\n getVisibleRowRange(padding: number): { start: number; end: number };\n getVisibleRowIndices(): number[];\n getVisibleColumnIndices(): number[];\n getDefaultCellStyle(): CellStyle;\n getComputedCellStyle(row: number, column: number): CellStyle;\n getMergedRange(row: number, column: number): MergedCellRange | null;\n getRangeRect(topRow: number, leftColumn: number, bottomRow: number, rightColumn: number): RangeRect;\n getRichTextRuns(row: number, column: number): RichTextRun[] | undefined;\n getCellText(row: number, column: number): string | null;\n pointsToPixels(points: number): number;\n withBodyClip(callback: () => void): void;\n getMergedLineGaps(): MergedLineGaps;\n hasCellBorders(): boolean;\n getCellBorders(): Iterable<[string, CellBorderDefinition]>;\n parseCellKey(key: string): { row: number; column: number } | null;\n getCellMergeBounds(row: number, column: number): {\n topRow: number;\n bottomRow: number;\n leftColumn: number;\n rightColumn: number;\n };\n getCellTextPadding(): number;\n ensureBoundaries(): void;\n shouldRenderGridLines(): boolean;\n}\n\nexport class SheetRenderer {\n constructor(private readonly context: SheetRendererContext) {}\n\n drawHeaders(viewports?: WorksheetViewports): void {\n const ctx = this.context.getContext();\n const bodyWidth = viewports?.cells.rect.width ?? this.context.getBodyViewportWidth();\n const bodyHeight = viewports?.cells.rect.height ?? this.context.getBodyViewportHeight();\n const { x: scrollX, y: scrollY } = this.context.getScrollOffset();\n const headerColumnWidth = this.context.getHeaderColumnWidth();\n const headerRowHeight = this.context.getHeaderRowHeight();\n const offsetX = headerColumnWidth - scrollX;\n const offsetY = headerRowHeight - scrollY;\n const viewportRight = headerColumnWidth + bodyWidth;\n const viewportBottom = headerRowHeight + bodyHeight;\n\n ctx.save();\n ctx.fillStyle = '#f5f5f5';\n ctx.fillRect(headerColumnWidth, 0, bodyWidth, headerRowHeight);\n ctx.fillRect(0, headerRowHeight, headerColumnWidth, bodyHeight);\n\n ctx.fillStyle = '#e0e0e0';\n ctx.fillRect(0, 0, headerColumnWidth, headerRowHeight);\n\n const pixelRatio = this.context.getPixelRatio();\n const pixelAdjust = 0.5 / pixelRatio;\n ctx.strokeStyle = '#c0c0c0';\n ctx.lineWidth = 1 / pixelRatio;\n ctx.beginPath();\n ctx.moveTo(headerColumnWidth + pixelAdjust, 0);\n ctx.lineTo(headerColumnWidth + pixelAdjust, headerRowHeight + bodyHeight);\n ctx.moveTo(0, headerRowHeight + pixelAdjust);\n ctx.lineTo(headerColumnWidth + bodyWidth, headerRowHeight + pixelAdjust);\n ctx.stroke();\n\n ctx.font = '12px sans-serif';\n ctx.fillStyle = '#1f2933';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n const columnRange = viewports?.columnHeader.columns ?? this.context.getVisibleColumnRange(0);\n const columnBoundaries = this.context.getColumnBoundaries();\n const columnWidths = this.context.getColumnWidths();\n const columnHeaderClip = viewports?.columnHeader.rect;\n if (columnHeaderClip) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(\n columnHeaderClip.x,\n columnHeaderClip.y,\n columnHeaderClip.width,\n columnHeaderClip.height,\n );\n ctx.clip();\n }\n for (let c = columnRange.start; c <= columnRange.end; c += 1) {\n const columnLeft = offsetX + columnBoundaries[c];\n const columnWidth = columnWidths[c];\n const columnRight = columnLeft + columnWidth;\n if (columnRight < headerColumnWidth || columnLeft > viewportRight) {\n continue;\n }\n const centerX = columnLeft + columnWidth / 2;\n const centerY = headerRowHeight / 2;\n ctx.save();\n ctx.beginPath();\n ctx.rect(columnLeft, 0, columnWidth, headerRowHeight);\n ctx.clip();\n ctx.fillText(columnIndexToName(c), centerX, centerY);\n ctx.restore();\n }\n if (columnHeaderClip) {\n ctx.restore();\n }\n\n const rowRange = viewports?.rowHeader.rows ?? this.context.getVisibleRowRange(0);\n const rowBoundaries = this.context.getRowBoundaries();\n const rowHeights = this.context.getRowHeights();\n const rowHeaderClip = viewports?.rowHeader.rect;\n if (rowHeaderClip) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(rowHeaderClip.x, rowHeaderClip.y, rowHeaderClip.width, rowHeaderClip.height);\n ctx.clip();\n }\n for (let r = rowRange.start; r <= rowRange.end; r += 1) {\n const rowTop = offsetY + rowBoundaries[r];\n const rowHeight = rowHeights[r];\n const rowBottom = rowTop + rowHeight;\n if (rowBottom < headerRowHeight || rowTop > viewportBottom) {\n continue;\n }\n const centerX = headerColumnWidth / 2;\n const centerY = rowTop + rowHeight / 2;\n ctx.fillText(String(r + 1), centerX, centerY);\n }\n if (rowHeaderClip) {\n ctx.restore();\n }\n\n ctx.restore();\n }\n\n drawCells(viewport?: CellsViewport): void {\n const bodyWidth = viewport?.rect.width ?? this.context.getBodyViewportWidth();\n const bodyHeight = viewport?.rect.height ?? this.context.getBodyViewportHeight();\n if (bodyWidth <= 0 || bodyHeight <= 0) {\n return;\n }\n const { x: scrollX, y: scrollY } = this.context.getScrollOffset();\n const headerColumnWidth = this.context.getHeaderColumnWidth();\n const headerRowHeight = this.context.getHeaderRowHeight();\n const offsetX = headerColumnWidth - scrollX;\n const offsetY = headerRowHeight - scrollY;\n const viewportRight = headerColumnWidth + bodyWidth;\n const viewportBottom = headerRowHeight + bodyHeight;\n\n const rowIndices = viewport?.rowIndices ?? this.context.getVisibleRowIndices();\n const columnIndices = viewport?.columnIndices ?? this.context.getVisibleColumnIndices();\n if (!rowIndices.length || !columnIndices.length) {\n return;\n }\n\n const ctx = this.context.getContext();\n const rowBoundaries = this.context.getRowBoundaries();\n const rowHeights = this.context.getRowHeights();\n const columnBoundaries = this.context.getColumnBoundaries();\n const columnWidths = this.context.getColumnWidths();\n const defaultStyle = this.context.getDefaultCellStyle();\n const cellPadding = this.context.getCellTextPadding();\n const pixelRatio = this.context.getPixelRatio();\n\n this.context.withBodyClip(() => {\n\n for (const r of rowIndices) {\n const rowTop = rowBoundaries[r];\n const rowHeight = rowHeights[r];\n const rowY = offsetY + rowTop;\n if (rowY > viewportBottom) {\n break;\n }\n for (const c of columnIndices) {\n const columnLeft = columnBoundaries[c];\n const columnWidth = columnWidths[c];\n const columnX = offsetX + columnLeft;\n if (columnX > viewportRight) {\n break;\n }\n const style = this.context.getComputedCellStyle(r, c);\n const merged = this.context.getMergedRange(r, c);\n const isAnchor = !merged || (merged.topRow === r && merged.leftColumn === c);\n const cellRect = {\n x: columnX,\n y: rowY,\n width: columnWidth,\n height: rowHeight,\n };\n const drawRect = merged\n ? this.context.getRangeRect(\n merged.topRow,\n merged.leftColumn,\n merged.bottomRow,\n merged.rightColumn,\n )\n : cellRect;\n\n const hasCustomBackground = style.backgroundColor !== defaultStyle.backgroundColor;\n if ((!merged || isAnchor) && hasCustomBackground) {\n this.fillCellBackground(\n ctx,\n drawRect.x,\n drawRect.y,\n drawRect.width,\n drawRect.height,\n style.backgroundColor,\n );\n }\n }\n }\n\n const previousBaseline = ctx.textBaseline;\n ctx.textBaseline = 'alphabetic';\n\n for (const r of rowIndices) {\n const rowTop = rowBoundaries[r];\n const rowHeight = rowHeights[r];\n const rowY = offsetY + rowTop;\n if (rowY > viewportBottom) {\n break;\n }\n for (const c of columnIndices) {\n const columnLeft = columnBoundaries[c];\n const columnWidth = columnWidths[c];\n const columnX = offsetX + columnLeft;\n if (columnX > viewportRight) {\n break;\n }\n const style = this.context.getComputedCellStyle(r, c);\n const merged = this.context.getMergedRange(r, c);\n const isAnchor = !merged || (merged.topRow === r && merged.leftColumn === c);\n const cellRect = {\n x: columnX,\n y: rowY,\n width: columnWidth,\n height: rowHeight,\n };\n const drawRect = merged\n ? this.context.getRangeRect(\n merged.topRow,\n merged.leftColumn,\n merged.bottomRow,\n merged.rightColumn,\n )\n : cellRect;\n\n if (!isAnchor) {\n continue;\n }\n\n const richTextRuns = this.context.getRichTextRuns(r, c);\n if (richTextRuns && richTextRuns.length > 0) {\n this.drawRichText(drawRect, style, richTextRuns);\n continue;\n }\n\n const text = this.context.getCellText(r, c);\n if (text === null) {\n continue;\n }\n const fontFamily = style.fontFamily.includes(' ')\n ? `\"${style.fontFamily}\"`\n : style.fontFamily;\n const fontSizePx = this.context.pointsToPixels(style.fontSize);\n const composedFont = this.composeFont({\n text: '',\n fontFamily,\n fontSize: fontSizePx,\n bold: style.bold,\n italic: style.italic,\n color: style.color ?? defaultStyle.color,\n underline: false,\n });\n ctx.font = composedFont;\n const lineHeight = fontSizePx + cellPadding;\n const lines = this.layoutPlainTextLines(text, style, drawRect);\n ctx.fillStyle = style.color ?? defaultStyle.color;\n const contentHeight = lineHeight * lines.length;\n let firstLineY = drawRect.y + cellPadding;\n if (style.verticalAlign === 'middle') {\n firstLineY = drawRect.y + (drawRect.height - contentHeight) / 2;\n } else if (style.verticalAlign === 'bottom') {\n firstLineY = drawRect.y + drawRect.height - contentHeight - cellPadding;\n }\n const minY = drawRect.y + cellPadding;\n const maxY = drawRect.y + drawRect.height - cellPadding - contentHeight;\n firstLineY = Math.min(firstLineY, maxY);\n firstLineY = Math.max(firstLineY, minY);\n const baselineOffset = fontSizePx;\n for (let i = 0; i < lines.length; i += 1) {\n const lineTop = firstLineY + i * lineHeight;\n if (lineTop > drawRect.y + drawRect.height - cellPadding) {\n break;\n }\n const lineMetrics = ctx.measureText(lines[i]);\n const lineWidth = lineMetrics.width;\n const textX = this.computeAlignedX(drawRect, lineWidth, style.textAlign);\n const baseline = lineTop + baselineOffset;\n ctx.fillText(lines[i], textX, baseline);\n if (style.underline) {\n this.drawUnderline(ctx, textX, lineWidth, baseline, fontSizePx);\n }\n }\n }\n }\n ctx.textBaseline = previousBaseline;\n\n if (this.context.shouldRenderGridLines()) {\n const pixelAdjust = 0.5 / pixelRatio;\n const mergedLineGaps = this.context.getMergedLineGaps();\n ctx.strokeStyle = '#d0d0d0';\n ctx.lineWidth = 1 / pixelRatio;\n ctx.beginPath();\n\n const rowLineStart = Math.max(0, rowIndices[0]);\n const rowLineEnd = Math.min(\n rowBoundaries.length - 1,\n rowIndices[rowIndices.length - 1] + 1,\n );\n const lastRowBoundary = Math.min(\n rowBoundaries.length - 1,\n rowIndices[rowIndices.length - 1] + 1,\n );\n const maxBodyY = headerRowHeight + rowBoundaries[lastRowBoundary];\n const maxColumnBoundary = Math.min(\n columnBoundaries.length - 1,\n columnIndices[columnIndices.length - 1] + 1,\n );\n const maxBodyX = headerColumnWidth + columnBoundaries[maxColumnBoundary];\n for (let r = rowLineStart; r <= rowLineEnd; r += 1) {\n const absolute = rowBoundaries[r];\n const y = offsetY + absolute + pixelAdjust;\n if (y < headerRowHeight || y > viewportBottom + pixelAdjust) {\n continue;\n }\n const gaps = mergedLineGaps.horizontal.get(r);\n if (!gaps || gaps.length === 0) {\n ctx.moveTo(headerColumnWidth, y);\n ctx.lineTo(maxBodyX, y);\n continue;\n }\n const segments = this.buildVisibleLineSegments(\n gaps.map((gap) => ({\n start: offsetX + columnBoundaries[gap.startColumnBoundary],\n end: offsetX + columnBoundaries[gap.endColumnBoundary],\n })),\n headerColumnWidth,\n maxBodyX,\n );\n for (const segment of segments) {\n ctx.moveTo(segment.start, y);\n ctx.lineTo(segment.end, y);\n }\n }\n\n const columnLineStart = Math.max(0, columnIndices[0]);\n const columnLineEnd = Math.min(\n columnBoundaries.length - 1,\n columnIndices[columnIndices.length - 1] + 1,\n );\n for (let c = columnLineStart; c <= columnLineEnd; c += 1) {\n const absolute = columnBoundaries[c];\n const x = offsetX + absolute + pixelAdjust;\n if (x < headerColumnWidth || x > maxBodyX + pixelAdjust) {\n continue;\n }\n const gaps = mergedLineGaps.vertical.get(c);\n if (!gaps || gaps.length === 0) {\n ctx.moveTo(x, headerRowHeight);\n const maxBodyHeight =\n headerRowHeight + rowBoundaries[Math.min(rowBoundaries.length - 1, rowIndices[rowIndices.length - 1] + 1)];\n ctx.lineTo(x, Math.min(viewportBottom, maxBodyHeight));\n continue;\n }\n const segments = this.buildVisibleLineSegments(\n gaps.map((gap) => ({\n start: offsetY + rowBoundaries[gap.startRowBoundary],\n end: offsetY + rowBoundaries[gap.endRowBoundary],\n })),\n headerRowHeight,\n Math.min(viewportBottom, maxBodyY),\n );\n for (const segment of segments) {\n ctx.moveTo(x, segment.start);\n ctx.lineTo(x, segment.end);\n }\n }\n\n ctx.stroke();\n }\n });\n }\n\n drawCustomBorders(viewport?: CellsViewport): void {\n if (!this.context.hasCellBorders()) {\n return;\n }\n const bodyWidth = viewport?.rect.width ?? this.context.getBodyViewportWidth();\n const bodyHeight = viewport?.rect.height ?? this.context.getBodyViewportHeight();\n if (bodyWidth <= 0 || bodyHeight <= 0) {\n return;\n }\n this.context.ensureBoundaries();\n const ctx = this.context.getContext();\n const viewportRows = viewport?.rows ?? this.context.getVisibleRowRange(0);\n const viewportCols = viewport?.columns ?? this.context.getVisibleColumnRange(0);\n const horizontalEdges = new Map<string, PendingHorizontalEdge>();\n const verticalEdges = new Map<string, PendingVerticalEdge>();\n\n for (const [key, borders] of this.context.getCellBorders()) {\n const coords = this.context.parseCellKey(key);\n if (!coords) {\n continue;\n }\n const bounds = this.context.getCellMergeBounds(coords.row, coords.column);\n const overlapsViewport =\n bounds.bottomRow >= viewportRows.start &&\n bounds.topRow <= viewportRows.end &&\n bounds.rightColumn >= viewportCols.start &&\n bounds.leftColumn <= viewportCols.end;\n if (!overlapsViewport) {\n continue;\n }\n this.addHorizontalEdge(horizontalEdges, bounds.topRow, bounds.leftColumn, bounds.rightColumn, borders.top);\n this.addHorizontalEdge(\n horizontalEdges,\n bounds.bottomRow + 1,\n bounds.leftColumn,\n bounds.rightColumn,\n borders.bottom,\n );\n this.addVerticalEdge(verticalEdges, bounds.leftColumn, bounds.topRow, bounds.bottomRow, borders.left);\n this.addVerticalEdge(\n verticalEdges,\n bounds.rightColumn + 1,\n bounds.topRow,\n bounds.bottomRow,\n borders.right,\n );\n }\n\n if (!horizontalEdges.size && !verticalEdges.size) {\n return;\n }\n\n this.context.withBodyClip(() => {\n ctx.lineCap = 'butt';\n ctx.lineJoin = 'miter';\n for (const edge of horizontalEdges.values()) {\n this.drawHorizontalBorderEdge(ctx, edge);\n }\n for (const edge of verticalEdges.values()) {\n this.drawVerticalBorderEdge(ctx, edge);\n }\n });\n }\n\n layoutRichText(runs: RichTextRun[], baseStyle: CellStyle): RichTextLine[] {\n const baseFontPx = this.context.pointsToPixels(baseStyle.fontSize);\n const resolvedRuns = runs.map((run) => this.resolveRichTextRun(run, baseStyle));\n const lines: RichTextLine[] = [];\n let currentRuns: ResolvedRichRun[] = [];\n for (const run of resolvedRuns) {\n const text = run.text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n const segments = text.split('\\n');\n segments.forEach((segment, index) => {\n if (segment.length > 0) {\n currentRuns.push({ ...run, text: segment });\n }\n if (index < segments.length - 1) {\n lines.push(this.measureRichTextLine(currentRuns, baseFontPx));\n currentRuns = [];\n }\n });\n }\n if (currentRuns.length > 0 || lines.length === 0) {\n lines.push(this.measureRichTextLine(currentRuns, baseFontPx));\n }\n return lines;\n }\n\n private layoutPlainTextLines(text: string, style: CellStyle, rect: RangeRect): string[] {\n const padding = this.context.getCellTextPadding();\n const availableWidth = Math.max(0, rect.width - padding * 2);\n const wrapMode = style.textWrapMode ?? 'none';\n const shouldWrap = wrapMode !== 'none' && availableWidth > 0;\n const rawLines = text.split(/\\r\\n|\\r|\\n/);\n const lines: string[] = [];\n for (const rawLine of rawLines) {\n if (!shouldWrap) {\n lines.push(rawLine);\n continue;\n }\n const segments = this.wrapPlainLine(rawLine, availableWidth, wrapMode === 'break-word');\n if (segments.length === 0) {\n lines.push('');\n } else {\n lines.push(...segments);\n }\n }\n return lines;\n }\n\n private wrapPlainLine(line: string, maxWidth: number, breakAnywhere: boolean): string[] {\n if (!line) {\n return [''];\n }\n if (maxWidth <= 0) {\n return [line];\n }\n const ctx = this.context.getContext();\n const tokens = breakAnywhere ? Array.from(line) : line.split(/(\\s+)/);\n const lines: string[] = [];\n let current = '';\n for (const token of tokens) {\n if (!token) {\n continue;\n }\n const candidate = current ? current + token : token;\n if (this.measureTextWidth(candidate, ctx) <= maxWidth) {\n current = candidate;\n continue;\n }\n if (current) {\n lines.push(current);\n current = '';\n }\n if (this.measureTextWidth(token, ctx) <= maxWidth) {\n current = token;\n continue;\n }\n const broken = this.breakSegment(token, maxWidth, ctx);\n if (broken.length) {\n lines.push(...broken);\n }\n }\n if (current) {\n lines.push(current);\n }\n if (!lines.length) {\n lines.push('');\n }\n return lines;\n }\n\n private breakSegment(value: string, maxWidth: number, ctx: CanvasRenderingContext2D): string[] {\n const segments: string[] = [];\n let buffer = '';\n for (const char of value) {\n const candidate = buffer ? buffer + char : char;\n if (this.measureTextWidth(candidate, ctx) <= maxWidth) {\n buffer = candidate;\n continue;\n }\n if (buffer) {\n segments.push(buffer);\n }\n buffer = char;\n if (this.measureTextWidth(buffer, ctx) > maxWidth) {\n segments.push(buffer);\n buffer = '';\n }\n }\n if (buffer) {\n segments.push(buffer);\n }\n return segments;\n }\n\n private measureTextWidth(value: string, ctx: CanvasRenderingContext2D): number {\n return ctx.measureText(value).width;\n }\n\n private drawRichText(rect: RangeRect, style: CellStyle, runs: RichTextRun[]): void {\n const lines = this.layoutRichText(runs, style);\n if (!lines.length) {\n return;\n }\n const ctx = this.context.getContext();\n const previousAlign = ctx.textAlign;\n ctx.textAlign = 'left';\n const padding = this.context.getCellTextPadding();\n const contentHeight = lines.reduce((sum, line) => sum + line.lineHeight, 0);\n let firstLineY = rect.y + padding;\n if (style.verticalAlign === 'middle') {\n firstLineY = rect.y + (rect.height - contentHeight) / 2;\n } else if (style.verticalAlign === 'bottom') {\n firstLineY = rect.y + rect.height - contentHeight - padding;\n }\n const minY = rect.y + padding;\n const maxY = rect.y + rect.height - padding - contentHeight;\n firstLineY = Math.min(firstLineY, maxY);\n firstLineY = Math.max(firstLineY, minY);\n let lineTop = firstLineY;\n for (const line of lines) {\n const textX = this.computeAlignedX(rect, line.width, style.textAlign);\n let cursorX = textX;\n const baseline = lineTop + line.ascent;\n for (const run of line.runs) {\n const ctxFont = this.composeFont(run);\n ctx.font = ctxFont;\n ctx.fillStyle = run.color;\n const metrics = ctx.measureText(run.text);\n ctx.fillText(run.text, cursorX, baseline);\n if (run.underline) {\n this.drawUnderline(ctx, cursorX, metrics.width, baseline, run.fontSize);\n }\n cursorX += metrics.width;\n }\n lineTop += line.lineHeight;\n }\n ctx.textAlign = previousAlign;\n }\n\n private resolveRichTextRun(run: RichTextRun, baseStyle: CellStyle): ResolvedRichRun {\n const fontFamily = run.fontFamily ?? baseStyle.fontFamily;\n const fontSize = this.context.pointsToPixels(run.fontSize ?? baseStyle.fontSize);\n const fallbackColor = baseStyle.color ?? this.context.getDefaultCellStyle().color ?? '#000000';\n return {\n text: run.text,\n fontFamily,\n fontSize,\n bold: !!run.bold,\n italic: !!run.italic,\n color: run.color ?? fallbackColor,\n underline: !!run.underline,\n };\n }\n\n private measureRichTextLine(runs: ResolvedRichRun[], baseFontPx: number): RichTextLine {\n const ctx = this.context.getContext();\n const padding = this.context.getCellTextPadding();\n const lineRuns = runs.map((run) => ({ ...run }));\n let width = 0;\n let maxFont = baseFontPx;\n if (lineRuns.length === 0) {\n return {\n runs: [],\n width: 0,\n lineHeight: baseFontPx + padding,\n ascent: baseFontPx,\n };\n }\n for (const run of lineRuns) {\n maxFont = Math.max(maxFont, run.fontSize);\n ctx.font = this.composeFont(run);\n width += ctx.measureText(run.text).width;\n }\n return {\n runs: lineRuns,\n width,\n lineHeight: maxFont + padding,\n ascent: maxFont,\n };\n }\n\n private composeFont(run: ResolvedRichRun): string {\n const parts: string[] = [];\n if (run.italic) {\n parts.push('italic');\n }\n if (run.bold) {\n parts.push('bold');\n }\n parts.push(`${run.fontSize}px`);\n const family = run.fontFamily.includes(' ') ? `\"${run.fontFamily}\"` : run.fontFamily;\n parts.push(family);\n return parts.join(' ');\n }\n\n private drawUnderline(\n ctx: CanvasRenderingContext2D,\n x: number,\n width: number,\n baseline: number,\n fontSize: number,\n ): void {\n if (width <= 0) {\n return;\n }\n const thickness = Math.max(1, Math.round(fontSize / 15));\n const offset = Math.max(thickness, fontSize * 0.05);\n ctx.fillRect(x, baseline + offset, width, thickness);\n }\n\n private computeAlignedX(rect: RangeRect, contentWidth: number, alignment: TextAlign): number {\n const padding = this.context.getCellTextPadding();\n if (alignment === 'center') {\n return rect.x + rect.width / 2 - contentWidth / 2;\n }\n if (alignment === 'right') {\n return rect.x + rect.width - padding - contentWidth;\n }\n return rect.x + padding;\n }\n\n private fillCellBackground(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n width: number,\n height: number,\n color: string,\n ): void {\n ctx.save();\n ctx.fillStyle = color;\n ctx.fillRect(x, y, Math.max(0, width), Math.max(0, height));\n ctx.restore();\n }\n\n private buildVisibleLineSegments(\n gaps: Array<{ start: number; end: number }>,\n lineStart: number,\n lineEnd: number,\n ): Array<{ start: number; end: number }> {\n if (gaps.length === 0) {\n return [{ start: lineStart, end: lineEnd }];\n }\n const normalizedGaps = gaps\n .map((gap) => ({\n start: Math.max(lineStart, Math.min(gap.start, gap.end)),\n end: Math.min(lineEnd, Math.max(gap.start, gap.end)),\n }))\n .filter((gap) => gap.start < gap.end)\n .sort((a, b) => a.start - b.start);\n\n const segments: Array<{ start: number; end: number }> = [];\n let cursor = lineStart;\n for (const gap of normalizedGaps) {\n if (gap.start > cursor) {\n segments.push({ start: cursor, end: gap.start });\n }\n cursor = Math.max(cursor, gap.end);\n if (cursor >= lineEnd) {\n break;\n }\n }\n if (cursor < lineEnd) {\n segments.push({ start: cursor, end: lineEnd });\n }\n return segments.length > 0 ? segments : [];\n }\n\n private addHorizontalEdge(\n edges: Map<string, PendingHorizontalEdge>,\n boundaryIndex: number,\n fromColumn: number,\n toColumn: number,\n line?: BorderLine,\n ): void {\n if (!line || line.width <= 0) {\n return;\n }\n const key = this.buildHorizontalEdgeKey(boundaryIndex, fromColumn, toColumn);\n const existing = edges.get(key);\n if (!existing) {\n edges.set(key, { boundaryIndex, fromColumn, toColumn, line });\n return;\n }\n const winner = this.pickDominantBorderLine(existing.line, line);\n if (winner === existing.line) {\n return;\n }\n edges.set(key, { boundaryIndex, fromColumn, toColumn, line: winner });\n }\n\n private addVerticalEdge(\n edges: Map<string, PendingVerticalEdge>,\n boundaryIndex: number,\n fromRow: number,\n toRow: number,\n line?: BorderLine,\n ): void {\n if (!line || line.width <= 0) {\n return;\n }\n const key = this.buildVerticalEdgeKey(boundaryIndex, fromRow, toRow);\n const existing = edges.get(key);\n if (!existing) {\n edges.set(key, { boundaryIndex, fromRow, toRow, line });\n return;\n }\n const winner = this.pickDominantBorderLine(existing.line, line);\n if (winner === existing.line) {\n return;\n }\n edges.set(key, { boundaryIndex, fromRow, toRow, line: winner });\n }\n\n private buildHorizontalEdgeKey(boundaryIndex: number, fromColumn: number, toColumn: number): string {\n return `h:${boundaryIndex}:${fromColumn}:${toColumn}`;\n }\n\n private buildVerticalEdgeKey(boundaryIndex: number, fromRow: number, toRow: number): string {\n return `v:${boundaryIndex}:${fromRow}:${toRow}`;\n }\n\n private pickDominantBorderLine(existing: BorderLine, candidate: BorderLine): BorderLine {\n if (candidate.width > existing.width) {\n return candidate;\n }\n if (candidate.width < existing.width) {\n return existing;\n }\n const existingPriority = this.getBorderStylePriority(existing.style);\n const candidatePriority = this.getBorderStylePriority(candidate.style);\n if (candidatePriority > existingPriority) {\n return candidate;\n }\n if (candidatePriority < existingPriority) {\n return existing;\n }\n const existingOrder = existing.appliedAt ?? 0;\n const candidateOrder = candidate.appliedAt ?? 0;\n return candidateOrder >= existingOrder ? candidate : existing;\n }\n\n private getBorderStylePriority(style: BorderLineStyle): number {\n switch (style) {\n case 'solid':\n return 3;\n case 'dashed':\n return 2;\n case 'dotted':\n default:\n return 1;\n }\n }\n\n private drawHorizontalBorderEdge(ctx: CanvasRenderingContext2D, edge: PendingHorizontalEdge): void {\n const dash = this.getDashPattern(edge.line.style, edge.line.width);\n ctx.setLineDash(dash);\n ctx.strokeStyle = edge.line.color;\n ctx.lineWidth = edge.line.width / this.context.getPixelRatio();\n const columnBoundaries = this.context.getColumnBoundaries();\n const rowBoundaries = this.context.getRowBoundaries();\n const { x: scrollX, y: scrollY } = this.context.getScrollOffset();\n const headerColumnWidth = this.context.getHeaderColumnWidth();\n const headerRowHeight = this.context.getHeaderRowHeight();\n const pixelAdjust = 0.5 / this.context.getPixelRatio();\n const xStart = headerColumnWidth - scrollX + columnBoundaries[edge.fromColumn];\n const xEnd = headerColumnWidth - scrollX + columnBoundaries[edge.toColumn + 1];\n const y = headerRowHeight - scrollY + rowBoundaries[edge.boundaryIndex] + pixelAdjust;\n\n ctx.beginPath();\n ctx.moveTo(xStart, y);\n ctx.lineTo(xEnd, y);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n private drawVerticalBorderEdge(ctx: CanvasRenderingContext2D, edge: PendingVerticalEdge): void {\n const dash = this.getDashPattern(edge.line.style, edge.line.width);\n ctx.setLineDash(dash);\n ctx.strokeStyle = edge.line.color;\n ctx.lineWidth = edge.line.width / this.context.getPixelRatio();\n const columnBoundaries = this.context.getColumnBoundaries();\n const rowBoundaries = this.context.getRowBoundaries();\n const { x: scrollX, y: scrollY } = this.context.getScrollOffset();\n const headerColumnWidth = this.context.getHeaderColumnWidth();\n const headerRowHeight = this.context.getHeaderRowHeight();\n const pixelAdjust = 0.5 / this.context.getPixelRatio();\n const x = headerColumnWidth - scrollX + columnBoundaries[edge.boundaryIndex] + pixelAdjust;\n const yStart = headerRowHeight - scrollY + rowBoundaries[edge.fromRow];\n const yEnd = headerRowHeight - scrollY + rowBoundaries[edge.toRow + 1];\n\n ctx.beginPath();\n ctx.moveTo(x, yStart);\n ctx.lineTo(x, yEnd);\n ctx.stroke();\n ctx.setLineDash([]);\n }\n\n private getDashPattern(style: BorderLineStyle, width: number): number[] {\n switch (style) {\n case 'dashed':\n return [4 * width, 2 * width];\n case 'dotted':\n return [width, width];\n case 'solid':\n default:\n return [];\n }\n }\n}\n\nfunction columnIndexToName(index: number): string {\n let name = '';\n let n = index;\n do {\n const remainder = n % 26;\n name = String.fromCharCode(65 + remainder) + name;\n n = Math.floor(n / 26) - 1;\n } while (n >= 0);\n return name;\n}\n","export type ViewportRange = { start: number; end: number };\n\nexport type ViewportRect = { x: number; y: number; width: number; height: number };\n\nexport interface WorksheetViewportSource {\n headerColumnWidth: number;\n headerRowHeight: number;\n getBodyViewportWidth(): number;\n getBodyViewportHeight(): number;\n getVisibleRowRange(padding?: number): ViewportRange;\n getVisibleColumnRange(padding?: number): ViewportRange;\n getVisibleRowIndices(): number[];\n getVisibleColumnIndices(): number[];\n}\n\nclass BaseViewport {\n rect: ViewportRect = { x: 0, y: 0, width: 0, height: 0 };\n rows: ViewportRange = { start: 0, end: -1 };\n columns: ViewportRange = { start: 0, end: -1 };\n\n setRect(rect: ViewportRect): void {\n this.rect = rect;\n }\n}\n\nexport class ColumnHeaderViewport extends BaseViewport {\n setRenderRange(columns: ViewportRange): void {\n this.columns = columns;\n // Column headers render on the first row of the sheet.\n this.rows = { start: 0, end: 0 };\n }\n}\n\nexport class RowHeaderViewport extends BaseViewport {\n setRenderRange(rows: ViewportRange): void {\n this.rows = rows;\n // Row headers render on the first column of the sheet.\n this.columns = { start: 0, end: 0 };\n }\n}\n\nexport class CellsViewport extends BaseViewport {\n rowIndices: number[] = [];\n columnIndices: number[] = [];\n\n setRenderRange(\n rows: ViewportRange,\n columns: ViewportRange,\n rowIndices: number[],\n columnIndices: number[],\n ): void {\n this.rows = rows;\n this.columns = columns;\n this.rowIndices = rowIndices;\n this.columnIndices = columnIndices;\n }\n}\n\nexport type WorksheetViewports = {\n columnHeader: ColumnHeaderViewport;\n rowHeader: RowHeaderViewport;\n cells: CellsViewport;\n};\n\nexport class ViewportController {\n readonly columnHeader = new ColumnHeaderViewport();\n readonly rowHeader = new RowHeaderViewport();\n readonly cells = new CellsViewport();\n\n constructor(private readonly worksheet: WorksheetViewportSource) {}\n\n update(): WorksheetViewports {\n this.updateLayout();\n this.updateRanges();\n return {\n columnHeader: this.columnHeader,\n rowHeader: this.rowHeader,\n cells: this.cells,\n };\n }\n\n private updateLayout(): void {\n const bodyWidth = this.worksheet.getBodyViewportWidth();\n const bodyHeight = this.worksheet.getBodyViewportHeight();\n this.columnHeader.setRect({\n x: this.worksheet.headerColumnWidth,\n y: 0,\n width: bodyWidth,\n height: this.worksheet.headerRowHeight,\n });\n this.rowHeader.setRect({\n x: 0,\n y: this.worksheet.headerRowHeight,\n width: this.worksheet.headerColumnWidth,\n height: bodyHeight,\n });\n this.cells.setRect({\n x: this.worksheet.headerColumnWidth,\n y: this.worksheet.headerRowHeight,\n width: bodyWidth,\n height: bodyHeight,\n });\n }\n\n private updateRanges(): void {\n const visibleRows = this.worksheet.getVisibleRowRange(0);\n const visibleColumns = this.worksheet.getVisibleColumnRange(0);\n\n this.columnHeader.setRenderRange(visibleColumns);\n this.rowHeader.setRenderRange(visibleRows);\n\n const rowIndices = this.worksheet.getVisibleRowIndices();\n const columnIndices = this.worksheet.getVisibleColumnIndices();\n this.cells.setRenderRange(visibleRows, visibleColumns, rowIndices, columnIndices);\n }\n}\n","/* eslint-disable no-bitwise */\n/**\n * Portions of the DEFLATE implementation are adapted from SheetJS (MIT License).\n * https://github.com/SheetJS/sheetjs\n */\n\nconst EOCD_SIGNATURE = 0x06054b50;\nconst CENTRAL_DIR_SIGNATURE = 0x02014b50;\nconst LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\n\nconst textDecoder: TextDecoder | null = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8') : null;\n\ntype ZipEntry = {\n name: string;\n compression: number;\n compressedSize: number;\n uncompressedSize: number;\n localHeaderOffset: number;\n};\n\nexport type ZipMap = Record<string, Uint8Array>;\n\nexport function unzip(data: Uint8Array): ZipMap {\n const entries = readCentralDirectory(data);\n const files: ZipMap = {};\n for (const entry of entries) {\n if (entry.name.endsWith('/')) {\n continue;\n }\n files[entry.name] = extractEntry(data, entry);\n }\n return files;\n}\n\nfunction readCentralDirectory(bytes: Uint8Array): ZipEntry[] {\n const eocdOffset = findEndOfCentralDirectory(bytes);\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n const totalEntries = view.getUint16(eocdOffset + 10, true);\n const centralDirOffset = view.getUint32(eocdOffset + 16, true);\n const entries: ZipEntry[] = [];\n let offset = centralDirOffset;\n for (let i = 0; i < totalEntries; i += 1) {\n const signature = view.getUint32(offset, true);\n if (signature !== CENTRAL_DIR_SIGNATURE) {\n throw new Error('Invalid central directory signature.');\n }\n const compression = view.getUint16(offset + 10, true);\n const compressedSize = view.getUint32(offset + 20, true);\n const uncompressedSize = view.getUint32(offset + 24, true);\n const nameLength = view.getUint16(offset + 28, true);\n const extraLength = view.getUint16(offset + 30, true);\n const commentLength = view.getUint16(offset + 32, true);\n const localHeaderOffset = view.getUint32(offset + 42, true);\n const nameBytes = bytes.subarray(offset + 46, offset + 46 + nameLength);\n const name = normalizePath(decodeUtf8(nameBytes));\n entries.push({\n name,\n compression,\n compressedSize,\n uncompressedSize,\n localHeaderOffset,\n });\n offset += 46 + nameLength + extraLength + commentLength;\n }\n return entries;\n}\n\nfunction findEndOfCentralDirectory(bytes: Uint8Array): number {\n for (let i = bytes.length - 22; i >= 0; i -= 1) {\n if (\n bytes[i] === 0x50 &&\n bytes[i + 1] === 0x4b &&\n bytes[i + 2] === 0x05 &&\n bytes[i + 3] === 0x06\n ) {\n return i;\n }\n }\n throw new Error('End of central directory record was not found.');\n}\n\nfunction extractEntry(bytes: Uint8Array, entry: ZipEntry): Uint8Array {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n let offset = entry.localHeaderOffset;\n const signature = view.getUint32(offset, true);\n if (signature !== LOCAL_FILE_HEADER_SIGNATURE) {\n throw new Error(`Invalid local file header for ${entry.name}.`);\n }\n offset += 4; // signature\n offset += 2; // version\n const flags = view.getUint16(offset, true);\n offset += 2;\n const compression = view.getUint16(offset, true);\n offset += 2;\n offset += 8; // mod time/date + crc\n const _compressedSize = view.getUint32(offset, true);\n offset += 4;\n const _uncompressedSize = view.getUint32(offset, true);\n offset += 4;\n const nameLength = view.getUint16(offset, true);\n offset += 2;\n const extraLength = view.getUint16(offset, true);\n offset += 2;\n const dataStart = entry.localHeaderOffset + 30 + nameLength + extraLength;\n const compressedSize = flags & 0x0008 ? entry.compressedSize : _compressedSize;\n const uncompressedSize = flags & 0x0008 ? entry.uncompressedSize : _uncompressedSize;\n const compressed = bytes.subarray(dataStart, dataStart + compressedSize);\n if (compression === 0) {\n return compressed.slice();\n }\n if (compression === 8) {\n return inflateRaw(compressed, uncompressedSize);\n }\n throw new Error(`Unsupported ZIP compression method ${compression} in ${entry.name}.`);\n}\n\nfunction normalizePath(path: string): string {\n const withoutLeading = path.replace(/^[./\\\\]+/, '');\n return withoutLeading.replace(/\\\\/g, '/');\n}\n\nfunction decodeUtf8(bytes: Uint8Array): string {\n if (textDecoder) {\n return textDecoder.decode(bytes);\n }\n let result = '';\n for (let i = 0; i < bytes.length; i += 1) {\n result += String.fromCharCode(bytes[i]);\n }\n return result;\n}\n\n// -- Deflate implementation -------------------------------------------------\n\nconst CLEN_ORDER = [16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15];\nconst LEN_LN = [3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258];\nconst DST_LN = [1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577];\n\nconst bitswap8 = new Uint8Array(1 << 8);\nfor (let i = 0; i < bitswap8.length; i += 1) {\n bitswap8[i] = bitSwap8(i);\n}\n\nconst dynLiteralMap = new Uint16Array(32768);\nconst dynDistanceMap = new Uint16Array(32768);\nconst dynCodeMap = new Uint16Array(128);\nlet dynLiteralMax = 1;\nlet dynDistanceMax = 1;\n\nfunction inflateRaw(data: Uint8Array, expectedSize: number): Uint8Array {\n const [result] = inflate(data, expectedSize);\n return expectedSize ? result.slice(0, expectedSize) : result;\n}\n\nfunction inflate(data: Uint8Array, expectedSize: number): [Uint8Array, number] {\n if (data[0] === 3 && (data[1] & 3) === 0) {\n return [new Uint8Array(expectedSize), 2];\n }\n let bitOffset = 0;\n let header = 0;\n let outBuffer = createBuffer(expectedSize || 1 << 18);\n let writeOffset = 0;\n let maxLiteralBits = 0;\n let maxDistanceBits = 0;\n\n const literalMap = fixedLiteralMap;\n const distanceMap = fixedDistanceMap;\n\n while ((header & 1) === 0) {\n header = readBits3(data, bitOffset);\n bitOffset += 3;\n if ((header >>> 1) === 0) {\n if (bitOffset & 7) {\n bitOffset += 8 - (bitOffset & 7);\n }\n let size = data[bitOffset >>> 3] | (data[(bitOffset >>> 3) + 1] << 8);\n bitOffset += 32;\n if (size > 0) {\n if (!expectedSize && outBuffer.length < writeOffset + size) {\n outBuffer = growBuffer(outBuffer, writeOffset + size);\n }\n while (size > 0) {\n outBuffer[writeOffset++] = data[bitOffset >>> 3];\n bitOffset += 8;\n size -= 1;\n }\n }\n continue;\n }\n if ((header >> 1) === 1) {\n maxLiteralBits = 9;\n maxDistanceBits = 5;\n } else {\n bitOffset = buildDynamicTrees(data, bitOffset);\n maxLiteralBits = dynLiteralMax;\n maxDistanceBits = dynDistanceMax;\n }\n\n for (;;) {\n if (!expectedSize && outBuffer.length < writeOffset + 32767) {\n outBuffer = growBuffer(outBuffer, writeOffset + 32767);\n }\n const literalBits = readBitsN(data, bitOffset, maxLiteralBits);\n const literalCode =\n (header >>> 1) === 1 ? literalMap[literalBits] : dynLiteralMap[literalBits];\n bitOffset += literalCode & 15;\n let code = literalCode >>> 4;\n if ((code >>> 8 & 255) === 0) {\n outBuffer[writeOffset++] = code;\n continue;\n }\n if (code === 256) {\n break;\n }\n code -= 257;\n let lengthExtraBits = code < 8 ? 0 : (code - 4) >> 2;\n if (lengthExtraBits > 5) {\n lengthExtraBits = 0;\n }\n let target = writeOffset + LEN_LN[code];\n if (lengthExtraBits > 0) {\n target += readBitsN(data, bitOffset, lengthExtraBits);\n bitOffset += lengthExtraBits;\n }\n const distBits = readBitsN(data, bitOffset, maxDistanceBits);\n let distCode =\n (header >>> 1) === 1 ? distanceMap[distBits] : dynDistanceMap[distBits];\n bitOffset += distCode & 15;\n distCode >>>= 4;\n let distExtraBits = distCode < 4 ? 0 : (distCode - 2) >> 1;\n let distance = DST_LN[distCode];\n if (distExtraBits > 0) {\n distance += readBitsN(data, bitOffset, distExtraBits);\n bitOffset += distExtraBits;\n }\n if (!expectedSize && outBuffer.length < target) {\n outBuffer = growBuffer(outBuffer, target + 100);\n }\n while (writeOffset < target) {\n outBuffer[writeOffset] = outBuffer[writeOffset - distance];\n writeOffset += 1;\n }\n }\n }\n if (expectedSize) {\n return [outBuffer, (bitOffset + 7) >>> 3];\n }\n return [outBuffer.slice(0, writeOffset), (bitOffset + 7) >>> 3];\n}\n\nfunction buildDynamicTrees(data: Uint8Array, bitOffset: number): number {\n const HLIT = readBits5(data, bitOffset) + 257;\n bitOffset += 5;\n const HDIST = readBits5(data, bitOffset) + 1;\n bitOffset += 5;\n const HCLEN = readBits4(data, bitOffset) + 4;\n bitOffset += 4;\n\n const codeLengths = new Uint8Array(19);\n let maxLen = 1;\n const bitCounts = new Uint8Array(8);\n const nextCodes = new Uint8Array(8);\n for (let i = 0; i < HCLEN; i += 1) {\n const value = readBits3(data, bitOffset);\n const index = CLEN_ORDER[i];\n codeLengths[index] = value;\n if (maxLen < value) {\n maxLen = value;\n }\n bitCounts[value] += 1;\n bitOffset += 3;\n }\n let code = 0;\n bitCounts[0] = 0;\n for (let i = 1; i <= maxLen; i += 1) {\n nextCodes[i] = code = (code + bitCounts[i - 1]) << 1;\n }\n const codeTree = new Uint16Array(19);\n for (let i = 0; i < codeLengths.length; i += 1) {\n const len = codeLengths[i];\n if (len !== 0) {\n codeTree[i] = nextCodes[len]++;\n }\n }\n const codeMap = dynCodeMap;\n codeMap.fill(0);\n for (let i = 0; i < codeLengths.length; i += 1) {\n const len = codeLengths[i];\n if (len !== 0) {\n const swapped = bitswap8[codeTree[i]] >> (8 - len);\n for (let j = (1 << (7 - len)) - 1; j >= 0; --j) {\n codeMap[swapped | (j << len)] = (len & 7) | (i << 3);\n }\n }\n }\n const hCodes: number[] = [];\n maxLen = 1;\n while (hCodes.length < HLIT + HDIST) {\n let symbol = codeMap[readBits7(data, bitOffset)];\n bitOffset += symbol & 7;\n symbol >>>= 3;\n if (symbol === 16) {\n let repeat = 3 + readBits2(data, bitOffset);\n bitOffset += 2;\n const last = hCodes[hCodes.length - 1];\n while (repeat-- > 0) {\n hCodes.push(last);\n }\n } else if (symbol === 17) {\n let repeat = 3 + readBits3(data, bitOffset);\n bitOffset += 3;\n while (repeat-- > 0) {\n hCodes.push(0);\n }\n } else if (symbol === 18) {\n let repeat = 11 + readBits7(data, bitOffset);\n bitOffset += 7;\n while (repeat-- > 0) {\n hCodes.push(0);\n }\n } else {\n hCodes.push(symbol);\n if (maxLen < symbol) {\n maxLen = symbol;\n }\n }\n }\n const literalLengths = hCodes.slice(0, HLIT);\n const distanceLengths = hCodes.slice(HLIT);\n while (literalLengths.length < 286) literalLengths.push(0);\n while (distanceLengths.length < 30) distanceLengths.push(0);\n dynLiteralMax = buildTree(literalLengths, dynLiteralMap, 286);\n dynDistanceMax = buildTree(distanceLengths, dynDistanceMap, 30);\n return bitOffset;\n}\n\nfunction buildTree(codeLengths: number[], target: Uint16Array, maxSymbols: number): number {\n let maxLen = 1;\n const counts = new Uint16Array(32);\n for (let i = 0; i < codeLengths.length; i += 1) {\n const len = codeLengths[i] || 0;\n codeLengths[i] = len;\n counts[len] += 1;\n if (maxLen < len) {\n maxLen = len;\n }\n }\n counts[0] = 0;\n let code = 0;\n const nextCode = new Uint16Array(32);\n for (let i = 1; i <= maxLen; i += 1) {\n nextCode[i] = code = (code + counts[i - 1]) << 1;\n }\n for (let i = 0; i < maxSymbols; i += 1) {\n const len = codeLengths[i] || 0;\n if (len !== 0) {\n const val = bitSwapN(nextCode[len], maxLen) >> (maxLen - len);\n nextCode[len] += 1;\n for (let j = (1 << (maxLen + 4 - len)) - 1; j >= 0; --j) {\n target[val | (j << len)] = (len & 15) | (i << 4);\n }\n }\n }\n return maxLen;\n}\n\nconst fixedLiteralMap = new Uint16Array(512);\nconst fixedDistanceMap = new Uint16Array(32);\n\n(function initializeFixedTables() {\n const distLens: number[] = [];\n for (let i = 0; i < 32; i += 1) distLens.push(5);\n buildTree(distLens, fixedDistanceMap, 32);\n\n const literalLens: number[] = [];\n for (let i = 0; i <= 143; i += 1) literalLens.push(8);\n for (let i = 144; i <= 255; i += 1) literalLens.push(9);\n for (let i = 256; i <= 279; i += 1) literalLens.push(7);\n for (let i = 280; i <= 287; i += 1) literalLens.push(8);\n buildTree(literalLens, fixedLiteralMap, 288);\n})();\n\nfunction growBuffer(buffer: Uint8Array, size: number): Uint8Array {\n if (buffer.length >= size) {\n return buffer;\n }\n const next = new Uint8Array(Math.max(buffer.length * 2, size));\n next.set(buffer);\n return next;\n}\n\nfunction createBuffer(size: number): Uint8Array {\n return new Uint8Array(size);\n}\n\nfunction bitSwap8(value: number): number {\n const t =\n (((value << 1) | (value << 11)) & 139536) |\n (((value << 5) | (value << 15)) & 558144);\n return ((t >> 16) | (t >> 8) | t) & 255;\n}\n\nfunction bitSwapN(value: number, bits: number): number {\n let rev = bitswap8[value & 0xff];\n if (bits <= 8) {\n return rev >>> (8 - bits);\n }\n rev = (rev << 8) | bitswap8[(value >> 8) & 0xff];\n if (bits <= 16) {\n return rev >>> (16 - bits);\n }\n rev = (rev << 8) | bitswap8[(value >> 16) & 0xff];\n return rev >>> (24 - bits);\n}\n\nfunction readBits2(buf: Uint8Array, bitOffset: number): number {\n const w = bitOffset & 7;\n const h = bitOffset >>> 3;\n return (buf[h] | (w <= 6 ? 0 : buf[h + 1] << 8)) >>> w & 3;\n}\n\nfunction readBits3(buf: Uint8Array, bitOffset: number): number {\n const w = bitOffset & 7;\n const h = bitOffset >>> 3;\n return (buf[h] | (w <= 5 ? 0 : buf[h + 1] << 8)) >>> w & 7;\n}\n\nfunction readBits4(buf: Uint8Array, bitOffset: number): number {\n const w = bitOffset & 7;\n const h = bitOffset >>> 3;\n return (buf[h] | (w <= 4 ? 0 : buf[h + 1] << 8)) >>> w & 15;\n}\n\nfunction readBits5(buf: Uint8Array, bitOffset: number): number {\n const w = bitOffset & 7;\n const h = bitOffset >>> 3;\n return (buf[h] | (w <= 3 ? 0 : buf[h + 1] << 8)) >>> w & 31;\n}\n\nfunction readBits7(buf: Uint8Array, bitOffset: number): number {\n const w = bitOffset & 7;\n const h = bitOffset >>> 3;\n return (buf[h] | (w <= 1 ? 0 : buf[h + 1] << 8)) >>> w & 127;\n}\n\nfunction readBitsN(buf: Uint8Array, bitOffset: number, n: number): number {\n const w = bitOffset & 7;\n const h = bitOffset >>> 3;\n const mask = (1 << n) - 1;\n let value = buf[h] >>> w;\n if (n < 8 - w) {\n return value & mask;\n }\n value |= buf[h + 1] << (8 - w);\n if (n < 16 - w) {\n return value & mask;\n }\n value |= buf[h + 2] << (16 - w);\n if (n < 24 - w) {\n return value & mask;\n }\n value |= buf[h + 3] << (24 - w);\n return value & mask;\n}\n","export interface XmlNode {\n name: string;\n attributes: Record<string, string>;\n children: XmlNode[];\n text: string;\n}\n\nconst XML_ENTITY_MAP: Record<string, string> = {\n amp: '&',\n lt: '<',\n gt: '>',\n quot: '\"',\n apos: \"'\",\n};\n\n/**\n * Extremely small XML parser that is sufficient for the subset of OpenXML data\n * we need. It is not a full XML implementation but supports attributes,\n * self-closing tags, CDATA, namespaces, and nested nodes.\n */\nexport function parseXml(xml: string): XmlNode {\n const root: XmlNode = { name: '__root__', attributes: {}, children: [], text: '' };\n const stack: XmlNode[] = [root];\n const tokenRegex = /<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>|<!--[\\s\\S]*?-->|<[^>]+>|[^<]+/g;\n let match: RegExpExecArray | null;\n\n while ((match = tokenRegex.exec(xml)) !== null) {\n // CDATA block\n if (match[1] !== undefined) {\n stack[stack.length - 1].text += match[1];\n continue;\n }\n\n const token = match[0];\n if (!token) {\n continue;\n }\n\n if (token.startsWith('<!--')) {\n continue;\n }\n\n if (token.startsWith('<?') || token.startsWith('<!')) {\n continue;\n }\n\n if (token.startsWith('</')) {\n stack.pop();\n continue;\n }\n\n if (token.startsWith('<')) {\n const selfClosing = token.endsWith('/>');\n const content = token.slice(1, selfClosing ? -2 : -1).trim();\n if (!content) {\n continue;\n }\n const nameMatch = /^[^\\s/>]+/.exec(content);\n if (!nameMatch) {\n continue;\n }\n const tagName = nameMatch[0];\n const attrString = content.slice(tagName.length).trim();\n const node: XmlNode = {\n name: tagName,\n attributes: parseAttributes(attrString),\n children: [],\n text: '',\n };\n stack[stack.length - 1].children.push(node);\n if (!selfClosing) {\n stack.push(node);\n }\n continue;\n }\n\n const text = decodeXmlEntities(token);\n if (!text.length) {\n continue;\n }\n const target = stack[stack.length - 1];\n if (!/\\S/.test(text) && target.attributes['xml:space'] !== 'preserve') {\n continue;\n }\n target.text += text;\n }\n\n return root;\n}\n\nexport function localName(name: string): string {\n const index = name.indexOf(':');\n return index >= 0 ? name.slice(index + 1) : name;\n}\n\nexport function findChildren(node: XmlNode, tagName: string): XmlNode[] {\n const target = localName(tagName);\n return node.children.filter((child) => localName(child.name) === target);\n}\n\nexport function findChild(node: XmlNode, tagName: string): XmlNode | undefined {\n const target = localName(tagName);\n return node.children.find((child) => localName(child.name) === target);\n}\n\nexport function getTextContent(node: XmlNode): string {\n let output = node.text ?? '';\n for (const child of node.children) {\n output += getTextContent(child);\n }\n return output;\n}\n\nfunction parseAttributes(input: string): Record<string, string> {\n if (!input) {\n return {};\n }\n const attributes: Record<string, string> = {};\n const regex = /([^\\s=]+)\\s*=\\s*(\"([^\"]*)\"|'([^']*)')/g;\n let match: RegExpExecArray | null;\n while ((match = regex.exec(input)) !== null) {\n const [, key, , doubleValue, singleValue] = match;\n attributes[key] = decodeXmlEntities(doubleValue ?? singleValue ?? '');\n }\n return attributes;\n}\n\nfunction decodeXmlEntities(text: string): string {\n return text.replace(/&(#\\d+|#x[0-9a-fA-F]+|\\w+);/g, (match, entity) => {\n if (entity[0] === '#') {\n const codePoint = entity[1] === 'x' || entity[1] === 'X' ? parseInt(entity.slice(2), 16) : parseInt(entity.slice(1), 10);\n if (!Number.isNaN(codePoint)) {\n return String.fromCodePoint(codePoint);\n }\n return '';\n }\n return XML_ENTITY_MAP[entity] ?? match;\n });\n}\n","import { unzip } from './unzip';\nimport { findChild, findChildren, getTextContent, localName, parseXml, type XmlNode } from './xml';\nimport type { RichTextRun } from '../types/richText';\n\nexport type Range = { s: { r: number; c: number }; e: { r: number; c: number } };\nexport type WorksheetMergeRange = { s: { r: number; c: number }; e: { r: number; c: number } };\n\nexport type ColumnInfo = { wpx?: number; wch?: number; width?: number; custom?: boolean };\nexport type RowInfo = { hpx?: number; hpt?: number; custom?: boolean };\nexport type SheetFormatProperties = {\n defaultRowHeight?: number;\n defaultColWidth?: number;\n customHeight?: boolean;\n};\nexport type SheetView = { showGridLines?: boolean };\n\nexport type DrawingAnchorPosition = {\n row: number;\n column: number;\n rowOffset: number;\n columnOffset: number;\n};\n\nexport type WorksheetImageAnchor =\n | { type: 'oneCell'; from: DrawingAnchorPosition; width: number; height: number }\n | { type: 'twoCell'; from: DrawingAnchorPosition; to: DrawingAnchorPosition };\n\nexport type WorksheetImage = {\n id: string;\n imagePath: string;\n format: string;\n mimeType: string;\n data: Uint8Array;\n anchor: WorksheetImageAnchor;\n};\n\nexport type ExcelFont = {\n name?: string;\n size?: number;\n color?: ExcelColor;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n};\n\nexport type CellStyle = {\n alignment?: { horizontal?: string; vertical?: string };\n font?: ExcelFont;\n numFmtId?: number;\n formatCode?: string;\n};\n\nexport type CellObject = {\n v: string | number | boolean | null;\n value?: string | number | boolean | null;\n t: string;\n s?: CellStyle;\n richText?: RichTextRun[];\n};\n\nexport type WorkSheet = {\n [address: string]:\n | CellObject\n | string\n | ColumnInfo[]\n | RowInfo[]\n | WorksheetMergeRange[]\n | SheetFormatProperties\n | WorksheetImage[]\n | SheetView\n | undefined;\n '!ref'?: string;\n '!cols'?: ColumnInfo[];\n '!rows'?: RowInfo[];\n '!merges'?: WorksheetMergeRange[];\n '!sheetFormat'?: SheetFormatProperties;\n '!images'?: WorksheetImage[];\n '!sheetView'?: SheetView;\n};\n\ntype SharedStringEntry = { text: string; richText?: RichTextRun[] };\n\nexport type ExcelBorderLine = { style?: string; color?: ExcelColor };\nexport type ExcelBorder = {\n left?: ExcelBorderLine;\n right?: ExcelBorderLine;\n top?: ExcelBorderLine;\n bottom?: ExcelBorderLine;\n};\nexport type ExcelColor = { rgb?: string; indexed?: number; theme?: number; tint?: number };\nexport type ExcelFill = { patternType?: string; fgColor?: ExcelColor; bgColor?: ExcelColor };\n\nexport type CellXfRecord = {\n borderId?: number;\n fillId?: number;\n fontId?: number;\n numFmtId?: number;\n alignment?: { horizontal?: string; vertical?: string };\n};\n\ntype WorkbookColors = {\n indexed?: Array<string | null>;\n};\n\nexport type WorkbookStyles = {\n CellXf?: CellXfRecord[];\n Borders?: ExcelBorder[];\n Fills?: Array<ExcelFill | undefined>;\n Fonts?: ExcelFont[];\n NumberFormats?: Map<number, string>;\n Colors?: WorkbookColors;\n};\n\nexport type WorkBook = {\n SheetNames: string[];\n Sheets: Record<string, WorkSheet>;\n Styles?: WorkbookStyles;\n Directory?: { sheets?: string[] };\n files?: Record<string, { content?: string } | string>;\n};\n\nexport type SheetToJsonOptions = {\n header?: 1;\n defval?: string | number | boolean | null;\n raw?: boolean;\n};\n\nexport type ReadOptions = {\n type?: 'binary' | 'array';\n cellStyles?: boolean;\n bookFiles?: boolean;\n};\n\nconst textDecoder: TextDecoder | null = typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8') : null;\n\nexport const utils = {\n sheet_to_json,\n encode_cell: encodeCell,\n decode_cell: decodeCell,\n decode_range: decodeRange,\n};\n\nexport function read(data: ArrayBuffer | Uint8Array | string, _options?: ReadOptions): WorkBook {\n const bytes = normalizeInput(data);\n const zipEntries = unzip(bytes);\n const workbookXml = readXml(zipEntries, 'xl/workbook.xml');\n const workbookDoc = parseXml(workbookXml);\n const workbookNode = workbookDoc.children.find((child) => localName(child.name) === 'workbook') ?? workbookDoc.children[0];\n if (!workbookNode) {\n throw new Error('Workbook XML is invalid.');\n }\n const sheetsNode = findChild(workbookNode, 'sheets');\n if (!sheetsNode) {\n throw new Error('Workbook does not contain sheets metadata.');\n }\n const sheetNodes = findChildren(sheetsNode, 'sheet');\n if (!sheetNodes.length) {\n throw new Error('Workbook does not contain any sheets.');\n }\n const relationships = readWorkbookRelationships(zipEntries);\n const sharedStrings = readSharedStrings(zipEntries);\n const styles = readStyles(zipEntries);\n\n const workbook: WorkBook = {\n SheetNames: [],\n Sheets: {},\n Styles: styles,\n Directory: { sheets: [] },\n files: {},\n };\n\n sheetNodes.forEach((sheetNode) => {\n const name = sheetNode.attributes.name;\n const relId = sheetNode.attributes['r:id'];\n if (!name || !relId) {\n return;\n }\n const path = relationships.get(relId);\n if (!path) {\n throw new Error(`Unable to resolve worksheet path for ${name}.`);\n }\n const sheetXml = readXml(zipEntries, path);\n const worksheet = readWorksheet(sheetXml, sharedStrings, styles, zipEntries, path);\n workbook.SheetNames.push(name);\n workbook.Sheets[name] = worksheet;\n workbook.Directory?.sheets?.push(path);\n workbook.files![path] = sheetXml;\n });\n\n return workbook;\n}\n\nfunction readWorksheet(\n xml: string,\n sharedStrings: SharedStringEntry[],\n styles: WorkbookStyles | undefined,\n zipEntries: Record<string, Uint8Array>,\n sheetPath: string,\n): WorkSheet {\n const doc = parseXml(xml);\n const root = doc.children.find((child) => localName(child.name) === 'worksheet') ?? doc.children[0];\n if (!root) {\n throw new Error('Worksheet XML is invalid.');\n }\n const worksheet: WorkSheet = {};\n const dimensionRef = findChild(root, 'dimension')?.attributes.ref;\n const sheetFormatNode = findChild(root, 'sheetFormatPr');\n const sheetViewsNode = findChild(root, 'sheetViews');\n if (sheetViewsNode) {\n const viewNode = findChild(sheetViewsNode, 'sheetView');\n if (viewNode?.attributes) {\n const showGridLinesAttr =\n viewNode.attributes.showGridLines ?? viewNode.attributes.showgridlines;\n const showGridLines = parseBooleanAttribute(showGridLinesAttr);\n if (showGridLines !== null) {\n worksheet['!sheetView'] = { showGridLines };\n }\n }\n }\n if (sheetFormatNode) {\n const format: SheetFormatProperties = {};\n const defaultRowHeight = parseFloat(sheetFormatNode.attributes.defaultRowHeight ?? '');\n if (Number.isFinite(defaultRowHeight)) {\n format.defaultRowHeight = defaultRowHeight;\n }\n const defaultColWidth = parseFloat(sheetFormatNode.attributes.defaultColWidth ?? '');\n if (Number.isFinite(defaultColWidth)) {\n format.defaultColWidth = defaultColWidth;\n }\n if (sheetFormatNode.attributes.customHeight !== undefined) {\n format.customHeight = sheetFormatNode.attributes.customHeight === '1';\n }\n if (Object.keys(format).length > 0) {\n worksheet['!sheetFormat'] = format;\n }\n }\n const colsNode = findChild(root, 'cols');\n if (colsNode) {\n worksheet['!cols'] = readColumns(colsNode);\n }\n const sheetDataNode = findChild(root, 'sheetData');\n const { minRow, minCol, maxRow, maxCol } = readSheetData(sheetDataNode, worksheet, sharedStrings, styles);\n const mergesNode = findChild(root, 'mergeCells');\n if (mergesNode) {\n worksheet['!merges'] = readMerges(mergesNode);\n }\n const rowsNode = sheetDataNode ? findChildren(sheetDataNode, 'row') : [];\n if (rowsNode.length) {\n worksheet['!rows'] = readRowsInfo(rowsNode);\n }\n const images = readWorksheetImages(root, zipEntries, sheetPath);\n if (images.length) {\n worksheet['!images'] = images;\n }\n worksheet['!ref'] =\n dimensionRef ??\n encodeRange({\n s: { r: Math.max(minRow, 0), c: Math.max(minCol, 0) },\n e: { r: Math.max(maxRow, 0), c: Math.max(maxCol, 0) },\n });\n return worksheet;\n}\n\nfunction readColumns(colsNode: XmlNode): ColumnInfo[] {\n const columns: ColumnInfo[] = [];\n const colNodes = findChildren(colsNode, 'col');\n for (const colNode of colNodes) {\n const min = Math.max(parseInt(colNode.attributes.min ?? '1', 10) - 1, 0);\n const max = Math.max(parseInt(colNode.attributes.max ?? String(min + 1), 10) - 1, min);\n const width = colNode.attributes.width ? Number(colNode.attributes.width) : undefined;\n const wpx = typeof width === 'number' ? charWidthToPixels(width) : undefined;\n const customAttr = colNode.attributes.customWidth ?? colNode.attributes.customwidth;\n const custom =\n customAttr !== undefined\n ? customAttr === '1' || customAttr.toLowerCase() === 'true'\n : undefined;\n for (let idx = min; idx <= max; idx += 1) {\n columns[idx] = {\n width,\n wch: width,\n wpx,\n custom,\n };\n }\n }\n return columns;\n}\n\nfunction readRowsInfo(rowNodes: XmlNode[]): RowInfo[] {\n const rows: RowInfo[] = [];\n for (const rowNode of rowNodes) {\n const rowIndex = Math.max(parseInt(rowNode.attributes.r ?? '1', 10) - 1, 0);\n const info: RowInfo = {};\n if (rowNode.attributes.ht) {\n const height = Number(rowNode.attributes.ht);\n if (Number.isFinite(height)) {\n info.hpt = height;\n info.hpx = height * (96 / 72);\n }\n }\n if (rowNode.attributes.customHeight !== undefined) {\n info.custom = rowNode.attributes.customHeight === '1' || rowNode.attributes.customHeight === 'true';\n }\n rows[rowIndex] = info;\n }\n return rows;\n}\n\nfunction readWorksheetImages(\n root: XmlNode,\n zipEntries: Record<string, Uint8Array>,\n sheetPath: string,\n): WorksheetImage[] {\n const drawingNodes = findChildren(root, 'drawing');\n if (!drawingNodes.length) {\n return [];\n }\n const relationships = readPartRelationships(zipEntries, sheetPath);\n if (!relationships.size) {\n return [];\n }\n const images: WorksheetImage[] = [];\n for (const drawingNode of drawingNodes) {\n const relId = drawingNode.attributes['r:id'];\n if (!relId) {\n continue;\n }\n const drawingPath = relationships.get(relId);\n if (!drawingPath) {\n continue;\n }\n images.push(...readDrawingImages(zipEntries, drawingPath));\n }\n return images;\n}\n\nfunction readDrawingImages(\n zipEntries: Record<string, Uint8Array>,\n drawingPath: string,\n): WorksheetImage[] {\n if (!zipEntries[drawingPath]) {\n return [];\n }\n const xml = readXml(zipEntries, drawingPath);\n const doc = parseXml(xml);\n const root = doc.children.find((child) => localName(child.name) === 'wsDr') ?? doc.children[0];\n if (!root) {\n return [];\n }\n const relationships = readPartRelationships(zipEntries, drawingPath);\n if (!relationships.size) {\n return [];\n }\n const anchors = root.children.filter((node) => {\n const name = localName(node.name);\n return name === 'oneCellAnchor' || name === 'twoCellAnchor';\n });\n const images: WorksheetImage[] = [];\n anchors.forEach((anchorNode, index) => {\n const picNode = findChild(anchorNode, 'pic');\n if (!picNode) {\n return;\n }\n const blipFill = findChild(picNode, 'blipFill');\n const blip = blipFill ? findChild(blipFill, 'blip') : undefined;\n const embedId =\n blip?.attributes['r:embed'] ??\n blip?.attributes['r:Embed'] ??\n blip?.attributes['r:EMBED'] ??\n blip?.attributes['r:id'];\n if (!embedId) {\n return;\n }\n const imagePath = relationships.get(embedId);\n if (!imagePath) {\n return;\n }\n const anchor = parseDrawingAnchor(anchorNode);\n if (!anchor) {\n return;\n }\n const mediaEntry = zipEntries[imagePath];\n if (!mediaEntry) {\n return;\n }\n const data = new Uint8Array(mediaEntry);\n images.push({\n id: `${drawingPath}#${embedId}#${index}`,\n imagePath,\n format: imagePath.split('.').pop()?.toLowerCase() ?? 'image',\n mimeType: guessMimeType(imagePath),\n data,\n anchor,\n });\n });\n return images;\n}\n\nfunction guessMimeType(path: string): string {\n const ext = path.split('.').pop()?.toLowerCase();\n switch (ext) {\n case 'png':\n return 'image/png';\n case 'jpg':\n case 'jpeg':\n return 'image/jpeg';\n case 'gif':\n return 'image/gif';\n case 'bmp':\n return 'image/bmp';\n case 'svg':\n return 'image/svg+xml';\n case 'tif':\n case 'tiff':\n return 'image/tiff';\n case 'webp':\n return 'image/webp';\n default:\n return 'application/octet-stream';\n }\n}\n\nfunction parseDrawingAnchor(anchorNode: XmlNode): WorksheetImageAnchor | null {\n const fromNode = findChild(anchorNode, 'from');\n const from = parseAnchorPosition(fromNode);\n if (!from) {\n return null;\n }\n const anchorType = localName(anchorNode.name);\n if (anchorType === 'oneCellAnchor') {\n const extNode = findChild(anchorNode, 'ext');\n const width = extNode?.attributes.cx ? Number(extNode.attributes.cx) : 0;\n const height = extNode?.attributes.cy ? Number(extNode.attributes.cy) : 0;\n return {\n type: 'oneCell',\n from,\n width: Number.isFinite(width) ? width : 0,\n height: Number.isFinite(height) ? height : 0,\n };\n }\n if (anchorType === 'twoCellAnchor') {\n const toNode = findChild(anchorNode, 'to');\n const to = parseAnchorPosition(toNode);\n if (!to) {\n return null;\n }\n return {\n type: 'twoCell',\n from,\n to,\n };\n }\n return null;\n}\n\nfunction parseAnchorPosition(node: XmlNode | undefined): DrawingAnchorPosition | null {\n if (!node) {\n return null;\n }\n const column = Number.parseInt(findChild(node, 'col')?.text ?? '0', 10);\n const row = Number.parseInt(findChild(node, 'row')?.text ?? '0', 10);\n const columnOffset = Number.parseInt(findChild(node, 'colOff')?.text ?? '0', 10);\n const rowOffset = Number.parseInt(findChild(node, 'rowOff')?.text ?? '0', 10);\n if (\n Number.isNaN(column) ||\n Number.isNaN(row) ||\n column < 0 ||\n row < 0 ||\n Number.isNaN(columnOffset) ||\n Number.isNaN(rowOffset)\n ) {\n return null;\n }\n return {\n row,\n column,\n rowOffset,\n columnOffset,\n };\n}\n\nfunction readRichTextRuns(node: XmlNode): RichTextRun[] {\n const runNodes = findChildren(node, 'r');\n if (!runNodes.length) {\n const textNode = findChild(node, 't');\n const text = textNode ? getTextContent(textNode) : getTextContent(node);\n return text ? [{ text }] : [];\n }\n const runs: RichTextRun[] = [];\n for (const runNode of runNodes) {\n const textNode = findChild(runNode, 't');\n const text = textNode ? getTextContent(textNode) : '';\n const run: RichTextRun = { text };\n const propsNode = findChild(runNode, 'rPr');\n if (propsNode) {\n const fontNode = findChild(propsNode, 'rFont');\n const fontFamily = fontNode?.attributes.val;\n if (fontFamily) {\n run.fontFamily = fontFamily;\n }\n const sizeNode = findChild(propsNode, 'sz');\n if (sizeNode?.attributes.val) {\n const size = Number(sizeNode.attributes.val);\n if (Number.isFinite(size) && size > 0) {\n run.fontSize = size;\n }\n }\n const boldNode = findChild(propsNode, 'b');\n if (boldNode) {\n run.bold = boldNode.attributes.val === undefined || boldNode.attributes.val !== '0';\n }\n const italicNode = findChild(propsNode, 'i');\n if (italicNode) {\n run.italic = italicNode.attributes.val === undefined || italicNode.attributes.val !== '0';\n }\n const underlineNode = findChild(propsNode, 'u');\n if (underlineNode) {\n const val = underlineNode.attributes.val ?? 'single';\n run.underline = val !== 'none' && val !== '0';\n }\n const colorNode = findChild(propsNode, 'color');\n const rgb = colorNode?.attributes.rgb;\n if (rgb) {\n run.color = convertRichTextColor(rgb);\n }\n }\n runs.push(run);\n }\n return runs;\n}\n\nfunction convertRichTextColor(rgb: string): string {\n if (rgb.length === 8) {\n return `#${rgb.slice(2)}`;\n }\n if (rgb.length === 6) {\n return `#${rgb}`;\n }\n return '#000000';\n}\n\nfunction readSheetData(\n sheetData: XmlNode | undefined,\n worksheet: WorkSheet,\n sharedStrings: SharedStringEntry[],\n styles: WorkbookStyles | undefined,\n): { minRow: number; minCol: number; maxRow: number; maxCol: number } {\n if (!sheetData) {\n return { minRow: 0, minCol: 0, maxRow: 0, maxCol: 0 };\n }\n const rows = findChildren(sheetData, 'row');\n let minRow = Number.MAX_SAFE_INTEGER;\n let minCol = Number.MAX_SAFE_INTEGER;\n let maxRow = 0;\n let maxCol = 0;\n for (const row of rows) {\n const rowIndex = Math.max(parseInt(row.attributes.r ?? '1', 10) - 1, 0);\n const cellNodes = findChildren(row, 'c');\n let fallbackColumn = 0;\n for (const cellNode of cellNodes) {\n const address = cellNode.attributes.r;\n const position = address ? decodeCell(address) : { r: rowIndex, c: fallbackColumn };\n fallbackColumn = position.c + 1;\n const cellType = cellNode.attributes.t ?? 'n';\n const styleIndex = cellNode.attributes.s ? Number(cellNode.attributes.s) : undefined;\n const decoded = readCellValue(cellNode, cellType, sharedStrings);\n const value = decoded.value;\n if (value === null || value === undefined || value === '') {\n continue;\n }\n const cell: CellObject = {\n v: value,\n value,\n t: normalizeCellType(cellType),\n };\n if (decoded.richText && decoded.richText.length > 0) {\n cell.richText = decoded.richText;\n }\n const cellStyle = resolveCellStyle(styleIndex, styles);\n if (cellStyle) {\n cell.s = cellStyle;\n }\n const key = encodeCell(position);\n worksheet[key] = cell;\n minRow = Math.min(minRow, position.r);\n minCol = Math.min(minCol, position.c);\n maxRow = Math.max(maxRow, position.r);\n maxCol = Math.max(maxCol, position.c);\n }\n }\n if (minRow === Number.MAX_SAFE_INTEGER) {\n minRow = 0;\n minCol = 0;\n }\n return { minRow, minCol, maxRow, maxCol };\n}\n\ntype DecodedCellValue = { value: string | number | boolean | null; richText?: RichTextRun[] };\n\nfunction readCellValue(\n cellNode: XmlNode,\n cellType: string,\n sharedStrings: SharedStringEntry[],\n): DecodedCellValue {\n if (cellType === 's') {\n const valueNode = findChild(cellNode, 'v');\n if (!valueNode?.text) {\n return { value: '' };\n }\n const index = Number(valueNode.text);\n const entry = sharedStrings[index];\n return entry ? { value: entry.text, richText: entry.richText } : { value: '' };\n }\n if (cellType === 'inlineStr') {\n const inlineNode = findChild(cellNode, 'is') ?? cellNode;\n const runs = readRichTextRuns(inlineNode);\n if (runs.length > 0) {\n return { value: runs.map((run) => run.text).join(''), richText: runs };\n }\n const textNode = findChild(inlineNode, 't');\n if (textNode) {\n return { value: getTextContent(textNode) };\n }\n return { value: getTextContent(inlineNode) };\n }\n if (cellType === 'b') {\n const valueNode = findChild(cellNode, 'v');\n if (!valueNode?.text) {\n return { value: false };\n }\n return { value: valueNode.text === '1' };\n }\n const valueNode = findChild(cellNode, 'v');\n if (!valueNode) {\n return { value: null };\n }\n if (cellType === 'n' || cellType === 'd') {\n const parsed = Number(valueNode.text);\n if (Number.isFinite(parsed)) {\n return { value: parsed };\n }\n }\n return { value: valueNode.text ?? '' };\n}\n\nfunction normalizeCellType(cellType: string): string {\n if (cellType === 'inlineStr') {\n return 's';\n }\n return cellType;\n}\n\nfunction readMerges(mergeNode: XmlNode): WorksheetMergeRange[] {\n const merges: WorksheetMergeRange[] = [];\n const mergeCells = findChildren(mergeNode, 'mergeCell');\n for (const mergeCell of mergeCells) {\n const ref = mergeCell.attributes.ref;\n if (!ref) {\n continue;\n }\n const range = decodeRange(ref);\n merges.push(range);\n }\n return merges;\n}\n\nfunction readSharedStrings(zipEntries: Record<string, Uint8Array>): SharedStringEntry[] {\n const sharedStrings: SharedStringEntry[] = [];\n const path = 'xl/sharedStrings.xml';\n if (!zipEntries[path]) {\n return sharedStrings;\n }\n const xml = readXml(zipEntries, path);\n const doc = parseXml(xml);\n const root = doc.children.find((child) => localName(child.name) === 'sst');\n if (!root) {\n return sharedStrings;\n }\n const siNodes = findChildren(root, 'si');\n for (const siNode of siNodes) {\n const runs = readRichTextRuns(siNode);\n if (runs.length > 0) {\n sharedStrings.push({ text: runs.map((run) => run.text).join(''), richText: runs });\n continue;\n }\n sharedStrings.push({ text: getTextContent(siNode) });\n }\n return sharedStrings;\n}\n\nfunction readStyles(zipEntries: Record<string, Uint8Array>): WorkbookStyles | undefined {\n const path = 'xl/styles.xml';\n if (!zipEntries[path]) {\n return undefined;\n }\n const xml = readXml(zipEntries, path);\n const doc = parseXml(xml);\n const root = doc.children.find((child) => localName(child.name) === 'styleSheet');\n if (!root) {\n return undefined;\n }\n const styles: WorkbookStyles = {\n CellXf: [],\n Borders: [],\n Fills: [],\n Fonts: [],\n NumberFormats: new Map(),\n };\n const numFmtsNode = findChild(root, 'numFmts');\n if (numFmtsNode) {\n const customFormats = readNumberFormats(numFmtsNode);\n customFormats.forEach((code, id) => {\n styles.NumberFormats?.set(id, code);\n });\n }\n const bordersNode = findChild(root, 'borders');\n if (bordersNode) {\n const borderNodes = findChildren(bordersNode, 'border');\n styles.Borders = borderNodes.map(readBorder);\n }\n const fontsNode = findChild(root, 'fonts');\n if (fontsNode) {\n const fontNodes = findChildren(fontsNode, 'font');\n styles.Fonts = fontNodes.map(readFont);\n }\n const colorsNode = findChild(root, 'colors');\n if (colorsNode) {\n const colors = readColors(colorsNode);\n if (colors.indexed && colors.indexed.length > 0) {\n styles.Colors = colors;\n }\n }\n const fillsNode = findChild(root, 'fills');\n if (fillsNode) {\n const fillNodes = findChildren(fillsNode, 'fill');\n styles.Fills = fillNodes.map((fillNode) => readFill(fillNode));\n }\n const cellXfsNode = findChild(root, 'cellXfs');\n if (cellXfsNode) {\n const xfNodes = findChildren(cellXfsNode, 'xf');\n styles.CellXf = xfNodes.map((xfNode) => {\n const xf: CellXfRecord = {};\n const borderIndex = parseIndexAttribute(xfNode.attributes.borderId ?? xfNode.attributes.borderid);\n if (borderIndex !== null) {\n xf.borderId = borderIndex;\n }\n const fillIndex = parseIndexAttribute(xfNode.attributes.fillId ?? xfNode.attributes.fillid);\n if (fillIndex !== null) {\n xf.fillId = fillIndex;\n }\n const fontIndex = parseIndexAttribute(xfNode.attributes.fontId ?? xfNode.attributes.fontid);\n if (fontIndex !== null) {\n xf.fontId = fontIndex;\n }\n const numFmtId = parseIndexAttribute(xfNode.attributes.numFmtId ?? xfNode.attributes.numfmtid);\n if (numFmtId !== null) {\n xf.numFmtId = numFmtId;\n }\n const alignmentNode = findChild(xfNode, 'alignment');\n if (alignmentNode?.attributes) {\n const horizontal = alignmentNode.attributes.horizontal;\n const vertical = alignmentNode.attributes.vertical;\n if (horizontal || vertical) {\n xf.alignment = {};\n if (horizontal) {\n xf.alignment.horizontal = horizontal;\n }\n if (vertical) {\n xf.alignment.vertical = vertical;\n }\n }\n }\n return xf;\n });\n }\n return styles;\n}\n\nfunction parseIndexAttribute(value: string | undefined): number | null {\n if (value === undefined) {\n return null;\n }\n const parsed = Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n}\n\nfunction parseBooleanAttribute(value: string | undefined): boolean | null {\n if (value === undefined) {\n return null;\n }\n if (value === '1') {\n return true;\n }\n if (value === '0') {\n return false;\n }\n const normalized = value.trim().toLowerCase();\n if (normalized === 'true') {\n return true;\n }\n if (normalized === 'false') {\n return false;\n }\n return null;\n}\n\nfunction readColors(colorsNode: XmlNode): WorkbookColors {\n const colors: WorkbookColors = {};\n const indexedNode = findChild(colorsNode, 'indexedColors');\n if (indexedNode) {\n const rgbNodes = findChildren(indexedNode, 'rgbColor');\n colors.indexed = rgbNodes.map((node) => normalizeRgbAttribute(node.attributes.rgb));\n }\n return colors;\n}\n\nfunction normalizeRgbAttribute(rgb: string | undefined): string | null {\n if (!rgb) {\n return null;\n }\n const hex = rgb.replace(/^#/, '');\n if (hex.length === 8) {\n return `#${hex.slice(2)}`;\n }\n if (hex.length === 6) {\n return `#${hex}`;\n }\n return null;\n}\n\nfunction readBorder(borderNode: XmlNode): ExcelBorder {\n return {\n left: readBorderEdge(findChild(borderNode, 'left')),\n right: readBorderEdge(findChild(borderNode, 'right')),\n top: readBorderEdge(findChild(borderNode, 'top')),\n bottom: readBorderEdge(findChild(borderNode, 'bottom')),\n };\n}\n\nfunction readBorderEdge(edgeNode: XmlNode | undefined): ExcelBorderLine | undefined {\n if (!edgeNode) {\n return undefined;\n }\n const style = edgeNode.attributes.style;\n const colorNode = findChild(edgeNode, 'color');\n const color = readColor(colorNode);\n if (!style && !color) {\n return undefined;\n }\n return { style, color };\n}\n\nfunction readFill(fillNode: XmlNode): ExcelFill | undefined {\n const patternNode = findChild(fillNode, 'patternFill');\n if (!patternNode) {\n return undefined;\n }\n const patternType = patternNode.attributes.patternType ?? patternNode.attributes.patterntype;\n const fgColorNode = findChild(patternNode, 'fgColor');\n const bgColorNode = findChild(patternNode, 'bgColor');\n const fgColor = readColor(fgColorNode);\n const bgColor = readColor(bgColorNode);\n if (!patternType && !fgColor && !bgColor) {\n return undefined;\n }\n return { patternType, fgColor, bgColor };\n}\n\nfunction readColor(colorNode: XmlNode | undefined): ExcelColor | undefined {\n if (!colorNode) {\n return undefined;\n }\n const color: ExcelColor = {};\n if (colorNode.attributes.rgb) {\n color.rgb = colorNode.attributes.rgb;\n }\n const indexed = parseIndexAttribute(colorNode.attributes.indexed);\n if (indexed !== null) {\n color.indexed = indexed;\n }\n const theme = parseIndexAttribute(colorNode.attributes.theme);\n if (theme !== null) {\n color.theme = theme;\n }\n if (colorNode.attributes.tint !== undefined) {\n const tint = Number(colorNode.attributes.tint);\n if (Number.isFinite(tint)) {\n color.tint = tint;\n }\n }\n return Object.keys(color).length ? color : undefined;\n}\n\nfunction readNumberFormats(numFmtsNode: XmlNode): Map<number, string> {\n const formats = new Map<number, string>();\n const numFmtNodes = findChildren(numFmtsNode, 'numFmt');\n for (const fmtNode of numFmtNodes) {\n const id = parseIndexAttribute(fmtNode.attributes.numFmtId ?? fmtNode.attributes.numfmtid);\n const code = fmtNode.attributes.formatCode ?? fmtNode.attributes.formatcode;\n if (id === null || !code) {\n continue;\n }\n formats.set(id, code);\n }\n return formats;\n}\n\nfunction readFont(fontNode: XmlNode): ExcelFont {\n const font: ExcelFont = {};\n const nameNode = findChild(fontNode, 'name');\n if (nameNode?.attributes.val) {\n font.name = nameNode.attributes.val;\n }\n const sizeNode = findChild(fontNode, 'sz');\n if (sizeNode?.attributes.val) {\n const parsed = Number(sizeNode.attributes.val);\n if (Number.isFinite(parsed)) {\n font.size = parsed;\n }\n }\n const colorNode = findChild(fontNode, 'color');\n const color = readColor(colorNode);\n if (color) {\n font.color = color;\n }\n const boldNode = findChild(fontNode, 'b');\n if (boldNode) {\n font.bold = boldNode.attributes.val === undefined || boldNode.attributes.val !== '0';\n }\n const italicNode = findChild(fontNode, 'i');\n if (italicNode) {\n font.italic = italicNode.attributes.val === undefined || italicNode.attributes.val !== '0';\n }\n const underlineNode = findChild(fontNode, 'u');\n if (underlineNode) {\n const val = underlineNode.attributes.val ?? 'single';\n font.underline = val !== 'none' && val !== '0';\n }\n return font;\n}\n\nfunction readWorkbookRelationships(zipEntries: Record<string, Uint8Array>): Map<string, string> {\n return readPartRelationships(zipEntries, 'xl/workbook.xml');\n}\n\nfunction readPartRelationships(\n zipEntries: Record<string, Uint8Array>,\n partPath: string,\n): Map<string, string> {\n const relationships = new Map<string, string>();\n const relsPath = getRelationshipsPath(partPath);\n if (!zipEntries[relsPath]) {\n return relationships;\n }\n const xml = readXml(zipEntries, relsPath);\n const doc = parseXml(xml);\n const root = doc.children.find((child) => localName(child.name) === 'Relationships');\n if (!root) {\n return relationships;\n }\n const relationNodes = findChildren(root, 'Relationship');\n for (const rel of relationNodes) {\n const id = rel.attributes.Id;\n const target = rel.attributes.Target;\n if (!id || !target) {\n continue;\n }\n relationships.set(id, resolveRelationshipTarget(partPath, target));\n }\n return relationships;\n}\n\nfunction getRelationshipsPath(partPath: string): string {\n const lastSlash = partPath.lastIndexOf('/');\n const directory = lastSlash >= 0 ? partPath.slice(0, lastSlash + 1) : '';\n const file = lastSlash >= 0 ? partPath.slice(lastSlash + 1) : partPath;\n return `${directory}_rels/${file}.rels`.replace(/\\/+/g, '/');\n}\n\nfunction resolveRelationshipTarget(basePath: string, target: string): string {\n if (target.startsWith('/')) {\n return target.replace(/^\\//, '');\n }\n const baseParts = basePath.split('/');\n baseParts.pop();\n const segments = target.split('/');\n for (const segment of segments) {\n if (!segment || segment === '.') {\n continue;\n }\n if (segment === '..') {\n if (baseParts.length) {\n baseParts.pop();\n }\n } else {\n baseParts.push(segment);\n }\n }\n return baseParts.join('/');\n}\n\nfunction readXml(zipEntries: Record<string, Uint8Array>, path: string): string {\n const entry = zipEntries[path];\n if (!entry) {\n throw new Error(`File \"${path}\" was not found in the archive.`);\n }\n return decodeUtf8(entry);\n}\n\nfunction decodeUtf8(bytes: Uint8Array): string {\n if (textDecoder) {\n return textDecoder.decode(bytes);\n }\n let result = '';\n for (let i = 0; i < bytes.length; i += 1) {\n result += String.fromCharCode(bytes[i]);\n }\n return result;\n}\n\nfunction normalizeInput(input: ArrayBuffer | Uint8Array | string): Uint8Array {\n if (typeof input === 'string') {\n const buffer = new Uint8Array(input.length);\n for (let i = 0; i < input.length; i += 1) {\n buffer[i] = input.charCodeAt(i) & 0xff;\n }\n return buffer;\n }\n if (input instanceof Uint8Array) {\n return input;\n }\n return new Uint8Array(input);\n}\n\nfunction sheet_to_json<T = (string | number | boolean | null)[]>(sheet: WorkSheet, options?: SheetToJsonOptions): T[] {\n if (options?.header !== 1) {\n throw new Error('sheet_to_json currently supports header: 1 only.');\n }\n const defval = options?.defval ?? null;\n const raw = options?.raw ?? true;\n const rangeRef = sheet['!ref'] ?? inferSheetRange(sheet);\n const range = decodeRange(rangeRef);\n const maxRow = Math.max(range.e.r, 0);\n const maxCol = Math.max(range.e.c, 0);\n const totalRows = maxRow + 1;\n const totalCols = maxCol + 1;\n const rows: (string | number | boolean | null)[][] = new Array(totalRows);\n\n for (let r = range.s.r; r <= range.e.r; r += 1) {\n const row = ensureRow(rows, r, totalCols, defval);\n for (let c = range.s.c; c <= range.e.c; c += 1) {\n const address = encodeCell({ r, c });\n const cell = sheet[address] as CellObject | undefined;\n if (!cell) {\n continue;\n }\n row[c] = raw === false ? formatCell(cell) : (cell.v ?? defval);\n }\n }\n\n for (let r = 0; r < totalRows; r += 1) {\n ensureRow(rows, r, totalCols, defval);\n }\n\n return rows as unknown as T[];\n}\n\nfunction formatCell(cell: CellObject): string {\n if (cell.t === 'b') {\n return cell.v ? 'TRUE' : 'FALSE';\n }\n return cell.v !== null && cell.v !== undefined ? String(cell.v) : '';\n}\n\nfunction inferSheetRange(sheet: WorkSheet): string {\n let minRow = Number.MAX_SAFE_INTEGER;\n let minCol = Number.MAX_SAFE_INTEGER;\n let maxRow = 0;\n let maxCol = 0;\n Object.keys(sheet).forEach((key) => {\n if (!/^[A-Z]+[0-9]+$/.test(key)) {\n return;\n }\n const position = decodeCell(key);\n minRow = Math.min(minRow, position.r);\n minCol = Math.min(minCol, position.c);\n maxRow = Math.max(maxRow, position.r);\n maxCol = Math.max(maxCol, position.c);\n });\n if (minRow === Number.MAX_SAFE_INTEGER) {\n return 'A1:A1';\n }\n return encodeRange({\n s: { r: minRow, c: minCol },\n e: { r: maxRow, c: maxCol },\n });\n}\n\nfunction ensureRow(\n rows: (string | number | boolean | null)[][],\n index: number,\n columnCount: number,\n defval: string | number | boolean | null,\n): (string | number | boolean | null)[] {\n if (!rows[index]) {\n const row: (string | number | boolean | null)[] = new Array(columnCount);\n for (let i = 0; i < columnCount; i += 1) {\n row[i] = defval;\n }\n rows[index] = row;\n }\n return rows[index];\n}\n\nfunction resolveCellStyle(\n styleIndex: number | undefined,\n styles: WorkbookStyles | undefined,\n): CellStyle | undefined {\n if (!styles || typeof styleIndex !== 'number') {\n return undefined;\n }\n const xf = styles.CellXf?.[styleIndex];\n if (!xf) {\n return undefined;\n }\n const style: CellStyle = {};\n if (xf.alignment?.horizontal || xf.alignment?.vertical) {\n style.alignment = {};\n if (xf.alignment.horizontal) {\n style.alignment.horizontal = xf.alignment.horizontal;\n }\n if (xf.alignment.vertical) {\n style.alignment.vertical = xf.alignment.vertical;\n }\n }\n if (typeof xf.numFmtId === 'number') {\n style.numFmtId = xf.numFmtId;\n const customFormat = styles.NumberFormats?.get(xf.numFmtId);\n if (customFormat) {\n style.formatCode = customFormat;\n }\n }\n if (typeof xf.fontId === 'number' && xf.fontId >= 0) {\n const font = styles.Fonts?.[xf.fontId];\n if (font) {\n const normalizedFont: ExcelFont = {};\n if (font.name) {\n normalizedFont.name = font.name;\n }\n if (typeof font.size === 'number' && Number.isFinite(font.size)) {\n normalizedFont.size = font.size;\n }\n if (font.color) {\n normalizedFont.color = { ...font.color };\n }\n if (normalizedFont.name || normalizedFont.size || normalizedFont.color) {\n style.font = normalizedFont;\n }\n }\n }\n return style.alignment || style.font || style.numFmtId !== undefined ? style : undefined;\n}\n\nfunction encodeRange(range: Range): string {\n return `${encodeCell(range.s)}:${encodeCell(range.e)}`;\n}\n\nfunction decodeRange(ref: string): Range {\n const parts = ref.split(':');\n if (parts.length === 1) {\n const pos = decodeCell(parts[0]);\n return { s: pos, e: pos };\n }\n return { s: decodeCell(parts[0]), e: decodeCell(parts[1]) };\n}\n\nfunction encodeCell(position: { r: number; c: number }): string {\n return `${encodeCol(position.c)}${encodeRow(position.r)}`;\n}\n\nfunction decodeCell(address: string): { r: number; c: number } {\n const match = /^([A-Z]+)(\\d+)$/.exec(address.toUpperCase());\n if (!match) {\n throw new Error(`Invalid cell address \"${address}\".`);\n }\n return {\n c: decodeCol(match[1]),\n r: Number(match[2]) - 1,\n };\n}\n\nfunction encodeCol(columnIndex: number): string {\n let column = '';\n let index = columnIndex;\n while (index >= 0) {\n column = String.fromCharCode((index % 26) + 65) + column;\n index = Math.floor(index / 26) - 1;\n }\n return column;\n}\n\nfunction encodeRow(rowIndex: number): string {\n return String(rowIndex + 1);\n}\n\nfunction decodeCol(col: string): number {\n let result = 0;\n for (let i = 0; i < col.length; i += 1) {\n result = result * 26 + (col.charCodeAt(i) - 64);\n }\n return result - 1;\n}\n\nfunction charWidthToPixels(measure: number): number {\n if (!Number.isFinite(measure) || measure <= 0) {\n return 0;\n }\n const MAX_DIGIT_WIDTH = 7;\n const CELL_PADDING = 5;\n if (measure < 1) {\n return Math.floor(measure * (MAX_DIGIT_WIDTH + CELL_PADDING));\n }\n return Math.floor(measure * MAX_DIGIT_WIDTH + CELL_PADDING);\n}\n","import {\n read,\n utils,\n type WorkBook,\n type WorkSheet,\n type CellObject,\n type SheetFormatProperties,\n type DrawingAnchorPosition,\n type WorksheetImage,\n} from './xlsx';\nimport { DEFAULT_COLUMNS, DEFAULT_ROWS } from '../core/worksheet/gridDefaults';\nimport { type CellStyle, type TextAlign, type VerticalAlign } from '../core/style/cellStyle';\nimport { formatNumberWithFormat } from '../core/style/numberFormat';\nimport type { CellInputValue, MergedCellRange } from '../core/cell/types';\nimport type { BorderLineOptions, CellBorderDefinition } from '../core/border/types';\n\n// ---------------------------------------------------------------------------\n// Built-in Excel number format codes (numFmtId → format string)\n// ---------------------------------------------------------------------------\n\nconst BUILTIN_NUMBER_FORMATS: Record<number, string> = {\n 0: 'General',\n 1: '0',\n 2: '0.00',\n 3: '#,##0',\n 4: '#,##0.00',\n 5: '$#,##0_);($#,##0)',\n 6: '$#,##0_);[Red]($#,##0)',\n 7: '$#,##0.00_);($#,##0.00)',\n 8: '$#,##0.00_);[Red]($#,##0.00)',\n 9: '0%',\n 10: '0.00%',\n 11: '0.00E+00',\n 12: '# ?/?',\n 13: '# ??/??',\n 14: 'm/d/yy',\n 15: 'd-mmm-yy',\n 16: 'd-mmm',\n 17: 'mmm-yy',\n 18: 'h:mm AM/PM',\n 19: 'h:mm:ss AM/PM',\n 20: 'h:mm',\n 21: 'h:mm:ss',\n 22: 'm/d/yy h:mm',\n 37: '#,##0 ;(#,##0)',\n 38: '#,##0 ;[Red](#,##0)',\n 39: '#,##0.00;(#,##0.00)',\n 40: '#,##0.00;[Red](#,##0.00)',\n 41: '_(* #,##0_);_(* (#,##0);_(* \"-\"_);_(@_)',\n 42: '_(\"$\"* #,##0_);_(\"$\"* (#,##0);_(\"$\"* \"-\"_);_(@_)',\n 43: '_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(@_)',\n 44: '_(\"$\"* #,##0.00_);_(\"$\"* (#,##0.00);_(\"$\"* \"-\"??_);_(@_)',\n 45: 'mm:ss',\n 46: '[h]:mm:ss',\n 47: 'mm:ss.0',\n 48: '##0.0E+0',\n 49: '@',\n};\n\n// ---------------------------------------------------------------------------\n// Internal Excel type aliases\n// ---------------------------------------------------------------------------\n\ntype WorksheetMergeRange = { s: { r: number; c: number }; e: { r: number; c: number } };\ntype ColumnInfo = { wpx?: number; wch?: number; width?: number; custom?: boolean };\ntype RowInfo = { hpx?: number; hpt?: number; custom?: boolean };\ntype ExcelBorder = {\n left?: ExcelBorderLine;\n right?: ExcelBorderLine;\n top?: ExcelBorderLine;\n bottom?: ExcelBorderLine;\n};\ntype ExcelBorderLine = { style?: string; color?: ExcelColor };\ntype ExcelColor = { rgb?: string; indexed?: number; theme?: number; tint?: number };\ntype ExcelFontDefinition = {\n sz?: number;\n name?: string;\n color?: ExcelColor;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n};\ntype ExcelFill = { patternType?: string; fgColor?: ExcelColor; bgColor?: ExcelColor };\ntype AlignmentStyle = { horizontal?: TextAlign; vertical?: VerticalAlign };\n\nconst CELL_ADDRESS_REGEX = /^[A-Z]+[0-9]+$/i;\nconst EMUS_PER_PIXEL = 914400 / 96;\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type LoadXlsxOptions = { sheetName?: string };\n\n/** Shape of the return value from XlsxImporter.load(). */\nexport type LoadXlsxResult = { images: WorksheetImage[] };\n\n/**\n * Minimal interface of the worksheet object that the importer writes to.\n * Keeping this narrow makes the importer independent of the full Worksheet class.\n */\nexport interface XlsxImportTarget {\n rows: number;\n columns: number;\n setGridSize(rows: number, columns: number): void;\n setShowGridLines(visible: boolean): void;\n applyColumnWidths(\n widths: Map<number, number>,\n options?: { customColumns?: Set<number>; enforceMinColumnWidth?: boolean },\n ): void;\n applyRowHeights(heights: Map<number, number>, options?: { customRows?: Set<number> }): void;\n applyCellBorders(borders: Map<string, CellBorderDefinition>): void;\n setMergedRanges(ranges: Iterable<MergedCellRange>): void;\n loadCells(cells: Iterable<CellInputValue>): void;\n setScrollOffset(x: number, y: number): void;\n autoFitRows(options?: { rows?: number[]; respectCustomHeight?: boolean }): void;\n}\n\n// ---------------------------------------------------------------------------\n// XlsxImporter\n// ---------------------------------------------------------------------------\n\n/**\n * Parses an xlsx file and loads its data into an XlsxImportTarget (typically a Worksheet).\n * Create a new instance per load operation.\n */\nexport class XlsxImporter {\n private readonly binaryDecoder: TextDecoder | null =\n typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-8') : null;\n\n private indexedColors: Map<number, string> | null = null;\n\n constructor(private readonly worksheet: XlsxImportTarget) {}\n\n load(data: ArrayBuffer | Uint8Array | string, options?: LoadXlsxOptions): LoadXlsxResult {\n this.indexedColors = null;\n const workbook = this.readWorkbook(data);\n this.indexedColors = this.buildIndexedColorMap(workbook);\n\n const sheetName = options?.sheetName ?? workbook.SheetNames[0];\n if (!sheetName) {\n throw new Error('Workbook does not contain any sheets.');\n }\n const sheet = workbook.Sheets[sheetName];\n if (!sheet) {\n throw new Error(`Sheet \"${sheetName}\" was not found.`);\n }\n\n const { rows, columns } = this.determineSheetDimensions(sheet);\n this.worksheet.setGridSize(rows, columns);\n\n const sheetIndex = workbook.SheetNames.indexOf(sheetName);\n if (sheetIndex < 0) {\n throw new Error(`Unable to resolve sheet index for \"${sheetName}\".`);\n }\n\n const showGridLines = this.resolveSheetGridLineVisibility(sheet);\n this.worksheet.setShowGridLines(showGridLines ?? true);\n\n const { widths: columnWidths, customColumns } = this.extractColumnWidths(sheet);\n const { heights: rowHeights, customRows } = this.extractRowHeights(sheet);\n this.worksheet.applyColumnWidths(columnWidths, {\n customColumns,\n enforceMinColumnWidth: false,\n });\n this.worksheet.applyRowHeights(rowHeights, { customRows });\n\n const styleIndexes = this.extractCellStyleIndexes(workbook, sheetIndex);\n const cellBorders = this.extractCellBorders(workbook, styleIndexes);\n const numberFormats = this.buildStyleNumberFormatMap(workbook);\n const styleAlignments = this.buildStyleAlignmentMap(workbook);\n const styleFills = this.buildStyleFillMap(workbook);\n const styleFonts = this.buildStyleFontMap(workbook);\n this.worksheet.applyCellBorders(cellBorders);\n\n const sheetMerges = (sheet['!merges'] as WorksheetMergeRange[] | undefined) ?? [];\n const cells = this.extractCells(\n sheet,\n sheetMerges,\n styleIndexes,\n numberFormats,\n styleAlignments,\n styleFills,\n styleFonts,\n );\n const mergedRanges = this.extractMergedRanges(sheetMerges);\n this.worksheet.setMergedRanges(mergedRanges);\n this.worksheet.loadCells(cells);\n this.worksheet.setScrollOffset(0, 0);\n this.worksheet.autoFitRows({ respectCustomHeight: true });\n\n const sheetImages = (sheet['!images'] as WorksheetImage[] | undefined) ?? [];\n const images = sheetImages.map((image) => ({\n ...image,\n data: new Uint8Array(image.data),\n }));\n\n return { images };\n }\n\n private readWorkbook(data: ArrayBuffer | Uint8Array | string): WorkBook {\n if (typeof data === 'string') {\n return read(data, { type: 'binary', cellStyles: true, bookFiles: true });\n }\n const buffer = data instanceof Uint8Array ? data : new Uint8Array(data);\n return read(buffer, { type: 'array', cellStyles: true, bookFiles: true });\n }\n\n private determineSheetDimensions(sheet: WorkSheet): { rows: number; columns: number } {\n const ref = sheet['!ref'];\n if (typeof ref === 'string') {\n const range = utils.decode_range(ref);\n return { rows: Math.max(1, range.e.r + 1), columns: Math.max(1, range.e.c + 1) };\n }\n let maxRow = -1;\n let maxCol = -1;\n for (const address of Object.keys(sheet)) {\n if (!CELL_ADDRESS_REGEX.test(address)) {\n continue;\n }\n const position = utils.decode_cell(address);\n maxRow = Math.max(maxRow, position.r);\n maxCol = Math.max(maxCol, position.c);\n }\n if (maxRow < 0 || maxCol < 0) {\n return { rows: DEFAULT_ROWS, columns: DEFAULT_COLUMNS };\n }\n return { rows: maxRow + 1, columns: maxCol + 1 };\n }\n\n private resolveSheetGridLineVisibility(sheet: WorkSheet): boolean | null {\n const flag = sheet['!sheetView']?.showGridLines;\n return typeof flag === 'boolean' ? flag : null;\n }\n\n private extractCells(\n sheet: WorkSheet,\n merges: WorksheetMergeRange[],\n styleIndexes: Map<string, number>,\n numberFormats: Map<number, string>,\n styleAlignments: Map<number, AlignmentStyle>,\n styleFills: Map<number, string>,\n styleFonts: Map<\n number,\n {\n color?: string;\n fontFamily?: string;\n fontSize?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n }\n >,\n ): CellInputValue[] {\n const rows = utils.sheet_to_json<(string | number | boolean | null)[]>(sheet, {\n header: 1,\n raw: true,\n defval: '',\n });\n\n const maxRows = Math.min(rows.length, this.worksheet.rows);\n const cells: CellInputValue[] = [];\n for (let r = 0; r < maxRows; r += 1) {\n const row = rows[r];\n const maxColumns = Math.min(row.length, this.worksheet.columns);\n for (let c = 0; c < maxColumns; c += 1) {\n const cellValue = row[c];\n const address = utils.encode_cell({ r, c });\n const cellMeta = sheet[address] as CellObject | undefined;\n const styleIndex = styleIndexes.get(address);\n const styleAlignment =\n styleIndex !== undefined ? styleAlignments.get(styleIndex) : undefined;\n const textAlign = this.getHorizontalAlignment(\n cellMeta,\n merges,\n r,\n c,\n styleAlignment?.horizontal,\n );\n const verticalAlign = this.getVerticalAlignment(\n cellMeta,\n merges,\n r,\n c,\n styleAlignment?.vertical,\n );\n const backgroundColor = styleIndex !== undefined ? styleFills.get(styleIndex) : undefined;\n const fontOverrides = styleIndex !== undefined ? styleFonts.get(styleIndex) : undefined;\n const style = this.buildCellStyle(\n cellMeta,\n textAlign,\n verticalAlign,\n backgroundColor,\n fontOverrides,\n );\n const formatCode = styleIndex !== undefined ? numberFormats.get(styleIndex) : undefined;\n const rawString = this.serializeRawCellValue(cellValue ?? null);\n const formattedValue =\n typeof cellValue === 'number' && formatCode\n ? formatNumberWithFormat(cellValue, formatCode)\n : null;\n const richText = cellMeta?.richText;\n const hasValue = rawString !== null && rawString.length > 0;\n if (!hasValue && !style && !richText?.length) {\n continue;\n }\n cells.push({\n row: r,\n column: c,\n value: rawString ?? '',\n displayValue: formattedValue ?? undefined,\n numberFormat: formatCode,\n style,\n richText: richText && richText.length ? richText.map((run) => ({ ...run })) : undefined,\n });\n }\n }\n return cells;\n }\n\n private extractMergedRanges(merges: WorksheetMergeRange[]): MergedCellRange[] {\n const normalized: MergedCellRange[] = [];\n for (const merge of merges) {\n const top = Math.min(Math.max(merge.s.r, 0), this.worksheet.rows - 1);\n const bottom = Math.min(Math.max(merge.e.r, 0), this.worksheet.rows - 1);\n const left = Math.min(Math.max(merge.s.c, 0), this.worksheet.columns - 1);\n const right = Math.min(Math.max(merge.e.c, 0), this.worksheet.columns - 1);\n const normalizedTop = Math.min(top, bottom);\n const normalizedBottom = Math.max(top, bottom);\n const normalizedLeft = Math.min(left, right);\n const normalizedRight = Math.max(left, right);\n if (normalizedTop === normalizedBottom && normalizedLeft === normalizedRight) {\n continue;\n }\n normalized.push({\n topRow: normalizedTop,\n bottomRow: normalizedBottom,\n leftColumn: normalizedLeft,\n rightColumn: normalizedRight,\n });\n }\n return normalized;\n }\n\n private extractColumnWidths(sheet: WorkSheet): {\n widths: Map<number, number>;\n customColumns: Set<number>;\n } {\n const output = new Map<number, number>();\n const customColumns = new Set<number>();\n const sheetFormat = this.getSheetFormat(sheet);\n const defaultWidth = this.normalizeDefaultColumnWidth(sheetFormat?.defaultColWidth);\n if (defaultWidth !== null) {\n for (let column = 0; column < this.worksheet.columns; column += 1) {\n output.set(column, defaultWidth);\n }\n }\n const columns = sheet['!cols'] as ColumnInfo[] | undefined;\n if (!Array.isArray(columns)) {\n return { widths: output, customColumns };\n }\n for (let index = 0; index < columns.length && index < this.worksheet.columns; index += 1) {\n const col = columns[index];\n if (!col) {\n continue;\n }\n const width = this.normalizeColumnWidth(col);\n if (width !== null) {\n output.set(index, width);\n }\n if (col.custom) {\n customColumns.add(index);\n }\n }\n return { widths: output, customColumns };\n }\n\n private extractRowHeights(sheet: WorkSheet): {\n heights: Map<number, number>;\n customRows: Set<number>;\n } {\n const output = new Map<number, number>();\n const customRows = new Set<number>();\n const sheetFormat = this.getSheetFormat(sheet);\n const defaultHeight = this.normalizeDefaultRowHeight(sheetFormat?.defaultRowHeight);\n if (defaultHeight !== null) {\n for (let row = 0; row < this.worksheet.rows; row += 1) {\n output.set(row, defaultHeight);\n }\n }\n const rows = sheet['!rows'] as RowInfo[] | undefined;\n if (!Array.isArray(rows)) {\n return { heights: output, customRows };\n }\n for (let index = 0; index < rows.length && index < this.worksheet.rows; index += 1) {\n const row = rows[index];\n if (!row) {\n continue;\n }\n const height = this.normalizeRowHeight(row);\n if (height !== null) {\n output.set(index, height);\n if (row.custom) {\n customRows.add(index);\n }\n }\n }\n return { heights: output, customRows };\n }\n\n private extractCellStyleIndexes(workbook: WorkBook, sheetIndex: number): Map<string, number> {\n const xml = this.getSheetXml(workbook, sheetIndex);\n if (!xml) {\n return new Map();\n }\n const regex = /<c\\b([^>]*)>/g;\n const map = new Map<string, number>();\n let match: RegExpExecArray | null;\n while ((match = regex.exec(xml)) !== null) {\n const attrs = match[1];\n const refMatch = /r=\"([^\"]+)\"/.exec(attrs);\n const styleMatch = /s=\"([^\"]+)\"/.exec(attrs);\n if (!refMatch || !styleMatch) {\n continue;\n }\n const styleIndex = Number(styleMatch[1]);\n if (!Number.isFinite(styleIndex)) {\n continue;\n }\n map.set(refMatch[1], styleIndex);\n }\n return map;\n }\n\n private extractCellBorders(\n workbook: WorkBook,\n styleIndexes: Map<string, number>,\n ): Map<string, CellBorderDefinition> {\n if (!styleIndexes.size) {\n return new Map();\n }\n const styles = this.buildStyleBorderMap(workbook);\n if (!styles.size) {\n return new Map();\n }\n const borders = new Map<string, CellBorderDefinition>();\n for (const [address, styleIndex] of styleIndexes.entries()) {\n const border = styles.get(styleIndex);\n if (!border) {\n continue;\n }\n const decoded = utils.decode_cell(address);\n if (\n decoded.r < 0 ||\n decoded.c < 0 ||\n decoded.r >= this.worksheet.rows ||\n decoded.c >= this.worksheet.columns\n ) {\n continue;\n }\n borders.set(`${decoded.r}:${decoded.c}`, border);\n }\n return borders;\n }\n\n private buildStyleNumberFormatMap(workbook: WorkBook): Map<number, string> {\n const map = new Map<number, string>();\n const styles = workbook.Styles;\n const cellXfs = styles?.CellXf ?? [];\n cellXfs.forEach((xf, index) => {\n const numFmtId = this.parseIndex(xf.numFmtId);\n if (numFmtId === null) {\n return;\n }\n const code = styles?.NumberFormats?.get(numFmtId) ?? BUILTIN_NUMBER_FORMATS[numFmtId];\n if (code) {\n map.set(index, code);\n }\n });\n return map;\n }\n\n private buildStyleAlignmentMap(workbook: WorkBook): Map<number, AlignmentStyle> {\n const workbookAny = workbook as unknown as {\n Styles?: { CellXf?: Array<{ alignment?: { horizontal?: string; vertical?: string } }> };\n };\n const cellXfs = workbookAny.Styles?.CellXf ?? [];\n const map = new Map<number, AlignmentStyle>();\n cellXfs.forEach((xf, index) => {\n const horizontal = this.normalizeHorizontalAlignment(xf.alignment?.horizontal);\n const vertical = this.normalizeVerticalAlignment(xf.alignment?.vertical);\n if (horizontal || vertical) {\n map.set(index, { horizontal, vertical });\n }\n });\n return map;\n }\n\n private buildStyleFillMap(workbook: WorkBook): Map<number, string> {\n const workbookAny = workbook as unknown as {\n Styles?: {\n CellXf?: Array<{ fillId?: number | string; [key: string]: unknown }>;\n Fills?: Array<ExcelFill | undefined>;\n };\n };\n const cellXfs = workbookAny.Styles?.CellXf ?? [];\n const fills = (workbookAny.Styles?.Fills ?? []) as Array<ExcelFill | undefined>;\n const map = new Map<number, string>();\n cellXfs.forEach((xf, index) => {\n const fillIndex = this.parseIndex(xf.fillId ?? xf.fillid);\n if (fillIndex === null) {\n return;\n }\n const fill = fills[fillIndex];\n const color = this.convertExcelFill(fill);\n if (color) {\n map.set(index, color);\n }\n });\n return map;\n }\n\n private buildStyleFontMap(workbook: WorkBook): Map<\n number,\n {\n color?: string;\n fontFamily?: string;\n fontSize?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n }\n > {\n const workbookAny = workbook as unknown as {\n Styles?: {\n CellXf?: Array<{ fontId?: number | string; [key: string]: unknown }>;\n Fonts?: Array<ExcelFontDefinition | undefined>;\n };\n };\n const cellXfs = workbookAny.Styles?.CellXf ?? [];\n const fonts = (workbookAny.Styles?.Fonts ?? []) as Array<ExcelFontDefinition | undefined>;\n const map = new Map<\n number,\n {\n color?: string;\n fontFamily?: string;\n fontSize?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n }\n >();\n cellXfs.forEach((xf, index) => {\n const fontIndex = this.parseIndex(xf.fontId ?? xf.fontid);\n if (fontIndex === null) {\n return;\n }\n const font = fonts[fontIndex];\n if (!font) {\n return;\n }\n const color = this.extractFontColor(font) ?? undefined;\n const fontFamily = font?.name;\n const fontSize = typeof font?.sz === 'number' ? font.sz : undefined;\n const bold = typeof font?.bold === 'boolean' ? font.bold : undefined;\n const italic = typeof font?.italic === 'boolean' ? font.italic : undefined;\n const underline = typeof font?.underline === 'boolean' ? font.underline : undefined;\n if (color || fontFamily || fontSize || bold !== undefined || italic !== undefined || underline !== undefined) {\n map.set(index, { color, fontFamily, fontSize, bold, italic, underline });\n }\n });\n return map;\n }\n\n private buildStyleBorderMap(workbook: WorkBook): Map<number, CellBorderDefinition> {\n const workbookAny = workbook as unknown as {\n Styles?: {\n CellXf?: Array<{ borderId?: number | string; [key: string]: unknown }>;\n Borders?: ExcelBorder[];\n };\n };\n const cellXfs = (workbookAny.Styles?.CellXf ?? []) as Array<{\n borderId?: number | string;\n [key: string]: unknown;\n }>;\n const borders = (workbookAny.Styles?.Borders ?? []) as ExcelBorder[];\n const map = new Map<number, CellBorderDefinition>();\n cellXfs.forEach((xf, index) => {\n const borderIndex = this.parseIndex(xf.borderId ?? xf.borderid);\n if (borderIndex === null) {\n return;\n }\n const excelBorder = borders[borderIndex];\n const converted = this.convertExcelBorder(excelBorder);\n if (converted) {\n map.set(index, converted);\n }\n });\n return map;\n }\n\n private convertExcelFill(fill?: ExcelFill): string | null {\n if (!fill) {\n return null;\n }\n const patternType = fill.patternType?.toLowerCase();\n if (patternType && patternType !== 'solid') {\n return null;\n }\n const color = fill.fgColor ?? fill.bgColor;\n if (!color) {\n return null;\n }\n return this.convertExcelColor(color, '#ffffff');\n }\n\n private convertExcelBorder(border?: ExcelBorder): CellBorderDefinition | null {\n if (!border) {\n return null;\n }\n const result: CellBorderDefinition = {};\n const top = this.convertExcelBorderLine(border.top);\n const right = this.convertExcelBorderLine(border.right);\n const bottom = this.convertExcelBorderLine(border.bottom);\n const left = this.convertExcelBorderLine(border.left);\n if (top) {\n result.top = top;\n }\n if (right) {\n result.right = right;\n }\n if (bottom) {\n result.bottom = bottom;\n }\n if (left) {\n result.left = left;\n }\n return Object.keys(result).length ? result : null;\n }\n\n private convertExcelBorderLine(edge?: ExcelBorderLine) {\n if (!edge || !edge.style) {\n return undefined;\n }\n const { style, width } = this.mapExcelBorderStyle(edge.style);\n const color = this.convertExcelColor(edge.color);\n return { style, width, color };\n }\n\n private mapExcelBorderStyle(excelStyle: string): {\n style: BorderLineOptions['style'];\n width: number;\n } {\n switch (excelStyle) {\n case 'dotted':\n return { style: 'dotted', width: 1 };\n case 'dashDot':\n case 'dashDotDot':\n case 'dashed':\n return { style: 'dashed', width: 1 };\n case 'mediumDashDot':\n case 'mediumDashDotDot':\n case 'mediumDashed':\n return { style: 'dashed', width: 2 };\n case 'thick':\n case 'double':\n return { style: 'solid', width: 3 };\n case 'medium':\n return { style: 'solid', width: 2 };\n case 'hair':\n case 'thin':\n default:\n return { style: 'solid', width: 1 };\n }\n }\n\n private convertExcelColor(color?: ExcelColor, fallback = '#1f2933'): string {\n return this.resolveExcelColor(color) ?? fallback;\n }\n\n private resolveExcelColor(color?: ExcelColor): string | null {\n if (!color) {\n return null;\n }\n if (color.rgb) {\n const normalized = this.normalizeColorHex(color.rgb);\n if (normalized) {\n return normalized;\n }\n }\n if (color.indexed !== undefined) {\n const paletteColor = this.indexedColors?.get(color.indexed);\n if (paletteColor) {\n return paletteColor;\n }\n }\n return null;\n }\n\n private normalizeColorHex(value: string | null | undefined): string | null {\n if (!value) {\n return null;\n }\n const hex = value.replace(/^#/, '');\n if (hex.length === 8) {\n return `#${hex.slice(2)}`;\n }\n if (hex.length === 6) {\n return `#${hex}`;\n }\n return null;\n }\n\n private extractFontColor(font?: ExcelFontDefinition): string | null {\n if (!font?.color) {\n return null;\n }\n return this.convertExcelColor(font.color);\n }\n\n private buildIndexedColorMap(workbook: WorkBook): Map<number, string> | null {\n const indexed = workbook.Styles?.Colors?.indexed;\n if (!indexed || indexed.length === 0) {\n return null;\n }\n const map = new Map<number, string>();\n indexed.forEach((value, index) => {\n const normalized = this.normalizeColorHex(value);\n if (normalized) {\n map.set(index, normalized);\n }\n });\n return map.size ? map : null;\n }\n\n private getSheetXml(workbook: WorkBook, sheetIndex: number): string | null {\n const workbookAny = workbook as unknown as {\n Directory?: { sheets?: string[] };\n files?: Record<string, { content?: unknown } | ArrayBuffer | Uint8Array | string>;\n };\n const sheets = workbookAny.Directory?.sheets;\n if (!sheets || sheetIndex < 0 || sheetIndex >= sheets.length) {\n return null;\n }\n const path = sheets[sheetIndex]?.replace(/^\\/+/, '');\n if (!path) {\n return null;\n }\n const fileRecord = workbookAny.files?.[path];\n if (!fileRecord) {\n return null;\n }\n const raw = (fileRecord as { content?: unknown }).content ?? fileRecord;\n return this.decodeBinaryString(raw);\n }\n\n private decodeBinaryString(data: unknown): string | null {\n if (!data) {\n return null;\n }\n if (typeof data === 'string') {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return this.decodeWithTextDecoder(new Uint8Array(data));\n }\n if (ArrayBuffer.isView(data)) {\n const view = data as ArrayBufferView;\n const array = new Uint8Array(view.buffer, view.byteOffset, view.byteLength);\n return this.decodeWithTextDecoder(array);\n }\n return null;\n }\n\n private decodeWithTextDecoder(bytes: Uint8Array): string {\n if (this.binaryDecoder) {\n return this.binaryDecoder.decode(bytes);\n }\n let result = '';\n for (let i = 0; i < bytes.length; i += 1) {\n result += String.fromCharCode(bytes[i]);\n }\n return result;\n }\n\n private parseIndex(value: unknown): number | null {\n const parsed = typeof value === 'string' ? Number.parseInt(value, 10) : Number(value);\n return Number.isFinite(parsed) ? parsed : null;\n }\n\n private getSheetFormat(sheet: WorkSheet): SheetFormatProperties | undefined {\n const format = sheet['!sheetFormat'];\n if (format && typeof format === 'object') {\n return format as SheetFormatProperties;\n }\n return undefined;\n }\n\n private normalizeColumnWidth(column: ColumnInfo): number | null {\n if (typeof column.wpx === 'number' && column.wpx > 0) {\n return column.wpx;\n }\n if (typeof column.width === 'number' && column.width > 0) {\n return this.charWidthToPixels(column.width);\n }\n if (typeof column.wch === 'number' && column.wch > 0) {\n return this.charWidthToPixels(column.wch);\n }\n return null;\n }\n\n private normalizeRowHeight(row: RowInfo): number | null {\n if (typeof row.hpx === 'number' && row.hpx > 0) {\n return row.hpx;\n }\n if (typeof row.hpt === 'number' && row.hpt > 0) {\n return row.hpt * (96 / 72);\n }\n return null;\n }\n\n private normalizeDefaultColumnWidth(width?: number): number | null {\n if (typeof width !== 'number' || Number.isNaN(width) || width <= 0) {\n return null;\n }\n return this.charWidthToPixels(width);\n }\n\n private normalizeDefaultRowHeight(height?: number): number | null {\n if (typeof height !== 'number' || Number.isNaN(height) || height <= 0) {\n return null;\n }\n return height * (96 / 72);\n }\n\n private charWidthToPixels(measure: number): number {\n if (!Number.isFinite(measure) || measure <= 0) {\n return 0;\n }\n const MAX_DIGIT_WIDTH = 7; // Excel default for Calibri 11\n const CELL_PADDING = 5; // Excel adds ~5px padding to each column\n if (measure < 1) {\n return Math.floor(measure * (MAX_DIGIT_WIDTH + CELL_PADDING));\n }\n return Math.floor(measure * MAX_DIGIT_WIDTH + CELL_PADDING);\n }\n\n private getHorizontalAlignment(\n cell: CellObject | undefined,\n merges: WorksheetMergeRange[],\n row: number,\n column: number,\n styleAlignment?: TextAlign,\n ): TextAlign | undefined {\n const explicit =\n styleAlignment ??\n this.normalizeHorizontalAlignment(\n (cell?.s as { alignment?: { horizontal?: string } } | undefined)?.alignment?.horizontal,\n );\n if (explicit) {\n return explicit;\n }\n if (cell && (cell.t === 'n' || cell.t === 'd')) {\n return 'right';\n }\n return undefined;\n }\n\n private getVerticalAlignment(\n cell: CellObject | undefined,\n merges: WorksheetMergeRange[],\n row: number,\n column: number,\n styleAlignment?: VerticalAlign,\n ): VerticalAlign | undefined {\n return (\n styleAlignment ??\n this.normalizeVerticalAlignment(\n (cell?.s as { alignment?: { vertical?: string } } | undefined)?.alignment?.vertical,\n )\n );\n }\n\n private buildCellStyle(\n cell: CellObject | undefined,\n textAlign: TextAlign | undefined,\n verticalAlign: VerticalAlign | undefined,\n backgroundColor: string | undefined,\n fontOverrides?: {\n color?: string;\n fontFamily?: string;\n fontSize?: number;\n bold?: boolean;\n italic?: boolean;\n underline?: boolean;\n },\n ): Partial<CellStyle> | undefined {\n const style: Partial<CellStyle> = {};\n if (textAlign) {\n style.textAlign = textAlign;\n }\n if (verticalAlign) {\n style.verticalAlign = verticalAlign;\n }\n if (backgroundColor) {\n style.backgroundColor = backgroundColor;\n }\n const resolvedFontColor = this.getCellFontColor(cell) ?? fontOverrides?.color;\n if (resolvedFontColor) {\n style.color = resolvedFontColor;\n }\n const fontFamily = this.getCellFontFamily(cell) ?? fontOverrides?.fontFamily;\n if (fontFamily) {\n style.fontFamily = fontFamily;\n }\n const fontSize = this.getCellFontSize(cell) ?? fontOverrides?.fontSize;\n if (fontSize) {\n style.fontSize = fontSize;\n }\n const fontBold = this.getCellFontBold(cell) ?? fontOverrides?.bold;\n if (fontBold !== undefined) {\n style.bold = fontBold;\n }\n const fontItalic = this.getCellFontItalic(cell) ?? fontOverrides?.italic;\n if (fontItalic !== undefined) {\n style.italic = fontItalic;\n }\n const fontUnderline = this.getCellFontUnderline(cell) ?? fontOverrides?.underline;\n if (fontUnderline !== undefined) {\n style.underline = fontUnderline;\n }\n return Object.keys(style).length ? style : undefined;\n }\n\n private getCellFontColor(cell: CellObject | undefined): string | undefined {\n const fontColor = (cell?.s as { font?: { color?: ExcelColor } } | undefined)?.font?.color;\n if (!fontColor) {\n return undefined;\n }\n return this.convertExcelColor(fontColor);\n }\n\n private getCellFontFamily(cell: CellObject | undefined): string | undefined {\n const fontName = (cell?.s as { font?: { name?: string } } | undefined)?.font?.name;\n if (typeof fontName === 'string' && fontName.trim().length > 0) {\n return fontName;\n }\n return undefined;\n }\n\n private getCellFontSize(cell: CellObject | undefined): number | undefined {\n const fontSize = (cell?.s as { font?: { size?: number } } | undefined)?.font?.size;\n if (typeof fontSize !== 'number' || Number.isNaN(fontSize) || fontSize <= 0) {\n return undefined;\n }\n return fontSize;\n }\n\n private getCellFontBold(cell: CellObject | undefined): boolean | undefined {\n const fontBold = (cell?.s as { font?: { bold?: boolean } } | undefined)?.font?.bold;\n return typeof fontBold === 'boolean' ? fontBold : undefined;\n }\n\n private getCellFontItalic(cell: CellObject | undefined): boolean | undefined {\n const fontItalic = (cell?.s as { font?: { italic?: boolean } } | undefined)?.font?.italic;\n return typeof fontItalic === 'boolean' ? fontItalic : undefined;\n }\n\n private getCellFontUnderline(cell: CellObject | undefined): boolean | undefined {\n const fontUnderline = (cell?.s as { font?: { underline?: boolean } } | undefined)?.font?.underline;\n return typeof fontUnderline === 'boolean' ? fontUnderline : undefined;\n }\n\n private normalizeHorizontalAlignment(value?: string): TextAlign | undefined {\n switch (value) {\n case 'center':\n case 'centerContinuous':\n case 'distributed':\n case 'justify':\n return 'center';\n case 'right':\n return 'right';\n case 'left':\n return 'left';\n default:\n return undefined;\n }\n }\n\n private normalizeVerticalAlignment(value?: string): VerticalAlign | undefined {\n switch (value) {\n case 'center':\n case 'centerContinuous':\n case 'distributed':\n case 'justify':\n case 'middle':\n return 'middle';\n case 'bottom':\n return 'bottom';\n case 'top':\n return 'top';\n default:\n return undefined;\n }\n }\n\n private serializeRawCellValue(value: string | number | boolean | null): string | null {\n if (value === null || value === undefined) {\n return null;\n }\n if (typeof value === 'string') {\n return value;\n }\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value.toString() : null;\n }\n if (typeof value === 'boolean') {\n return value ? 'TRUE' : 'FALSE';\n }\n return null;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Image URL helpers (used by WorksheetAPI after import)\n// ---------------------------------------------------------------------------\n\nexport type WorksheetImageAnchorPosition = {\n row: number;\n column: number;\n offsetX: number;\n offsetY: number;\n};\n\nexport type WorksheetImagePlacement =\n | { type: 'oneCell'; from: WorksheetImageAnchorPosition; width: number; height: number }\n | { type: 'twoCell'; from: WorksheetImageAnchorPosition; to: WorksheetImageAnchorPosition };\n\nexport type WorksheetImageInfo = {\n id: string;\n mimeType: string;\n data: Uint8Array;\n anchor: WorksheetImagePlacement;\n};\n\nexport function convertImageInfo(image: WorksheetImage): WorksheetImageInfo {\n return {\n id: image.id,\n mimeType: image.mimeType,\n data: image.data,\n anchor: convertAnchor(image.anchor),\n };\n}\n\nfunction convertAnchor(anchor: WorksheetImage['anchor']): WorksheetImagePlacement {\n if (anchor.type === 'oneCell') {\n return {\n type: 'oneCell',\n from: convertAnchorPosition(anchor.from),\n width: emuToPixels(anchor.width),\n height: emuToPixels(anchor.height),\n };\n }\n return {\n type: 'twoCell',\n from: convertAnchorPosition(anchor.from),\n to: convertAnchorPosition(anchor.to),\n };\n}\n\nfunction convertAnchorPosition(position: DrawingAnchorPosition): WorksheetImageAnchorPosition {\n return {\n row: position.row,\n column: position.column,\n offsetX: emuToPixels(position.columnOffset),\n offsetY: emuToPixels(position.rowOffset),\n };\n}\n\nfunction emuToPixels(value: number): number {\n return Number.isFinite(value) ? value / EMUS_PER_PIXEL : 0;\n}\n\nexport function buildImageUrl(image: WorksheetImage): string {\n if (\n typeof Blob !== 'undefined' &&\n typeof URL !== 'undefined' &&\n typeof URL.createObjectURL === 'function'\n ) {\n const view = image.data;\n const buffer =\n view.byteOffset === 0 && view.byteLength === view.buffer.byteLength\n ? (view.buffer as ArrayBuffer)\n : (view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength) as ArrayBuffer);\n const blob = new Blob([buffer], { type: image.mimeType });\n return URL.createObjectURL(blob);\n }\n return `data:${image.mimeType};base64,${encodeBase64(image.data)}`;\n}\n\nfunction encodeBase64(data: Uint8Array): string {\n if (typeof btoa === 'function') {\n let binary = '';\n for (let i = 0; i < data.length; i += 1) {\n binary += String.fromCharCode(data[i]);\n }\n return btoa(binary);\n }\n throw new Error('Base64 encoding is not supported in this environment.');\n}\n","const LOCAL_FILE_HEADER_SIGNATURE = 0x04034b50;\nconst CENTRAL_DIRECTORY_SIGNATURE = 0x02014b50;\nconst END_OF_CENTRAL_DIR_SIGNATURE = 0x06054b50;\n\nconst textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\n\nconst CRC32_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let i = 0; i < 256; i += 1) {\n let value = i;\n for (let bit = 0; bit < 8; bit += 1) {\n value = (value & 1) === 1 ? 0xedb88320 ^ (value >>> 1) : value >>> 1;\n }\n table[i] = value >>> 0;\n }\n return table;\n})();\n\nfunction encodeUtf8(input: string): Uint8Array {\n if (textEncoder) {\n return textEncoder.encode(input);\n }\n const buffer = new Uint8Array(input.length);\n for (let i = 0; i < input.length; i += 1) {\n buffer[i] = input.charCodeAt(i);\n }\n return buffer;\n}\n\nfunction crc32(data: Uint8Array): number {\n let crc = 0xffffffff;\n for (let i = 0; i < data.length; i += 1) {\n crc = CRC32_TABLE[(crc ^ data[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xffffffff) >>> 0;\n}\n\nexport function createZip(entries: Array<{ name: string; data: Uint8Array }>): Uint8Array {\n const fileChunks: Uint8Array[] = [];\n const centralChunks: Uint8Array[] = [];\n let offset = 0;\n\n for (const entry of entries) {\n const nameBytes = encodeUtf8(entry.name);\n const entryCrc = crc32(entry.data);\n const localHeader = new Uint8Array(30 + nameBytes.length);\n const localView = new DataView(localHeader.buffer);\n localView.setUint32(0, LOCAL_FILE_HEADER_SIGNATURE, true);\n localView.setUint16(4, 20, true); // version needed to extract\n localView.setUint16(6, 0, true); // general purpose bit flag\n localView.setUint16(8, 0, true); // compression (0 = store)\n localView.setUint16(10, 0, true); // mod time\n localView.setUint16(12, 0, true); // mod date\n localView.setUint32(14, entryCrc, true);\n localView.setUint32(18, entry.data.length, true);\n localView.setUint32(22, entry.data.length, true);\n localView.setUint16(26, nameBytes.length, true);\n localView.setUint16(28, 0, true); // extra field length\n localHeader.set(nameBytes, 30);\n\n fileChunks.push(localHeader);\n fileChunks.push(entry.data);\n\n const centralHeader = new Uint8Array(46 + nameBytes.length);\n const centralView = new DataView(centralHeader.buffer);\n centralView.setUint32(0, CENTRAL_DIRECTORY_SIGNATURE, true);\n centralView.setUint16(4, 20, true); // version made by\n centralView.setUint16(6, 20, true); // version needed to extract\n centralView.setUint16(8, 0, true); // general purpose bit flag\n centralView.setUint16(10, 0, true); // compression\n centralView.setUint16(12, 0, true); // mod time\n centralView.setUint16(14, 0, true); // mod date\n centralView.setUint32(16, entryCrc, true);\n centralView.setUint32(20, entry.data.length, true);\n centralView.setUint32(24, entry.data.length, true);\n centralView.setUint16(28, nameBytes.length, true);\n centralView.setUint16(30, 0, true); // extra field length\n centralView.setUint16(32, 0, true); // file comment length\n centralView.setUint16(34, 0, true); // disk number start\n centralView.setUint16(36, 0, true); // internal file attributes\n centralView.setUint32(40, 0, true); // external file attributes\n centralView.setUint32(42, offset, true);\n centralHeader.set(nameBytes, 46);\n\n centralChunks.push(centralHeader);\n\n offset += localHeader.length + entry.data.length;\n }\n\n const centralDirOffset = offset;\n const centralDirSize = centralChunks.reduce((sum, chunk) => sum + chunk.length, 0);\n const eocd = new Uint8Array(22);\n const eocdView = new DataView(eocd.buffer);\n eocdView.setUint32(0, END_OF_CENTRAL_DIR_SIGNATURE, true);\n eocdView.setUint16(4, 0, true); // number of this disk\n eocdView.setUint16(6, 0, true); // disk where central directory starts\n eocdView.setUint16(8, entries.length, true); // number of central dir records on this disk\n eocdView.setUint16(10, entries.length, true); // total central dir records\n eocdView.setUint32(12, centralDirSize, true);\n eocdView.setUint32(16, centralDirOffset, true);\n eocdView.setUint16(20, 0, true); // comment length\n\n const totalLength =\n fileChunks.reduce((sum, chunk) => sum + chunk.length, 0) + centralDirSize + eocd.length;\n const output = new Uint8Array(totalLength);\n let position = 0;\n for (const chunk of fileChunks) {\n output.set(chunk, position);\n position += chunk.length;\n }\n for (const chunk of centralChunks) {\n output.set(chunk, position);\n position += chunk.length;\n }\n output.set(eocd, position);\n return output;\n}\n","import { DEFAULT_COLUMN_WIDTH, DEFAULT_ROW_HEIGHT } from '../core/worksheet/gridDefaults';\nimport { DEFAULT_CELL_STYLE, type CellStyle } from '../core/style/cellStyle';\nimport type { WorksheetExportSnapshot } from '../core/worksheet/worksheet';\nimport { utils } from './xlsx';\nimport { createZip } from './zipWriter';\n\nconst WORKBOOK_NAMESPACE = 'http://schemas.openxmlformats.org/spreadsheetml/2006/main';\nconst RELS_NAMESPACE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';\n\nconst textEncoder = typeof TextEncoder !== 'undefined' ? new TextEncoder() : null;\nconst COLUMN_PADDING = 5;\nconst COLUMN_CHARACTER_WIDTH = 7;\n\ntype FontDefinition = {\n name?: string;\n sz?: number;\n bold?: true;\n italic?: true;\n underline?: string;\n color?: { rgb: string };\n};\n\ntype FillDefinition =\n | { patternType: 'none' }\n | { patternType: 'gray125' }\n | { patternType: 'solid'; fgColor: { rgb: string }; bgColor: { indexed: string } };\n\ntype AlignmentDefinition = { horizontal?: string; vertical?: string; wrapText?: '1' };\n\ntype CellXfDefinition = {\n fontId: number;\n fillId: number;\n alignment?: AlignmentDefinition;\n applyFont?: boolean;\n applyFill?: boolean;\n applyAlignment?: boolean;\n};\n\nfunction encodeUtf8(value: string): Uint8Array {\n if (textEncoder) {\n return textEncoder.encode(value);\n }\n const output = new Uint8Array(value.length);\n for (let i = 0; i < value.length; i += 1) {\n output[i] = value.charCodeAt(i);\n }\n return output;\n}\n\nexport function buildXlsxFromSnapshot(\n snapshot: WorksheetExportSnapshot,\n sheetName: string,\n): ArrayBuffer {\n const styleManager = new StyleManager();\n const sharedStrings = new SharedStringTable();\n const sheetXml = buildSheetXml(snapshot, styleManager, sharedStrings);\n const stylesXml = styleManager.buildStylesXml();\n const workbookXml = buildWorkbookXml(sheetName);\n const workbookRelsXml = buildWorkbookRelationshipsXml();\n const contentTypesXml = buildContentTypesXml();\n const sharedStringsXml = buildSharedStringsXml(sharedStrings);\n const themeXml = buildThemeXml();\n const timestamp = formatIsoDate(new Date());\n const corePropertiesXml = buildCorePropertiesXml(timestamp);\n const appPropertiesXml = buildAppPropertiesXml();\n const rootRelsXml = buildRootRelationshipsXml();\n\n const entries = [\n { name: '[Content_Types].xml', data: encodeUtf8(contentTypesXml) },\n { name: '_rels/.rels', data: encodeUtf8(rootRelsXml) },\n { name: 'xl/workbook.xml', data: encodeUtf8(workbookXml) },\n { name: 'xl/_rels/workbook.xml.rels', data: encodeUtf8(workbookRelsXml) },\n { name: 'xl/styles.xml', data: encodeUtf8(stylesXml) },\n { name: 'xl/sharedStrings.xml', data: encodeUtf8(sharedStringsXml) },\n { name: 'xl/theme/theme1.xml', data: encodeUtf8(themeXml) },\n { name: 'docProps/core.xml', data: encodeUtf8(corePropertiesXml) },\n { name: 'docProps/app.xml', data: encodeUtf8(appPropertiesXml) },\n { name: 'xl/worksheets/sheet1.xml', data: encodeUtf8(sheetXml) },\n ];\n const zip = createZip(entries);\n return zip.buffer.slice(zip.byteOffset, zip.byteOffset + zip.byteLength) as ArrayBuffer;\n}\n\nfunction buildSheetXml(\n snapshot: WorksheetExportSnapshot,\n styleManager: StyleManager,\n strings: SharedStringTable,\n): string {\n const cellGroups = new Map<number, WorksheetExportSnapshot['cells']>();\n let maxRow = Math.max(snapshot.rows - 1, 0);\n let maxCol = Math.max(snapshot.columns - 1, 0);\n\n for (const cell of snapshot.cells) {\n if (!cellGroups.has(cell.row)) {\n cellGroups.set(cell.row, []);\n }\n cellGroups.get(cell.row)!.push(cell);\n maxRow = Math.max(maxRow, cell.row);\n maxCol = Math.max(maxCol, cell.column);\n }\n\n for (const merge of snapshot.merges) {\n maxRow = Math.max(maxRow, merge.bottomRow);\n maxCol = Math.max(maxCol, merge.rightColumn);\n }\n\n const dimensionRef = `${utils.encode_cell({ r: 0, c: 0 })}:${utils.encode_cell({\n r: Math.max(maxRow, 0),\n c: Math.max(maxCol, 0),\n })}`;\n\n const columns = buildColumnsSection(Math.max(snapshot.columnWidths.length, maxCol + 1), snapshot);\n const rows = buildRowsSection(cellGroups, snapshot, styleManager, strings);\n const merges = buildMergeCellsSection(snapshot.merges);\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<worksheet xmlns:r=\"${RELS_NAMESPACE}\" xmlns=\"${WORKBOOK_NAMESPACE}\">\n <dimension ref=\"${dimensionRef}\"/>\n <sheetViews>\n <sheetView workbookViewId=\"0\" showGridLines=\"1\"/>\n </sheetViews>\n <sheetFormatPr defaultColWidth=\"${columnWidthToExcel(DEFAULT_COLUMN_WIDTH)}\" defaultRowHeight=\"${DEFAULT_ROW_HEIGHT}\"/>\n ${columns}\n <sheetData>${rows}</sheetData>\n ${merges}\n</worksheet>`;\n}\n\nfunction buildColumnsSection(columnCount: number, snapshot: WorksheetExportSnapshot): string {\n const parts: string[] = [];\n for (let index = 0; index < Math.max(columnCount, 1); index += 1) {\n const widthPx = snapshot.columnWidths[index] ?? DEFAULT_COLUMN_WIDTH;\n const width = columnWidthToExcel(widthPx);\n const customWidth = widthPx !== DEFAULT_COLUMN_WIDTH ? ' customWidth=\"1\"' : '';\n parts.push(`<col min=\"${index + 1}\" max=\"${index + 1}\" width=\"${width}\"${customWidth}/>`);\n }\n return `<cols>${parts.join('')}</cols>`;\n}\n\nfunction columnWidthToExcel(px: number): string {\n const width = Math.max(0.1, (px - COLUMN_PADDING) / COLUMN_CHARACTER_WIDTH);\n return width.toFixed(4);\n}\n\nfunction buildRowsSection(\n cellGroups: Map<number, WorksheetExportSnapshot['cells']>,\n snapshot: WorksheetExportSnapshot,\n styleManager: StyleManager,\n strings: SharedStringTable,\n): string {\n const rowHeights = snapshot.rowHeights;\n const rowsToRender = new Set<number>();\n for (const rowIndex of cellGroups.keys()) {\n rowsToRender.add(rowIndex);\n }\n for (let index = 0; index < rowHeights.length; index += 1) {\n const height = rowHeights[index];\n if (height !== DEFAULT_ROW_HEIGHT) {\n rowsToRender.add(index);\n }\n }\n const sortedRows = Array.from(rowsToRender).sort((a, b) => a - b);\n const parts: string[] = [];\n for (const rowIndex of sortedRows) {\n const height = snapshot.rowHeights[rowIndex] ?? DEFAULT_ROW_HEIGHT;\n const attributes = [`r=\"${rowIndex + 1}\"`];\n if (height !== DEFAULT_ROW_HEIGHT) {\n attributes.push(`ht=\"${height.toFixed(2)}\"`);\n attributes.push('customHeight=\"1\"');\n }\n const cells = (cellGroups.get(rowIndex) ?? []).slice().sort((a, b) => a.column - b.column);\n const cellXml = cells.map((cell) => buildCellXml(cell, styleManager, strings)).join('');\n if (cellXml) {\n parts.push(`<row ${attributes.join(' ')}>${cellXml}</row>`);\n } else {\n parts.push(`<row ${attributes.join(' ')}/>`);\n }\n }\n return parts.join('');\n}\n\nfunction buildCellXml(\n cell: WorksheetExportSnapshot['cells'][number],\n styleManager: StyleManager,\n strings: SharedStringTable,\n): string {\n const address = utils.encode_cell({ r: cell.row, c: cell.column });\n const styleIndex = styleManager.getStyleIndex(cell.style);\n const styleAttribute = typeof styleIndex === 'number' ? ` s=\"${styleIndex}\"` : '';\n const value = cell.value ?? '';\n if (typeof value === 'string') {\n const index = strings.register(value);\n return `<c r=\"${address}\" t=\"s\"${styleAttribute}><v>${index}</v></c>`;\n }\n if (typeof value === 'number') {\n return `<c r=\"${address}\" t=\"n\"${styleAttribute}><v>${value}</v></c>`;\n }\n if (typeof value === 'boolean') {\n return `<c r=\"${address}\" t=\"b\"${styleAttribute}><v>${value ? 1 : 0}</v></c>`;\n }\n return `<c r=\"${address}\" t=\"n\"${styleAttribute}><v>0</v></c>`;\n}\n\nfunction buildMergeCellsSection(merges: WorksheetExportSnapshot['merges']): string {\n if (!merges.length) {\n return '';\n }\n const cells = merges.map((merge) => {\n const start = utils.encode_cell({ r: merge.topRow, c: merge.leftColumn });\n const end = utils.encode_cell({ r: merge.bottomRow, c: merge.rightColumn });\n return `<mergeCell ref=\"${start}:${end}\"/>`;\n });\n return `<mergeCells count=\"${cells.length}\">${cells.join('')}</mergeCells>`;\n}\n\nfunction escapeXml(input: string): string {\n return input\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n .replace(/\"/g, '&quot;')\n .replace(/'/g, '&apos;');\n}\n\nfunction buildWorkbookXml(name: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<workbook xmlns:r=\"${RELS_NAMESPACE}\" xmlns=\"${WORKBOOK_NAMESPACE}\">\n <sheets>\n <sheet name=\"${escapeXml(name)}\" sheetId=\"1\" r:id=\"rId1\"/>\n </sheets>\n</workbook>`;\n}\n\nfunction buildWorkbookRelationshipsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"${RELS_NAMESPACE}\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet1.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>\n <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\" Target=\"sharedStrings.xml\"/>\n <Relationship Id=\"rId4\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\" Target=\"theme/theme1.xml\"/>\n</Relationships>`;\n}\n\nfunction buildContentTypesXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>\n <Default Extension=\"xml\" ContentType=\"application/xml\"/>\n <Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>\n <Override PartName=\"/xl/worksheets/sheet1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>\n <Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>\n <Override PartName=\"/xl/sharedStrings.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\"/>\n <Override PartName=\"/xl/theme/theme1.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.theme+xml\"/>\n <Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/>\n <Override PartName=\"/docProps/app.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.extended-properties+xml\"/>\n</Types>`;\n}\n\nfunction buildRootRelationshipsXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n <Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>\n <Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/>\n <Relationship Id=\"rId3\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties\" Target=\"docProps/app.xml\"/>\n</Relationships>`;\n}\n\nfunction buildSharedStringsXml(table: SharedStringTable): string {\n const entriesXml = table.entries\n .map(\n (entry) =>\n `<si><t${entry.preserve ? ' xml:space=\"preserve\"' : ''}>${escapeXml(entry.text)}</t></si>`,\n )\n .join('');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<sst xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" count=\"${table.count}\" uniqueCount=\"${table.entries.length}\">\n ${entriesXml}\n</sst>`;\n}\n\nclass SharedStringTable {\n public entries: Array<{ text: string; preserve: boolean }> = [];\n public count = 0;\n\n private readonly map: Map<string, number> = new Map();\n\n register(value: string): number {\n this.count += 1;\n const existing = this.map.get(value);\n if (existing !== undefined) {\n return existing;\n }\n const preserve = /^\\s|\\s$/.test(value);\n const index = this.entries.length;\n this.entries.push({ text: value, preserve });\n this.map.set(value, index);\n return index;\n }\n}\n\nfunction buildThemeXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<a:theme xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\" name=\"Office Theme\">\n <a:themeElements>\n <a:clrScheme name=\"Office\">\n <a:dk1><a:sysClr val=\"windowText\" lastClr=\"000000\"/></a:dk1>\n <a:lt1><a:sysClr val=\"window\" lastClr=\"FFFFFF\"/></a:lt1>\n <a:dk2><a:srgbClr val=\"1F497D\"/></a:dk2>\n <a:lt2><a:srgbClr val=\"EEECE1\"/></a:lt2>\n <a:accent1><a:srgbClr val=\"4F81BC\"/></a:accent1>\n <a:accent2><a:srgbClr val=\"C0504D\"/></a:accent2>\n <a:accent3><a:srgbClr val=\"9BBB59\"/></a:accent3>\n <a:accent4><a:srgbClr val=\"8064A2\"/></a:accent4>\n <a:accent5><a:srgbClr val=\"4BACC6\"/></a:accent5>\n <a:accent6><a:srgbClr val=\"F79646\"/></a:accent6>\n <a:hlink><a:srgbClr val=\"0000FF\"/></a:hlink>\n <a:folHlink><a:srgbClr val=\"800080\"/></a:folHlink>\n </a:clrScheme>\n <a:fontScheme name=\"Office\">\n <a:majorFont>\n <a:latin typeface=\"Calibri\"/>\n </a:majorFont>\n <a:minorFont>\n <a:latin typeface=\"Calibri\"/>\n </a:minorFont>\n </a:fontScheme>\n <a:fmtScheme name=\"Office\">\n <a:fillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:gradFill rotWithShape=\"1\">\n <a:gsLst>\n <a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:lumOff val=\"100000\"/></a:schemeClr></a:gs>\n <a:gs pos=\"50000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:lumOff val=\"100000\"/></a:schemeClr></a:gs>\n <a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:lumOff val=\"100000\"/></a:schemeClr></a:gs>\n </a:gsLst>\n <a:lin ang=\"16200000\" scaled=\"1\"/>\n </a:gradFill>\n <a:gradFill rotWithShape=\"1\">\n <a:gsLst>\n <a:gs pos=\"0\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"110000\"/><a:lumOff val=\"100000\"/></a:schemeClr></a:gs>\n <a:gs pos=\"100000\"><a:schemeClr val=\"phClr\"><a:lumMod val=\"105000\"/><a:lumOff val=\"100000\"/></a:schemeClr></a:gs>\n </a:gsLst>\n <a:lin ang=\"16200000\" scaled=\"0\"/>\n </a:gradFill>\n </a:fillStyleLst>\n <a:lnStyleLst>\n <a:ln w=\"9525\" cap=\"flat\" cmpd=\"sng\" algn=\"ctr\">\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:prstDash val=\"solid\"/>\n </a:ln>\n </a:lnStyleLst>\n <a:effectStyleLst>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n <a:effectStyle><a:effectLst/></a:effectStyle>\n </a:effectStyleLst>\n <a:bgFillStyleLst>\n <a:solidFill><a:schemeClr val=\"phClr\"/></a:solidFill>\n <a:solidFill><a:schemeClr val=\"phClr\"><a:lumMod val=\"95000\"/><a:satMod val=\"105000\"/></a:schemeClr></a:solidFill>\n </a:bgFillStyleLst>\n </a:fmtScheme>\n </a:themeElements>\n </a:theme>`;\n}\n\nfunction formatIsoDate(date: Date): string {\n return date.toISOString();\n}\n\nfunction buildCorePropertiesXml(timestamp: string): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\"\n xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\"\n xmlns:dcmitype=\"http://purl.org/dc/dcmitype/\"\n xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n <dc:creator>ReoGrid</dc:creator>\n <cp:lastModifiedBy>ReoGrid</cp:lastModifiedBy>\n <dcterms:created xsi:type=\"dcterms:W3CDTF\">${timestamp}</dcterms:created>\n <dcterms:modified xsi:type=\"dcterms:W3CDTF\">${timestamp}</dcterms:modified>\n</cp:coreProperties>`;\n}\n\nfunction buildAppPropertiesXml(): string {\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Properties xmlns=\"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\"\n xmlns:vt=\"http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes\">\n <Application>ReoGrid</Application>\n <DocSecurity>0</DocSecurity>\n <ScaleCrop>false</ScaleCrop>\n <HeadingPairs>\n <vt:vector size=\"2\" baseType=\"variant\">\n <vt:variant><vt:lpstr>Worksheets</vt:lpstr></vt:variant>\n <vt:variant><vt:i4>1</vt:i4></vt:variant>\n </vt:vector>\n </HeadingPairs>\n <TitlesOfParts>\n <vt:vector size=\"1\" baseType=\"lpstr\">\n <vt:lpstr>Sheet1</vt:lpstr>\n </vt:vector>\n </TitlesOfParts>\n <Company/>\n <LinksUpToDate>false</LinksUpToDate>\n <SharedDoc>false</SharedDoc>\n</Properties>`;\n}\n\nclass StyleManager {\n private readonly fonts: FontDefinition[] = [\n { name: DEFAULT_CELL_STYLE.fontFamily, sz: DEFAULT_CELL_STYLE.fontSize },\n ];\n private readonly fontKeyMap = new Map<string, number>();\n private readonly fills: FillDefinition[] = [\n { patternType: 'none' },\n { patternType: 'gray125' },\n ];\n private readonly fillKeyMap = new Map<string, number>();\n private readonly cellXfs: CellXfDefinition[] = [{ fontId: 0, fillId: 0 }];\n private readonly styleKeyMap = new Map<string, number>();\n\n public getStyleIndex(style?: CellStyle): number | undefined {\n if (!style) {\n return undefined;\n }\n const fontId = this.resolveFont(style);\n const fillId = this.resolveFill(style);\n const alignment = this.resolveAlignment(style);\n const key = `${fontId}:${fillId}:${alignment?.horizontal ?? ''}:${alignment?.vertical ?? ''}:${alignment?.wrapText ?? ''}`;\n const existing = this.styleKeyMap.get(key);\n if (existing !== undefined) {\n return existing;\n }\n const index = this.cellXfs.length;\n this.cellXfs.push({\n fontId,\n fillId,\n alignment,\n applyFont: fontId !== 0,\n applyFill: fillId !== 0,\n applyAlignment: Boolean(\n alignment && (alignment.horizontal || alignment.vertical || alignment.wrapText),\n ),\n });\n this.styleKeyMap.set(key, index);\n return index;\n }\n\n public buildStylesXml(): string {\n const fontsXml = this.fonts.map((font) => {\n const parts: string[] = [];\n if (font.sz) {\n parts.push(`<sz val=\"${font.sz}\"/>`);\n }\n if (font.name) {\n parts.push(`<name val=\"${escapeXml(font.name)}\"/>`);\n }\n if (font.bold) {\n parts.push('<b/>');\n }\n if (font.italic) {\n parts.push('<i/>');\n }\n if (font.underline) {\n parts.push(`<u val=\"${font.underline}\"/>`);\n }\n if (font.color) {\n parts.push(`<color rgb=\"${font.color.rgb}\"/>`);\n }\n return `<font>${parts.join('')}</font>`;\n });\n\n const fillsXml = this.fills.map((fill) => {\n if (fill.patternType === 'none') {\n return '<fill><patternFill patternType=\"none\"/></fill>';\n }\n if (fill.patternType === 'gray125') {\n return '<fill><patternFill patternType=\"gray125\"/></fill>';\n }\n if (fill.patternType === 'solid') {\n return `<fill><patternFill patternType=\"solid\"><fgColor rgb=\"${fill.fgColor.rgb}\"/><bgColor indexed=\"${fill.bgColor.indexed}\"/></patternFill></fill>`;\n }\n return '<fill><patternFill patternType=\"none\"/></fill>';\n });\n\n const cellXfsXml = this.cellXfs.map((xf) => {\n const attributes = [\n `numFmtId=\"0\"`,\n `fontId=\"${xf.fontId}\"`,\n `fillId=\"${xf.fillId}\"`,\n `borderId=\"0\"`,\n `xfId=\"0\"`,\n ];\n if (xf.applyFont) {\n attributes.push('applyFont=\"1\"');\n }\n if (xf.applyFill) {\n attributes.push('applyFill=\"1\"');\n }\n if (xf.applyAlignment) {\n attributes.push('applyAlignment=\"1\"');\n }\n const alignmentXml = xf.alignment\n ? `<alignment${xf.alignment.horizontal ? ` horizontal=\"${xf.alignment.horizontal}\"` : ''}${\n xf.alignment.vertical ? ` vertical=\"${xf.alignment.vertical}\"` : ''\n }${xf.alignment.wrapText ? ' wrapText=\"1\"' : ''}/>`\n : '';\n return `<xf ${attributes.join(' ')}>${alignmentXml}</xf>`;\n });\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<styleSheet xmlns=\"${WORKBOOK_NAMESPACE}\" xmlns:x14ac=\"http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac\" xmlns:mc=\"http://schemas.openxmlformats.org/markup-compatibility/2006\" mc:Ignorable=\"x14ac\">\n <numFmts count=\"0\"/>\n <fonts count=\"${this.fonts.length}\">${fontsXml.join('')}</fonts>\n <fills count=\"${this.fills.length}\">${fillsXml.join('')}</fills>\n <borders count=\"1\">\n <border>\n <left/>\n <right/>\n <top/>\n <bottom/>\n <diagonal/>\n </border>\n </borders>\n <cellStyleXfs count=\"1\">\n <xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>\n </cellStyleXfs>\n <cellXfs count=\"${this.cellXfs.length}\">${cellXfsXml.join('')}</cellXfs>\n <cellStyles count=\"1\">\n <cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/>\n </cellStyles>\n</styleSheet>`;\n }\n\n private resolveFont(style: CellStyle): number {\n const defaultColor = normalizeColor(DEFAULT_CELL_STYLE.color);\n const styleColor = normalizeColor(style.color);\n const hasFontOverrides =\n style.fontFamily !== DEFAULT_CELL_STYLE.fontFamily ||\n style.fontSize !== DEFAULT_CELL_STYLE.fontSize ||\n style.bold ||\n style.italic ||\n style.underline ||\n (styleColor && styleColor !== defaultColor);\n if (!hasFontOverrides) {\n return 0;\n }\n const key = `font:${\n style.fontFamily || ''\n }:${style.fontSize}:${style.bold ? '1' : '0'}:${style.italic ? '1' : '0'}:${style.underline ? '1' : '0'}:${styleColor ?? ''}`;\n const cached = this.fontKeyMap.get(key);\n if (cached !== undefined) {\n return cached;\n }\n const entry: FontDefinition = {};\n if (style.fontFamily && style.fontFamily !== DEFAULT_CELL_STYLE.fontFamily) {\n entry.name = style.fontFamily;\n }\n if (style.fontSize && style.fontSize !== DEFAULT_CELL_STYLE.fontSize) {\n entry.sz = style.fontSize;\n }\n if (style.bold) {\n entry.bold = true;\n }\n if (style.italic) {\n entry.italic = true;\n }\n if (style.underline) {\n entry.underline = 'single';\n }\n if (styleColor && styleColor !== defaultColor) {\n entry.color = { rgb: styleColor };\n }\n this.fonts.push(entry);\n const index = this.fonts.length - 1;\n this.fontKeyMap.set(key, index);\n return index;\n }\n\n private resolveFill(style: CellStyle): number {\n const color = normalizeColor(style.backgroundColor);\n const defaultBackground = normalizeColor(DEFAULT_CELL_STYLE.backgroundColor);\n if (!color || color === defaultBackground) {\n return 0;\n }\n const key = `fill:${color}`;\n const cached = this.fillKeyMap.get(key);\n if (cached !== undefined) {\n return cached;\n }\n const entry: FillDefinition = {\n patternType: 'solid',\n fgColor: { rgb: color },\n bgColor: { indexed: '64' },\n };\n this.fills.push(entry);\n const index = this.fills.length - 1;\n this.fillKeyMap.set(key, index);\n return index;\n }\n\n private resolveAlignment(style: CellStyle): AlignmentDefinition | undefined {\n const horizontal = style.textAlign !== DEFAULT_CELL_STYLE.textAlign ? style.textAlign : undefined;\n const verticalValue =\n style.verticalAlign !== DEFAULT_CELL_STYLE.verticalAlign\n ? style.verticalAlign === 'middle'\n ? 'center'\n : style.verticalAlign\n : undefined;\n const wrapText =\n style.textWrapMode !== DEFAULT_CELL_STYLE.textWrapMode ? '1' : undefined;\n if (!horizontal && !verticalValue && !wrapText) {\n return undefined;\n }\n return {\n horizontal,\n vertical: verticalValue,\n wrapText,\n };\n }\n}\n\nfunction normalizeColor(color: string): string | undefined {\n if (!color || typeof color !== 'string') {\n return undefined;\n }\n let normalized = color.trim();\n if (!normalized) {\n return undefined;\n }\n if (normalized.startsWith('#')) {\n normalized = normalized.slice(1);\n }\n const rgbMatch = normalized.match(/^rgba?\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})/i);\n if (rgbMatch) {\n const [r, g, b] = rgbMatch.slice(1).map((value) =>\n Math.max(0, Math.min(255, Number(value) || 0)),\n );\n return `FF${[r, g, b].map((segment) => segment.toString(16).padStart(2, '0')).join('')}`.toUpperCase();\n }\n if (normalized.length === 3) {\n normalized = normalized\n .split('')\n .map((char) => char + char)\n .join('');\n }\n if (normalized.length === 6 || normalized.length === 8) {\n const hex = normalized.toUpperCase();\n return hex.length === 6 ? `FF${hex}` : hex;\n }\n return undefined;\n}\n","import type { Worksheet } from './worksheet';\nimport type { CellStyle } from '../style/cellStyle';\nimport type { BorderLineOptions, RangeBorderSide } from '../border/types';\n\nexport type CellStyleInput = Partial<CellStyle>;\n\n// ---------------------------------------------------------------------------\n// CellHandle\n// ---------------------------------------------------------------------------\n\nexport class CellHandle {\n private readonly ws: Worksheet;\n\n private readonly r: number;\n\n private readonly c: number;\n\n constructor(ws: Worksheet, row: number, col: number) {\n this.ws = ws;\n this.r = row;\n this.c = col;\n }\n\n get value(): string {\n return this.ws.getCellInput(this.r, this.c) ?? '';\n }\n\n set value(v: string) {\n this.ws.setCellInput(this.r, this.c, v);\n }\n\n get style(): Partial<CellStyle> {\n return this.ws.getComputedCellStyle(this.r, this.c);\n }\n\n set style(s: CellStyleInput) {\n this.ws.setCellStyle(this.r, this.c, s);\n }\n\n getValue(): string {\n return this.value;\n }\n\n setValue(v: string): this {\n this.value = v;\n return this;\n }\n\n getStyle(): CellStyle {\n return this.ws.getComputedCellStyle(this.r, this.c);\n }\n\n setStyle(s: CellStyleInput): this {\n this.ws.setCellStyle(this.r, this.c, s);\n return this;\n }\n}\n\n/** No-op handle returned when a cell address is outside the allowed constraint bounds. */\nexport class NullCellHandle {\n get value(): string {\n return '';\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n set value(_v: string) {}\n\n get style(): Partial<CellStyle> {\n return {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n set style(_s: CellStyleInput) {}\n\n getValue(): string {\n return '';\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setValue(_v: string): this {\n return this;\n }\n\n getStyle(): CellStyle {\n return {} as CellStyle;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setStyle(_s: CellStyleInput): this {\n return this;\n }\n}\n\n// ---------------------------------------------------------------------------\n// RangeHandle\n// ---------------------------------------------------------------------------\n\nexport class RangeHandle {\n private readonly ws: Worksheet;\n\n private readonly topRow: number;\n\n private readonly leftColumn: number;\n\n private readonly bottomRow: number;\n\n private readonly rightColumn: number;\n\n constructor(\n ws: Worksheet,\n topRow: number,\n leftColumn: number,\n bottomRow: number,\n rightColumn: number,\n ) {\n this.ws = ws;\n this.topRow = topRow;\n this.leftColumn = leftColumn;\n this.bottomRow = bottomRow;\n this.rightColumn = rightColumn;\n }\n\n setStyle(style: CellStyleInput): this {\n for (let row = this.topRow; row <= this.bottomRow; row += 1) {\n for (let col = this.leftColumn; col <= this.rightColumn; col += 1) {\n this.ws.setCellStyle(row, col, style);\n }\n }\n return this;\n }\n\n setBackgroundColor(color: string): this {\n this.ws.setRangeBackgroundColor(\n this.topRow,\n this.leftColumn,\n this.bottomRow,\n this.rightColumn,\n color,\n );\n return this;\n }\n\n merge(): this {\n this.ws.mergeCells(this.topRow, this.leftColumn, this.bottomRow, this.rightColumn);\n return this;\n }\n\n unmerge(): this {\n this.ws.unmergeCells(this.topRow, this.leftColumn, this.bottomRow, this.rightColumn);\n return this;\n }\n\n border(options: BorderLineOptions, sides?: RangeBorderSide[]): this {\n this.ws.setRangeBorder(\n this.topRow,\n this.leftColumn,\n this.bottomRow,\n this.rightColumn,\n options,\n sides,\n );\n return this;\n }\n}\n\n/** No-op handle returned when a range is outside the allowed constraint bounds. */\nexport class NullRangeHandle {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setStyle(_s: CellStyleInput): this {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n setBackgroundColor(_c: string): this {\n return this;\n }\n\n merge(): this {\n return this;\n }\n\n unmerge(): this {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n border(_o: BorderLineOptions, _s?: RangeBorderSide[]): this {\n return this;\n }\n}\n\n// ---------------------------------------------------------------------------\n// ColumnHandle\n// ---------------------------------------------------------------------------\n\nexport class ColumnHandle {\n private readonly ws: Worksheet;\n\n private readonly col: number;\n\n constructor(ws: Worksheet, col: number) {\n this.ws = ws;\n this.col = col;\n }\n\n get width(): number {\n return this.ws.columnWidths[this.col] ?? 0;\n }\n\n set width(w: number) {\n this.ws.setColumnWidth(this.col, w);\n }\n}\n\n// ---------------------------------------------------------------------------\n// RowHandle\n// ---------------------------------------------------------------------------\n\nexport class RowHandle {\n private readonly ws: Worksheet;\n\n private readonly row: number;\n\n constructor(ws: Worksheet, row: number) {\n this.ws = ws;\n this.row = row;\n }\n\n get height(): number {\n return this.ws.rowHeights[this.row] ?? 0;\n }\n\n set height(h: number) {\n this.ws.setRowHeight(this.row, h);\n }\n}\n","import { Worksheet, MIN_COLUMN_WIDTH, MIN_ROW_HEIGHT, CELL_TEXT_PADDING } from './worksheet';\nimport type { CellStyle } from '../style/cellStyle';\nimport { SheetRenderer, type SheetRendererContext } from '../../render/sheetRenderer';\nimport { ViewportController } from '../../render/viewports';\nimport { utils, type WorksheetImage } from '../../io/xlsx';\nimport {\n XlsxImporter,\n convertImageInfo,\n buildImageUrl,\n type LoadXlsxOptions,\n type WorksheetImageInfo,\n type WorksheetImageAnchorPosition,\n type WorksheetImagePlacement,\n} from '../../io/xlsxImporter';\nimport { buildXlsxFromSnapshot } from '../../io/xlsxWriter';\nimport {\n CellHandle,\n NullCellHandle,\n RangeHandle,\n NullRangeHandle,\n ColumnHandle,\n RowHandle,\n type CellStyleInput,\n} from './handles';\nimport type { MergedCellRange } from '../cell/types';\n\nexport type SaveXlsxOptions = { filename?: string; sheetName?: string };\n\nexport type {\n LoadXlsxOptions,\n WorksheetImageInfo,\n WorksheetImageAnchorPosition,\n WorksheetImagePlacement,\n};\n\nexport interface WorksheetConstraints {\n maxRows?: number;\n maxCols?: number;\n}\n\nexport class CanvasWorksheet extends Worksheet {\n public readonly canvas: HTMLCanvasElement;\n\n private readonly ctx: CanvasRenderingContext2D;\n\n private readonly sheetRenderer: SheetRenderer;\n\n private readonly viewportController: ViewportController;\n\n // ── Constraints (Lite edition limits) ─────────────────────────────────────\n\n private readonly constraints: WorksheetConstraints;\n\n // ── Image management ───────────────────────────────────────────────────────\n\n private worksheetImages: WorksheetImage[] = [];\n\n private readonly imageUrlCache: Map<string, string> = new Map();\n\n private readonly imageListeners: Set<(images: WorksheetImageInfo[]) => void> = new Set();\n\n constructor(canvas: HTMLCanvasElement, constraints: WorksheetConstraints = {}) {\n super();\n this.canvas = canvas;\n this.constraints = constraints;\n const context = canvas.getContext('2d');\n if (!context) {\n throw new Error('Canvas 2D context is not available.');\n }\n this.ctx = context;\n this.sheetRenderer = new SheetRenderer(this.createSheetRendererContext());\n this.viewportController = new ViewportController(this);\n this.resize();\n }\n\n // ── Grid lines property ────────────────────────────────────────────────────\n\n get showGridLines(): boolean {\n return this.getShowGridLines();\n }\n\n set showGridLines(visible: boolean) {\n this.setShowGridLines(visible);\n }\n\n // ── OO cell/range/column/row factory methods ───────────────────────────────\n\n cell(a1: string): CellHandle | NullCellHandle {\n const pos = this.decodeA1Cell(a1);\n if (this.isOutOfBounds(pos.row, pos.column)) {\n return new NullCellHandle();\n }\n return new CellHandle(this, pos.row, pos.column);\n }\n\n range(a1Range: string): RangeHandle | NullRangeHandle {\n const r = this.decodeA1Range(a1Range);\n if (this.isRangeOutOfBounds(r.topRow, r.leftColumn, r.bottomRow, r.rightColumn)) {\n return new NullRangeHandle();\n }\n return new RangeHandle(this, r.topRow, r.leftColumn, r.bottomRow, r.rightColumn);\n }\n\n column(index: number): ColumnHandle {\n return new ColumnHandle(this, index);\n }\n\n row(index: number): RowHandle {\n return new RowHandle(this, index);\n }\n\n // ── xlsx import / export ───────────────────────────────────────────────────\n\n async loadFromUrl(url: string | URL, options?: LoadXlsxOptions): Promise<void> {\n const response = await fetch(url.toString());\n if (!response.ok) {\n throw new Error(`Failed to fetch XLSX from ${url}: ${response.status} ${response.statusText}`);\n }\n const buffer = await response.arrayBuffer();\n await this.loadFromXlsx(buffer, options);\n }\n\n async loadFromFile(file: File, options?: LoadXlsxOptions): Promise<void> {\n const buffer = await file.arrayBuffer();\n await this.loadFromXlsx(buffer, options);\n }\n\n async loadFromXlsx(\n data: ArrayBuffer | Uint8Array | string,\n options?: LoadXlsxOptions,\n ): Promise<void> {\n this.resetImageCache();\n const importer = new XlsxImporter(this);\n const result = importer.load(data, options);\n this.worksheetImages = result.images;\n this.notifyImagesChanged();\n }\n\n saveAsXlsx(options?: SaveXlsxOptions): void {\n const snapshot = this.getExportSnapshot();\n const sheetName = this.normalizeSheetName(options?.sheetName ?? 'Sheet1');\n const buffer = buildXlsxFromSnapshot(snapshot, sheetName);\n const filename = options?.filename ?? 'reogrid.xlsx';\n this.downloadWorkbook(buffer, filename);\n }\n\n // ── Image management ───────────────────────────────────────────────────────\n\n getImages(): WorksheetImageInfo[] {\n return this.worksheetImages.map((image) => convertImageInfo(image));\n }\n\n createImageUrl(imageId: string): string {\n const cached = this.imageUrlCache.get(imageId);\n if (cached) {\n return cached;\n }\n const image = this.findImage(imageId);\n if (!image) {\n throw new Error(`Image \"${imageId}\" not found.`);\n }\n const url = buildImageUrl(image);\n this.imageUrlCache.set(imageId, url);\n return url;\n }\n\n revokeImageUrl(imageId: string): void {\n const url = this.imageUrlCache.get(imageId);\n if (!url) {\n return;\n }\n if (typeof URL !== 'undefined' && typeof URL.revokeObjectURL === 'function') {\n URL.revokeObjectURL(url);\n }\n this.imageUrlCache.delete(imageId);\n }\n\n onImagesChange(listener: (images: WorksheetImageInfo[]) => void): () => void {\n this.imageListeners.add(listener);\n listener(this.getImages());\n return () => {\n this.imageListeners.delete(listener);\n };\n }\n\n // ── Canvas rendering ───────────────────────────────────────────────────────\n\n resize(width?: number, height?: number): void {\n const targetRect =\n this.canvas.parentElement?.getBoundingClientRect() ?? this.canvas.getBoundingClientRect();\n const rootWindow = typeof window === 'undefined' ? null : window;\n const fallbackWidth = rootWindow?.innerWidth ?? this.canvas.width;\n const fallbackHeight = rootWindow?.innerHeight ?? this.canvas.height;\n const resolvedWidth = width ?? (targetRect.width || fallbackWidth);\n const resolvedHeight = height ?? (targetRect.height || fallbackHeight);\n\n this.viewportWidth = resolvedWidth;\n this.viewportHeight = resolvedHeight;\n\n const devicePixelRatio = rootWindow?.devicePixelRatio ?? 1;\n this.pixelRatio = devicePixelRatio;\n const displayWidth = Math.max(1, Math.round(resolvedWidth * devicePixelRatio));\n const displayHeight = Math.max(1, Math.round(resolvedHeight * devicePixelRatio));\n\n this.canvas.style.width = `${resolvedWidth}px`;\n this.canvas.style.height = `${resolvedHeight}px`;\n if (this.canvas.width !== displayWidth) {\n this.canvas.width = displayWidth;\n }\n if (this.canvas.height !== displayHeight) {\n this.canvas.height = displayHeight;\n }\n\n this.ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, 0, 0);\n this.ctx.imageSmoothingEnabled = false;\n this.clampScrollOffsetInPlace();\n this.render();\n }\n\n public override render(): void {\n this.updateBoundaries();\n const viewports = this.viewportController.update();\n this.clear();\n this.sheetRenderer.drawHeaders(viewports);\n this.sheetRenderer.drawCells(viewports.cells);\n this.sheetRenderer.drawCustomBorders(viewports.cells);\n this.withBodyClip(() => this.selection.draw(this.ctx));\n this.withBodyClip(() => this.drawResizeGuide());\n }\n\n // ── Private helpers ────────────────────────────────────────────────────────\n\n private isOutOfBounds(row: number, col: number): boolean {\n const { maxRows, maxCols } = this.constraints;\n return (maxRows !== undefined && row >= maxRows) || (maxCols !== undefined && col >= maxCols);\n }\n\n private isRangeOutOfBounds(\n topRow: number,\n leftCol: number,\n bottomRow: number,\n rightCol: number,\n ): boolean {\n return this.isOutOfBounds(topRow, leftCol) || this.isOutOfBounds(bottomRow, rightCol);\n }\n\n private decodeA1Cell(a1Ref: string): { row: number; column: number } {\n let decoded: { r: number; c: number };\n try {\n decoded = utils.decode_cell(a1Ref);\n } catch (error) {\n throw new Error(`Invalid cell reference \"${a1Ref}\": ${(error as Error).message}`);\n }\n return { row: decoded.r, column: decoded.c };\n }\n\n private decodeA1Range(a1Range: string): MergedCellRange {\n let decoded: { s: { r: number; c: number }; e: { r: number; c: number } };\n try {\n decoded = utils.decode_range(a1Range);\n } catch (error) {\n throw new Error(`Invalid range reference \"${a1Range}\": ${(error as Error).message}`);\n }\n return {\n topRow: Math.min(decoded.s.r, decoded.e.r),\n bottomRow: Math.max(decoded.s.r, decoded.e.r),\n leftColumn: Math.min(decoded.s.c, decoded.e.c),\n rightColumn: Math.max(decoded.s.c, decoded.e.c),\n };\n }\n\n private findImage(imageId: string): WorksheetImage | undefined {\n return this.worksheetImages.find((image) => image.id === imageId);\n }\n\n private resetImageCache(): void {\n this.clearImageUrlCache();\n this.worksheetImages = [];\n this.notifyImagesChanged();\n }\n\n private clearImageUrlCache(): void {\n if (typeof URL !== 'undefined' && typeof URL.revokeObjectURL === 'function') {\n for (const url of this.imageUrlCache.values()) {\n URL.revokeObjectURL(url);\n }\n }\n this.imageUrlCache.clear();\n }\n\n private notifyImagesChanged(): void {\n const snapshot = this.getImages();\n for (const listener of this.imageListeners) {\n listener(snapshot);\n }\n }\n\n private normalizeSheetName(name: string): string {\n const cleaned = name.replace(/[:\\\\\\/\\?\\*\\[\\]]/g, '').trim();\n if (!cleaned.length) {\n return 'Sheet1';\n }\n return cleaned.slice(0, 31);\n }\n\n private downloadWorkbook(buffer: ArrayBuffer, filename: string): void {\n const blob = new Blob([buffer], {\n type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n });\n this.triggerDownload(blob, filename);\n }\n\n private triggerDownload(blob: Blob, filename: string): void {\n if (\n typeof document === 'undefined' ||\n typeof URL === 'undefined' ||\n typeof URL.createObjectURL !== 'function'\n ) {\n throw new Error('Saving XLSX requires a browser environment.');\n }\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.style.display = 'none';\n const container = document.body;\n if (!container) {\n throw new Error('Saving XLSX requires a mounted document body.');\n }\n container.appendChild(anchor);\n anchor.click();\n container.removeChild(anchor);\n URL.revokeObjectURL(url);\n }\n\n private clear(): void {\n const ctx = this.ctx;\n ctx.save();\n ctx.setTransform(1, 0, 0, 1, 0, 0);\n ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n ctx.restore();\n }\n\n private withBodyClip(callback: () => void): void {\n const bodyWidth = this.getBodyViewportWidth();\n const bodyHeight = this.getBodyViewportHeight();\n if (bodyWidth <= 0 || bodyHeight <= 0) {\n return;\n }\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n ctx.rect(this.headerColumnWidth, this.headerRowHeight, bodyWidth, bodyHeight);\n ctx.clip();\n try {\n callback();\n } finally {\n ctx.restore();\n }\n }\n\n private drawResizeGuide(): void {\n const guide = this.resizeGuide;\n if (!guide) {\n return;\n }\n const ctx = this.ctx;\n ctx.save();\n ctx.strokeStyle = '#1f2933';\n ctx.lineWidth = 1 / this.pixelRatio;\n ctx.setLineDash([4 / this.pixelRatio, 4 / this.pixelRatio]);\n ctx.beginPath();\n if (guide.type === 'column') {\n const bodyHeight = this.getBodyViewportHeight();\n ctx.moveTo(guide.position, this.headerRowHeight);\n ctx.lineTo(guide.position, this.headerRowHeight + bodyHeight);\n } else {\n const bodyWidth = this.getBodyViewportWidth();\n ctx.moveTo(this.headerColumnWidth, guide.position);\n ctx.lineTo(this.headerColumnWidth + bodyWidth, guide.position);\n }\n ctx.stroke();\n ctx.restore();\n }\n\n protected override measureColumnWidth(column: number): number {\n let maxWidth = MIN_COLUMN_WIDTH;\n for (let row = 0; row < this.rows; row += 1) {\n const style = this.getComputedCellStyle(row, column);\n const width = this.measureCellContentWidth(row, column, style);\n if (width > maxWidth) {\n maxWidth = width;\n }\n }\n return Math.max(maxWidth, MIN_COLUMN_WIDTH);\n }\n\n protected override measureRowHeight(row: number): number {\n let maxHeight = 0;\n for (let column = 0; column < this.columns; column += 1) {\n const style = this.getComputedCellStyle(row, column);\n const height = this.measureCellContentHeight(row, column, style);\n if (height > maxHeight) {\n maxHeight = height;\n }\n }\n return Math.max(maxHeight, MIN_ROW_HEIGHT);\n }\n\n protected override measureCellContentHeight(row: number, column: number, style: CellStyle): number {\n const richText = this.getRichTextRuns(row, column);\n if (richText && richText.length > 0) {\n const lines = this.sheetRenderer.layoutRichText(richText, style);\n if (!lines.length) {\n return 0;\n }\n const contentHeight = lines.reduce((sum, line) => sum + line.lineHeight, 0);\n return contentHeight + CELL_TEXT_PADDING * 2;\n }\n const text = this.getCellText(row, column);\n if (!text) {\n return 0;\n }\n const fontSizePx = this.pointsToPixels(style.fontSize);\n const lineHeight = fontSizePx + CELL_TEXT_PADDING;\n const lines = text.split(/\\r\\n|\\r|\\n/);\n return lines.length * lineHeight + CELL_TEXT_PADDING * 2;\n }\n\n protected override measureCellContentWidth(row: number, column: number, style: CellStyle): number {\n const padding = CELL_TEXT_PADDING * 2;\n const richText = this.getRichTextRuns(row, column);\n if (richText && richText.length > 0) {\n const lines = this.sheetRenderer.layoutRichText(richText, style);\n if (!lines.length) {\n return MIN_COLUMN_WIDTH;\n }\n const maxWidth = lines.reduce((max, line) => Math.max(max, line.width), 0);\n return maxWidth + padding;\n }\n const text = this.getCellText(row, column);\n if (!text) {\n return MIN_COLUMN_WIDTH;\n }\n const fontFamily = style.fontFamily.includes(' ') ? `\"${style.fontFamily}\"` : style.fontFamily;\n const fontSizePx = this.pointsToPixels(style.fontSize);\n const previousFont = this.ctx.font;\n this.ctx.font = `${fontSizePx}px ${fontFamily}`;\n const lines = text.split(/\\r\\n|\\r|\\n/);\n let maxWidth = 0;\n for (const line of lines) {\n const width = this.ctx.measureText(line).width;\n if (width > maxWidth) {\n maxWidth = width;\n }\n }\n this.ctx.font = previousFont;\n return maxWidth + padding;\n }\n\n private createSheetRendererContext(): SheetRendererContext {\n return {\n getContext: () => this.ctx,\n getPixelRatio: () => this.pixelRatio,\n getBodyViewportWidth: () => this.getBodyViewportWidth(),\n getBodyViewportHeight: () => this.getBodyViewportHeight(),\n getHeaderColumnWidth: () => this.headerColumnWidth,\n getHeaderRowHeight: () => this.headerRowHeight,\n getScrollOffset: () => ({ x: this.scrollX, y: this.scrollY }),\n getColumnBoundaries: () => this.getColumnBoundaries(),\n getRowBoundaries: () => this.getRowBoundaries(),\n getColumnWidths: () => this.getColumnWidths(),\n getRowHeights: () => this.getRowHeights(),\n getVisibleColumnRange: (padding) => this.getVisibleColumnRange(padding),\n getVisibleRowRange: (padding) => this.getVisibleRowRange(padding),\n getVisibleRowIndices: () => this.getVisibleRowIndices(),\n getVisibleColumnIndices: () => this.getVisibleColumnIndices(),\n getDefaultCellStyle: () => this.getDefaultCellStyle(),\n getComputedCellStyle: (row, column) => this.getComputedCellStyle(row, column),\n getMergedRange: (row, column) => this.getMergedRange(row, column),\n getRangeRect: (topRow, leftColumn, bottomRow, rightColumn) =>\n this.getRangeRect(topRow, leftColumn, bottomRow, rightColumn),\n getRichTextRuns: (row, column) => this.getRichTextRuns(row, column),\n getCellText: (row, column) => this.getCellText(row, column),\n pointsToPixels: (points) => this.pointsToPixels(points),\n withBodyClip: (callback) => this.withBodyClip(callback),\n getMergedLineGaps: () => this.getMergedLineGaps(),\n hasCellBorders: () => this.borders.size > 0,\n getCellBorders: () => this.getCellBorders(),\n parseCellKey: (key) => this.parseCellKey(key),\n getCellMergeBounds: (row, column) => this.getCellMergeBounds(row, column),\n getCellTextPadding: () => CELL_TEXT_PADDING,\n ensureBoundaries: () => this.ensureBoundaries(),\n shouldRenderGridLines: () => this.shouldRenderGridLines(),\n };\n }\n}\n\nexport type { CellStyleInput };\n","import type { CanvasWorksheet, HitTestResult } from '../../core/worksheet';\nimport type { CellEditor } from '../editor/cellEditor';\n\ntype DragContext =\n | { type: 'cell' }\n | { type: 'row-header'; anchorRow: number }\n | { type: 'column-header'; anchorColumn: number }\n | { type: 'corner' };\n\ntype ResizeContext =\n | { type: 'column'; column: number; origin: number; originalSize: number }\n | { type: 'row'; row: number; origin: number; originalSize: number };\n\ninterface CanvasPoint {\n x: number;\n y: number;\n}\n\nexport class PointerController {\n private readonly worksheet: CanvasWorksheet;\n\n private readonly canvas: HTMLCanvasElement;\n\n private readonly eventTarget: HTMLElement;\n\n private readonly cellEditor: CellEditor;\n\n private isDragging = false;\n\n private dragContext: DragContext | null = null;\n\n private isResizing = false;\n\n private resizeContext: ResizeContext | null = null;\n\n constructor(worksheet: CanvasWorksheet, cellEditor: CellEditor, eventTarget?: HTMLElement) {\n this.worksheet = worksheet;\n this.canvas = worksheet.canvas;\n this.eventTarget = eventTarget ?? this.canvas;\n this.cellEditor = cellEditor;\n\n this.eventTarget.addEventListener('mousedown', this.handleMouseDown);\n this.eventTarget.addEventListener('dblclick', this.handleDoubleClick);\n window.addEventListener('mousemove', this.handleMouseMove);\n window.addEventListener('mouseup', this.handleMouseUp);\n }\n\n destroy(): void {\n this.eventTarget.removeEventListener('mousedown', this.handleMouseDown);\n this.eventTarget.removeEventListener('dblclick', this.handleDoubleClick);\n window.removeEventListener('mousemove', this.handleMouseMove);\n window.removeEventListener('mouseup', this.handleMouseUp);\n }\n\n private handleMouseDown = (event: MouseEvent): void => {\n if (this.cellEditor.isEditing()) {\n this.cellEditor.commit();\n }\n\n const point = this.getCanvasPoint(event);\n if (!point) {\n return;\n }\n\n if (this.tryBeginResize(point)) {\n event.preventDefault();\n return;\n }\n\n const hit = this.worksheet.hitTest(point.x, point.y);\n if (!hit) {\n return;\n }\n\n event.preventDefault();\n this.isDragging = true;\n\n const { selection } = this.worksheet;\n switch (hit.type) {\n case 'cell':\n this.dragContext = { type: 'cell' };\n selection.begin(hit.row, hit.column);\n break;\n case 'row-header':\n this.dragContext = { type: 'row-header', anchorRow: hit.row };\n selection.selectRows(hit.row);\n break;\n case 'column-header':\n this.dragContext = { type: 'column-header', anchorColumn: hit.column };\n selection.selectColumns(hit.column);\n break;\n case 'corner':\n this.dragContext = { type: 'corner' };\n selection.selectAll();\n break;\n default:\n this.isDragging = false;\n this.dragContext = null;\n return;\n }\n\n this.worksheet.render();\n this.worksheet.notifySelectionChanged();\n };\n\n private handleMouseMove = (event: MouseEvent): void => {\n const point = this.getCanvasPoint(event);\n if (this.isResizing && this.resizeContext) {\n if (point) {\n event.preventDefault();\n this.handleResizeDrag(point);\n }\n return;\n }\n\n if (!this.isDragging || !this.dragContext) {\n this.updateHoverCursor(point);\n return;\n }\n\n if (!point) {\n return;\n }\n\n const hit = this.worksheet.hitTest(point.x, point.y);\n if (!hit) {\n return;\n }\n\n let updated = false;\n const { selection } = this.worksheet;\n\n switch (this.dragContext.type) {\n case 'cell':\n if (hit.type === 'cell') {\n selection.update(hit.row, hit.column);\n updated = true;\n }\n break;\n case 'row-header': {\n const row = this.resolveRowFromHit(hit);\n if (row !== null) {\n selection.selectRows(this.dragContext.anchorRow, row);\n updated = true;\n }\n break;\n }\n case 'column-header': {\n const column = this.resolveColumnFromHit(hit);\n if (column !== null) {\n selection.selectColumns(this.dragContext.anchorColumn, column);\n updated = true;\n }\n break;\n }\n case 'corner':\n default:\n break;\n }\n\n if (updated) {\n event.preventDefault();\n this.worksheet.render();\n this.worksheet.notifySelectionChanged();\n }\n };\n\n private handleMouseUp = (): void => {\n if (this.isResizing) {\n this.isResizing = false;\n this.resizeContext = null;\n this.setCursor('default');\n this.worksheet.setResizeGuide(null);\n return;\n }\n\n if (!this.isDragging) {\n return;\n }\n\n this.isDragging = false;\n this.dragContext = null;\n };\n\n private handleDoubleClick = (event: MouseEvent): void => {\n const point = this.getCanvasPoint(event);\n if (!point) {\n return;\n }\n\n const columnHandle = this.worksheet.getColumnResizeHandle(point.x, point.y);\n if (columnHandle !== null) {\n event.preventDefault();\n this.worksheet.autoFitColumns({ columns: [columnHandle], respectCustomWidth: false });\n return;\n }\n\n const rowHandle = this.worksheet.getRowResizeHandle(point.x, point.y);\n if (rowHandle !== null) {\n event.preventDefault();\n this.worksheet.autoFitRows({ rows: [rowHandle], respectCustomHeight: false });\n return;\n }\n\n const hit = this.worksheet.hitTest(point.x, point.y);\n if (!hit || hit.type !== 'cell') {\n return;\n }\n\n event.preventDefault();\n this.cellEditor.beginEdit(hit.row, hit.column);\n };\n\n private getCanvasPoint(event: MouseEvent): CanvasPoint | null {\n const rect = this.canvas.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n return null;\n }\n\n return {\n x: event.clientX - rect.left,\n y: event.clientY - rect.top,\n };\n }\n\n private resolveRowFromHit(hit: HitTestResult): number | null {\n if (hit.type === 'row-header' || hit.type === 'cell') {\n return hit.row;\n }\n return null;\n }\n\n private resolveColumnFromHit(hit: HitTestResult): number | null {\n if (hit.type === 'column-header' || hit.type === 'cell') {\n return hit.column;\n }\n return null;\n }\n\n private tryBeginResize(point: CanvasPoint): boolean {\n const columnHandle = this.worksheet.getColumnResizeHandle(point.x, point.y);\n if (columnHandle !== null) {\n this.isResizing = true;\n this.resizeContext = {\n type: 'column',\n column: columnHandle,\n origin: point.x,\n originalSize: this.worksheet.getColumnWidth(columnHandle),\n };\n this.setCursor('col-resize');\n this.worksheet.setResizeGuide({ type: 'column', position: point.x });\n return true;\n }\n\n const rowHandle = this.worksheet.getRowResizeHandle(point.x, point.y);\n if (rowHandle !== null) {\n this.isResizing = true;\n this.resizeContext = {\n type: 'row',\n row: rowHandle,\n origin: point.y,\n originalSize: this.worksheet.getRowHeight(rowHandle),\n };\n this.setCursor('row-resize');\n this.worksheet.setResizeGuide({ type: 'row', position: point.y });\n return true;\n }\n\n return false;\n }\n\n private handleResizeDrag(point: CanvasPoint): void {\n if (!this.resizeContext) {\n return;\n }\n\n if (this.resizeContext.type === 'column') {\n const delta = point.x - this.resizeContext.origin;\n this.worksheet.setResizeGuide({ type: 'column', position: point.x }, false);\n const nextWidth = this.resizeContext.originalSize + delta;\n this.worksheet.setColumnWidth(this.resizeContext.column, nextWidth);\n } else if (this.resizeContext.type === 'row') {\n const delta = point.y - this.resizeContext.origin;\n this.worksheet.setResizeGuide({ type: 'row', position: point.y }, false);\n const nextHeight = this.resizeContext.originalSize + delta;\n this.worksheet.setRowHeight(this.resizeContext.row, nextHeight);\n }\n }\n\n private updateHoverCursor(point: CanvasPoint | null): void {\n if (this.isResizing || this.isDragging) {\n return;\n }\n if (!point) {\n this.setCursor('default');\n return;\n }\n\n if (this.worksheet.getColumnResizeHandle(point.x, point.y) !== null) {\n this.setCursor('col-resize');\n } else if (this.worksheet.getRowResizeHandle(point.x, point.y) !== null) {\n this.setCursor('row-resize');\n } else {\n this.setCursor('default');\n }\n }\n\n private setCursor(cursor: string): void {\n if (this.canvas.style.cursor !== cursor) {\n this.canvas.style.cursor = cursor;\n }\n }\n}\n","import type { CanvasWorksheet } from '../../core/worksheet';\n\ninterface EditingCell {\n row: number;\n column: number;\n}\n\ninterface BeginEditOptions {\n presetValue?: string;\n selectAll?: boolean;\n}\n\nexport class CellEditor {\n private readonly worksheet: CanvasWorksheet;\n\n private readonly input: HTMLTextAreaElement;\n\n private editingCell: EditingCell | null = null;\n\n constructor(worksheet: CanvasWorksheet) {\n this.worksheet = worksheet;\n this.input = this.createInput();\n window.addEventListener('resize', this.refreshPosition);\n }\n\n beginEdit(row: number, column: number, options: BeginEditOptions = {}): void {\n const { presetValue, selectAll = true } = options;\n this.editingCell = { row, column };\n if (presetValue !== undefined) {\n this.input.value = presetValue;\n } else {\n this.input.value = this.worksheet.getCellInput(row, column) ?? '';\n }\n const style = this.worksheet.getComputedCellStyle(row, column);\n this.input.style.textAlign = style.textAlign;\n const fontSizePx = this.worksheet.pointsToPixels(style.fontSize);\n this.input.style.fontSize = `${fontSizePx}px`;\n this.input.style.color = style.color;\n this.input.style.whiteSpace = style.textWrapMode === 'none' ? 'pre' : 'pre-wrap';\n this.input.style.wordBreak = style.textWrapMode === 'break-word' ? 'break-word' : 'normal';\n this.input.style.overflowWrap = style.textWrapMode === 'break-word' ? 'break-word' : 'normal';\n this.updateInputPosition();\n this.input.style.display = 'block';\n this.input.focus();\n if (selectAll) {\n this.input.select();\n } else {\n const pos = this.input.value.length;\n this.input.setSelectionRange(pos, pos);\n }\n }\n\n commit(): void {\n if (!this.editingCell) {\n return;\n }\n const { row, column } = this.editingCell;\n this.worksheet.setCellInput(row, column, this.input.value);\n this.hide();\n }\n\n cancel(): void {\n this.hide();\n }\n\n isEditing(): boolean {\n return this.editingCell !== null;\n }\n\n destroy(): void {\n window.removeEventListener('resize', this.refreshPosition);\n this.input.remove();\n }\n\n private hide(): void {\n this.editingCell = null;\n this.input.style.display = 'none';\n }\n\n private refreshPosition = (): void => {\n if (!this.editingCell) {\n return;\n }\n this.updateInputPosition();\n };\n\n private createInput(): HTMLTextAreaElement {\n const input = document.createElement('textarea');\n input.style.position = 'fixed';\n input.style.display = 'none';\n input.style.font = '14px sans-serif';\n input.style.padding = '2px 4px';\n input.style.border = '2px solid #2196f3';\n input.style.boxShadow = '0 2px 4px rgba(0, 0, 0, 0.15)';\n input.style.outline = 'none';\n input.style.background = '#fff';\n input.style.textAlign = 'left';\n input.style.zIndex = '1000';\n input.style.resize = 'none';\n input.style.whiteSpace = 'pre-wrap';\n input.style.overflow = 'hidden';\n input.addEventListener('keydown', (event) => {\n if (\n event.key === 'Enter' &&\n !event.shiftKey &&\n !event.altKey &&\n !event.ctrlKey &&\n !event.metaKey\n ) {\n event.preventDefault();\n this.commit();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.cancel();\n } else if (\n (event.key === 'ArrowLeft' ||\n event.key === 'ArrowRight' ||\n event.key === 'ArrowUp' ||\n event.key === 'ArrowDown') &&\n !event.shiftKey &&\n !event.metaKey &&\n !event.ctrlKey &&\n !event.altKey\n ) {\n this.handleHorizontalNavigation(event);\n }\n });\n input.addEventListener('blur', () => {\n this.commit();\n });\n document.body.appendChild(input);\n return input;\n }\n\n private updateInputPosition(): void {\n if (!this.editingCell) {\n return;\n }\n\n const rect = this.worksheet.canvas.getBoundingClientRect();\n if (rect.width === 0 || rect.height === 0) {\n return;\n }\n\n const cellRect = this.worksheet.getCellRect(this.editingCell.row, this.editingCell.column);\n const left = rect.left + cellRect.x;\n const top = rect.top + cellRect.y;\n const width = cellRect.width;\n const height = cellRect.height;\n\n this.input.style.left = `${left}px`;\n this.input.style.top = `${top}px`;\n this.input.style.width = `${width}px`;\n this.input.style.height = `${height}px`;\n this.input.style.lineHeight = '1.4';\n }\n\n private handleHorizontalNavigation(event: KeyboardEvent): void {\n if (!this.editingCell) {\n return;\n }\n\n const selectionStart = this.input.selectionStart;\n const selectionEnd = this.input.selectionEnd;\n if (selectionStart === null || selectionEnd === null || selectionStart !== selectionEnd) {\n return;\n }\n\n if (event.key === 'ArrowRight' && selectionEnd === this.input.value.length) {\n event.preventDefault();\n this.commitAndMove(0, 1);\n } else if (event.key === 'ArrowLeft' && selectionStart === 0) {\n event.preventDefault();\n this.commitAndMove(0, -1);\n } else if (event.key === 'ArrowUp' && selectionStart === 0) {\n event.preventDefault();\n this.commitAndMove(-1, 0);\n } else if (event.key === 'ArrowDown' && selectionEnd === this.input.value.length) {\n event.preventDefault();\n this.commitAndMove(1, 0);\n }\n }\n\n private commitAndMove(rowDelta: number, columnDelta: number): void {\n if (!this.editingCell) {\n return;\n }\n this.commit();\n const next = this.worksheet.selection.moveActiveCell(rowDelta, columnDelta);\n this.worksheet.render();\n this.worksheet.notifySelectionChanged();\n this.beginEdit(next.row, next.column);\n }\n}\n","import type { CanvasWorksheet } from '../../core/worksheet';\nimport type { CellEditor } from '../editor/cellEditor';\n\nexport class KeyboardController {\n private readonly worksheet: CanvasWorksheet;\n\n private readonly cellEditor: CellEditor;\n\n constructor(worksheet: CanvasWorksheet, cellEditor: CellEditor) {\n this.worksheet = worksheet;\n this.cellEditor = cellEditor;\n window.addEventListener('keydown', this.handleKeyDown, { passive: false });\n }\n\n destroy(): void {\n window.removeEventListener('keydown', this.handleKeyDown);\n }\n\n private handleKeyDown = (event: KeyboardEvent): void => {\n if (event.defaultPrevented) {\n return;\n }\n\n if (this.cellEditor.isEditing()) {\n return;\n }\n\n const focused = document.activeElement;\n if (\n focused instanceof HTMLInputElement ||\n focused instanceof HTMLTextAreaElement ||\n focused instanceof HTMLSelectElement ||\n (focused instanceof HTMLElement && focused.isContentEditable)\n ) {\n return;\n }\n\n if (this.handleNavigationKeys(event)) {\n return;\n }\n\n const activeCell = this.ensureActiveCell();\n\n if (event.key === 'F2') {\n event.preventDefault();\n this.cellEditor.beginEdit(activeCell.row, activeCell.column);\n return;\n }\n\n if (event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n this.cellEditor.beginEdit(activeCell.row, activeCell.column, {\n presetValue: event.key,\n selectAll: false,\n });\n }\n };\n\n private handleNavigationKeys(event: KeyboardEvent): boolean {\n const selection = this.worksheet.selection;\n const key = event.key;\n let moved = false;\n switch (key) {\n case 'ArrowUp':\n selection.moveActiveCell(-1, 0);\n moved = true;\n break;\n case 'ArrowDown':\n selection.moveActiveCell(1, 0);\n moved = true;\n break;\n case 'ArrowLeft':\n selection.moveActiveCell(0, -1);\n moved = true;\n break;\n case 'ArrowRight':\n selection.moveActiveCell(0, 1);\n moved = true;\n break;\n default:\n break;\n }\n\n if (moved) {\n event.preventDefault();\n this.worksheet.render();\n this.worksheet.notifySelectionChanged();\n }\n return moved;\n }\n\n private ensureActiveCell(): { row: number; column: number } {\n const active = this.worksheet.selection.getActiveCell();\n if (active) {\n return active;\n }\n const fallback = this.worksheet.selection.moveActiveCell(0, 0);\n this.worksheet.notifySelectionChanged();\n return fallback;\n }\n}\n","import type { CanvasWorksheet, WorksheetImageInfo, WorksheetImagePlacement } from '../../core/worksheet/canvasWorksheet';\n\ntype ImageEntry = {\n element: HTMLImageElement;\n info: WorksheetImageInfo;\n};\n\nexport class WorksheetImageLayer {\n private readonly worksheet: CanvasWorksheet;\n\n private readonly container: HTMLDivElement;\n\n private readonly images: Map<string, ImageEntry> = new Map();\n\n private unsubscribeScroll: (() => void) | null = null;\n\n private unsubscribeStructure: (() => void) | null = null;\n\n private unsubscribeImages: (() => void) | null = null;\n\n constructor(worksheet: CanvasWorksheet, host: HTMLElement) {\n this.worksheet = worksheet;\n this.container = document.createElement('div');\n this.container.className = 'reogrid-image-layer';\n this.container.style.position = 'absolute';\n this.container.style.inset = '0';\n this.container.style.pointerEvents = 'none';\n this.container.style.zIndex = '2';\n host.appendChild(this.container);\n this.unsubscribeScroll = this.worksheet.onScrollChange((offset) => {\n this.syncScroll(offset.x, offset.y);\n });\n this.syncScroll(this.worksheet.getScrollOffset().x, this.worksheet.getScrollOffset().y);\n this.unsubscribeStructure = this.worksheet.onStructureChange(() => this.layoutAll());\n this.unsubscribeImages = this.worksheet.onImagesChange((images) => this.setImages(images));\n }\n\n destroy(): void {\n this.clearImages();\n if (this.unsubscribeScroll) {\n this.unsubscribeScroll();\n this.unsubscribeScroll = null;\n }\n if (this.unsubscribeStructure) {\n this.unsubscribeStructure();\n this.unsubscribeStructure = null;\n }\n if (this.unsubscribeImages) {\n this.unsubscribeImages();\n this.unsubscribeImages = null;\n }\n this.container.remove();\n }\n\n private setImages(images: WorksheetImageInfo[]): void {\n const nextIds = new Set(images.map((image) => image.id));\n for (const [id, entry] of this.images.entries()) {\n if (!nextIds.has(id)) {\n this.removeImageEntry(entry);\n this.images.delete(id);\n }\n }\n images.forEach((image) => {\n const existing = this.images.get(image.id);\n if (existing) {\n existing.info = image;\n this.layoutImage(existing.element, image.anchor);\n return;\n }\n const element = document.createElement('img');\n element.draggable = false;\n element.alt = '';\n element.decoding = 'async';\n element.loading = 'lazy';\n element.style.position = 'absolute';\n element.style.pointerEvents = 'none';\n element.style.userSelect = 'none';\n element.style.display = 'block';\n element.style.maxWidth = 'none';\n element.style.maxHeight = 'none';\n element.src = this.worksheet.createImageUrl(image.id);\n this.container.appendChild(element);\n this.layoutImage(element, image.anchor);\n this.images.set(image.id, { element, info: image });\n });\n }\n\n private clearImages(): void {\n for (const entry of this.images.values()) {\n this.removeImageEntry(entry);\n }\n this.images.clear();\n }\n\n private layoutAll(): void {\n for (const entry of this.images.values()) {\n this.layoutImage(entry.element, entry.info.anchor);\n }\n }\n\n private removeImageEntry(entry: ImageEntry): void {\n entry.element.remove();\n this.worksheet.revokeImageUrl(entry.info.id);\n }\n\n private layoutImage(element: HTMLImageElement, anchor: WorksheetImagePlacement): void {\n if (anchor.type === 'oneCell') {\n const point = this.getAnchorPoint(anchor.from);\n const width = Math.max(0, anchor.width);\n const height = Math.max(0, anchor.height);\n element.style.left = `${point.x}px`;\n element.style.top = `${point.y}px`;\n element.style.width = `${width}px`;\n element.style.height = `${height}px`;\n return;\n }\n const from = this.getAnchorPoint(anchor.from);\n const to = this.getAnchorPoint(anchor.to);\n const width = Math.max(0, to.x - from.x);\n const height = Math.max(0, to.y - from.y);\n element.style.left = `${from.x}px`;\n element.style.top = `${from.y}px`;\n element.style.width = `${width}px`;\n element.style.height = `${height}px`;\n }\n\n private getAnchorPoint(anchor: WorksheetImagePlacement['from']): { x: number; y: number } {\n const x = this.worksheet.getColumnStart(anchor.column) + anchor.offsetX;\n const y = this.worksheet.getRowStart(anchor.row) + anchor.offsetY;\n return { x, y };\n }\n\n private syncScroll(scrollX: number, scrollY: number): void {\n this.container.style.transform = `translate(${-scrollX}px, ${-scrollY}px)`;\n }\n}\n","import { CANVAS_ID, WORKSPACE_ID } from './app/domIds';\nimport {\n GRID_LAYER_CLASS,\n GRID_SCROLL_CLASS,\n GRID_SPACER_CLASS,\n WORKBOOK_CLASS,\n WORKSPACE_CLASS,\n WORKSHEET_CONTAINER_CLASS,\n ensureWorkspaceStyles,\n} from './app/styles';\nimport { CanvasWorksheet } from './core/worksheet';\nimport { PointerController } from './render/controllers/pointerController';\nimport { CellEditor } from './render/editor/cellEditor';\nimport { KeyboardController } from './render/controllers/keyboardController';\nimport { WorksheetImageLayer } from './render/layers/imageLayer';\n\ntype WorkspaceSurface = {\n canvas: HTMLCanvasElement;\n scrollContainer: HTMLDivElement;\n spacer: HTMLDivElement;\n worksheetContainer: HTMLDivElement;\n};\n\nexport type ReogridMountTarget = string | HTMLElement;\n\nexport interface ReogridOptions {\n workspace?: ReogridMountTarget;\n workspaceId?: string;\n canvasId?: string;\n injectStyles?: boolean;\n /** Maximum number of rows. Writes beyond this limit are silently ignored. */\n maxRows?: number;\n /** Maximum number of columns. Writes beyond this limit are silently ignored. */\n maxCols?: number;\n}\n\nexport interface ReogridInstance {\n worksheet: CanvasWorksheet;\n cellEditor: CellEditor;\n pointerController: PointerController;\n keyboardController: KeyboardController;\n destroy: () => void;\n}\n\nconst WORKSPACE_DATASET_FLAG = 'reogridMounted';\nconst WHEEL_LISTENER_OPTIONS: AddEventListenerOptions = { passive: false };\n\nexport function createReogrid(options: ReogridOptions = {}): ReogridInstance {\n if (typeof document === 'undefined') {\n throw new Error('createReogrid requires a browser environment.');\n }\n\n if (options.injectStyles !== false) {\n ensureWorkspaceStyles();\n }\n\n const workspace = resolveWorkspaceElement(options.workspace, options.workspaceId ?? WORKSPACE_ID);\n const canvasId = options.canvasId ?? CANVAS_ID;\n const surface = ensureWorkspaceSurface(workspace, canvasId);\n const { worksheet, destroy: teardownWorksheet } = initCanvasWorksheet(surface, {\n maxRows: options.maxRows,\n maxCols: options.maxCols,\n });\n\n const cellEditor = new CellEditor(worksheet);\n const pointerController = new PointerController(worksheet, cellEditor, surface.worksheetContainer);\n const keyboardController = new KeyboardController(worksheet, cellEditor);\n const imageLayer = new WorksheetImageLayer(worksheet, surface.worksheetContainer);\n const detachFontSync = attachFontRenderSync(worksheet);\n\n worksheet.notifySelectionChanged();\n\n const destroy = (): void => {\n detachFontSync();\n imageLayer.destroy();\n pointerController.destroy();\n keyboardController.destroy();\n cellEditor.destroy();\n teardownWorksheet();\n delete workspace.dataset[WORKSPACE_DATASET_FLAG];\n };\n\n return {\n worksheet,\n cellEditor,\n pointerController,\n keyboardController,\n destroy,\n };\n}\n\nfunction resolveWorkspaceElement(\n target: ReogridMountTarget | undefined,\n fallbackId: string,\n): HTMLElement {\n if (target instanceof HTMLElement) {\n return target;\n }\n\n if (typeof target === 'string') {\n const element = document.querySelector<HTMLElement>(target);\n if (element) {\n return element;\n }\n throw new Error(`Workspace element \"${target}\" was not found.`);\n }\n\n const fallback = document.getElementById(fallbackId);\n if (fallback instanceof HTMLElement) {\n return fallback;\n }\n\n throw new Error(`Workspace element \"#${fallbackId}\" was not found.`);\n}\n\nfunction ensureWorkspaceSurface(workspace: HTMLElement, canvasId: string): WorkspaceSurface {\n if (workspace.dataset[WORKSPACE_DATASET_FLAG]) {\n throw new Error('A ReoGrid instance is already mounted on this workspace.');\n }\n\n const doc = workspace.ownerDocument ?? document;\n workspace.classList.add(WORKSPACE_CLASS);\n\n let workbook = workspace.querySelector<HTMLDivElement>(`.${WORKBOOK_CLASS}`);\n if (!workbook) {\n workbook = doc.createElement('div');\n workbook.className = WORKBOOK_CLASS;\n workspace.appendChild(workbook);\n }\n\n let worksheetContainer = workbook.querySelector<HTMLDivElement>(`.${WORKSHEET_CONTAINER_CLASS}`);\n if (!worksheetContainer) {\n worksheetContainer = doc.createElement('div');\n worksheetContainer.className = WORKSHEET_CONTAINER_CLASS;\n workbook.appendChild(worksheetContainer);\n }\n\n let scrollContainer = worksheetContainer.querySelector<HTMLDivElement>(`.${GRID_SCROLL_CLASS}`);\n if (!scrollContainer) {\n scrollContainer = doc.createElement('div');\n scrollContainer.className = GRID_SCROLL_CLASS;\n worksheetContainer.appendChild(scrollContainer);\n }\n\n let spacer = scrollContainer.querySelector<HTMLDivElement>(`.${GRID_SPACER_CLASS}`);\n if (!spacer) {\n spacer = doc.createElement('div');\n spacer.className = GRID_SPACER_CLASS;\n scrollContainer.appendChild(spacer);\n }\n\n let canvas = worksheetContainer.querySelector<HTMLCanvasElement>(`#${canvasId}`);\n if (!canvas) {\n canvas = doc.createElement('canvas');\n canvas.id = canvasId;\n worksheetContainer.appendChild(canvas);\n }\n canvas.classList.add(GRID_LAYER_CLASS);\n\n workspace.dataset[WORKSPACE_DATASET_FLAG] = 'true';\n\n return { canvas, scrollContainer, spacer, worksheetContainer };\n}\n\nfunction initCanvasWorksheet(\n surface: WorkspaceSurface,\n constraints: { maxRows?: number; maxCols?: number },\n): {\n worksheet: CanvasWorksheet;\n destroy: () => void;\n} {\n const worksheet = new CanvasWorksheet(surface.canvas, constraints);\n\n const syncScrollFromWorksheet = (): void => {\n const { x, y } = worksheet.getScrollOffset();\n if (Math.abs(surface.scrollContainer.scrollLeft - x) > 0.5) {\n surface.scrollContainer.scrollLeft = x;\n }\n if (Math.abs(surface.scrollContainer.scrollTop - y) > 0.5) {\n surface.scrollContainer.scrollTop = y;\n }\n };\n\n const updateSpacerSize = (): void => {\n const size = worksheet.getScrollContentSize();\n surface.spacer.style.width = `${size.width}px`;\n surface.spacer.style.height = `${size.height}px`;\n syncScrollFromWorksheet();\n };\n\n const handleScroll = (): void => {\n worksheet.setScrollOffset(\n surface.scrollContainer.scrollLeft,\n surface.scrollContainer.scrollTop,\n );\n };\n\n const handleWheel = (event: WheelEvent): void => {\n if (event.ctrlKey || event.metaKey) {\n return;\n }\n surface.scrollContainer.scrollBy({\n left: event.deltaX,\n top: event.deltaY,\n behavior: 'auto',\n });\n event.preventDefault();\n };\n\n const handleResize = (): void => {\n worksheet.resize();\n };\n\n const positionScrollContainer = (): void => {\n surface.scrollContainer.style.top = `${worksheet.headerRowHeight}px`;\n surface.scrollContainer.style.left = `${worksheet.headerColumnWidth}px`;\n surface.scrollContainer.style.right = '0';\n surface.scrollContainer.style.bottom = '0';\n };\n\n surface.scrollContainer.addEventListener('scroll', handleScroll);\n surface.worksheetContainer.addEventListener('wheel', handleWheel, WHEEL_LISTENER_OPTIONS);\n const stopScrollbarPointerEvents = (event: MouseEvent): void => {\n if (isPointerEventOnScrollbar(event, surface.scrollContainer)) {\n event.stopPropagation();\n }\n };\n surface.scrollContainer.addEventListener('mousedown', stopScrollbarPointerEvents);\n surface.scrollContainer.addEventListener('dblclick', stopScrollbarPointerEvents);\n\n const unsubscribeViewport = worksheet.onViewportSizeChange(updateSpacerSize);\n const unsubscribeScroll = worksheet.onScrollChange(syncScrollFromWorksheet);\n const detachStructureListener = worksheet.onStructureChange(positionScrollContainer);\n const detachViewportSizeListener = worksheet.onViewportSizeChange(positionScrollContainer);\n\n if (typeof window !== 'undefined') {\n window.addEventListener('resize', handleResize);\n }\n\n updateSpacerSize();\n positionScrollContainer();\n\n return {\n worksheet,\n destroy: () => {\n surface.scrollContainer.removeEventListener('scroll', handleScroll);\n surface.scrollContainer.removeEventListener('mousedown', stopScrollbarPointerEvents);\n surface.scrollContainer.removeEventListener('dblclick', stopScrollbarPointerEvents);\n surface.worksheetContainer.removeEventListener('wheel', handleWheel, WHEEL_LISTENER_OPTIONS);\n if (typeof window !== 'undefined') {\n window.removeEventListener('resize', handleResize);\n }\n unsubscribeViewport();\n unsubscribeScroll();\n detachStructureListener();\n detachViewportSizeListener();\n },\n };\n}\n\nfunction isPointerEventOnScrollbar(event: MouseEvent, container: HTMLDivElement): boolean {\n const rect = container.getBoundingClientRect();\n const verticalScrollbarWidth = rect.width - container.clientWidth;\n const horizontalScrollbarHeight = rect.height - container.clientHeight;\n const isOverVerticalScrollbar =\n verticalScrollbarWidth > 0 && event.clientX >= rect.right - verticalScrollbarWidth;\n const isOverHorizontalScrollbar =\n horizontalScrollbarHeight > 0 && event.clientY >= rect.bottom - horizontalScrollbarHeight;\n return isOverVerticalScrollbar || isOverHorizontalScrollbar;\n}\n\nfunction attachFontRenderSync(worksheet: CanvasWorksheet): () => void {\n if (typeof document === 'undefined' || typeof document.fonts === 'undefined') {\n return () => {};\n }\n const fonts = document.fonts;\n let disposed = false;\n const rerender = (): void => {\n if (!disposed) {\n worksheet.render();\n }\n };\n if (fonts.ready && typeof fonts.ready.then === 'function') {\n fonts.ready.then(rerender).catch(() => {});\n }\n const handleLoadingDone = (): void => {\n rerender();\n };\n if (typeof fonts.addEventListener === 'function' && typeof fonts.removeEventListener === 'function') {\n fonts.addEventListener('loadingdone', handleLoadingDone);\n return () => {\n disposed = true;\n fonts.removeEventListener('loadingdone', handleLoadingDone);\n };\n }\n return () => {\n disposed = true;\n };\n}\n\nexport { CanvasWorksheet } from './core/worksheet';\nexport type { CellStyleInput } from './core/worksheet/handles';\nexport type {\n WorksheetImageInfo,\n WorksheetImagePlacement,\n WorksheetImageAnchorPosition,\n SaveXlsxOptions,\n LoadXlsxOptions,\n} from './core/worksheet/canvasWorksheet';\nexport type { TextAlign, VerticalAlign, CellStyle } from './core/style/cellStyle';\nexport { Worksheet } from './core/worksheet/worksheet';\nexport { ToolbarController } from './render/controllers/toolbarController';\nexport { CellEditor } from './render/editor/cellEditor';\nexport { PointerController } from './render/controllers/pointerController';\nexport { KeyboardController } from './render/controllers/keyboardController';\nexport * from './constants';\nexport { buildXlsxFromSnapshot } from './io/xlsxWriter';\n","import { createReogrid as createReogridCore, type ReogridInstance, type ReogridOptions } from '../index';\n\nexport type { ReogridInstance };\nexport type { ReogridOptions };\n\n// ── License validation ────────────────────────────────────────────────────────\n\ninterface LicenseCache {\n valid: boolean;\n cachedAt: number;\n plan?: string;\n expiresAt?: string | null;\n}\n\nconst CACHE_KEY = '__reogrid_pro_license__';\nconst CACHE_TTL_MS = 7 * 24 * 60 * 60 * 1000; // re-validate after 7 days\nconst GRACE_PERIOD_MS = 30 * 24 * 60 * 60 * 1000; // offline grace: 30 days\n\nfunction readCache(): LicenseCache | null {\n try {\n if (typeof localStorage !== 'undefined') {\n const raw = localStorage.getItem(CACHE_KEY);\n if (raw) return JSON.parse(raw) as LicenseCache;\n }\n } catch { /* ignore */ }\n return null;\n}\n\nfunction writeCache(data: LicenseCache): void {\n try {\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem(CACHE_KEY, JSON.stringify(data));\n }\n } catch { /* ignore */ }\n}\n\nasync function validateRemote(key: string, endpoint: string): Promise<LicenseCache> {\n const res = await fetch(`${endpoint}/reogrid/license/validate`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ key }),\n });\n const data = await res.json() as { valid: boolean; plan?: string; expiresAt?: string | null };\n return {\n valid: !!data.valid,\n plan: data.plan,\n expiresAt: data.expiresAt,\n cachedAt: Date.now(),\n };\n}\n\nasync function checkLicense(key: string, endpoint: string): Promise<boolean> {\n const cached = readCache();\n const now = Date.now();\n\n // Cache still fresh — skip network call\n if (cached && now - cached.cachedAt < CACHE_TTL_MS) {\n return cached.valid;\n }\n\n try {\n const result = await validateRemote(key, endpoint);\n writeCache(result);\n if (!result.valid) {\n console.warn('[ReoGrid Pro] License validation failed. Please check your license key.');\n }\n return result.valid;\n } catch {\n // Server unreachable — fall back to cached result within grace period\n if (cached && now - cached.cachedAt < GRACE_PERIOD_MS) {\n console.warn('[ReoGrid Pro] License server unreachable. Using cached result (grace period).');\n return cached.valid;\n }\n console.warn('[ReoGrid Pro] License server unreachable and no valid cache. License unverified.');\n return false;\n }\n}\n\n// ── Public API ────────────────────────────────────────────────────────────────\n\nexport interface ReogridProOptions extends ReogridOptions {\n /**\n * Your ReoGrid Pro license key (issued from the Unvell customer portal).\n */\n licenseKey?: string;\n\n /**\n * License validation endpoint base URL.\n * Defaults to the official Unvell API server.\n */\n licenseEndpoint?: string;\n}\n\nconst DEFAULT_ENDPOINT = 'https://api.unvell.com';\n\n/**\n * Creates a ReoGrid Pro instance.\n * License validation runs in the background — the grid is immediately usable.\n * An invalid or missing key logs a console warning but does not block rendering.\n */\nexport function createReogrid(options: ReogridProOptions = {}): ReogridInstance {\n const { licenseKey, licenseEndpoint = DEFAULT_ENDPOINT, ...gridOptions } = options;\n\n const instance = createReogridCore(gridOptions);\n\n if (licenseKey) {\n checkLicense(licenseKey, licenseEndpoint).then(valid => {\n if (!valid) {\n console.warn(\n '[ReoGrid Pro] Invalid or expired license key. ' +\n 'Visit https://unvell.com/portal to manage your license.',\n );\n }\n });\n } else {\n console.warn(\n '[ReoGrid Pro] No license key provided. ' +\n 'A license key is required for production use. ' +\n 'Visit https://unvell.com/portal to obtain one.',\n );\n }\n\n return instance;\n}\n"],"mappings":"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","names":["textDecoder","valueNode","decodeUtf8","LOCAL_FILE_HEADER_SIGNATURE","textEncoder","encodeUtf8","lines","maxWidth","width","height","createReogrid"]}