@coco-vexel/coco-office-editor 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +510 -2
- package/THIRD_PARTY_NOTICES.md +212 -0
- package/dist/index.cjs +26401 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +12 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.js +26192 -0
- package/dist/index.js.map +1 -0
- package/dist/model-DB6aN6uJ.d.cts +321 -0
- package/dist/model-DB6aN6uJ.d.ts +321 -0
- package/dist/native-B6B649CC.d.ts +1111 -0
- package/dist/native-Ct9nN06K.d.cts +1111 -0
- package/dist/ppt-native.cjs +5334 -0
- package/dist/ppt-native.cjs.map +1 -0
- package/dist/ppt-native.d.cts +2 -0
- package/dist/ppt-native.d.ts +2 -0
- package/dist/ppt-native.js +5332 -0
- package/dist/ppt-native.js.map +1 -0
- package/dist/ppt.cjs +5426 -0
- package/dist/ppt.cjs.map +1 -0
- package/dist/ppt.d.cts +306 -0
- package/dist/ppt.d.ts +306 -0
- package/dist/ppt.js +5410 -0
- package/dist/ppt.js.map +1 -0
- package/dist/spreadsheet.cjs +4276 -0
- package/dist/spreadsheet.cjs.map +1 -0
- package/dist/spreadsheet.d.cts +676 -0
- package/dist/spreadsheet.d.ts +676 -0
- package/dist/spreadsheet.js +4213 -0
- package/dist/spreadsheet.js.map +1 -0
- package/dist/word-editing.cjs +812 -0
- package/dist/word-editing.cjs.map +1 -0
- package/dist/word-editing.d.cts +149 -0
- package/dist/word-editing.d.ts +149 -0
- package/dist/word-editing.js +803 -0
- package/dist/word-editing.js.map +1 -0
- package/dist/word-native.cjs +13400 -0
- package/dist/word-native.cjs.map +1 -0
- package/dist/word-native.d.cts +4 -0
- package/dist/word-native.d.ts +4 -0
- package/dist/word-native.js +13293 -0
- package/dist/word-native.js.map +1 -0
- package/dist/word-prosemirror.cjs +489 -0
- package/dist/word-prosemirror.cjs.map +1 -0
- package/dist/word-prosemirror.d.cts +21 -0
- package/dist/word-prosemirror.d.ts +21 -0
- package/dist/word-prosemirror.js +483 -0
- package/dist/word-prosemirror.js.map +1 -0
- package/dist/word.cjs +16764 -0
- package/dist/word.cjs.map +1 -0
- package/dist/word.d.cts +84 -0
- package/dist/word.d.ts +84 -0
- package/dist/word.js +16632 -0
- package/dist/word.js.map +1 -0
- package/package.json +106 -3
- package/src/styles/editor.css +1507 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/spreadsheet/types.ts","../src/spreadsheet/render-model.ts","../src/spreadsheet/layout.ts","../src/spreadsheet/viewport.ts","../src/spreadsheet/style-resolver.ts","../src/spreadsheet/canvas-renderer.ts","../src/spreadsheet/selection.ts","../src/spreadsheet/clipboard.ts","../src/spreadsheet/auto-fill.ts","../src/spreadsheet/commands.ts","../src/spreadsheet/search.ts","../src/spreadsheet/filter.ts","../src/spreadsheet/runtime.ts","../src/spreadsheet/agent-action.ts","../src/spreadsheet/editing.ts","../src/spreadsheet/scrollbar.ts","../src/spreadsheet/resize.ts","../src/spreadsheet/format-state.ts","../src/spreadsheet/native.ts"],"names":["formatCellAddress","rangesIntersect","formatRangeAddress","_a","drawing","anchor","parseCellAddress","_b","parseRangeAddress","containsPoint","hit"],"mappings":"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","file":"spreadsheet.js","sourcesContent":["import type {\n ExcelCellKind,\n ExcelCellModel,\n ExcelCellValue,\n ExcelColumnModel,\n ExcelMergedRangeModel,\n ExcelRowModel,\n ExcelSheetModel,\n ExcelStylesModel,\n} from '@coco-vexel/coco-office/excel';\n\nexport interface SpreadsheetPoint {\n x: number;\n y: number;\n}\n\nexport interface SpreadsheetSize {\n width: number;\n height: number;\n}\n\nexport interface SpreadsheetRect extends SpreadsheetPoint, SpreadsheetSize {}\n\nexport interface SpreadsheetRange {\n startRow: number;\n startColumn: number;\n endRow: number;\n endColumn: number;\n}\n\nexport interface SpreadsheetRenderCell {\n row: number;\n column: number;\n address: string;\n kind: ExcelCellKind;\n value: ExcelCellValue;\n displayText: string;\n formula?: string;\n styleId?: number;\n source: ExcelCellModel;\n}\n\nexport interface SpreadsheetMergeInfo {\n address: string;\n range: SpreadsheetRange;\n masterAddress: string;\n source: ExcelMergedRangeModel;\n}\n\nexport interface SpreadsheetSheetRenderModel {\n sheetId: string;\n sheetName: string;\n source: ExcelSheetModel;\n styles: ExcelStylesModel;\n cellsByAddress: Map<string, SpreadsheetRenderCell>;\n cellsByRowColumn: Map<string, SpreadsheetRenderCell>;\n rowMetaByIndex: Map<number, ExcelRowModel>;\n columnMetaByIndex: Map<number, ExcelColumnModel>;\n mergeMasterByAddress: Map<string, SpreadsheetMergeInfo>;\n mergeFollowerByAddress: Map<string, string>;\n maxRow: number;\n maxColumn: number;\n}\n\nexport interface SpreadsheetLayoutOptions {\n defaultRowHeight?: number;\n defaultColumnWidth?: number;\n rowHeaderWidth?: number;\n columnHeaderHeight?: number;\n rowCount?: number;\n columnCount?: number;\n}\n\nexport interface SpreadsheetHitCell {\n kind: 'cell';\n row: number;\n column: number;\n address: string;\n}\n\nexport interface SpreadsheetHitColumnHeader {\n kind: 'columnHeader';\n column: number;\n}\n\nexport interface SpreadsheetHitRowHeader {\n kind: 'rowHeader';\n row: number;\n}\n\nexport interface SpreadsheetHitCorner {\n kind: 'corner';\n}\n\nexport interface SpreadsheetHitNone {\n kind: 'none';\n}\n\nexport type SpreadsheetHitResult =\n | SpreadsheetHitCell\n | SpreadsheetHitColumnHeader\n | SpreadsheetHitRowHeader\n | SpreadsheetHitCorner\n | SpreadsheetHitNone;\n\nexport type SpreadsheetViewportKind =\n | 'main'\n | 'frozenTop'\n | 'frozenLeft'\n | 'frozenTopLeft'\n | 'columnHeaderScrollable'\n | 'columnHeaderFrozen'\n | 'rowHeaderScrollable'\n | 'rowHeaderFrozen'\n | 'corner';\n\nexport interface SpreadsheetViewport {\n kind: SpreadsheetViewportKind;\n screenRect: SpreadsheetRect;\n originX: number;\n originY: number;\n rows: { start: number; end: number };\n columns: { start: number; end: number };\n}\n\nexport interface SpreadsheetScrollState {\n x: number;\n y: number;\n}\n\nexport interface SpreadsheetFreezeState {\n frozenRows: number;\n frozenColumns: number;\n}\n\nexport interface SpreadsheetViewportState {\n viewportSize: SpreadsheetSize;\n scroll: SpreadsheetScrollState;\n freeze: SpreadsheetFreezeState;\n}\n\nexport function rowColumnKey(row: number, column: number): string {\n return `${row}:${column}`;\n}\n\n","import {\n formatCellAddress,\n parseCellAddress,\n parseRangeAddress,\n type ExcelCellModel,\n type ExcelColumnModel,\n type ExcelRowModel,\n type ExcelSheetModel,\n type ExcelStylesModel,\n type SpreadsheetFormulaResult,\n} from '@coco-vexel/coco-office/excel';\nimport {\n rowColumnKey,\n type SpreadsheetMergeInfo,\n type SpreadsheetRange,\n type SpreadsheetRenderCell,\n type SpreadsheetSheetRenderModel,\n} from './types.js';\n\nexport interface BuildSpreadsheetRenderModelOptions {\n minimumRows?: number;\n minimumColumns?: number;\n formulaResults?: Map<string, SpreadsheetFormulaResult>;\n}\n\nexport function buildSpreadsheetSheetRenderModel(\n sheet: ExcelSheetModel,\n styles: ExcelStylesModel,\n options: BuildSpreadsheetRenderModelOptions = {},\n): SpreadsheetSheetRenderModel {\n const cellsByAddress = new Map<string, SpreadsheetRenderCell>();\n const cellsByRowColumn = new Map<string, SpreadsheetRenderCell>();\n const rowMetaByIndex = new Map<number, ExcelRowModel>();\n const columnMetaByIndex = new Map<number, ExcelColumnModel>();\n const mergeMasterByAddress = new Map<string, SpreadsheetMergeInfo>();\n const mergeFollowerByAddress = new Map<string, string>();\n let maxRow = options.minimumRows ?? 100;\n let maxColumn = options.minimumColumns ?? 26;\n\n for (const row of sheet.rows) {\n rowMetaByIndex.set(row.index, row);\n maxRow = Math.max(maxRow, row.index);\n }\n\n for (const column of sheet.columns) {\n for (let index = column.min; index <= column.max; index++) {\n columnMetaByIndex.set(index, column);\n }\n maxColumn = Math.max(maxColumn, column.max);\n }\n\n for (const cell of sheet.cells) {\n const renderCell = toRenderCell(cell, styles, options.formulaResults);\n cellsByAddress.set(cell.address, renderCell);\n cellsByRowColumn.set(rowColumnKey(cell.row, cell.column), renderCell);\n maxRow = Math.max(maxRow, cell.row);\n maxColumn = Math.max(maxColumn, cell.column);\n }\n\n // Dynamic-array spill cells are calculated results without persisted source cells.\n for (const [address, result] of options.formulaResults ?? []) {\n if (cellsByAddress.has(address) || result.error) continue;\n const parsed = parseCellAddress(address);\n const virtualCell: ExcelCellModel = {\n address,\n row: parsed.row,\n column: parsed.column,\n kind: 'formula',\n value: null,\n };\n const renderCell = toRenderCell(virtualCell, styles, options.formulaResults);\n cellsByAddress.set(address, renderCell);\n cellsByRowColumn.set(rowColumnKey(parsed.row, parsed.column), renderCell);\n maxRow = Math.max(maxRow, parsed.row);\n maxColumn = Math.max(maxColumn, parsed.column);\n }\n\n for (const merge of sheet.mergedRanges) {\n const range = parseRangeAddress(merge.address);\n const endRow = range.startRow + range.rowCount - 1;\n const endColumn = range.startColumn + range.columnCount - 1;\n const renderRange: SpreadsheetRange = {\n startRow: range.startRow,\n startColumn: range.startColumn,\n endRow,\n endColumn,\n };\n const masterAddress = formatCellAddress(range.startRow, range.startColumn);\n const info: SpreadsheetMergeInfo = {\n address: merge.address,\n range: renderRange,\n masterAddress,\n source: merge,\n };\n mergeMasterByAddress.set(masterAddress, info);\n maxRow = Math.max(maxRow, endRow);\n maxColumn = Math.max(maxColumn, endColumn);\n\n for (let row = range.startRow; row <= endRow; row++) {\n for (let column = range.startColumn; column <= endColumn; column++) {\n const address = formatCellAddress(row, column);\n if (address !== masterAddress) mergeFollowerByAddress.set(address, masterAddress);\n }\n }\n }\n\n return {\n sheetId: sheet.id,\n sheetName: sheet.name,\n source: sheet,\n styles,\n cellsByAddress,\n cellsByRowColumn,\n rowMetaByIndex,\n columnMetaByIndex,\n mergeMasterByAddress,\n mergeFollowerByAddress,\n maxRow,\n maxColumn,\n };\n}\n\nexport function getRenderCell(\n model: SpreadsheetSheetRenderModel,\n row: number,\n column: number,\n): SpreadsheetRenderCell | undefined {\n return model.cellsByRowColumn.get(rowColumnKey(row, column));\n}\n\nfunction toRenderCell(\n cell: ExcelCellModel,\n styles: ExcelStylesModel,\n formulaResults?: Map<string, SpreadsheetFormulaResult>,\n): SpreadsheetRenderCell {\n const formulaResult = formulaResults?.get(cell.address);\n const resultValue = formulaResult && !formulaResult.error ? formulaResult.value : undefined;\n const value = Array.isArray(resultValue) ? resultValue[0]?.[0] ?? null : resultValue ?? cell.value;\n return {\n row: cell.row,\n column: cell.column,\n address: cell.address,\n kind: cell.kind,\n value,\n displayText: cellToDisplayText(cell, styles, value, formulaResult),\n formula: cell.formula,\n styleId: cell.styleId,\n source: cell,\n };\n}\n\nfunction cellToDisplayText(\n cell: ExcelCellModel,\n styles: ExcelStylesModel,\n value: ExcelCellModel['value'],\n formulaResult?: SpreadsheetFormulaResult,\n): string {\n if (formulaResult?.error) return formulaResult.displayText;\n if (value !== null) return formatSpreadsheetDisplayValue(value, numberFormatCodeForCell(cell, styles));\n return '';\n}\n\nfunction numberFormatCodeForCell(cell: ExcelCellModel, styles: ExcelStylesModel): string | undefined {\n return styles.cellFormats[cell.styleId ?? 0]?.numberFormatCode;\n}\n\nexport function formatSpreadsheetDisplayValue(\n value: ExcelCellModel['value'],\n formatCode: string | undefined,\n): string {\n if (value === null) return '';\n if (typeof value !== 'number' || !formatCode) return String(value);\n const normalized = formatCode.toLowerCase();\n if (normalized.includes('%')) return `${formatFixedNumber(value * 100, decimalPlaces(formatCode))}%`;\n if (normalized.includes('$')) return `$${formatFixedNumber(value, decimalPlaces(formatCode), true)}`;\n if (looksLikeDateFormat(normalized)) return formatExcelSerialDate(value);\n if (formatCode.includes(',')) return formatFixedNumber(value, decimalPlaces(formatCode), true);\n if (formatCode.includes('.')) return formatFixedNumber(value, decimalPlaces(formatCode));\n return String(value);\n}\n\nfunction decimalPlaces(formatCode: string): number {\n const match = /\\.(0+)/.exec(formatCode);\n return match?.[1]?.length ?? 0;\n}\n\nfunction formatFixedNumber(value: number, digits: number, grouping = false): string {\n return new Intl.NumberFormat('en-US', {\n minimumFractionDigits: digits,\n maximumFractionDigits: digits,\n useGrouping: grouping,\n }).format(value);\n}\n\nfunction looksLikeDateFormat(formatCode: string): boolean {\n return /(^|[^a-z])y{2,4}([^a-z]|$)/.test(formatCode) && /(^|[^a-z])d{1,2}([^a-z]|$)/.test(formatCode);\n}\n\nfunction formatExcelSerialDate(serial: number): string {\n if (!Number.isFinite(serial)) return String(serial);\n const epoch = Date.UTC(1899, 11, 30);\n const date = new Date(epoch + Math.round(serial) * 86_400_000);\n const year = date.getUTCFullYear();\n const month = String(date.getUTCMonth() + 1).padStart(2, '0');\n const day = String(date.getUTCDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n}\n","import { formatCellAddress } from '@coco-vexel/coco-office/excel';\nimport type {\n SpreadsheetHitResult,\n SpreadsheetLayoutOptions,\n SpreadsheetRange,\n SpreadsheetRect,\n SpreadsheetSheetRenderModel,\n SpreadsheetSize,\n} from './types.js';\n\nconst DEFAULT_ROW_HEIGHT = 22;\nconst DEFAULT_COLUMN_WIDTH = 96;\nconst DEFAULT_ROW_HEADER_WIDTH = 48;\nconst DEFAULT_COLUMN_HEADER_HEIGHT = 24;\nconst EXCEL_POINTS_TO_CSS_PIXELS = 96 / 72;\n// OOXML column widths are measured in zero-glyph characters, not CSS pixels.\nconst EXCEL_MAX_DIGIT_WIDTH_PX = 7;\nconst EXCEL_COLUMN_PADDING_PX = 5;\n\nexport class SpreadsheetLayout {\n readonly defaultRowHeight: number;\n readonly defaultColumnWidth: number;\n readonly rowHeaderWidth: number;\n readonly columnHeaderHeight: number;\n readonly rowCount: number;\n readonly columnCount: number;\n\n private readonly rowOffsets: number[];\n private readonly columnOffsets: number[];\n private readonly rowHeights: number[];\n private readonly columnWidths: number[];\n\n constructor(\n readonly model: SpreadsheetSheetRenderModel,\n options: SpreadsheetLayoutOptions = {},\n ) {\n this.defaultRowHeight = options.defaultRowHeight ?? DEFAULT_ROW_HEIGHT;\n this.defaultColumnWidth = options.defaultColumnWidth ?? DEFAULT_COLUMN_WIDTH;\n this.rowHeaderWidth = options.rowHeaderWidth ?? DEFAULT_ROW_HEADER_WIDTH;\n this.columnHeaderHeight = options.columnHeaderHeight ?? DEFAULT_COLUMN_HEADER_HEIGHT;\n this.rowCount = Math.max(options.rowCount ?? 0, model.maxRow);\n this.columnCount = Math.max(options.columnCount ?? 0, model.maxColumn);\n this.rowHeights = buildRowHeights(model, this.rowCount, this.defaultRowHeight);\n this.columnWidths = buildColumnWidths(model, this.columnCount, this.defaultColumnWidth);\n this.rowOffsets = buildOffsets(this.rowHeights);\n this.columnOffsets = buildOffsets(this.columnWidths);\n }\n\n totalWidth(): number {\n return this.columnOffsets[this.columnOffsets.length - 1] ?? 0;\n }\n\n totalHeight(): number {\n return this.rowOffsets[this.rowOffsets.length - 1] ?? 0;\n }\n\n getColumnWidth(column: number): number {\n return this.columnWidths[column - 1] ?? this.defaultColumnWidth;\n }\n\n getRowHeight(row: number): number {\n return this.rowHeights[row - 1] ?? this.defaultRowHeight;\n }\n\n getColumnX(column: number): number {\n return this.columnOffsets[Math.max(0, column - 1)] ?? 0;\n }\n\n getRowY(row: number): number {\n return this.rowOffsets[Math.max(0, row - 1)] ?? 0;\n }\n\n getCellLogicalRect(row: number, column: number): SpreadsheetRect {\n return {\n x: this.getColumnX(column),\n y: this.getRowY(row),\n width: this.getColumnWidth(column),\n height: this.getRowHeight(row),\n };\n }\n\n getRangeLogicalRect(range: SpreadsheetRange): SpreadsheetRect {\n const x = this.getColumnX(range.startColumn);\n const y = this.getRowY(range.startRow);\n const endX = this.getColumnX(range.endColumn) + this.getColumnWidth(range.endColumn);\n const endY = this.getRowY(range.endRow) + this.getRowHeight(range.endRow);\n return { x, y, width: endX - x, height: endY - y };\n }\n\n getVisibleRange(\n originX: number,\n originY: number,\n size: SpreadsheetSize,\n minimumRow = 1,\n minimumColumn = 1,\n ): SpreadsheetRange {\n const startColumn = Math.max(minimumColumn, this.columnAt(originX));\n const startRow = Math.max(minimumRow, this.rowAt(originY));\n const endColumn = Math.max(\n startColumn,\n Math.min(this.columnCount, this.columnAt(originX + size.width) + 1),\n );\n const endRow = Math.max(\n startRow,\n Math.min(this.rowCount, this.rowAt(originY + size.height) + 1),\n );\n return { startRow, startColumn, endRow, endColumn };\n }\n\n rowAt(logicalY: number): number {\n return clampIndex(binarySearchOffset(this.rowOffsets, logicalY), this.rowCount);\n }\n\n columnAt(logicalX: number): number {\n return clampIndex(binarySearchOffset(this.columnOffsets, logicalX), this.columnCount);\n }\n\n hitTestLogical(logicalX: number, logicalY: number): SpreadsheetHitResult {\n const column = this.columnAt(logicalX);\n const row = this.rowAt(logicalY);\n if (row < 1 || column < 1 || row > this.rowCount || column > this.columnCount) {\n return { kind: 'none' };\n }\n return { kind: 'cell', row, column, address: formatCellAddress(row, column) };\n }\n}\n\nfunction buildRowHeights(\n model: SpreadsheetSheetRenderModel,\n rowCount: number,\n defaultHeight: number,\n): number[] {\n const heights: number[] = [];\n for (let row = 1; row <= rowCount; row++) {\n const meta = model.rowMetaByIndex.get(row);\n // OOXML stores row heights in points; layout geometry is expressed in CSS pixels.\n heights.push(meta?.hidden ? 0 : meta?.height === undefined ? defaultHeight : meta.height * EXCEL_POINTS_TO_CSS_PIXELS);\n }\n return heights;\n}\n\nfunction buildColumnWidths(\n model: SpreadsheetSheetRenderModel,\n columnCount: number,\n defaultWidth: number,\n): number[] {\n const widths: number[] = [];\n for (let column = 1; column <= columnCount; column++) {\n const meta = model.columnMetaByIndex.get(column);\n widths.push(meta?.hidden ? 0 : meta?.width === undefined ? defaultWidth : excelColumnWidthToCssPixels(meta.width));\n }\n return widths;\n}\n\n/** Convert an OOXML column width to the CSS-pixel geometry used by the renderer. */\nexport function excelColumnWidthToCssPixels(width: number): number {\n if (!Number.isFinite(width) || width <= 0) return 0;\n return Math.floor(\n ((256 * width + Math.floor(128 / EXCEL_MAX_DIGIT_WIDTH_PX)) / 256) * EXCEL_MAX_DIGIT_WIDTH_PX,\n );\n}\n\n/** Convert editor CSS pixels back to the OOXML width Core writes to xlsx. */\nexport function cssPixelsToExcelColumnWidth(width: number): number {\n if (!Number.isFinite(width) || width <= 0) return 0;\n return Math.floor(((width - EXCEL_COLUMN_PADDING_PX) / EXCEL_MAX_DIGIT_WIDTH_PX) * 256) / 256;\n}\n\nfunction buildOffsets(sizes: number[]): number[] {\n const offsets = [0];\n for (const size of sizes) offsets.push((offsets[offsets.length - 1] ?? 0) + size);\n return offsets;\n}\n\nfunction binarySearchOffset(offsets: number[], value: number): number {\n if (value <= 0) return 1;\n let low = 0;\n let high = offsets.length - 1;\n while (low < high) {\n const mid = Math.floor((low + high + 1) / 2);\n if ((offsets[mid] ?? 0) <= value) low = mid;\n else high = mid - 1;\n }\n return low + 1;\n}\n\nfunction clampIndex(index: number, max: number): number {\n return Math.max(1, Math.min(max, index));\n}\n","import type { ExcelPaneModel, ExcelSheetModel } from '@coco-vexel/coco-office/excel';\nimport type {\n SpreadsheetFreezeState,\n SpreadsheetHitResult,\n SpreadsheetPoint,\n SpreadsheetRect,\n SpreadsheetScrollState,\n SpreadsheetSize,\n SpreadsheetViewport,\n} from './types.js';\nimport type { SpreadsheetLayout } from './layout.js';\n\nexport interface SpreadsheetViewportManagerOptions {\n viewportSize: SpreadsheetSize;\n scroll?: Partial<SpreadsheetScrollState>;\n freeze?: Partial<SpreadsheetFreezeState>;\n}\n\nexport class SpreadsheetViewportManager {\n readonly scroll: SpreadsheetScrollState;\n readonly freeze: SpreadsheetFreezeState;\n readonly viewportSize: SpreadsheetSize;\n readonly viewports: SpreadsheetViewport[];\n\n constructor(\n private readonly layout: SpreadsheetLayout,\n options: SpreadsheetViewportManagerOptions,\n ) {\n this.viewportSize = options.viewportSize;\n this.freeze = {\n frozenRows: Math.max(0, options.freeze?.frozenRows ?? 0),\n frozenColumns: Math.max(0, options.freeze?.frozenColumns ?? 0),\n };\n this.scroll = clampScroll(layout, this.freeze, options.viewportSize, {\n x: options.scroll?.x ?? 0,\n y: options.scroll?.y ?? 0,\n });\n this.viewports = computeViewports(layout, this.viewportSize, this.scroll, this.freeze);\n }\n\n hitTest(point: SpreadsheetPoint): SpreadsheetHitResult {\n const viewport = this.findViewport(point);\n if (!viewport) return { kind: 'none' };\n if (viewport.kind === 'corner') return { kind: 'corner' };\n const logicalX = point.x - viewport.screenRect.x + viewport.originX;\n const logicalY = point.y - viewport.screenRect.y + viewport.originY;\n if (viewport.kind === 'columnHeaderScrollable' || viewport.kind === 'columnHeaderFrozen') {\n return { kind: 'columnHeader', column: this.layout.columnAt(logicalX) };\n }\n if (viewport.kind === 'rowHeaderScrollable' || viewport.kind === 'rowHeaderFrozen') {\n return { kind: 'rowHeader', row: this.layout.rowAt(logicalY) };\n }\n return this.layout.hitTestLogical(logicalX, logicalY);\n }\n\n findViewport(point: SpreadsheetPoint): SpreadsheetViewport | undefined {\n for (let index = this.viewports.length - 1; index >= 0; index--) {\n const viewport = this.viewports[index];\n if (viewport && containsPoint(viewport.screenRect, point)) return viewport;\n }\n return undefined;\n }\n\n cellScreenRect(row: number, column: number, viewport: SpreadsheetViewport): SpreadsheetRect {\n const logicalRect = this.layout.getCellLogicalRect(row, column);\n return {\n x: viewport.screenRect.x + logicalRect.x - viewport.originX,\n y: viewport.screenRect.y + logicalRect.y - viewport.originY,\n width: logicalRect.width,\n height: logicalRect.height,\n };\n }\n}\n\nexport function freezeStateFromSheet(sheet: ExcelSheetModel): SpreadsheetFreezeState {\n const pane = sheet.sheetViews[0]?.pane;\n return freezeStateFromPane(pane);\n}\n\nexport function freezeStateFromPane(pane: ExcelPaneModel | undefined): SpreadsheetFreezeState {\n if (!pane || pane.state !== 'frozen') return { frozenRows: 0, frozenColumns: 0 };\n return {\n frozenRows: Math.max(0, Math.floor(pane.ySplit ?? 0)),\n frozenColumns: Math.max(0, Math.floor(pane.xSplit ?? 0)),\n };\n}\n\nexport function clampScroll(\n layout: SpreadsheetLayout,\n freeze: SpreadsheetFreezeState,\n viewportSize: SpreadsheetSize,\n scroll: SpreadsheetScrollState,\n): SpreadsheetScrollState {\n const frozenWidth = layout.getColumnX(freeze.frozenColumns + 1);\n const frozenHeight = layout.getRowY(freeze.frozenRows + 1);\n const mainWidth = Math.max(0, viewportSize.width - layout.rowHeaderWidth - frozenWidth);\n const mainHeight = Math.max(0, viewportSize.height - layout.columnHeaderHeight - frozenHeight);\n const maxX = Math.max(0, layout.totalWidth() - frozenWidth - mainWidth);\n const maxY = Math.max(0, layout.totalHeight() - frozenHeight - mainHeight);\n return {\n x: Math.max(0, Math.min(maxX, scroll.x)),\n y: Math.max(0, Math.min(maxY, scroll.y)),\n };\n}\n\nfunction computeViewports(\n layout: SpreadsheetLayout,\n viewportSize: SpreadsheetSize,\n scroll: SpreadsheetScrollState,\n freeze: SpreadsheetFreezeState,\n): SpreadsheetViewport[] {\n const headerW = layout.rowHeaderWidth;\n const headerH = layout.columnHeaderHeight;\n const frozenW = layout.getColumnX(freeze.frozenColumns + 1);\n const frozenH = layout.getRowY(freeze.frozenRows + 1);\n const scrollableX = frozenW + scroll.x;\n const scrollableY = frozenH + scroll.y;\n const bodyW = Math.max(0, viewportSize.width - headerW);\n const bodyH = Math.max(0, viewportSize.height - headerH);\n const mainX = headerW + frozenW;\n const mainY = headerH + frozenH;\n const mainW = Math.max(0, viewportSize.width - mainX);\n const mainH = Math.max(0, viewportSize.height - mainY);\n const viewports: SpreadsheetViewport[] = [];\n\n viewports.push({\n kind: 'corner',\n screenRect: { x: 0, y: 0, width: headerW, height: headerH },\n originX: 0,\n originY: 0,\n rows: { start: 1, end: 0 },\n columns: { start: 1, end: 0 },\n });\n\n if (freeze.frozenColumns > 0) {\n viewports.push({\n kind: 'columnHeaderFrozen',\n screenRect: { x: headerW, y: 0, width: Math.min(frozenW, bodyW), height: headerH },\n originX: 0,\n originY: 0,\n rows: { start: 1, end: 0 },\n columns: { start: 1, end: freeze.frozenColumns },\n });\n }\n\n viewports.push({\n kind: 'columnHeaderScrollable',\n screenRect: {\n x: headerW + frozenW,\n y: 0,\n width: Math.max(0, viewportSize.width - headerW - frozenW),\n height: headerH,\n },\n originX: scrollableX,\n originY: 0,\n rows: { start: 1, end: 0 },\n columns: visibleColumns(layout, scrollableX, mainW, freeze.frozenColumns + 1),\n });\n\n if (freeze.frozenRows > 0) {\n viewports.push({\n kind: 'rowHeaderFrozen',\n screenRect: { x: 0, y: headerH, width: headerW, height: Math.min(frozenH, bodyH) },\n originX: 0,\n originY: 0,\n rows: { start: 1, end: freeze.frozenRows },\n columns: { start: 1, end: 0 },\n });\n }\n\n viewports.push({\n kind: 'rowHeaderScrollable',\n screenRect: {\n x: 0,\n y: headerH + frozenH,\n width: headerW,\n height: Math.max(0, viewportSize.height - headerH - frozenH),\n },\n originX: 0,\n originY: scrollableY,\n rows: visibleRows(layout, scrollableY, mainH, freeze.frozenRows + 1),\n columns: { start: 1, end: 0 },\n });\n\n if (freeze.frozenRows > 0 && freeze.frozenColumns > 0) {\n viewports.push({\n kind: 'frozenTopLeft',\n screenRect: { x: headerW, y: headerH, width: frozenW, height: frozenH },\n originX: 0,\n originY: 0,\n rows: { start: 1, end: freeze.frozenRows },\n columns: { start: 1, end: freeze.frozenColumns },\n });\n }\n\n if (freeze.frozenRows > 0) {\n viewports.push({\n kind: 'frozenTop',\n screenRect: { x: mainX, y: headerH, width: mainW, height: frozenH },\n originX: scrollableX,\n originY: 0,\n rows: { start: 1, end: freeze.frozenRows },\n columns: visibleColumns(layout, scrollableX, mainW, freeze.frozenColumns + 1),\n });\n }\n\n if (freeze.frozenColumns > 0) {\n viewports.push({\n kind: 'frozenLeft',\n screenRect: { x: headerW, y: mainY, width: frozenW, height: mainH },\n originX: 0,\n originY: scrollableY,\n rows: visibleRows(layout, scrollableY, mainH, freeze.frozenRows + 1),\n columns: { start: 1, end: freeze.frozenColumns },\n });\n }\n\n viewports.push({\n kind: 'main',\n screenRect: { x: mainX, y: mainY, width: mainW, height: mainH },\n originX: scrollableX,\n originY: scrollableY,\n rows: visibleRows(layout, scrollableY, mainH, freeze.frozenRows + 1),\n columns: visibleColumns(layout, scrollableX, mainW, freeze.frozenColumns + 1),\n });\n\n return viewports.filter((viewport) => viewport.screenRect.width > 0 && viewport.screenRect.height > 0);\n}\n\nfunction visibleRows(\n layout: SpreadsheetLayout,\n originY: number,\n height: number,\n minimumRow: number,\n): { start: number; end: number } {\n const range = layout.getVisibleRange(0, originY, { width: 1, height }, minimumRow, 1);\n return { start: range.startRow, end: range.endRow };\n}\n\nfunction visibleColumns(\n layout: SpreadsheetLayout,\n originX: number,\n width: number,\n minimumColumn: number,\n): { start: number; end: number } {\n const range = layout.getVisibleRange(originX, 0, { width, height: 1 }, 1, minimumColumn);\n return { start: range.startColumn, end: range.endColumn };\n}\n\nfunction containsPoint(rect: SpreadsheetRect, point: SpreadsheetPoint): boolean {\n return (\n point.x >= rect.x &&\n point.y >= rect.y &&\n point.x < rect.x + rect.width &&\n point.y < rect.y + rect.height\n );\n}\n\n","import type { ExcelBorderModel, ExcelCellFormatModel, ExcelStylesModel } from '@coco-vexel/coco-office/excel';\nimport { getRenderCell } from './render-model.js';\nimport type { SpreadsheetRange, SpreadsheetRenderCell, SpreadsheetSheetRenderModel } from './types.js';\n\nexport interface SpreadsheetResolvedCellStyle {\n font: string;\n fontSize: number;\n underline: boolean;\n fontColor: string;\n fillColor: string;\n wrapText: boolean;\n border: ExcelBorderModel;\n horizontalAlign: CanvasTextAlign;\n verticalAlign: 'top' | 'middle' | 'bottom';\n}\n\nexport function resolveSpreadsheetCellStyle(\n styles: ExcelStylesModel,\n styleId: number | undefined,\n cell?: SpreadsheetRenderCell,\n): SpreadsheetResolvedCellStyle {\n const format = styles.cellFormats[styleId ?? 0] ?? {};\n const font = styles.fonts[format.fontId ?? 0] ?? {};\n const fontSize = font.size ?? 11;\n const fill = styles.fills[format.fillId ?? 0] ?? {};\n const border = styles.borders[format.borderId ?? 0] ?? {};\n return {\n font: canvasFont(font.bold, font.italic, fontSize, font.name ?? 'Arial'),\n fontSize,\n underline: font.underline === true,\n fontColor: font.color?.rgb ?? '#111827',\n fillColor: fill.foregroundColor?.rgb ?? '#FFFFFF',\n wrapText: format.alignment?.wrapText === true,\n border,\n horizontalAlign: resolveHorizontalAlign(format, cell),\n verticalAlign: resolveVerticalAlign(format),\n };\n}\n\nexport function resolveSpreadsheetRangeBorder(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n): ExcelBorderModel {\n const border: ExcelBorderModel = {};\n for (let column = range.startColumn; column <= range.endColumn; column++) {\n border.top ??= cellBorderSide(model, range.startRow, column, 'top');\n border.bottom ??= cellBorderSide(model, range.endRow, column, 'bottom');\n }\n for (let row = range.startRow; row <= range.endRow; row++) {\n border.left ??= cellBorderSide(model, row, range.startColumn, 'left');\n border.right ??= cellBorderSide(model, row, range.endColumn, 'right');\n }\n return border;\n}\n\nfunction cellBorderSide(\n model: SpreadsheetSheetRenderModel,\n row: number,\n column: number,\n side: 'left' | 'right' | 'top' | 'bottom',\n): NonNullable<ExcelBorderModel['left']> | undefined {\n const cell = getRenderCell(model, row, column);\n const format = model.styles.cellFormats[cell?.styleId ?? 0] ?? {};\n return model.styles.borders[format.borderId ?? 0]?.[side];\n}\n\nfunction canvasFont(\n bold: boolean | undefined,\n italic: boolean | undefined,\n size: number,\n family: string,\n): string {\n const parts = [];\n if (italic) parts.push('italic');\n if (bold) parts.push('600');\n parts.push(`${size}px`);\n parts.push(quoteFontFamily(family));\n return parts.join(' ');\n}\n\nfunction quoteFontFamily(family: string): string {\n return /\\s/.test(family) ? JSON.stringify(family) : family;\n}\n\nfunction resolveHorizontalAlign(format: ExcelCellFormatModel, cell: SpreadsheetRenderCell | undefined): CanvasTextAlign {\n switch (format.alignment?.horizontal) {\n case 'left':\n return 'left';\n case 'center':\n return 'center';\n case 'right':\n return 'right';\n }\n if (cell?.kind === 'number') return 'right';\n if (cell?.kind === 'formula' && typeof cell.value === 'number') return 'right';\n if (cell?.kind === 'boolean' || cell?.kind === 'error') return 'center';\n return 'left';\n}\n\nfunction resolveVerticalAlign(format: ExcelCellFormatModel): 'top' | 'middle' | 'bottom' {\n switch (format.alignment?.vertical) {\n case 'top':\n return 'top';\n case 'center':\n case 'middle':\n return 'middle';\n case 'bottom':\n return 'bottom';\n default:\n return 'bottom';\n }\n}\n","import { columnIndexToName, formatCellAddress, type ExcelBorderModel } from '@coco-vexel/coco-office/excel';\nimport { getRenderCell } from './render-model.js';\nimport {\n resolveSpreadsheetCellStyle,\n resolveSpreadsheetRangeBorder,\n type SpreadsheetResolvedCellStyle,\n} from './style-resolver.js';\nimport type { SpreadsheetLayout } from './layout.js';\nimport type { SpreadsheetViewportManager } from './viewport.js';\nimport type { SpreadsheetRange, SpreadsheetRect, SpreadsheetViewport } from './types.js';\n\nexport interface SpreadsheetCanvasRendererOptions {\n baseCanvas: HTMLCanvasElement;\n headerCanvas: HTMLCanvasElement;\n overlayCanvas: HTMLCanvasElement;\n}\n\nexport class SpreadsheetCanvasRenderer {\n private readonly baseCtx: CanvasRenderingContext2D;\n private readonly headerCtx: CanvasRenderingContext2D;\n private readonly overlayCtx: CanvasRenderingContext2D;\n private cssWidth = 1;\n private cssHeight = 1;\n private scaleX = 1;\n private scaleY = 1;\n private headerFiltersEnabled = true;\n private headerFilterColumns: Set<number> | null = null;\n private activeHeaderFilterColumns = new Set<number>();\n\n constructor(private readonly options: SpreadsheetCanvasRendererOptions) {\n this.baseCtx = get2dContext(options.baseCanvas);\n this.headerCtx = get2dContext(options.headerCanvas);\n this.overlayCtx = get2dContext(options.overlayCanvas);\n }\n\n resize(width: number, height: number, devicePixelRatio = globalThis.devicePixelRatio || 1): void {\n this.cssWidth = Math.max(1, width);\n this.cssHeight = Math.max(1, height);\n const ratio = Math.max(1, devicePixelRatio || 1);\n for (const canvas of [\n this.options.baseCanvas,\n this.options.headerCanvas,\n this.options.overlayCanvas,\n ]) {\n canvas.style.width = `${this.cssWidth}px`;\n canvas.style.height = `${this.cssHeight}px`;\n canvas.width = Math.max(1, Math.ceil(this.cssWidth * ratio));\n canvas.height = Math.max(1, Math.ceil(this.cssHeight * ratio));\n const ctx = get2dContext(canvas);\n this.scaleX = canvas.width / this.cssWidth;\n this.scaleY = canvas.height / this.cssHeight;\n ctx.setTransform(this.scaleX, 0, 0, this.scaleY, 0, 0);\n ctx.imageSmoothingEnabled = false;\n }\n }\n\n setHeaderFiltersEnabled(enabled: boolean): void {\n this.headerFiltersEnabled = enabled;\n }\n\n setHeaderFilterColumns(columns: readonly number[] | null): void {\n this.headerFilterColumns = columns === null ? null : new Set(columns);\n }\n\n setActiveHeaderFilterColumns(columns: readonly number[]): void {\n this.activeHeaderFilterColumns = new Set(columns);\n }\n\n render(layout: SpreadsheetLayout, viewportManager: SpreadsheetViewportManager): void {\n this.clearAll(layout, viewportManager);\n this.drawCells(layout, viewportManager);\n this.drawHeaders(layout, viewportManager);\n }\n\n clearOverlay(): void {\n clearCanvas(this.overlayCtx, this.options.overlayCanvas);\n }\n\n renderSelection(\n layout: SpreadsheetLayout,\n viewportManager: SpreadsheetViewportManager,\n range: SpreadsheetRange,\n options: { showFillHandle?: boolean } = {},\n ): void {\n this.clearOverlay();\n const ctx = this.overlayCtx;\n for (const viewport of viewportManager.viewports) {\n if (!isCellViewport(viewport)) continue;\n const intersection = intersectRange(range, {\n startRow: viewport.rows.start,\n endRow: viewport.rows.end,\n startColumn: viewport.columns.start,\n endColumn: viewport.columns.end,\n });\n if (!intersection) continue;\n const logical = layout.getRangeLogicalRect(intersection);\n const rect = logicalRectToScreen(logical, viewport);\n withClip(ctx, viewport.screenRect, () => {\n ctx.fillStyle = 'rgba(37, 99, 235, 0.08)';\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\n ctx.strokeStyle = '#2563EB';\n ctx.lineWidth = 2 / this.scaleX;\n ctx.setLineDash([]);\n strokeCrispRect(ctx, insetRect(rect, 1), this.scaleX, this.scaleY);\n });\n }\n if (options.showFillHandle) this.drawFillHandle(layout, viewportManager, range);\n }\n\n fillHandleRect(\n layout: SpreadsheetLayout,\n viewportManager: SpreadsheetViewportManager,\n range: SpreadsheetRange,\n ): SpreadsheetRect | null {\n for (const viewport of viewportManager.viewports) {\n if (!isCellViewport(viewport)) continue;\n if (\n range.endRow < viewport.rows.start ||\n range.endRow > viewport.rows.end ||\n range.endColumn < viewport.columns.start ||\n range.endColumn > viewport.columns.end\n ) {\n continue;\n }\n const cell = viewportManager.cellScreenRect(range.endRow, range.endColumn, viewport);\n const size = 7;\n return {\n x: cell.x + cell.width - size / 2,\n y: cell.y + cell.height - size / 2,\n width: size,\n height: size,\n };\n }\n return null;\n }\n\n renderCopiedRange(\n layout: SpreadsheetLayout,\n viewportManager: SpreadsheetViewportManager,\n range: SpreadsheetRange,\n ): void {\n this.renderDashedRange(layout, viewportManager, range, {\n stroke: '#1D4ED8',\n });\n }\n\n renderDashedRange(\n layout: SpreadsheetLayout,\n viewportManager: SpreadsheetViewportManager,\n range: SpreadsheetRange,\n options: { stroke: string; fill?: string },\n ): void {\n const ctx = this.overlayCtx;\n for (const viewport of viewportManager.viewports) {\n if (!isCellViewport(viewport)) continue;\n const intersection = intersectRange(range, {\n startRow: viewport.rows.start,\n endRow: viewport.rows.end,\n startColumn: viewport.columns.start,\n endColumn: viewport.columns.end,\n });\n if (!intersection) continue;\n const logical = layout.getRangeLogicalRect(intersection);\n const rect = logicalRectToScreen(logical, viewport);\n withClip(ctx, viewport.screenRect, () => {\n ctx.save();\n if (options.fill) {\n ctx.fillStyle = options.fill;\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\n }\n ctx.strokeStyle = options.stroke;\n ctx.lineWidth = 2 / this.scaleX;\n ctx.setLineDash([4, 3]);\n ctx.lineDashOffset = 0;\n strokeCrispRect(ctx, insetRect(rect, 2), this.scaleX, this.scaleY);\n ctx.restore();\n });\n }\n }\n\n private clearAll(layout: SpreadsheetLayout, viewportManager: SpreadsheetViewportManager): void {\n void layout;\n void viewportManager;\n clearCanvas(this.baseCtx, this.options.baseCanvas);\n clearCanvas(this.headerCtx, this.options.headerCanvas);\n clearCanvas(this.overlayCtx, this.options.overlayCanvas);\n }\n\n private drawFillHandle(\n layout: SpreadsheetLayout,\n viewportManager: SpreadsheetViewportManager,\n range: SpreadsheetRange,\n ): void {\n const rect = this.fillHandleRect(layout, viewportManager, range);\n if (!rect) return;\n const ctx = this.overlayCtx;\n ctx.save();\n ctx.fillStyle = '#2563EB';\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\n ctx.strokeStyle = '#FFFFFF';\n ctx.lineWidth = 1 / this.scaleX;\n strokeCrispRect(ctx, insetRect(rect, 0.5), this.scaleX, this.scaleY);\n ctx.restore();\n }\n\n private drawCells(layout: SpreadsheetLayout, viewportManager: SpreadsheetViewportManager): void {\n const ctx = this.baseCtx;\n ctx.save();\n ctx.fillStyle = '#FFFFFF';\n ctx.fillRect(0, 0, this.cssWidth, this.cssHeight);\n ctx.restore();\n\n for (const viewport of viewportManager.viewports) {\n if (!isCellViewport(viewport)) continue;\n withClip(ctx, viewport.screenRect, () => {\n for (let row = viewport.rows.start; row <= viewport.rows.end; row++) {\n for (let column = viewport.columns.start; column <= viewport.columns.end; column++) {\n const address = formatCellAddress(row, column);\n const mergeMaster = layout.model.mergeFollowerByAddress.get(address);\n if (mergeMaster) continue;\n this.drawCell(ctx, layout, viewportManager, viewport, row, column, {\n drawBorder: false,\n reserveTrailingSpace: this.headerFiltersEnabled && row === 1,\n });\n if (\n this.headerFiltersEnabled &&\n row === 1 &&\n (this.headerFilterColumns === null || this.headerFilterColumns.has(column))\n ) {\n const logical = layout.getCellLogicalRect(row, column);\n const rect = {\n x: viewport.screenRect.x + logical.x - viewport.originX,\n y: viewport.screenRect.y + logical.y - viewport.originY,\n width: logical.width,\n height: logical.height,\n };\n drawFilterIcon(\n ctx,\n rect,\n this.scaleX,\n this.scaleY,\n this.activeHeaderFilterColumns.has(column),\n );\n }\n }\n }\n for (let row = viewport.rows.start; row <= viewport.rows.end; row++) {\n for (let column = viewport.columns.start; column <= viewport.columns.end; column++) {\n const address = formatCellAddress(row, column);\n const mergeMaster = layout.model.mergeFollowerByAddress.get(address);\n if (mergeMaster) continue;\n this.drawCell(ctx, layout, viewportManager, viewport, row, column, {\n drawContent: false,\n });\n }\n }\n });\n }\n }\n\n private drawCell(\n ctx: CanvasRenderingContext2D,\n layout: SpreadsheetLayout,\n viewportManager: SpreadsheetViewportManager,\n viewport: SpreadsheetViewport,\n row: number,\n column: number,\n options: { drawBorder?: boolean; drawContent?: boolean; reserveTrailingSpace?: boolean } = {},\n ): void {\n const cell = getRenderCell(layout.model, row, column);\n const merge = cell ? layout.model.mergeMasterByAddress.get(cell.address) : undefined;\n const rect = merge\n ? logicalRectToScreen(layout.getRangeLogicalRect(merge.range), viewport)\n : viewportManager.cellScreenRect(row, column, viewport);\n const style = resolveSpreadsheetCellStyle(layout.model.styles, cell?.styleId, cell);\n const border = merge ? resolveSpreadsheetRangeBorder(layout.model, merge.range) : style.border;\n if (options.drawContent !== false) {\n ctx.fillStyle = style.fillColor;\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\n ctx.strokeStyle = '#E5E7EB';\n ctx.lineWidth = 1 / this.scaleX;\n strokeCrispRect(ctx, rect, this.scaleX, this.scaleY);\n }\n if (options.drawBorder !== false) drawCellBorder(ctx, rect, border, this.scaleX, this.scaleY);\n if (options.drawContent === false || !cell?.displayText) return;\n\n ctx.save();\n ctx.font = style.font;\n ctx.fillStyle = style.fontColor;\n ctx.textAlign = style.horizontalAlign;\n ctx.textBaseline = 'middle';\n const padding = 6;\n const trailingSpace = options.reserveTrailingSpace && rect.width >= 28 ? 22 : 0;\n const contentRect = {\n x: rect.x,\n y: rect.y,\n width: Math.max(1, rect.width - trailingSpace),\n height: rect.height,\n };\n const textX =\n style.horizontalAlign === 'right'\n ? contentRect.x + contentRect.width - padding\n : style.horizontalAlign === 'center'\n ? contentRect.x + contentRect.width / 2\n : contentRect.x + padding;\n withClip(ctx, contentRect, () => {\n const lines = style.wrapText || cell.displayText.includes('\\n')\n ? wrapCanvasText(ctx, cell.displayText, Math.max(1, contentRect.width - padding * 2))\n : [cell.displayText];\n const lineHeight = style.fontSize * 1.2;\n const blockHeight = lines.length * lineHeight;\n const firstTextY = textBlockStartY(rect, style, padding, blockHeight, lineHeight);\n for (let index = 0; index < lines.length; index++) {\n const line = lines[index]!;\n const lineY = firstTextY + index * lineHeight;\n ctx.fillText(line, textX, lineY);\n if (style.underline) drawTextUnderline(ctx, line, textX, lineY, style, this.scaleX, this.scaleY);\n }\n });\n ctx.restore();\n }\n\n private drawHeaders(layout: SpreadsheetLayout, viewportManager: SpreadsheetViewportManager): void {\n const ctx = this.headerCtx;\n for (const viewport of viewportManager.viewports) {\n withClip(ctx, viewport.screenRect, () => {\n if (viewport.kind === 'corner') {\n drawHeaderRect(ctx, viewport.screenRect, '', this.scaleX, this.scaleY);\n } else if (\n viewport.kind === 'columnHeaderFrozen' ||\n viewport.kind === 'columnHeaderScrollable'\n ) {\n for (let column = viewport.columns.start; column <= viewport.columns.end; column++) {\n const logical = layout.getCellLogicalRect(1, column);\n const rect = {\n x: viewport.screenRect.x + logical.x - viewport.originX,\n y: viewport.screenRect.y,\n width: logical.width,\n height: viewport.screenRect.height,\n };\n drawHeaderRect(ctx, rect, columnIndexToName(column), this.scaleX, this.scaleY);\n }\n } else if (\n viewport.kind === 'rowHeaderFrozen' ||\n viewport.kind === 'rowHeaderScrollable'\n ) {\n for (let row = viewport.rows.start; row <= viewport.rows.end; row++) {\n const logical = layout.getCellLogicalRect(row, 1);\n const rect = {\n x: viewport.screenRect.x,\n y: viewport.screenRect.y + logical.y - viewport.originY,\n width: viewport.screenRect.width,\n height: logical.height,\n };\n drawHeaderRect(ctx, rect, String(row), this.scaleX, this.scaleY);\n }\n }\n });\n }\n }\n}\n\nfunction drawFilterIcon(\n ctx: CanvasRenderingContext2D,\n rect: SpreadsheetRect,\n scaleX: number,\n scaleY: number,\n active = false,\n): void {\n if (rect.width < 28) return;\n const centerX = rect.x + rect.width - 10;\n const centerY = rect.y + rect.height / 2;\n ctx.save();\n ctx.strokeStyle = active ? '#2563EB' : '#64748B';\n ctx.lineWidth = 1 / scaleX;\n ctx.lineCap = 'round';\n ctx.beginPath();\n ctx.moveTo(centerX - 4, centerY - 3);\n ctx.lineTo(centerX + 4, centerY - 3);\n ctx.lineTo(centerX + 1, centerY + 1);\n ctx.lineTo(centerX + 1, centerY + 4);\n ctx.lineTo(centerX - 1, centerY + 3);\n ctx.lineTo(centerX - 1, centerY + 1);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n void scaleY;\n}\n\nfunction intersectRange(a: SpreadsheetRange, b: SpreadsheetRange): SpreadsheetRange | null {\n const startRow = Math.max(a.startRow, b.startRow);\n const startColumn = Math.max(a.startColumn, b.startColumn);\n const endRow = Math.min(a.endRow, b.endRow);\n const endColumn = Math.min(a.endColumn, b.endColumn);\n if (startRow > endRow || startColumn > endColumn) return null;\n return { startRow, startColumn, endRow, endColumn };\n}\n\nfunction get2dContext(canvas: HTMLCanvasElement): CanvasRenderingContext2D {\n const ctx = canvas.getContext('2d');\n if (!ctx) throw new Error('SpreadsheetCanvasRenderer: 2D canvas context is unavailable');\n return ctx;\n}\n\nfunction clearCanvas(ctx: CanvasRenderingContext2D, canvas: HTMLCanvasElement): void {\n const width = Number.parseFloat(canvas.style.width) || canvas.width;\n const height = Number.parseFloat(canvas.style.height) || canvas.height;\n ctx.clearRect(0, 0, width, height);\n}\n\nfunction withClip(ctx: CanvasRenderingContext2D, rect: SpreadsheetRect, draw: () => void): void {\n ctx.save();\n ctx.beginPath();\n ctx.rect(rect.x, rect.y, rect.width, rect.height);\n ctx.clip();\n draw();\n ctx.restore();\n}\n\nfunction isCellViewport(viewport: SpreadsheetViewport): boolean {\n return (\n viewport.kind === 'main' ||\n viewport.kind === 'frozenTop' ||\n viewport.kind === 'frozenLeft' ||\n viewport.kind === 'frozenTopLeft'\n );\n}\n\nfunction logicalRectToScreen(rect: SpreadsheetRect, viewport: SpreadsheetViewport): SpreadsheetRect {\n return {\n x: viewport.screenRect.x + rect.x - viewport.originX,\n y: viewport.screenRect.y + rect.y - viewport.originY,\n width: rect.width,\n height: rect.height,\n };\n}\n\nfunction drawHeaderRect(\n ctx: CanvasRenderingContext2D,\n rect: SpreadsheetRect,\n text: string,\n scaleX: number,\n scaleY: number,\n): void {\n ctx.fillStyle = '#F3F4F6';\n ctx.fillRect(rect.x, rect.y, rect.width, rect.height);\n ctx.strokeStyle = '#D1D5DB';\n ctx.lineWidth = 1 / scaleX;\n strokeCrispRect(ctx, rect, scaleX, scaleY);\n if (!text) return;\n ctx.font = '12px Arial';\n ctx.fillStyle = '#374151';\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillText(text, rect.x + rect.width / 2, rect.y + rect.height / 2);\n}\n\nfunction drawCellBorder(\n ctx: CanvasRenderingContext2D,\n rect: SpreadsheetRect,\n border: ExcelBorderModel,\n scaleX: number,\n scaleY: number,\n): void {\n if (!border.left && !border.right && !border.top && !border.bottom) return;\n ctx.save();\n ctx.lineWidth = 1 / scaleX;\n ctx.setLineDash([]);\n if (border.top) {\n ctx.strokeStyle = border.top.color?.rgb ?? '#111827';\n drawCrispLine(ctx, rect.x, rect.y, rect.x + rect.width, rect.y, scaleX, scaleY);\n }\n if (border.right) {\n ctx.strokeStyle = border.right.color?.rgb ?? '#111827';\n drawCrispLine(ctx, rect.x + rect.width, rect.y, rect.x + rect.width, rect.y + rect.height, scaleX, scaleY);\n }\n if (border.bottom) {\n ctx.strokeStyle = border.bottom.color?.rgb ?? '#111827';\n drawCrispLine(ctx, rect.x, rect.y + rect.height, rect.x + rect.width, rect.y + rect.height, scaleX, scaleY);\n }\n if (border.left) {\n ctx.strokeStyle = border.left.color?.rgb ?? '#111827';\n drawCrispLine(ctx, rect.x, rect.y, rect.x, rect.y + rect.height, scaleX, scaleY);\n }\n ctx.restore();\n}\n\nfunction textBlockStartY(\n rect: SpreadsheetRect,\n style: SpreadsheetResolvedCellStyle,\n padding: number,\n blockHeight: number,\n lineHeight: number,\n): number {\n if (style.verticalAlign === 'top') return rect.y + padding + lineHeight / 2;\n if (style.verticalAlign === 'bottom') return rect.y + rect.height - padding - blockHeight + lineHeight / 2;\n return rect.y + (rect.height - blockHeight) / 2 + lineHeight / 2;\n}\n\nfunction wrapCanvasText(ctx: CanvasRenderingContext2D, text: string, maxWidth: number): string[] {\n const lines: string[] = [];\n for (const paragraph of text.split(/\\r?\\n/)) {\n if (paragraph === '') {\n lines.push('');\n continue;\n }\n let line = '';\n for (const character of paragraph) {\n const candidate = line + character;\n if (line && ctx.measureText(candidate).width > maxWidth) {\n lines.push(line);\n line = character;\n } else {\n line = candidate;\n }\n }\n if (line) lines.push(line);\n }\n return lines.length > 0 ? lines : [''];\n}\n\nfunction drawCrispLine(\n ctx: CanvasRenderingContext2D,\n x1: number,\n y1: number,\n x2: number,\n y2: number,\n scaleX: number,\n scaleY: number,\n): void {\n ctx.beginPath();\n ctx.moveTo(snapStrokeCoordinate(x1, scaleX), snapStrokeCoordinate(y1, scaleY));\n ctx.lineTo(snapStrokeCoordinate(x2, scaleX), snapStrokeCoordinate(y2, scaleY));\n ctx.stroke();\n}\n\nfunction drawTextUnderline(\n ctx: CanvasRenderingContext2D,\n text: string,\n textX: number,\n textY: number,\n style: SpreadsheetResolvedCellStyle,\n scaleX: number,\n scaleY: number,\n): void {\n const metrics = ctx.measureText(text);\n const width = metrics.width;\n const startX =\n style.horizontalAlign === 'right'\n ? textX - width\n : style.horizontalAlign === 'center'\n ? textX - width / 2\n : textX;\n const underlineOffset = Math.max(2, (metrics.actualBoundingBoxDescent || style.fontSize * 0.18) + 1);\n ctx.save();\n ctx.strokeStyle = style.fontColor;\n ctx.lineWidth = 1 / scaleX;\n drawCrispLine(ctx, startX, textY + underlineOffset, startX + width, textY + underlineOffset, scaleX, scaleY);\n ctx.restore();\n}\n\nfunction insetRect(rect: SpreadsheetRect, inset: number): SpreadsheetRect {\n return {\n x: rect.x + inset,\n y: rect.y + inset,\n width: Math.max(0, rect.width - inset * 2),\n height: Math.max(0, rect.height - inset * 2),\n };\n}\n\nfunction strokeCrispRect(\n ctx: CanvasRenderingContext2D,\n rect: SpreadsheetRect,\n scaleX: number,\n scaleY: number,\n): void {\n const x = snapStrokeCoordinate(rect.x, scaleX);\n const y = snapStrokeCoordinate(rect.y, scaleY);\n const right = snapStrokeCoordinate(rect.x + rect.width, scaleX);\n const bottom = snapStrokeCoordinate(rect.y + rect.height, scaleY);\n ctx.strokeRect(x, y, Math.max(0, right - x), Math.max(0, bottom - y));\n}\n\nfunction snapStrokeCoordinate(value: number, scale: number): number {\n return (Math.round(value * scale) + 0.5) / scale;\n}\n","import { formatCellAddress } from '@coco-vexel/coco-office/excel';\nimport type { SpreadsheetRange, SpreadsheetSheetRenderModel } from './types.js';\n\nexport interface SpreadsheetSelectionState {\n kind: 'cell' | 'row' | 'column';\n active: { row: number; column: number };\n range: SpreadsheetRange;\n}\n\nexport function createSelection(row: number, column: number): SpreadsheetSelectionState {\n return {\n kind: 'cell',\n active: { row, column },\n range: { startRow: row, startColumn: column, endRow: row, endColumn: column },\n };\n}\n\nexport function createRowSelection(\n row: number,\n bounds: { columnCount: number },\n): SpreadsheetSelectionState {\n return {\n kind: 'row',\n active: { row, column: 1 },\n range: { startRow: row, startColumn: 1, endRow: row, endColumn: bounds.columnCount },\n };\n}\n\nexport function createRowRangeSelection(\n startRow: number,\n endRow: number,\n bounds: { columnCount: number },\n): SpreadsheetSelectionState {\n const range = normalizeSelectionRange({\n startRow,\n startColumn: 1,\n endRow,\n endColumn: bounds.columnCount,\n });\n return {\n kind: 'row',\n active: { row: range.startRow, column: 1 },\n range,\n };\n}\n\nexport function createColumnSelection(\n column: number,\n bounds: { rowCount: number },\n): SpreadsheetSelectionState {\n return {\n kind: 'column',\n active: { row: 1, column },\n range: { startRow: 1, startColumn: column, endRow: bounds.rowCount, endColumn: column },\n };\n}\n\nexport function createColumnRangeSelection(\n startColumn: number,\n endColumn: number,\n bounds: { rowCount: number },\n): SpreadsheetSelectionState {\n const range = normalizeSelectionRange({\n startRow: 1,\n startColumn,\n endRow: bounds.rowCount,\n endColumn,\n });\n return {\n kind: 'column',\n active: { row: 1, column: range.startColumn },\n range,\n };\n}\n\nexport function normalizeSelectionRange(range: SpreadsheetRange): SpreadsheetRange {\n return {\n startRow: Math.min(range.startRow, range.endRow),\n startColumn: Math.min(range.startColumn, range.endColumn),\n endRow: Math.max(range.startRow, range.endRow),\n endColumn: Math.max(range.startColumn, range.endColumn),\n };\n}\n\nexport function extendSelection(\n selection: SpreadsheetSelectionState,\n row: number,\n column: number,\n bounds?: { rowCount: number; columnCount: number },\n): SpreadsheetSelectionState {\n if (selection.kind === 'row') {\n return {\n kind: 'row',\n active: selection.active,\n range: normalizeSelectionRange({\n startRow: selection.active.row,\n startColumn: 1,\n endRow: row,\n endColumn: bounds?.columnCount ?? selection.range.endColumn,\n }),\n };\n }\n if (selection.kind === 'column') {\n return {\n kind: 'column',\n active: selection.active,\n range: normalizeSelectionRange({\n startRow: 1,\n startColumn: selection.active.column,\n endRow: bounds?.rowCount ?? selection.range.endRow,\n endColumn: column,\n }),\n };\n }\n return {\n kind: 'cell',\n active: selection.active,\n range: normalizeSelectionRange({\n startRow: selection.active.row,\n startColumn: selection.active.column,\n endRow: row,\n endColumn: column,\n }),\n };\n}\n\nexport function moveSelection(\n selection: SpreadsheetSelectionState,\n deltaRow: number,\n deltaColumn: number,\n bounds: { rowCount: number; columnCount: number },\n): SpreadsheetSelectionState {\n return createSelection(\n clamp(selection.active.row + deltaRow, 1, bounds.rowCount),\n clamp(selection.active.column + deltaColumn, 1, bounds.columnCount),\n );\n}\n\n/**\n * Spreadsheet selections must include a full merged block once any cell in that block is touched.\n * Keep this shared because drag selection, paste feedback, and host integrations need the same rule.\n */\nexport function expandSelectionForMergedRanges(\n selection: SpreadsheetSelectionState,\n model: SpreadsheetSheetRenderModel,\n): SpreadsheetSelectionState {\n if (selection.kind !== 'cell') return selection;\n const active = mergeMasterPointForCell(selection.active.row, selection.active.column, model) ?? selection.active;\n return { ...selection, active, range: expandRangeForMergedRanges(selection.range, model) };\n}\n\nexport function expandRangeForMergedRanges(\n range: SpreadsheetRange,\n model: SpreadsheetSheetRenderModel,\n): SpreadsheetRange {\n let expanded = normalizeSelectionRange(range);\n let changed = true;\n while (changed) {\n changed = false;\n for (const merge of model.mergeMasterByAddress.values()) {\n if (!rangesIntersect(expanded, merge.range)) continue;\n const next = {\n startRow: Math.min(expanded.startRow, merge.range.startRow),\n startColumn: Math.min(expanded.startColumn, merge.range.startColumn),\n endRow: Math.max(expanded.endRow, merge.range.endRow),\n endColumn: Math.max(expanded.endColumn, merge.range.endColumn),\n };\n changed =\n next.startRow !== expanded.startRow ||\n next.startColumn !== expanded.startColumn ||\n next.endRow !== expanded.endRow ||\n next.endColumn !== expanded.endColumn;\n expanded = next;\n }\n }\n return expanded;\n}\n\nexport function selectionAfterRowDeletion(\n selection: SpreadsheetSelectionState,\n deletedStartRow: number,\n deletedCount: number,\n bounds: { rowCount: number; columnCount: number },\n model: SpreadsheetSheetRenderModel,\n): SpreadsheetSelectionState {\n const nextRow = clamp(positionAfterDeletion(selection.active.row, deletedStartRow, deletedCount), 1, bounds.rowCount);\n const nextColumn = clamp(selection.active.column, 1, bounds.columnCount);\n if (selection.kind === 'row') {\n return createRowSelection(nextRow, { columnCount: bounds.columnCount });\n }\n return expandSelectionForMergedRanges(createSelection(nextRow, nextColumn), model);\n}\n\nexport function selectionAfterColumnDeletion(\n selection: SpreadsheetSelectionState,\n deletedStartColumn: number,\n deletedCount: number,\n bounds: { rowCount: number; columnCount: number },\n model: SpreadsheetSheetRenderModel,\n): SpreadsheetSelectionState {\n const nextRow = clamp(selection.active.row, 1, bounds.rowCount);\n const nextColumn = clamp(positionAfterDeletion(selection.active.column, deletedStartColumn, deletedCount), 1, bounds.columnCount);\n if (selection.kind === 'column') {\n return createColumnSelection(nextColumn, { rowCount: bounds.rowCount });\n }\n return expandSelectionForMergedRanges(createSelection(nextRow, nextColumn), model);\n}\n\nfunction positionAfterDeletion(position: number, deletedStart: number, deletedCount: number): number {\n const deletedEnd = deletedStart + deletedCount - 1;\n if (position < deletedStart) return position;\n if (position > deletedEnd) return position - deletedCount;\n return deletedStart;\n}\n\nfunction rangesIntersect(a: SpreadsheetRange, b: SpreadsheetRange): boolean {\n return !(\n a.endRow < b.startRow ||\n a.startRow > b.endRow ||\n a.endColumn < b.startColumn ||\n a.startColumn > b.endColumn\n );\n}\n\nfunction mergeMasterPointForCell(\n row: number,\n column: number,\n model: SpreadsheetSheetRenderModel,\n): { row: number; column: number } | null {\n const masterAddress = model.mergeFollowerByAddress.get(formatCellAddress(row, column));\n if (!masterAddress) return null;\n const merge = model.mergeMasterByAddress.get(masterAddress);\n if (!merge) return null;\n return { row: merge.range.startRow, column: merge.range.startColumn };\n}\n\nfunction clamp(value: number, min: number, max: number): number {\n return Math.max(min, Math.min(max, value));\n}\n","import { formatCellAddress, formatRangeAddress, type ExcelCellValue } from '@coco-vexel/coco-office/excel';\nimport type { SpreadsheetRange, SpreadsheetSheetRenderModel } from './types.js';\nimport { getRenderCell } from './render-model.js';\n\nexport interface SpreadsheetClipboardMerge {\n startRowOffset: number;\n startColumnOffset: number;\n rowCount: number;\n columnCount: number;\n}\n\nexport interface SpreadsheetClipboardPayload {\n text: string;\n values: ExcelCellValue[][];\n styleIds: (number | undefined)[][];\n merges: SpreadsheetClipboardMerge[];\n}\n\nexport function buildSpreadsheetClipboardPayload(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n): SpreadsheetClipboardPayload {\n const text = serializeRangeToTsv(model, range);\n return {\n text,\n values: parseTsv(text),\n styleIds: rangeStyleIdsForClipboard(model, range),\n merges: mergedRangesForClipboard(model, range),\n };\n}\n\nexport function serializeRangeToTsv(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n): string {\n const lines: string[] = [];\n for (let row = range.startRow; row <= range.endRow; row++) {\n const values: string[] = [];\n for (let column = range.startColumn; column <= range.endColumn; column++) {\n values.push(escapeTsvValue(clipboardCellText(model, row, column)));\n }\n lines.push(values.join('\\t'));\n }\n return lines.join('\\n');\n}\n\nexport function parseTsv(text: string): ExcelCellValue[][] {\n return text\n .replace(/\\r\\n/g, '\\n')\n .replace(/\\r/g, '\\n')\n .split('\\n')\n .filter((line, index, lines) => !(index === lines.length - 1 && line === ''))\n .map((line) => line.split('\\t').map(coerceClipboardValue));\n}\n\nexport function rangeAddressForMatrix(\n startRow: number,\n startColumn: number,\n values: ExcelCellValue[][],\n): string {\n const rowCount = Math.max(1, values.length);\n const columnCount = Math.max(1, values.reduce((max, row) => Math.max(max, row.length), 0));\n return formatRangeAddress(startRow, startColumn, rowCount, columnCount);\n}\n\nfunction escapeTsvValue(value: string): string {\n return value.replace(/\\t/g, ' ').replace(/\\r?\\n/g, ' ');\n}\n\nfunction clipboardCellText(\n model: SpreadsheetSheetRenderModel,\n row: number,\n column: number,\n): string {\n const address = formatCellAddress(row, column);\n // Covered cells may still contain legacy values in imported workbooks.\n // Copy only the merge master so paste/unmerge does not surface hidden stale content.\n if (model.mergeFollowerByAddress.has(address)) return '';\n return getRenderCell(model, row, column)?.displayText ?? '';\n}\n\nfunction mergedRangesForClipboard(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n): SpreadsheetClipboardMerge[] {\n const merges: SpreadsheetClipboardMerge[] = [];\n for (const merge of model.mergeMasterByAddress.values()) {\n if (!rangeContainsRange(range, merge.range)) continue;\n merges.push({\n startRowOffset: merge.range.startRow - range.startRow,\n startColumnOffset: merge.range.startColumn - range.startColumn,\n rowCount: merge.range.endRow - merge.range.startRow + 1,\n columnCount: merge.range.endColumn - merge.range.startColumn + 1,\n });\n }\n return merges;\n}\n\nfunction rangeStyleIdsForClipboard(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n): (number | undefined)[][] {\n const styleIds: (number | undefined)[][] = [];\n for (let row = range.startRow; row <= range.endRow; row++) {\n const line: (number | undefined)[] = [];\n for (let column = range.startColumn; column <= range.endColumn; column++) {\n line.push(getRenderCell(model, row, column)?.styleId);\n }\n styleIds.push(line);\n }\n return styleIds;\n}\n\nfunction rangeContainsRange(outer: SpreadsheetRange, inner: SpreadsheetRange): boolean {\n return (\n inner.startRow >= outer.startRow &&\n inner.endRow <= outer.endRow &&\n inner.startColumn >= outer.startColumn &&\n inner.endColumn <= outer.endColumn\n );\n}\n\nfunction coerceClipboardValue(value: string): ExcelCellValue {\n if (value === '') return null;\n const number = Number(value);\n if (Number.isFinite(number) && value.trim() !== '') return number;\n if (value === 'TRUE') return true;\n if (value === 'FALSE') return false;\n return value;\n}\n","import { shiftFormulaReferences, type ExcelCellValue } from '@coco-vexel/coco-office/excel';\nimport { getRenderCell } from './render-model.js';\nimport type { SpreadsheetRange, SpreadsheetSheetRenderModel } from './types.js';\n\nexport type SpreadsheetAutoFillDirection = 'down' | 'right';\n\nexport interface SpreadsheetAutoFillCell {\n row: number;\n column: number;\n value: ExcelCellValue;\n formula?: string;\n styleId?: number;\n}\n\nexport interface SpreadsheetAutoFillPlan {\n direction: SpreadsheetAutoFillDirection;\n source: SpreadsheetRange;\n target: SpreadsheetRange;\n cells: SpreadsheetAutoFillCell[];\n}\n\n/**\n * Produces the cells outside the original selection for a down/right fill.\n * Merged ranges are deliberately excluded for now: their copy semantics need a\n * separate structural operation rather than cell-by-cell expansion.\n */\nexport function buildSpreadsheetAutoFillPlan(\n model: SpreadsheetSheetRenderModel,\n sourceRange: SpreadsheetRange,\n targetRange: SpreadsheetRange,\n): SpreadsheetAutoFillPlan {\n const source = normalizeRange(sourceRange);\n const target = normalizeRange(targetRange);\n const direction = resolveAutoFillDirection(source, target);\n if (rangeTouchesMergedCells(source, model) || rangeTouchesMergedCells(target, model)) {\n throw new Error('Auto fill does not support merged cells');\n }\n\n const cells: SpreadsheetAutoFillCell[] = [];\n for (let row = target.startRow; row <= target.endRow; row++) {\n for (let column = target.startColumn; column <= target.endColumn; column++) {\n if (isInsideRange(row, column, source)) continue;\n const sourceRow = direction === 'down'\n ? source.startRow + modulo(row - source.startRow, heightOf(source))\n : row;\n const sourceColumn = direction === 'right'\n ? source.startColumn + modulo(column - source.startColumn, widthOf(source))\n : column;\n const sourceCell = getRenderCell(model, sourceRow, sourceColumn);\n const sequenceValue = autoFillSequenceValue(model, source, direction, row, column);\n const formula = sourceCell?.formula\n ? shiftFormulaReferences(sourceCell.formula, row - sourceRow, column - sourceColumn)\n : undefined;\n cells.push({\n row,\n column,\n value: formula ? null : sequenceValue ?? sourceCell?.source.value ?? null,\n formula,\n styleId: sourceCell?.styleId,\n });\n }\n }\n\n return { direction, source, target, cells };\n}\n\nexport function supportsSpreadsheetAutoFill(\n model: SpreadsheetSheetRenderModel,\n sourceRange: SpreadsheetRange,\n): boolean {\n return !rangeTouchesMergedCells(normalizeRange(sourceRange), model);\n}\n\nfunction resolveAutoFillDirection(\n source: SpreadsheetRange,\n target: SpreadsheetRange,\n): SpreadsheetAutoFillDirection {\n const fillsDown =\n target.startRow === source.startRow &&\n target.startColumn === source.startColumn &&\n target.endColumn === source.endColumn &&\n target.endRow > source.endRow;\n if (fillsDown) return 'down';\n\n const fillsRight =\n target.startRow === source.startRow &&\n target.endRow === source.endRow &&\n target.startColumn === source.startColumn &&\n target.endColumn > source.endColumn;\n if (fillsRight) return 'right';\n throw new Error('Auto fill target must extend the source selection down or right');\n}\n\nfunction autoFillSequenceValue(\n model: SpreadsheetSheetRenderModel,\n source: SpreadsheetRange,\n direction: SpreadsheetAutoFillDirection,\n row: number,\n column: number,\n): number | undefined {\n const length = direction === 'down' ? heightOf(source) : widthOf(source);\n if (length < 2) return undefined;\n const values = Array.from({ length }, (_, index) => {\n const sourceRow = direction === 'down' ? source.startRow + index : row;\n const sourceColumn = direction === 'right' ? source.startColumn + index : column;\n const cell = getRenderCell(model, sourceRow, sourceColumn);\n return cell?.formula ? undefined : cell?.source.value;\n });\n if (!values.every((value): value is number => typeof value === 'number' && Number.isFinite(value))) {\n return undefined;\n }\n const step = values[1]! - values[0]!;\n if (!values.every((value, index) => index === 0 || value === values[0]! + step * index)) return undefined;\n const position = direction === 'down' ? row - source.startRow : column - source.startColumn;\n return values[0]! + step * position;\n}\n\nfunction rangeTouchesMergedCells(range: SpreadsheetRange, model: SpreadsheetSheetRenderModel): boolean {\n for (const merge of model.mergeMasterByAddress.values()) {\n if (rangesIntersect(range, merge.range)) return true;\n }\n return false;\n}\n\nfunction normalizeRange(range: SpreadsheetRange): SpreadsheetRange {\n return {\n startRow: Math.min(range.startRow, range.endRow),\n startColumn: Math.min(range.startColumn, range.endColumn),\n endRow: Math.max(range.startRow, range.endRow),\n endColumn: Math.max(range.startColumn, range.endColumn),\n };\n}\n\nfunction heightOf(range: SpreadsheetRange): number {\n return range.endRow - range.startRow + 1;\n}\n\nfunction widthOf(range: SpreadsheetRange): number {\n return range.endColumn - range.startColumn + 1;\n}\n\nfunction isInsideRange(row: number, column: number, range: SpreadsheetRange): boolean {\n return row >= range.startRow && row <= range.endRow && column >= range.startColumn && column <= range.endColumn;\n}\n\nfunction rangesIntersect(a: SpreadsheetRange, b: SpreadsheetRange): boolean {\n return !(\n a.endRow < b.startRow ||\n a.startRow > b.endRow ||\n a.endColumn < b.startColumn ||\n a.startColumn > b.endColumn\n );\n}\n\nfunction modulo(value: number, divisor: number): number {\n return ((value % divisor) + divisor) % divisor;\n}\n","import type { ExcelCellValue, ExcelWorkbook } from '@coco-vexel/coco-office/excel';\nimport { formatCellAddress, formatRangeAddress } from '@coco-vexel/coco-office/excel';\nimport { cssPixelsToExcelColumnWidth } from './layout.js';\n\nexport async function setSpreadsheetCellValue(\n workbook: ExcelWorkbook,\n sheetName: string,\n address: string,\n value: ExcelCellValue,\n): Promise<void> {\n await workbook.worksheets.getItem(sheetName).getCell(address).setValue(value);\n}\n\nexport async function setSpreadsheetCellFormula(\n workbook: ExcelWorkbook,\n sheetName: string,\n address: string,\n formula: string | null,\n): Promise<void> {\n await workbook.worksheets.getItem(sheetName).getCell(address).setFormula(formula);\n}\n\nexport async function setSpreadsheetRangeValues(\n workbook: ExcelWorkbook,\n sheetName: string,\n startRow: number,\n startColumn: number,\n values: ExcelCellValue[][],\n): Promise<void> {\n const rowCount = values.length;\n const columnCount = values.reduce((max, row) => Math.max(max, row.length), 0);\n const normalized = values.map((row) => {\n const next = row.slice();\n while (next.length < columnCount) next.push(null);\n return next;\n });\n await workbook.worksheets\n .getItem(sheetName)\n .getRange(formatRangeAddress(startRow, startColumn, rowCount, columnCount))\n .setValues(normalized);\n}\n\nexport async function clearSpreadsheetRange(\n workbook: ExcelWorkbook,\n sheetName: string,\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n): Promise<void> {\n await workbook.worksheets\n .getItem(sheetName)\n .getRange(formatRangeAddress(startRow, startColumn, rowCount, columnCount))\n .clear();\n}\n\nexport async function setSpreadsheetRowHeight(\n workbook: ExcelWorkbook,\n sheetName: string,\n row: number,\n height: number,\n): Promise<void> {\n await workbook.worksheets\n .getItem(sheetName)\n .getRange(formatCellAddress(row, 1))\n .setRowHeight(height);\n}\n\nexport async function setSpreadsheetColumnWidth(\n workbook: ExcelWorkbook,\n sheetName: string,\n column: number,\n width: number,\n): Promise<void> {\n await workbook.worksheets\n .getItem(sheetName)\n .getRange(formatCellAddress(1, column))\n .setColumnWidth(cssPixelsToExcelColumnWidth(width));\n}\n","import type { ExcelCellValue } from '@coco-vexel/coco-office/excel';\nimport type { SpreadsheetRange, SpreadsheetRenderCell, SpreadsheetSheetRenderModel } from './types.js';\n\nexport interface SpreadsheetFindOptions {\n query: string;\n matchCase?: boolean;\n}\n\nexport interface SpreadsheetFindMatch {\n row: number;\n column: number;\n address: string;\n text: string;\n}\n\nexport interface SpreadsheetReplaceTarget {\n address: string;\n value?: ExcelCellValue;\n formula?: string;\n}\n\nexport function buildSpreadsheetReplacePlan(\n model: SpreadsheetSheetRenderModel,\n options: SpreadsheetFindOptions & { replacement: string },\n): SpreadsheetReplaceTarget[] {\n const query = options.query.trim();\n if (!query) return [];\n const matches: SpreadsheetReplaceTarget[] = [];\n const cells = [...model.cellsByAddress.values()].sort((a, b) => a.row - b.row || a.column - b.column);\n for (const cell of cells) {\n if (!searchableCellText(cell, options.matchCase === true).includes(normalizeSearchText(query, options.matchCase === true))) continue;\n if (cell.formula) {\n const formulaQuery = query.startsWith('=') ? query.slice(1) : query;\n matches.push({ address: cell.address, formula: replaceText(cell.formula, formulaQuery, options.replacement, options.matchCase === true) });\n } else {\n const source = cell.value === null ? '' : String(cell.value);\n matches.push({ address: cell.address, value: replaceText(source, query, options.replacement, options.matchCase === true) });\n }\n }\n return matches;\n}\n\nexport function findSpreadsheetMatches(\n model: SpreadsheetSheetRenderModel,\n options: SpreadsheetFindOptions,\n): SpreadsheetFindMatch[] {\n const query = normalizeSearchText(options.query, options.matchCase === true);\n if (!query) return [];\n const matches: SpreadsheetFindMatch[] = [];\n const cells = [...model.cellsByAddress.values()].sort((a, b) => a.row - b.row || a.column - b.column);\n for (const cell of cells) {\n const haystack = searchableCellText(cell, options.matchCase === true);\n if (!haystack.includes(query)) continue;\n matches.push({ row: cell.row, column: cell.column, address: cell.address, text: cell.displayText });\n }\n return matches;\n}\n\nexport function nextSpreadsheetMatch(\n matches: readonly SpreadsheetFindMatch[],\n active: { row: number; column: number },\n direction: 'forward' | 'backward' = 'forward',\n): SpreadsheetFindMatch | null {\n if (matches.length === 0) return null;\n if (direction === 'backward') {\n return [...matches].reverse().find((match) => compareCellPosition(match, active) < 0) ?? matches[matches.length - 1] ?? null;\n }\n return matches.find((match) => compareCellPosition(match, active) > 0) ?? matches[0] ?? null;\n}\n\nexport function rangeForSpreadsheetMatch(match: SpreadsheetFindMatch): SpreadsheetRange {\n return {\n startRow: match.row,\n startColumn: match.column,\n endRow: match.row,\n endColumn: match.column,\n };\n}\n\nfunction searchableCellText(cell: SpreadsheetRenderCell, matchCase: boolean): string {\n const parts = [\n cell.displayText,\n rawCellValueText(cell.value),\n cell.formula ? `=${cell.formula}` : '',\n ].filter(Boolean);\n return normalizeSearchText(parts.join('\\n'), matchCase);\n}\n\nfunction rawCellValueText(value: ExcelCellValue): string {\n return value === null ? '' : String(value);\n}\n\nfunction normalizeSearchText(value: string, matchCase: boolean): string {\n const text = value.trim();\n return matchCase ? text : text.toLocaleLowerCase();\n}\n\nfunction compareCellPosition(\n a: { row: number; column: number },\n b: { row: number; column: number },\n): number {\n return a.row === b.row ? a.column - b.column : a.row - b.row;\n}\n\nfunction replaceText(source: string, query: string, replacement: string, matchCase: boolean): string {\n if (!query) return source;\n const escaped = query.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n return source.replace(new RegExp(escaped, matchCase ? 'g' : 'gi'), replacement);\n}\n","import type { SpreadsheetRange, SpreadsheetSheetRenderModel } from './types.js';\nimport { getRenderCell } from './render-model.js';\n\nexport type SpreadsheetSortDirection = 'asc' | 'desc';\n\nexport interface SpreadsheetColumnFilter {\n column: number;\n values: readonly string[];\n}\n\nexport function spreadsheetFilterValues(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n column: number,\n): string[] {\n const values = new Set<string>();\n for (let row = range.startRow + 1; row <= range.endRow; row += 1) {\n values.add(getRenderCell(model, row, column)?.displayText ?? '');\n }\n return [...values].sort((left, right) => left.localeCompare(right, undefined, { numeric: true }));\n}\n\nexport function spreadsheetVisibleFilterValues(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n column: number,\n): string[] {\n const visibleValues = new Set<string>();\n for (let row = range.startRow + 1; row <= range.endRow; row += 1) {\n if (model.rowMetaByIndex.get(row)?.hidden) continue;\n visibleValues.add(getRenderCell(model, row, column)?.displayText ?? '');\n }\n return [...visibleValues].sort((left, right) => left.localeCompare(right, undefined, { numeric: true }));\n}\n\nexport function spreadsheetRowsForFilter(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n column: number,\n value: string | readonly string[],\n): number[] {\n const values = new Set(typeof value === 'string' ? [value] : value);\n const hiddenRows: number[] = [];\n for (let row = range.startRow + 1; row <= range.endRow; row += 1) {\n if (!values.has(getRenderCell(model, row, column)?.displayText ?? '')) hiddenRows.push(row);\n }\n return hiddenRows;\n}\n\nexport function spreadsheetRowsForColumnFilters(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n filters: readonly SpreadsheetColumnFilter[],\n): number[] {\n const allowedByColumn = filters.map((filter) => [filter.column, new Set(filter.values)] as const);\n const hiddenRows: number[] = [];\n for (let row = range.startRow + 1; row <= range.endRow; row += 1) {\n const matchesAll = allowedByColumn.every(([column, values]) =>\n values.has(getRenderCell(model, row, column)?.displayText ?? ''),\n );\n if (!matchesAll) hiddenRows.push(row);\n }\n return hiddenRows;\n}\n\nexport function spreadsheetSortRows(\n model: SpreadsheetSheetRenderModel,\n range: SpreadsheetRange,\n column: number,\n direction: SpreadsheetSortDirection,\n): number[] {\n const rows = Array.from({ length: range.endRow - range.startRow }, (_, index) => range.startRow + index + 1);\n rows.sort((leftRow, rightRow) => {\n const left = getRenderCell(model, leftRow, column)?.displayText ?? '';\n const right = getRenderCell(model, rightRow, column)?.displayText ?? '';\n if (left === '' && right !== '') return 1;\n if (left !== '' && right === '') return -1;\n const comparison = left.localeCompare(right, undefined, { numeric: true, sensitivity: 'base' });\n return (direction === 'desc' ? -comparison : comparison) || leftRow - rightRow;\n });\n return rows;\n}\n","import {\n ExcelWorkbook,\n SpreadsheetFormulaEngine,\n rewriteFormulaForRowSort,\n diffExcelWorkbookModels,\n type ExcelCellValue,\n type ExcelWorkbookLoadOptions,\n type ExcelWorkbookModel,\n type ExcelBorderModel,\n type ExcelColorModel,\n type ExcelAgentTransactionGroupOptions,\n type ExcelHistoryApplyResult,\n type ExcelSheetViewModel,\n type ExcelTransactionBuilder,\n type ExcelTransactionGroupOptions,\n type ExcelTransactionGroupSummary,\n type ExcelWorkbookDiff,\n type SpreadsheetFormulaResult,\n} from '@coco-vexel/coco-office/excel';\nimport { formatCellAddress, formatRangeAddress, parseCellAddress, parseRangeAddress } from '@coco-vexel/coco-office/excel';\nimport { buildSpreadsheetSheetRenderModel } from './render-model.js';\nimport { cssPixelsToExcelColumnWidth } from './layout.js';\nimport { buildSpreadsheetAutoFillPlan } from './auto-fill.js';\nimport { buildSpreadsheetReplacePlan } from './search.js';\nimport {\n spreadsheetRowsForColumnFilters,\n spreadsheetRowsForFilter,\n spreadsheetSortRows,\n type SpreadsheetColumnFilter,\n type SpreadsheetSortDirection,\n} from './filter.js';\nimport type { SpreadsheetRange, SpreadsheetSheetRenderModel } from './types.js';\nimport type { SpreadsheetClipboardMerge } from './clipboard.js';\n\nexport interface SpreadsheetEditorRuntimeState {\n workbook: ExcelWorkbook;\n model: ExcelWorkbookModel;\n activeSheetName: string;\n activeSheet: SpreadsheetSheetRenderModel;\n formulaResults: Map<string, SpreadsheetFormulaResult>;\n formulaEngine: SpreadsheetFormulaEngine;\n}\n\nexport interface SpreadsheetCellEditHistoryOptions {\n mergeUndo?: boolean;\n mergeWindowMs?: number;\n}\n\nexport type SpreadsheetUserTransactionOptions = Omit<ExcelTransactionGroupOptions, 'source'>;\nexport type SpreadsheetAgentTransactionRunner = (runtime: SpreadsheetEditorRuntime) => Promise<void>;\n\nexport interface SpreadsheetAgentTransactionPreview {\n result: ExcelHistoryApplyResult | null;\n summary: ExcelTransactionGroupSummary | null;\n diff: ExcelWorkbookDiff;\n diffSummary: SpreadsheetPreviewDiffSummary;\n beforeModel: ExcelWorkbookModel;\n afterModel: ExcelWorkbookModel;\n activeSheetName: string;\n}\n\nexport interface SpreadsheetPreviewDiffSummary {\n changed: boolean;\n changedSheets: number;\n sheetNames: string[];\n cellChanges: {\n total: number;\n added: number;\n modified: number;\n deleted: number;\n };\n structuralChanged: boolean;\n objectChanged: boolean;\n sampleCells: SpreadsheetPreviewCellChangeSummary[];\n}\n\nexport interface SpreadsheetPreviewCellChangeSummary {\n sheetName: string;\n address: string;\n kind: 'added' | 'deleted' | 'modified';\n before: ExcelCellValue | null;\n after: ExcelCellValue | null;\n}\n\nexport type SpreadsheetPasteMode = 'all' | 'values' | 'formats';\n\nexport interface SpreadsheetPasteOptions {\n mode?: SpreadsheetPasteMode;\n merges?: SpreadsheetClipboardMerge[];\n styleIds?: (number | undefined)[][];\n}\n\nexport class SpreadsheetEditorRuntime {\n private activeTransaction: ExcelTransactionBuilder | null = null;\n private activeTransactionSource: 'user' | 'agent' | null = null;\n private transactionNeedsRefresh = false;\n\n private constructor(private state: SpreadsheetEditorRuntimeState) {}\n\n static async fromZip(\n bytes: Uint8Array | ArrayBuffer,\n options: ExcelWorkbookLoadOptions = {},\n ): Promise<SpreadsheetEditorRuntime> {\n const workbook = await ExcelWorkbook.fromZip(bytes, options);\n return SpreadsheetEditorRuntime.fromWorkbook(workbook);\n }\n\n static async fromWorkbook(workbook: ExcelWorkbook): Promise<SpreadsheetEditorRuntime> {\n const model = await workbook.toModel();\n const firstSheet = model.sheets[0];\n if (!firstSheet) throw new Error('SpreadsheetEditorRuntime: workbook has no sheets');\n const formulaEngine = new SpreadsheetFormulaEngine(firstSheet, { sheets: model.sheets });\n const formulaResults = formulaEngine.calculate();\n return new SpreadsheetEditorRuntime({\n workbook,\n model,\n activeSheetName: firstSheet.name,\n formulaResults,\n formulaEngine,\n activeSheet: buildSpreadsheetSheetRenderModel(firstSheet, model.styles, { formulaResults }),\n });\n }\n\n workbook(): ExcelWorkbook {\n return this.state.workbook;\n }\n\n model(): ExcelWorkbookModel {\n return this.state.model;\n }\n\n activeSheetName(): string {\n return this.state.activeSheetName;\n }\n\n activeSheet(): SpreadsheetSheetRenderModel {\n return this.state.activeSheet;\n }\n\n canUndo(): boolean {\n return this.state.workbook.history().canUndo();\n }\n\n canRedo(): boolean {\n return this.state.workbook.history().canRedo();\n }\n\n async undo(): Promise<ExcelHistoryApplyResult | null> {\n const result = await this.state.workbook.history().undo();\n if (!result) return null;\n await this.refresh();\n return result;\n }\n\n async redo(): Promise<ExcelHistoryApplyResult | null> {\n const result = await this.state.workbook.history().redo();\n if (!result) return null;\n await this.refresh();\n return result;\n }\n\n async runUserTransaction(\n options: SpreadsheetUserTransactionOptions,\n run: () => Promise<void>,\n ): Promise<ExcelHistoryApplyResult | null> {\n return this.runScopedTransaction(\n 'user',\n (apply) => this.state.workbook.history().runGroup({ ...options, source: 'user' }, apply),\n run,\n );\n }\n\n async runAgentTransaction(\n options: ExcelAgentTransactionGroupOptions,\n run: SpreadsheetAgentTransactionRunner,\n ): Promise<ExcelHistoryApplyResult | null> {\n return this.runScopedTransaction(\n 'agent',\n (apply) => this.state.workbook.history().runAgentGroup(options, apply),\n () => run(this),\n );\n }\n\n async previewAgentTransaction(\n options: ExcelAgentTransactionGroupOptions,\n run: SpreadsheetAgentTransactionRunner,\n ): Promise<SpreadsheetAgentTransactionPreview> {\n // Preview uses a cloned workbook so hosts can show diff/summary before committing.\n // Web and desktop agents should reuse the same runner for preview and apply.\n const beforeModel = cloneWorkbookModel(this.state.model);\n const previewWorkbook = await ExcelWorkbook.fromModel(beforeModel, { mode: 'inline' });\n const previewRuntime = await SpreadsheetEditorRuntime.fromWorkbook(previewWorkbook);\n await previewRuntime.setActiveSheet(this.state.activeSheetName);\n try {\n const result = await previewRuntime.runAgentTransaction(options, run);\n const afterModel = cloneWorkbookModel(previewRuntime.model());\n const diff = diffExcelWorkbookModels(beforeModel, afterModel);\n return {\n result,\n summary: result?.summary ?? null,\n diff,\n diffSummary: summarizeSpreadsheetPreviewDiff(diff),\n beforeModel,\n afterModel,\n activeSheetName: previewRuntime.activeSheetName(),\n };\n } finally {\n await previewRuntime.dispose();\n }\n }\n\n async setActiveSheet(sheetName: string): Promise<void> {\n const sheet = this.state.model.sheets.find((item) => item.name === sheetName);\n if (!sheet) throw new Error(`SpreadsheetEditorRuntime: sheet not found: ${sheetName}`);\n const formulaEngine = new SpreadsheetFormulaEngine(sheet, { sheets: this.state.model.sheets });\n const formulaResults = formulaEngine.calculate();\n this.state.activeSheetName = sheet.name;\n this.state.formulaResults = formulaResults;\n this.state.formulaEngine = formulaEngine;\n this.state.activeSheet = buildSpreadsheetSheetRenderModel(sheet, this.state.model.styles, {\n formulaResults,\n });\n }\n\n async addSheet(name: string): Promise<void> {\n await this.runWorksheetStructureMutation(\n (tx) => tx.addSheet(name),\n () => this.state.workbook.worksheets.add(name).then(() => undefined),\n );\n await this.setActiveSheet(name);\n }\n\n async renameSheet(sheetName: string, name: string): Promise<void> {\n const wasActive = sheetName === this.state.activeSheetName;\n await this.runWorksheetStructureMutation(\n (tx) => tx.renameSheet(sheetName, name),\n () => this.state.workbook.worksheets.getItem(sheetName).rename(name),\n );\n if (wasActive) await this.setActiveSheet(name);\n }\n\n async copySheet(sheetName: string, newName: string): Promise<void> {\n await this.runWorksheetStructureMutation(\n (tx) => tx.copySheet(sheetName, newName),\n () => this.state.workbook.worksheets.copy(sheetName, newName).then(() => undefined),\n );\n await this.setActiveSheet(newName);\n }\n\n async deleteSheet(sheetName: string): Promise<void> {\n const index = this.state.model.sheets.findIndex((sheet) => sheet.name === sheetName);\n if (index === -1) throw new Error(`SpreadsheetEditorRuntime: sheet not found: ${sheetName}`);\n if (this.state.model.sheets.length === 1) {\n throw new Error('SpreadsheetEditorRuntime: cannot delete the last worksheet');\n }\n const nextActive = this.state.model.sheets[index + 1] ?? this.state.model.sheets[index - 1];\n const wasActive = sheetName === this.state.activeSheetName;\n await this.runWorksheetStructureMutation(\n (tx) => tx.deleteSheet(sheetName),\n () => this.state.workbook.worksheets.deleteItem(sheetName),\n );\n if (wasActive && nextActive) await this.setActiveSheet(nextActive.name);\n }\n\n async moveSheet(sheetName: string, toIndex: number): Promise<void> {\n await this.runWorksheetStructureMutation(\n (tx) => tx.moveSheet(sheetName, toIndex),\n () => this.state.workbook.worksheets.move(sheetName, toIndex),\n );\n }\n\n async refresh(): Promise<void> {\n const model = await this.state.workbook.toModel();\n const sheet =\n model.sheets.find((item) => item.name === this.state.activeSheetName) ?? model.sheets[0];\n if (!sheet) throw new Error('SpreadsheetEditorRuntime: workbook has no sheets');\n const formulaEngine = new SpreadsheetFormulaEngine(sheet, { sheets: model.sheets });\n const formulaResults = formulaEngine.calculate();\n this.state = {\n ...this.state,\n model,\n activeSheetName: sheet.name,\n formulaResults,\n formulaEngine,\n activeSheet: buildSpreadsheetSheetRenderModel(sheet, model.styles, { formulaResults }),\n };\n }\n\n async setCellValue(\n address: string,\n value: ExcelCellValue,\n historyOptions: SpreadsheetCellEditHistoryOptions = {},\n ): Promise<void> {\n const targetAddress = this.editableCellAddress(address);\n await this.runUserMutation(this.cellEditHistoryGroup(`Set ${targetAddress}`, targetAddress, historyOptions), async (tx) => {\n await tx.setCellValue(this.state.activeSheetName, targetAddress, value);\n });\n }\n\n async setCellFormula(\n address: string,\n formula: string | null,\n historyOptions: SpreadsheetCellEditHistoryOptions = {},\n ): Promise<void> {\n const targetAddress = this.editableCellAddress(address);\n await this.runUserMutation(this.cellEditHistoryGroup(`Set ${targetAddress} formula`, targetAddress, historyOptions), async (tx) => {\n await tx.setCellFormula(this.state.activeSheetName, targetAddress, formula);\n });\n }\n\n async replaceAll(\n query: string,\n replacement: string,\n matchCase = false,\n ): Promise<number> {\n const plan = buildSpreadsheetReplacePlan(this.state.activeSheet, { query, replacement, matchCase });\n if (plan.length === 0) return 0;\n await this.runUserMutation({ label: `Replace ${query}` }, async (tx) => {\n for (const target of plan) {\n if (target.formula !== undefined) {\n await tx.setCellFormula(this.state.activeSheetName, target.address, target.formula);\n } else {\n await tx.setCellValue(this.state.activeSheetName, target.address, target.value ?? null);\n }\n }\n });\n return plan.length;\n }\n\n async filterRows(\n startRow: number,\n endRow: number,\n column: number,\n value: string | readonly string[] | null,\n ): Promise<void> {\n const range = { startRow, startColumn: column, endRow, endColumn: column };\n const hiddenRows = value === null\n ? []\n : spreadsheetRowsForFilter(this.state.activeSheet, { ...range, startColumn: 1, endColumn: this.state.activeSheet.maxColumn }, column, value);\n await this.runUserMutation({ label: value === null ? 'Clear filter' : 'Filter rows' }, async (tx) => {\n await tx.runSnapshot('Filter rows', 'spreadsheet row filter', async () => {\n await this.state.workbook.executeCode<void>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetName);\n const hidden = new Set(args.hiddenRows);\n for (let index = args.startRow + 1; index <= args.endRow; index += 1) {\n let row = sheet.model.rows.find((item) => item.index === index);\n if (hidden.has(index)) {\n row ??= { index };\n row.hidden = true;\n if (!sheet.model.rows.includes(row)) sheet.model.rows.push(row);\n } else if (row) {\n delete row.hidden;\n }\n }\n sheet.model.rows.sort((left, right) => left.index - right.index);\n `,\n { sheetName: this.state.activeSheetName, startRow, endRow, hiddenRows },\n );\n });\n });\n }\n\n async filterRowsByColumns(\n startRow: number,\n endRow: number,\n filters: readonly SpreadsheetColumnFilter[],\n ): Promise<void> {\n const range = {\n startRow,\n startColumn: 1,\n endRow,\n endColumn: this.state.activeSheet.maxColumn,\n };\n const hiddenRows = spreadsheetRowsForColumnFilters(this.state.activeSheet, range, filters);\n await this.runUserMutation({ label: 'Filter rows' }, async (tx) => {\n await tx.runSnapshot('Filter rows', 'spreadsheet row filter', async () => {\n await this.state.workbook.executeCode<void>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetName);\n const hidden = new Set(args.hiddenRows);\n for (let index = args.startRow + 1; index <= args.endRow; index += 1) {\n let row = sheet.model.rows.find((item) => item.index === index);\n if (hidden.has(index)) {\n row ??= { index };\n row.hidden = true;\n if (!sheet.model.rows.includes(row)) sheet.model.rows.push(row);\n } else if (row) {\n delete row.hidden;\n }\n }\n sheet.model.rows.sort((left, right) => left.index - right.index);\n `,\n { sheetName: this.state.activeSheetName, startRow, endRow, hiddenRows },\n );\n });\n });\n }\n\n async sortRows(\n startRow: number,\n endRow: number,\n column: number,\n direction: SpreadsheetSortDirection,\n ): Promise<void> {\n const range = { startRow, startColumn: 1, endRow, endColumn: this.state.activeSheet.maxColumn };\n const orderedRows = spreadsheetSortRows(this.state.activeSheet, range, column, direction);\n const rowMap = new Map(orderedRows.map((sourceRow, index) => [sourceRow, startRow + index + 1]));\n const formulaUpdates = this.state.activeSheet.source.cells\n .filter((cell) => cell.formula)\n .map((cell) => [\n cell.address,\n rewriteFormulaForRowSort(cell.formula ?? '', rowMap, { sheetName: this.state.activeSheetName }),\n ]);\n await this.runUserMutation({ label: direction === 'asc' ? 'Sort ascending' : 'Sort descending' }, async (tx) => {\n await tx.runSnapshot('Sort rows', 'spreadsheet row sort', async () => {\n await this.state.workbook.executeCode<void>(\n `\n const sheet = workbook.worksheets.getItem(args.sheetName);\n const rowMap = new Map(args.rowMap);\n const formulas = new Map(args.formulas);\n function formatCellAddress(row, column) {\n let value = column;\n let letters = '';\n while (value > 0) {\n const remainder = (value - 1) % 26;\n letters = String.fromCharCode(65 + remainder) + letters;\n value = Math.floor((value - 1) / 26);\n }\n return letters + row;\n }\n for (const cell of sheet.model.cells) {\n const nextFormula = formulas.get(cell.address);\n if (nextFormula !== undefined) cell.formula = nextFormula;\n const nextRow = rowMap.get(cell.row);\n if (nextRow === undefined) continue;\n cell.row = nextRow;\n cell.address = formatCellAddress(cell.row, cell.column);\n }\n for (const row of sheet.model.rows) {\n const nextIndex = rowMap.get(row.index);\n if (nextIndex !== undefined) row.index = nextIndex;\n }\n sheet.model.cells.sort((left, right) => left.row - right.row || left.column - right.column);\n sheet.model.rows.sort((left, right) => left.index - right.index);\n `,\n { sheetName: this.state.activeSheetName, rowMap: [...rowMap.entries()], formulas: formulaUpdates },\n );\n });\n });\n }\n\n async setRangeValues(\n startRow: number,\n startColumn: number,\n values: ExcelCellValue[][],\n ): Promise<void> {\n const rowCount = values.length;\n const columnCount = values.reduce((max, row) => Math.max(max, row.length), 0);\n const normalized = values.map((row) => {\n const next = row.slice();\n while (next.length < columnCount) next.push(null);\n return next;\n });\n await this.runUserMutation({ label: 'Set range values' }, async (tx) => {\n await tx.setRangeValues(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n normalized,\n );\n });\n }\n\n async autoFillRange(sourceRange: SpreadsheetRange, targetRange: SpreadsheetRange): Promise<void> {\n const plan = buildSpreadsheetAutoFillPlan(this.state.activeSheet, sourceRange, targetRange);\n if (plan.cells.length === 0) return;\n await this.runUserMutation({ label: 'Auto fill' }, async (tx) => {\n for (const cell of plan.cells) {\n const address = formatCellAddress(cell.row, cell.column);\n if (cell.formula) await tx.setCellFormula(this.state.activeSheetName, address, cell.formula);\n else await tx.setCellValue(this.state.activeSheetName, address, cell.value);\n await tx.setRangeStyleId(this.state.activeSheetName, address, cell.styleId);\n }\n });\n }\n\n async pasteRangeValues(\n startRow: number,\n startColumn: number,\n values: ExcelCellValue[][],\n merges: SpreadsheetClipboardMerge[] = [],\n styleIds: (number | undefined)[][] = [],\n ): Promise<void> {\n await this.pasteRange(startRow, startColumn, values, { mode: 'all', merges, styleIds });\n }\n\n async pasteRange(\n startRow: number,\n startColumn: number,\n values: ExcelCellValue[][],\n options: SpreadsheetPasteOptions = {},\n ): Promise<void> {\n const mode = options.mode ?? 'all';\n const rowCount = values.length;\n const columnCount = values.reduce((max, row) => Math.max(max, row.length), 0);\n const normalized = values.map((row) => {\n const next = row.slice();\n while (next.length < columnCount) next.push(null);\n return next;\n });\n const effectiveRowCount = Math.max(1, rowCount);\n const effectiveColumnCount = Math.max(1, columnCount);\n const targetRange = {\n startRow,\n startColumn,\n endRow: startRow + effectiveRowCount - 1,\n endColumn: startColumn + effectiveColumnCount - 1,\n };\n const existingMerges = [...this.state.activeSheet.mergeMasterByAddress.values()]\n .filter((merge) => rangesIntersect(targetRange, merge.range))\n .map((merge) => merge.address);\n await this.runUserMutation({ label: pasteHistoryLabel(mode) }, async (tx) => {\n if (mode !== 'formats') {\n for (const address of existingMerges) await tx.unmergeRange(this.state.activeSheetName, address);\n await tx.setRangeValues(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, effectiveRowCount, effectiveColumnCount),\n normalized,\n );\n }\n if (mode !== 'values') {\n await applySpreadsheetPasteStyles(\n tx,\n this.state.activeSheetName,\n startRow,\n startColumn,\n effectiveColumnCount,\n options.styleIds ?? [],\n );\n }\n if (mode === 'all') await applySpreadsheetPasteMerges(tx, this.state.activeSheetName, startRow, startColumn, options.merges ?? []);\n });\n }\n\n async clearRange(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Clear range' }, async (tx) => {\n await tx.clearRange(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n );\n });\n }\n\n async setRowHeight(row: number, height: number): Promise<void> {\n await this.runUserMutation({ label: 'Set row height' }, async (tx) => {\n await tx.setRowHeight(this.state.activeSheetName, row, height);\n });\n }\n\n async setColumnWidth(column: number, width: number): Promise<void> {\n await this.runUserMutation({ label: 'Set column width' }, async (tx) => {\n await tx.setColumnWidth(this.state.activeSheetName, column, cssPixelsToExcelColumnWidth(width));\n });\n }\n\n async setFreezePanes(frozenRows: number, frozenColumns: number): Promise<void> {\n const rows = normalizeFrozenPaneCount(frozenRows);\n const columns = normalizeFrozenPaneCount(frozenColumns);\n const views = spreadsheetSheetViewsWithFrozenPane(this.state.activeSheet.source.sheetViews, rows, columns);\n await this.runUserMutation({ label: rows || columns ? 'Freeze panes' : 'Unfreeze panes' }, async (tx) => {\n await tx.setSheetViews(this.state.activeSheetName, views);\n });\n }\n\n async insertRows(rowIndex: number, count = 1): Promise<void> {\n await this.runUserMutation({ label: 'Insert rows' }, async (tx) => {\n await tx.insertRows(this.state.activeSheetName, rowIndex, count);\n });\n }\n\n async deleteRows(rowIndex: number, count = 1): Promise<void> {\n await this.runUserMutation({ label: 'Delete rows' }, async (tx) => {\n await tx.deleteRows(this.state.activeSheetName, rowIndex, count);\n });\n }\n\n async insertColumns(columnIndex: number, count = 1): Promise<void> {\n await this.runUserMutation({ label: 'Insert columns' }, async (tx) => {\n await tx.insertColumns(this.state.activeSheetName, columnIndex, count);\n });\n }\n\n async deleteColumns(columnIndex: number, count = 1): Promise<void> {\n await this.runUserMutation({ label: 'Delete columns' }, async (tx) => {\n await tx.deleteColumns(this.state.activeSheetName, columnIndex, count);\n });\n }\n\n async setRangeBold(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n value: boolean | undefined,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Set bold' }, async (tx) => {\n await tx.setRangeBold(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n value,\n );\n });\n }\n\n async setRangeItalic(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n value: boolean | undefined,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Set italic' }, async (tx) => {\n await tx.setRangeItalic(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n value,\n );\n });\n }\n\n async setRangeUnderline(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n value: boolean | undefined,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Set underline' }, async (tx) => {\n await tx.setRangeUnderline(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n value,\n );\n });\n }\n\n async setRangeFontColor(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n color: ExcelColorModel | undefined,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Set font color' }, async (tx) => {\n await tx.setRangeFontColor(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n color,\n );\n });\n }\n\n async setRangeFillColor(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n color: ExcelColorModel | undefined,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Set fill color' }, async (tx) => {\n await tx.setRangeFillColor(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n color,\n );\n });\n }\n\n async setRangeHorizontalAlign(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n horizontal: 'left' | 'center' | 'right' | undefined,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Set horizontal align' }, async (tx) => {\n await tx.setRangeHorizontalAlign(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n horizontal,\n );\n });\n }\n\n async setRangeVerticalAlign(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n vertical: 'top' | 'center' | 'bottom' | undefined,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Set vertical align' }, async (tx) => {\n await tx.setRangeVerticalAlign(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n vertical,\n );\n });\n }\n\n async setRangeNumberFormat(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n code: string | undefined,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Set number format' }, async (tx) => {\n await tx.setRangeNumberFormat(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n code,\n );\n });\n }\n\n async clearRangeFormat(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n ): Promise<void> {\n await this.runUserMutation({ label: 'Clear format' }, async (tx) => {\n await tx.clearRangeFormat(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n );\n });\n }\n\n async mergeRange(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n ): Promise<void> {\n const address = formatRangeAddress(startRow, startColumn, rowCount, columnCount);\n const masterStyleId = await this.cellStyleId(formatCellAddress(startRow, startColumn));\n await this.runUserMutation({ label: 'Merge range' }, async (tx) => {\n // Editor-level merge semantics hide follower cells, so normalize their styles first.\n await tx.setRangeStyleId(this.state.activeSheetName, address, masterStyleId);\n await tx.mergeRange(this.state.activeSheetName, address);\n });\n }\n\n async unmergeRanges(addresses: string[]): Promise<void> {\n if (addresses.length === 0) return;\n const merges = addresses.map((address) => {\n const merge = [...this.state.activeSheet.mergeMasterByAddress.values()].find((item) => item.address === address);\n const masterAddress = merge ? formatCellAddress(merge.range.startRow, merge.range.startColumn) : masterAddressForRange(address);\n return { address, masterAddress };\n });\n await this.runUserMutation({ label: 'Unmerge ranges' }, async (tx) => {\n for (const merge of merges) {\n // Prevent stale hidden follower styles from reappearing after unmerge.\n await tx.setRangeStyleId(this.state.activeSheetName, merge.address, await this.cellStyleId(merge.masterAddress));\n await tx.unmergeRange(this.state.activeSheetName, merge.address);\n }\n });\n }\n\n async setRangeBorder(\n startRow: number,\n startColumn: number,\n rowCount: number,\n columnCount: number,\n mode: 'all' | 'outer' | 'inner' | 'clear',\n ): Promise<void> {\n if (mode === 'clear') {\n await this.runUserMutation({ label: 'Clear border' }, async (tx) => {\n await tx.setRangeBorder(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n {},\n );\n });\n return;\n }\n\n const side = spreadsheetDefaultBorderSide();\n if (mode === 'all') {\n await this.runUserMutation({ label: 'Set all borders' }, async (tx) => {\n await tx.setRangeBorder(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n { left: side, right: side, top: side, bottom: side },\n );\n });\n return;\n }\n\n await this.runUserMutation({ label: `Set ${mode} borders` }, async (tx) => {\n await tx.setRangeBorder(\n this.state.activeSheetName,\n formatRangeAddress(startRow, startColumn, rowCount, columnCount),\n {},\n );\n for (let rowOffset = 0; rowOffset < rowCount; rowOffset++) {\n for (let columnOffset = 0; columnOffset < columnCount; columnOffset++) {\n const border: ExcelBorderModel = {};\n if (mode === 'outer') {\n if (rowOffset === 0) border.top = side;\n if (rowOffset === rowCount - 1) border.bottom = side;\n if (columnOffset === 0) border.left = side;\n if (columnOffset === columnCount - 1) border.right = side;\n } else {\n if (columnOffset < columnCount - 1) border.right = side;\n if (rowOffset < rowCount - 1) border.bottom = side;\n }\n if (Object.keys(border).length === 0) continue;\n await tx.setRangeBorder(\n this.state.activeSheetName,\n formatCellAddress(startRow + rowOffset, startColumn + columnOffset),\n border,\n );\n }\n }\n });\n }\n\n async toZip(): Promise<Uint8Array> {\n return this.state.workbook.toZip();\n }\n\n async moveChart(\n chartIndex: number,\n position: {\n from: { row: number; column: number; rowOffset?: number; columnOffset?: number };\n to?: { row: number; column: number; rowOffset?: number; columnOffset?: number };\n },\n ): Promise<void> {\n await this.runUserMutation({ label: 'Move chart' }, async (tx) => {\n await tx.runSnapshot('Move chart', 'spreadsheet chart position', async () => {\n const sheetModel = this.state.model.sheets.find((sheet) => sheet.name === this.state.activeSheetName);\n const chart = sheetModel?.charts[chartIndex];\n if (!sheetModel || !chart) return;\n const drawingIndex = sheetModel.drawings.findIndex((drawing) => drawing.path === chart.drawingPath);\n const drawing = drawingIndex >= 0 ? sheetModel.drawings[drawingIndex] : sheetModel.drawings[0];\n if (!drawing) return;\n const anchorIndex = drawing.anchors.findIndex((anchor) =>\n anchor.object?.kind === 'chart' &&\n (!chart.relationshipId || anchor.object.relationshipId === chart.relationshipId),\n );\n if (anchorIndex < 0) return;\n const drawings = await this.state.workbook.worksheets.getItem(this.state.activeSheetName).drawings.items();\n const coreDrawing = drawings[drawingIndex >= 0 ? drawingIndex : 0];\n const anchor = coreDrawing?.anchors.getItem(anchorIndex);\n if (!anchor) return;\n anchor.from.setRow(position.from.row);\n anchor.from.setColumn(position.from.column);\n anchor.from.setRowOffset(position.from.rowOffset);\n anchor.from.setColumnOffset(position.from.columnOffset);\n if (position.to) {\n anchor.to.setRow(position.to.row);\n anchor.to.setColumn(position.to.column);\n anchor.to.setRowOffset(position.to.rowOffset);\n anchor.to.setColumnOffset(position.to.columnOffset);\n }\n });\n });\n }\n\n async dispose(): Promise<void> {\n await this.state.workbook.dispose();\n }\n\n editableCellAddress(address: string): string {\n const cell = parseCellAddress(address);\n const normalized = formatCellAddress(cell.row, cell.column);\n return this.state.activeSheet.mergeFollowerByAddress.get(normalized) ?? normalized;\n }\n\n private rebuildActiveSheetRenderModel(): void {\n this.state.formulaResults = this.state.formulaEngine.calculate();\n this.state.activeSheet = buildSpreadsheetSheetRenderModel(\n this.state.activeSheet.source,\n this.state.model.styles,\n { formulaResults: this.state.formulaResults },\n );\n }\n\n private async runUserMutation(\n options: SpreadsheetUserTransactionOptions,\n mutate: (transaction: ExcelTransactionBuilder) => Promise<void>,\n ): Promise<void> {\n if (this.activeTransaction) {\n await mutate(this.activeTransaction);\n this.transactionNeedsRefresh = true;\n return;\n }\n await this.runScopedTransaction(\n 'user',\n (apply) => this.state.workbook.history().runGroup({ ...options, source: 'user' }, apply),\n async () => {\n if (!this.activeTransaction) throw new Error('SpreadsheetEditorRuntime: transaction not active');\n await mutate(this.activeTransaction);\n this.transactionNeedsRefresh = true;\n },\n );\n }\n\n private async runWorksheetStructureMutation(\n recordAgentMutation: (transaction: ExcelTransactionBuilder) => Promise<void>,\n mutate: () => Promise<void>,\n ): Promise<void> {\n if (this.activeTransactionSource === 'agent' && this.activeTransaction) {\n await recordAgentMutation(this.activeTransaction);\n this.transactionNeedsRefresh = true;\n // Sheet creation/rename changes the names used by following Agent steps.\n // Refresh now so those steps resolve the current workbook structure.\n await this.refresh();\n return;\n }\n\n // Match desktop spreadsheet behavior: sheet tab operations are not Ctrl/Cmd+Z edits.\n // Agent runs retain the structural patch so their entire action can roll back atomically.\n await mutate();\n await this.refresh();\n }\n\n private async cellStyleId(address: string): Promise<number | undefined> {\n return (await this.state.workbook.worksheets.getItem(this.state.activeSheetName).getRange(address).styleIds())[0]?.[0];\n }\n\n private async runScopedTransaction(\n source: 'user' | 'agent',\n execute: (run: (transaction: ExcelTransactionBuilder) => Promise<void>) => Promise<ExcelHistoryApplyResult | null>,\n run: () => Promise<void>,\n ): Promise<ExcelHistoryApplyResult | null> {\n if (this.activeTransaction) {\n await run();\n this.transactionNeedsRefresh = true;\n return null;\n }\n\n const previousNeedsRefresh = this.transactionNeedsRefresh;\n this.transactionNeedsRefresh = false;\n try {\n const result = await execute(async (transaction) => {\n this.activeTransaction = transaction;\n this.activeTransactionSource = source;\n try {\n await run();\n } finally {\n this.activeTransaction = null;\n this.activeTransactionSource = null;\n }\n });\n const shouldRefresh = this.transactionNeedsRefresh || result !== null;\n if (shouldRefresh) await this.refresh();\n return result;\n } finally {\n this.activeTransaction = null;\n this.activeTransactionSource = null;\n this.transactionNeedsRefresh = previousNeedsRefresh;\n }\n }\n\n private cellEditHistoryGroup(\n label: string,\n address: string,\n options: SpreadsheetCellEditHistoryOptions,\n ): SpreadsheetUserTransactionOptions {\n const base = { label };\n if (!options.mergeUndo) return base;\n return {\n ...base,\n mergeKey: `edit:${this.state.activeSheetName}!${address}`,\n mergeWindowMs: options.mergeWindowMs ?? 1000,\n };\n }\n\n private range(startRow: number, startColumn: number, rowCount: number, columnCount: number) {\n return this.state.workbook\n .worksheets\n .getItem(this.state.activeSheetName)\n .getRange(formatRangeAddress(startRow, startColumn, rowCount, columnCount));\n }\n}\n\nfunction spreadsheetDefaultBorderSide(): NonNullable<ExcelBorderModel['left']> {\n return { style: 'thin', color: { rgb: '#111827' } };\n}\n\nfunction normalizeFrozenPaneCount(value: number): number {\n if (!Number.isFinite(value)) return 0;\n return Math.max(0, Math.floor(value));\n}\n\nfunction spreadsheetSheetViewsWithFrozenPane(\n sheetViews: ExcelSheetViewModel[],\n frozenRows: number,\n frozenColumns: number,\n): ExcelSheetViewModel[] {\n if (!frozenRows && !frozenColumns) {\n return sheetViews.map((view, index) => ({\n ...view,\n pane: index === 0 ? undefined : view.pane ? { ...view.pane } : undefined,\n selections: view.selections.map((selection) => ({ ...selection })),\n }));\n }\n const currentView = sheetViews[0] ?? { workbookViewId: 0, selections: [] };\n const pane = {\n xSplit: frozenColumns || undefined,\n ySplit: frozenRows || undefined,\n topLeftCell: formatCellAddress(frozenRows + 1, frozenColumns + 1),\n activePane: frozenRows && frozenColumns ? 'bottomRight' : frozenRows ? 'bottomLeft' : 'topRight',\n state: 'frozen',\n };\n return [\n {\n ...currentView,\n pane,\n selections: currentView.selections.map((selection) => ({ ...selection })),\n },\n ...sheetViews.slice(1).map((view) => ({\n ...view,\n pane: view.pane ? { ...view.pane } : undefined,\n selections: view.selections.map((selection) => ({ ...selection })),\n })),\n ];\n}\n\nasync function applySpreadsheetPasteStyles(\n tx: ExcelTransactionBuilder,\n sheetName: string,\n startRow: number,\n startColumn: number,\n columnCount: number,\n styleIds: (number | undefined)[][],\n): Promise<void> {\n for (let rowOffset = 0; rowOffset < styleIds.length; rowOffset++) {\n const styleRow = styleIds[rowOffset];\n if (!styleRow) continue;\n for (let columnOffset = 0; columnOffset < columnCount; columnOffset++) {\n await tx.setRangeStyleId(\n sheetName,\n formatCellAddress(startRow + rowOffset, startColumn + columnOffset),\n styleRow[columnOffset],\n );\n }\n }\n}\n\nasync function applySpreadsheetPasteMerges(\n tx: ExcelTransactionBuilder,\n sheetName: string,\n startRow: number,\n startColumn: number,\n merges: SpreadsheetClipboardMerge[],\n): Promise<void> {\n for (const merge of merges) {\n await tx.mergeRange(\n sheetName,\n formatRangeAddress(\n startRow + merge.startRowOffset,\n startColumn + merge.startColumnOffset,\n merge.rowCount,\n merge.columnCount,\n ),\n );\n }\n}\n\nfunction pasteHistoryLabel(mode: SpreadsheetPasteMode): string {\n switch (mode) {\n case 'values':\n return 'Paste values';\n case 'formats':\n return 'Paste formats';\n default:\n return 'Paste range';\n }\n}\n\nfunction cloneWorkbookModel(model: ExcelWorkbookModel): ExcelWorkbookModel {\n return JSON.parse(JSON.stringify(model)) as ExcelWorkbookModel;\n}\n\nfunction summarizeSpreadsheetPreviewDiff(diff: ExcelWorkbookDiff): SpreadsheetPreviewDiffSummary {\n const cellChanges = {\n total: 0,\n added: 0,\n modified: 0,\n deleted: 0,\n };\n const sampleCells: SpreadsheetPreviewCellChangeSummary[] = [];\n for (const sheet of diff.sheets) {\n for (const cell of sheet.cells) {\n cellChanges.total += 1;\n cellChanges[cell.kind] += 1;\n if (sampleCells.length >= 20) continue;\n sampleCells.push({\n sheetName: sheet.afterName ?? sheet.beforeName ?? sheet.sheetId,\n address: cell.address,\n kind: cell.kind,\n before: cell.before?.value ?? null,\n after: cell.after?.value ?? null,\n });\n }\n }\n return {\n changed: diff.changed,\n changedSheets: diff.sheets.length,\n sheetNames: diff.sheets.map((sheet) => sheet.afterName ?? sheet.beforeName ?? sheet.sheetId),\n cellChanges,\n structuralChanged: diff.sheets.some((sheet) => sheet.structuralChanged),\n objectChanged: diff.sheets.some((sheet) => sheet.objectChanged),\n sampleCells,\n };\n}\n\nfunction rangesIntersect(a: SpreadsheetRange, b: SpreadsheetRange): boolean {\n return !(\n a.endRow < b.startRow ||\n a.startRow > b.endRow ||\n a.endColumn < b.startColumn ||\n a.startColumn > b.endColumn\n );\n}\n\nfunction masterAddressForRange(address: string): string {\n const range = parseRangeAddress(address);\n return formatCellAddress(range.startRow, range.startColumn);\n}\n","import type {\n ExcelAgentTransactionGroupOptions,\n ExcelHistoryApplyResult,\n} from '@coco-vexel/coco-office/excel';\nimport type { SpreadsheetRange } from './types.js';\nimport type {\n SpreadsheetAgentTransactionPreview,\n SpreadsheetEditorRuntime,\n} from './runtime.js';\n\nexport interface SpreadsheetAgentActionContext {\n /** Current selection at the time the action is created. Hosts may pass richer app state later. */\n selection?: SpreadsheetRange;\n /** Optional opaque host payload, for example an agent plan id or UI prompt metadata. */\n metadata?: Record<string, unknown>;\n}\n\nexport interface SpreadsheetAgentAction {\n id: string;\n label: string;\n description?: string;\n actor?: string;\n agentRunId?: string;\n agentStepId?: string;\n agentActionId?: string;\n metadata?: Record<string, unknown>;\n run(runtime: SpreadsheetEditorRuntime, context: SpreadsheetAgentActionContext): Promise<void>;\n}\n\nexport interface SpreadsheetAgentActionPreview {\n action: SpreadsheetAgentAction;\n context: SpreadsheetAgentActionContext;\n transaction: SpreadsheetAgentTransactionPreview;\n}\n\nexport interface SpreadsheetAgentActionApplyResult {\n action: SpreadsheetAgentAction;\n context: SpreadsheetAgentActionContext;\n transaction: ExcelHistoryApplyResult | null;\n}\n\nexport async function previewSpreadsheetAgentAction(\n runtime: SpreadsheetEditorRuntime,\n action: SpreadsheetAgentAction,\n context: SpreadsheetAgentActionContext = {},\n): Promise<SpreadsheetAgentActionPreview> {\n return {\n action,\n context,\n transaction: await runtime.previewAgentTransaction(agentActionTransactionOptions(action), (targetRuntime) =>\n action.run(targetRuntime, context),\n ),\n };\n}\n\nexport async function applySpreadsheetAgentAction(\n runtime: SpreadsheetEditorRuntime,\n action: SpreadsheetAgentAction,\n context: SpreadsheetAgentActionContext = {},\n): Promise<SpreadsheetAgentActionApplyResult> {\n return {\n action,\n context,\n transaction: await runtime.runAgentTransaction(agentActionTransactionOptions(action), (targetRuntime) =>\n action.run(targetRuntime, context),\n ),\n };\n}\n\nfunction agentActionTransactionOptions(action: SpreadsheetAgentAction): ExcelAgentTransactionGroupOptions {\n return {\n label: action.label,\n actor: action.actor,\n description: action.description,\n agentRunId: action.agentRunId,\n agentStepId: action.agentStepId,\n agentActionId: action.agentActionId ?? action.id,\n metadata: action.metadata,\n };\n}\n","import type { SpreadsheetRect } from './types.js';\n\nexport interface SpreadsheetCellEditorOptions {\n textarea: HTMLTextAreaElement;\n onCommit: (value: string) => void | Promise<void>;\n onCancel?: () => void;\n}\n\nexport class SpreadsheetCellEditor {\n constructor(private readonly options: SpreadsheetCellEditorOptions) {\n this.options.textarea.addEventListener('keydown', (event) => {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancel();\n } else if (event.key === 'Enter' && !event.shiftKey) {\n event.preventDefault();\n void this.commit();\n }\n });\n }\n\n open(rect: SpreadsheetRect, value: string): void {\n const textarea = this.options.textarea;\n textarea.value = value;\n textarea.style.display = 'block';\n textarea.style.position = 'absolute';\n textarea.style.left = `${rect.x}px`;\n textarea.style.top = `${rect.y}px`;\n textarea.style.width = `${Math.max(1, rect.width)}px`;\n textarea.style.height = `${Math.max(1, rect.height)}px`;\n textarea.focus();\n textarea.select();\n }\n\n async commit(): Promise<void> {\n const value = this.options.textarea.value;\n this.close();\n await this.options.onCommit(value);\n }\n\n cancel(): void {\n this.close();\n this.options.onCancel?.();\n }\n\n close(): void {\n this.options.textarea.style.display = 'none';\n }\n}\n\n","import type { SpreadsheetScrollState } from './types.js';\nimport type { SpreadsheetLayout } from './layout.js';\nimport type { SpreadsheetFreezeState, SpreadsheetSize } from './types.js';\n\nexport function applyWheelDelta(\n scroll: SpreadsheetScrollState,\n deltaX: number,\n deltaY: number,\n): SpreadsheetScrollState {\n return {\n x: Math.max(0, scroll.x + deltaX),\n y: Math.max(0, scroll.y + deltaY),\n };\n}\n\nexport interface SpreadsheetScrollbarGeometry {\n trackLength: number;\n thumbStart: number;\n thumbLength: number;\n maxScroll: number;\n}\n\nexport interface SpreadsheetScrollbarState {\n horizontal: SpreadsheetScrollbarGeometry;\n vertical: SpreadsheetScrollbarGeometry;\n}\n\nexport function computeScrollbarState(\n layout: SpreadsheetLayout,\n viewportSize: SpreadsheetSize,\n freeze: SpreadsheetFreezeState,\n scroll: SpreadsheetScrollState,\n scrollbarThickness = 12,\n): SpreadsheetScrollbarState {\n const frozenWidth = layout.getColumnX(freeze.frozenColumns + 1);\n const frozenHeight = layout.getRowY(freeze.frozenRows + 1);\n const horizontalTrackLength = Math.max(\n 0,\n viewportSize.width - layout.rowHeaderWidth - frozenWidth - scrollbarThickness,\n );\n const verticalTrackLength = Math.max(\n 0,\n viewportSize.height - layout.columnHeaderHeight - frozenHeight - scrollbarThickness,\n );\n const horizontalViewport = horizontalTrackLength;\n const verticalViewport = verticalTrackLength;\n const horizontalContent = Math.max(0, layout.totalWidth() - frozenWidth);\n const verticalContent = Math.max(0, layout.totalHeight() - frozenHeight);\n\n return {\n horizontal: computeAxisScrollbar(horizontalContent, horizontalViewport, horizontalTrackLength, scroll.x),\n vertical: computeAxisScrollbar(verticalContent, verticalViewport, verticalTrackLength, scroll.y),\n };\n}\n\nexport function scrollFromThumbPosition(\n geometry: SpreadsheetScrollbarGeometry,\n thumbStart: number,\n): number {\n if (geometry.maxScroll <= 0) return 0;\n const maxThumbStart = Math.max(0, geometry.trackLength - geometry.thumbLength);\n if (maxThumbStart <= 0) return 0;\n const clamped = Math.max(0, Math.min(maxThumbStart, thumbStart));\n return (clamped / maxThumbStart) * geometry.maxScroll;\n}\n\nfunction computeAxisScrollbar(\n contentLength: number,\n viewportLength: number,\n trackLength: number,\n scrollOffset: number,\n): SpreadsheetScrollbarGeometry {\n const maxScroll = Math.max(0, contentLength - viewportLength);\n if (trackLength <= 0 || contentLength <= 0 || maxScroll <= 0) {\n return { trackLength, thumbStart: 0, thumbLength: trackLength, maxScroll: 0 };\n }\n const thumbLength = Math.max(24, Math.min(trackLength, (viewportLength / contentLength) * trackLength));\n const maxThumbStart = Math.max(0, trackLength - thumbLength);\n const thumbStart = maxScroll <= 0 ? 0 : (Math.max(0, Math.min(maxScroll, scrollOffset)) / maxScroll) * maxThumbStart;\n return { trackLength, thumbStart, thumbLength, maxScroll };\n}\n","import type { SpreadsheetLayout } from './layout.js';\nimport type { SpreadsheetViewport } from './types.js';\n\nexport const SPREADSHEET_COLUMN_RESIZE_MIN = 24;\nexport const SPREADSHEET_ROW_RESIZE_MIN = 12;\nexport const SPREADSHEET_RESIZE_HIT_TOLERANCE = 4;\n\nexport interface SpreadsheetResizeHandle {\n kind: 'column' | 'row';\n index: number;\n startSize: number;\n guidePosition: number;\n minSize: number;\n}\n\nexport interface SpreadsheetResizeDragState extends SpreadsheetResizeHandle {\n startClientX: number;\n startClientY: number;\n currentSize: number;\n currentGuidePosition: number;\n}\n\nexport function hitSpreadsheetResizeHandle(\n layout: SpreadsheetLayout,\n viewports: readonly SpreadsheetViewport[],\n point: { x: number; y: number },\n): SpreadsheetResizeHandle | null {\n for (const viewport of viewports) {\n if (viewport.kind === 'columnHeaderFrozen' || viewport.kind === 'columnHeaderScrollable') {\n const handle = hitSpreadsheetColumnResizeHandle(layout, viewport, point);\n if (handle) return handle;\n }\n if (viewport.kind === 'rowHeaderFrozen' || viewport.kind === 'rowHeaderScrollable') {\n const handle = hitSpreadsheetRowResizeHandle(layout, viewport, point);\n if (handle) return handle;\n }\n }\n return null;\n}\n\nexport function startSpreadsheetResizeDrag(\n handle: SpreadsheetResizeHandle,\n event: { clientX: number; clientY: number },\n): SpreadsheetResizeDragState {\n return {\n ...handle,\n startClientX: event.clientX,\n startClientY: event.clientY,\n currentSize: handle.startSize,\n currentGuidePosition: handle.guidePosition,\n };\n}\n\nexport function updateSpreadsheetResizeDrag(\n drag: SpreadsheetResizeDragState,\n event: { clientX: number; clientY: number },\n): SpreadsheetResizeDragState {\n const delta = drag.kind === 'column' ? event.clientX - drag.startClientX : event.clientY - drag.startClientY;\n const currentSize = Math.max(drag.minSize, Math.round(drag.startSize + delta));\n return {\n ...drag,\n currentSize,\n currentGuidePosition: drag.guidePosition + currentSize - drag.startSize,\n };\n}\n\nfunction hitSpreadsheetColumnResizeHandle(\n layout: SpreadsheetLayout,\n viewport: SpreadsheetViewport,\n point: { x: number; y: number },\n): SpreadsheetResizeHandle | null {\n if (!containsSpreadsheetPoint(viewport.screenRect, point, SPREADSHEET_RESIZE_HIT_TOLERANCE)) return null;\n for (let column = viewport.columns.start; column <= viewport.columns.end; column++) {\n const logical = layout.getCellLogicalRect(1, column);\n const left = viewport.screenRect.x + logical.x - viewport.originX;\n const right = left + logical.width;\n if (Math.abs(point.x - right) <= SPREADSHEET_RESIZE_HIT_TOLERANCE) {\n return {\n kind: 'column',\n index: column,\n startSize: layout.getColumnWidth(column),\n guidePosition: right,\n minSize: SPREADSHEET_COLUMN_RESIZE_MIN,\n };\n }\n }\n return null;\n}\n\nfunction hitSpreadsheetRowResizeHandle(\n layout: SpreadsheetLayout,\n viewport: SpreadsheetViewport,\n point: { x: number; y: number },\n): SpreadsheetResizeHandle | null {\n if (!containsSpreadsheetPoint(viewport.screenRect, point, SPREADSHEET_RESIZE_HIT_TOLERANCE)) return null;\n for (let row = viewport.rows.start; row <= viewport.rows.end; row++) {\n const logical = layout.getCellLogicalRect(row, 1);\n const top = viewport.screenRect.y + logical.y - viewport.originY;\n const bottom = top + logical.height;\n if (Math.abs(point.y - bottom) <= SPREADSHEET_RESIZE_HIT_TOLERANCE) {\n return {\n kind: 'row',\n index: row,\n startSize: layout.getRowHeight(row),\n guidePosition: bottom,\n minSize: SPREADSHEET_ROW_RESIZE_MIN,\n };\n }\n }\n return null;\n}\n\nfunction containsSpreadsheetPoint(\n rect: { x: number; y: number; width: number; height: number },\n point: { x: number; y: number },\n tolerance = 0,\n): boolean {\n return (\n point.x >= rect.x - tolerance &&\n point.y >= rect.y - tolerance &&\n point.x <= rect.x + rect.width + tolerance &&\n point.y <= rect.y + rect.height + tolerance\n );\n}\n","import type { ExcelBorderModel, ExcelCellFormatModel, ExcelColorModel } from '@coco-vexel/coco-office/excel';\nimport { getRenderCell } from './render-model.js';\nimport { normalizeSelectionRange, type SpreadsheetSelectionState } from './selection.js';\nimport type { SpreadsheetSheetRenderModel } from './types.js';\n\nexport type SpreadsheetMixedValue<T> = T | 'mixed';\n\nexport interface SpreadsheetSelectionFormatState {\n font: {\n bold: SpreadsheetMixedValue<boolean>;\n italic: SpreadsheetMixedValue<boolean>;\n underline: SpreadsheetMixedValue<boolean>;\n color: SpreadsheetMixedValue<ExcelColorModel | undefined>;\n };\n fill: {\n foregroundColor: SpreadsheetMixedValue<ExcelColorModel | undefined>;\n };\n numberFormatCode: SpreadsheetMixedValue<string | undefined>;\n alignment: {\n horizontal: SpreadsheetMixedValue<'left' | 'center' | 'right'>;\n vertical: SpreadsheetMixedValue<'top' | 'center' | 'bottom'>;\n };\n border: SpreadsheetMixedValue<ExcelBorderModel>;\n}\n\nexport function summarizeSpreadsheetSelectionFormat(\n model: SpreadsheetSheetRenderModel,\n selection: SpreadsheetSelectionState,\n): SpreadsheetSelectionFormatState {\n const summary = createEmptyFormatSummary();\n const range = normalizeSelectionRange(selection.range);\n for (let row = range.startRow; row <= range.endRow; row++) {\n for (let column = range.startColumn; column <= range.endColumn; column++) {\n const format = cellFormatAt(model, row, column);\n const font = model.styles.fonts[format.fontId ?? 0] ?? {};\n const fill = model.styles.fills[format.fillId ?? 0] ?? {};\n const border = model.styles.borders[format.borderId ?? 0] ?? {};\n collectSummaryValue(summary.bold, font.bold === true);\n collectSummaryValue(summary.italic, font.italic === true);\n collectSummaryValue(summary.underline, font.underline === true);\n collectSummaryValue(summary.fontColor, font.color);\n collectSummaryValue(summary.fillColor, fill.foregroundColor);\n collectSummaryValue(summary.numberFormatCode, format.numberFormatCode);\n collectSummaryValue(summary.horizontal, normalizeHorizontalAlign(format));\n collectSummaryValue(summary.vertical, normalizeVerticalAlign(format));\n collectSummaryValue(summary.border, border);\n }\n }\n return {\n font: {\n bold: summaryValue(summary.bold),\n italic: summaryValue(summary.italic),\n underline: summaryValue(summary.underline),\n color: summaryValue(summary.fontColor),\n },\n fill: {\n foregroundColor: summaryValue(summary.fillColor),\n },\n numberFormatCode: summaryValue(summary.numberFormatCode),\n alignment: {\n horizontal: summaryValue(summary.horizontal),\n vertical: summaryValue(summary.vertical),\n },\n border: summaryValue(summary.border),\n };\n}\n\ninterface FormatSummary<T> {\n hasValue: boolean;\n value: T | undefined;\n mixed: boolean;\n}\n\nfunction createEmptyFormatSummary() {\n return {\n bold: emptySummary<boolean>(),\n italic: emptySummary<boolean>(),\n underline: emptySummary<boolean>(),\n fontColor: emptySummary<ExcelColorModel | undefined>(),\n fillColor: emptySummary<ExcelColorModel | undefined>(),\n numberFormatCode: emptySummary<string | undefined>(),\n horizontal: emptySummary<'left' | 'center' | 'right'>(),\n vertical: emptySummary<'top' | 'center' | 'bottom'>(),\n border: emptySummary<ExcelBorderModel>(),\n };\n}\n\nfunction emptySummary<T>(): FormatSummary<T> {\n return { hasValue: false, value: undefined, mixed: false };\n}\n\nfunction collectSummaryValue<T>(summary: FormatSummary<T>, value: T): void {\n if (!summary.hasValue) {\n summary.hasValue = true;\n summary.value = value;\n return;\n }\n if (!formatValuesEqual(summary.value, value)) summary.mixed = true;\n}\n\nfunction summaryValue<T>(summary: FormatSummary<T>): SpreadsheetMixedValue<T> {\n return summary.mixed ? 'mixed' : (summary.value as T);\n}\n\nfunction cellFormatAt(\n model: SpreadsheetSheetRenderModel,\n row: number,\n column: number,\n): ExcelCellFormatModel {\n const cell = getRenderCell(model, row, column);\n return model.styles.cellFormats[cell?.styleId ?? 0] ?? {};\n}\n\nfunction normalizeHorizontalAlign(format: ExcelCellFormatModel): 'left' | 'center' | 'right' {\n return format.alignment?.horizontal === 'center' || format.alignment?.horizontal === 'right'\n ? format.alignment.horizontal\n : 'left';\n}\n\nfunction normalizeVerticalAlign(format: ExcelCellFormatModel): 'top' | 'center' | 'bottom' {\n if (format.alignment?.vertical === 'top' || format.alignment?.vertical === 'center') {\n return format.alignment.vertical;\n }\n return 'bottom';\n}\n\nfunction formatValuesEqual(a: unknown, b: unknown): boolean {\n return JSON.stringify(a ?? null) === JSON.stringify(b ?? null);\n}\n","import {\n formatCellAddress,\n formatRangeAddress,\n type ExcelCellValue,\n type ExcelColorModel,\n type ExcelChartModel,\n type ExcelDrawingAnchorModel,\n type ExcelDrawingModel,\n} from '@coco-vexel/coco-office/excel';\nimport { freezeStateFromSheet, SpreadsheetViewportManager } from './viewport.js';\nimport { SpreadsheetCanvasRenderer } from './canvas-renderer.js';\nimport { SpreadsheetEditorRuntime, type SpreadsheetUserTransactionOptions } from './runtime.js';\nimport { SpreadsheetLayout } from './layout.js';\nimport { SpreadsheetCellEditor } from './editing.js';\nimport {\n createColumnSelection,\n createRowSelection,\n createSelection,\n expandSelectionForMergedRanges,\n extendSelection,\n normalizeSelectionRange,\n type SpreadsheetSelectionState,\n} from './selection.js';\nimport { buildSpreadsheetClipboardPayload, parseTsv, type SpreadsheetClipboardPayload } from './clipboard.js';\nimport { getRenderCell } from './render-model.js';\nimport { resolveSpreadsheetCellStyle, type SpreadsheetResolvedCellStyle } from './style-resolver.js';\nimport { spreadsheetFilterValues, type SpreadsheetColumnFilter } from './filter.js';\nimport { supportsSpreadsheetAutoFill } from './auto-fill.js';\nimport {\n hitSpreadsheetResizeHandle,\n startSpreadsheetResizeDrag,\n updateSpreadsheetResizeDrag,\n type SpreadsheetResizeDragState,\n} from './resize.js';\nimport {\n applyWheelDelta,\n computeScrollbarState,\n scrollFromThumbPosition,\n type SpreadsheetScrollbarState,\n} from './scrollbar.js';\nimport type {\n SpreadsheetFreezeState,\n SpreadsheetRange,\n SpreadsheetRect,\n SpreadsheetScrollState,\n SpreadsheetViewport,\n} from './types.js';\n\nexport interface SpreadsheetEditorChangeEvent {\n kind: 'workbookChange';\n bytes: Uint8Array;\n}\n\nexport interface SpreadsheetEditorStateEvent {\n kind: 'stateChange';\n activeSheetName: string;\n selection: SpreadsheetSelectionState;\n editingCell: { row: number; column: number } | null;\n}\n\nexport interface SpreadsheetEditorCellState {\n address: string;\n row: number;\n column: number;\n value: ExcelCellValue;\n displayText: string;\n formula?: string;\n styleId?: number;\n format?: {\n font: unknown;\n fill: unknown;\n border: unknown;\n alignment: unknown;\n numberFormatCode?: string;\n };\n}\n\nexport interface SpreadsheetEditorOptions {\n workbookId?: string;\n onChange?: (event: SpreadsheetEditorChangeEvent) => void | Promise<void>;\n showSheetTabs?: boolean;\n /** Isolates editor internals from host-page CSS. Shadow DOM is enabled by default. */\n styleIsolation?: 'shadow' | 'none';\n /** Header filter icons are opt-in; hosts can expose filtering from a column menu instead. */\n enableHeaderFilters?: boolean;\n}\n\nexport interface SpreadsheetEditor {\n runtime(): SpreadsheetEditorRuntime;\n selection(): SpreadsheetSelectionState;\n cellState(address: string): SpreadsheetEditorCellState;\n freezeState(): SpreadsheetFreezeState;\n filterState(): ReadonlyMap<number, readonly string[]>;\n activeSheetName(): string;\n setActiveSheet(name: string): Promise<void>;\n addSheet(name: string): Promise<void>;\n renameSheet(sheetName: string, name: string): Promise<void>;\n copySheet(sheetName: string, newName: string): Promise<void>;\n deleteSheet(sheetName: string): Promise<void>;\n moveSheet(sheetName: string, toIndex: number): Promise<void>;\n setCellValue(address: string, value: ExcelCellValue): Promise<void>;\n setCellFormula(address: string, formula: string): Promise<void>;\n formatSelection(kind: 'bold' | 'italic' | 'underline'): Promise<void>;\n setSelectionFontColor(color: ExcelColorModel | undefined): Promise<void>;\n setSelectionFillColor(color: ExcelColorModel | undefined): Promise<void>;\n setSelectionHorizontalAlign(alignment: 'left' | 'center' | 'right'): Promise<void>;\n setSelectionVerticalAlign(alignment: 'top' | 'center' | 'bottom'): Promise<void>;\n setSelectionNumberFormat(code: string | undefined): Promise<void>;\n setSelectionBorder(mode: 'all' | 'outer' | 'inner' | 'clear'): Promise<void>;\n clearSelection(): Promise<void>;\n clearSelectionFormat(): Promise<void>;\n mergeSelection(): Promise<void>;\n unmergeSelection(): Promise<void>;\n freezeSelection(): Promise<void>;\n sortActiveColumn(direction: 'asc' | 'desc'): Promise<void>;\n filterColumn(column: number, values: readonly string[] | null): Promise<void>;\n runTransaction(\n options: SpreadsheetUserTransactionOptions,\n run: (editor: SpreadsheetEditor) => Promise<void>,\n ): Promise<void>;\n loadWorkbook(bytes: Uint8Array | ArrayBuffer): Promise<void>;\n toZip(): Promise<Uint8Array>;\n canUndo(): boolean;\n canRedo(): boolean;\n undo(): Promise<void>;\n redo(): Promise<void>;\n subscribe(listener: (event: SpreadsheetEditorChangeEvent) => void): () => void;\n subscribeState(listener: (event: SpreadsheetEditorStateEvent) => void): () => void;\n destroy(): void;\n}\n\n/**\n * Public browser/Electron surface for the spreadsheet editor.\n *\n * The host owns its toolbar and persistence policy. This surface owns the\n * canvas stack, viewport lifecycle, scrolling, and worksheet switching so web\n * and desktop hosts do not rebuild those pieces independently.\n */\nexport async function renderSpreadsheetEditor(\n host: HTMLElement,\n bytes: Uint8Array | ArrayBuffer,\n options: SpreadsheetEditorOptions = {},\n): Promise<SpreadsheetEditor> {\n const controller = new NativeSpreadsheetEditor(host, options);\n await controller.loadWorkbook(bytes);\n return controller;\n}\n\nclass NativeSpreadsheetEditor implements SpreadsheetEditor {\n private readonly renderRoot: HTMLElement | ShadowRoot;\n private runtimeValue: SpreadsheetEditorRuntime | null = null;\n private renderer: SpreadsheetCanvasRenderer | null = null;\n private layout: SpreadsheetLayout | null = null;\n private viewport: SpreadsheetViewportManager | null = null;\n private scroll: SpreadsheetScrollState = { x: 0, y: 0 };\n private scrollbarState: SpreadsheetScrollbarState | null = null;\n private readonly listeners = new Set<(event: SpreadsheetEditorChangeEvent) => void>();\n private readonly stateListeners = new Set<(event: SpreadsheetEditorStateEvent) => void>();\n private readonly baseCanvas = document.createElement('canvas');\n private readonly headerCanvas = document.createElement('canvas');\n private readonly overlayCanvas = document.createElement('canvas');\n private readonly unsupportedObjectLayer = document.createElement('div');\n private readonly sheetTabs = document.createElement('div');\n private readonly horizontalScrollbar = document.createElement('div');\n private readonly verticalScrollbar = document.createElement('div');\n private readonly horizontalThumb = document.createElement('div');\n private readonly verticalThumb = document.createElement('div');\n private readonly cellEditorElement = document.createElement('textarea');\n private readonly resizeGuide = document.createElement('div');\n private readonly contextMenu = document.createElement('div');\n private readonly filterMenu = document.createElement('div');\n private readonly cellEditor: SpreadsheetCellEditor;\n private readonly resizeObserver: ResizeObserver;\n private disposed = false;\n private drag: { axis: 'horizontal' | 'vertical'; pointer: number; thumb: number } | null = null;\n private selectionState: SpreadsheetSelectionState = createSelection(1, 1);\n private editingCell: { row: number; column: number } | null = null;\n private editingCellStyle: SpreadsheetResolvedCellStyle | null = null;\n private clipboardPayload: SpreadsheetClipboardPayload | null = null;\n private selecting = false;\n private resizeDrag: SpreadsheetResizeDragState | null = null;\n private autoFillDrag: { source: SpreadsheetRange; preview: SpreadsheetRange | null } | null = null;\n private selectedChartIndex: number | null = null;\n private chartDrag: {\n chartIndex: number;\n pointer: { x: number; y: number };\n startRect: SpreadsheetRect;\n previewRect: SpreadsheetRect;\n } | null = null;\n private readonly columnFilters = new Map<number, string[]>();\n private filterMenuColumn: number | null = null;\n private copiedRange: ReturnType<typeof normalizeSelectionRange> | null = null;\n private formulaReferenceRanges: Array<{ range: ReturnType<typeof normalizeSelectionRange>; stroke: string }> = [];\n private lastStateKey = '';\n private transactionDepth = 0;\n private transactionChanged = false;\n\n constructor(private readonly host: HTMLElement, private readonly options: SpreadsheetEditorOptions) {\n host.replaceChildren();\n this.renderRoot = options.styleIsolation === 'none'\n ? host\n : (host.shadowRoot ?? host.attachShadow({ mode: 'open' }));\n this.renderRoot.replaceChildren();\n if (this.renderRoot instanceof ShadowRoot) {\n const style = document.createElement('style');\n style.textContent = `\n :host { display: block; position: relative; min-width: 0; min-height: 0; }\n *, *::before, *::after { box-sizing: border-box; }\n button, input, textarea, select { font: 13px Arial, sans-serif; line-height: normal; }\n button { margin: 0; }\n `;\n this.renderRoot.appendChild(style);\n }\n host.classList.add('coco-spreadsheet-editor-host');\n Object.assign(host.style, { position: 'relative', overflow: 'hidden' });\n for (const canvas of [this.baseCanvas, this.headerCanvas, this.overlayCanvas]) {\n Object.assign(canvas.style, { position: 'absolute', inset: '0', display: 'block' });\n this.renderRoot.appendChild(canvas);\n }\n this.unsupportedObjectLayer.className = 'coco-spreadsheet-unsupported-object-layer';\n Object.assign(this.unsupportedObjectLayer.style, {\n position: 'absolute',\n inset: '0',\n zIndex: '4',\n overflow: 'hidden',\n pointerEvents: 'none',\n });\n this.renderRoot.appendChild(this.unsupportedObjectLayer);\n this.cellEditorElement.className = 'coco-spreadsheet-cell-editor';\n Object.assign(this.cellEditorElement.style, {\n position: 'absolute',\n zIndex: '20',\n display: 'none',\n resize: 'none',\n overflow: 'hidden',\n padding: '2px 4px',\n border: '2px solid #2563eb',\n outline: 'none',\n font: '13px Arial, sans-serif',\n lineHeight: 'normal',\n whiteSpace: 'pre-wrap',\n overflowWrap: 'break-word',\n });\n this.renderRoot.appendChild(this.cellEditorElement);\n this.resizeGuide.className = 'coco-spreadsheet-resize-guide';\n Object.assign(this.resizeGuide.style, {\n position: 'absolute',\n zIndex: '25',\n display: 'none',\n pointerEvents: 'none',\n background: '#2563eb',\n });\n this.renderRoot.appendChild(this.resizeGuide);\n this.contextMenu.className = 'coco-spreadsheet-context-menu';\n Object.assign(this.contextMenu.style, {\n position: 'fixed',\n zIndex: '50',\n display: 'none',\n minWidth: '160px',\n padding: '4px',\n background: '#ffffff',\n border: '1px solid #cbd5e1',\n borderRadius: '6px',\n boxShadow: '0 8px 24px rgba(15, 23, 42, 0.16)',\n });\n this.renderRoot.appendChild(this.contextMenu);\n this.filterMenu.className = 'coco-spreadsheet-filter-menu';\n Object.assign(this.filterMenu.style, {\n position: 'fixed', zIndex: '60', display: 'none', width: '240px', maxHeight: '360px',\n overflow: 'auto', padding: '8px', background: '#ffffff', border: '1px solid #cbd5e1',\n borderRadius: '6px', boxShadow: '0 8px 24px rgba(15, 23, 42, 0.16)',\n });\n this.renderRoot.appendChild(this.filterMenu);\n this.cellEditor = new SpreadsheetCellEditor({\n textarea: this.cellEditorElement,\n onCommit: async (value) => this.commitCellEdit(value),\n onCancel: () => {\n this.editingCell = null;\n this.editingCellStyle = null;\n this.formulaReferenceRanges = [];\n this.render();\n },\n });\n this.cellEditorElement.addEventListener('input', () => {\n if (!this.editingCell) return;\n this.formulaReferenceRanges = formulaReferenceRangesFromText(this.cellEditorElement.value);\n this.render();\n });\n this.configureScrollbar(this.horizontalScrollbar, this.horizontalThumb, true);\n this.configureScrollbar(this.verticalScrollbar, this.verticalThumb, false);\n this.renderRoot.append(this.horizontalScrollbar, this.verticalScrollbar);\n this.sheetTabs.className = 'coco-spreadsheet-editor-tabs';\n if (options.showSheetTabs !== false) this.renderRoot.appendChild(this.sheetTabs);\n this.renderer = new SpreadsheetCanvasRenderer({\n baseCanvas: this.baseCanvas,\n headerCanvas: this.headerCanvas,\n overlayCanvas: this.overlayCanvas,\n });\n host.addEventListener('wheel', this.handleWheel, { passive: false });\n host.addEventListener('click', this.handleClick);\n host.addEventListener('dblclick', this.handleDoubleClick);\n host.addEventListener('pointerdown', this.handlePointerDown);\n host.addEventListener('pointermove', this.handlePointerMove);\n host.addEventListener('pointerup', this.handlePointerUp);\n host.addEventListener('pointerleave', this.handlePointerLeave);\n host.addEventListener('keydown', this.handleKeyDown);\n host.addEventListener('copy', this.handleCopy);\n host.addEventListener('paste', this.handlePaste);\n host.addEventListener('contextmenu', this.handleContextMenu);\n document.addEventListener('pointerdown', this.handleDocumentPointerDown);\n this.filterMenu.addEventListener('click', this.handleFilterMenuClick);\n host.tabIndex = 0;\n this.resizeObserver = new ResizeObserver(() => this.render());\n this.resizeObserver.observe(host);\n }\n\n runtime(): SpreadsheetEditorRuntime {\n if (!this.runtimeValue) throw new Error('SpreadsheetEditor: workbook is not loaded');\n return this.runtimeValue;\n }\n\n selection(): SpreadsheetSelectionState {\n return this.selectionState;\n }\n\n cellState(address: string): SpreadsheetEditorCellState {\n const model = this.runtime().activeSheet();\n const cell = model.cellsByAddress.get(address);\n if (!cell) {\n const match = address.match(/^([A-Z]+)(\\d+)$/i);\n if (!match) throw new Error(`SpreadsheetEditor: invalid cell address ${address}`);\n const column = columnNumberFromLetters(match[1]!);\n const row = Number(match[2]);\n return { address: address.toUpperCase(), row, column, value: null, displayText: '' };\n }\n const format = model.styles.cellFormats[cell.styleId ?? 0];\n return {\n address: cell.address,\n row: cell.row,\n column: cell.column,\n value: cell.value,\n displayText: cell.displayText,\n formula: cell.formula,\n styleId: cell.styleId,\n format: format ? {\n font: model.styles.fonts[format.fontId ?? 0],\n fill: model.styles.fills[format.fillId ?? 0],\n border: model.styles.borders[format.borderId ?? 0],\n alignment: format.alignment,\n numberFormatCode: format.numberFormatCode,\n } : undefined,\n };\n }\n\n freezeState(): SpreadsheetFreezeState {\n return freezeStateFromSheet(this.runtime().activeSheet().source);\n }\n\n filterState(): ReadonlyMap<number, readonly string[]> {\n return new Map([...this.columnFilters.entries()].map(([column, values]) => [column, [...values] as readonly string[]]));\n }\n\n activeSheetName(): string {\n return this.runtime().activeSheetName();\n }\n\n async setActiveSheet(name: string): Promise<void> {\n await this.runtime().setActiveSheet(name);\n this.scroll = { x: 0, y: 0 };\n this.selectionState = createSelection(1, 1);\n this.render();\n this.renderTabs();\n }\n\n async addSheet(name: string): Promise<void> {\n await this.runtime().addSheet(name);\n this.scroll = { x: 0, y: 0 };\n this.selectionState = createSelection(1, 1);\n this.renderTabs();\n this.render();\n await this.emitChange();\n }\n\n async renameSheet(sheetName: string, name: string): Promise<void> {\n await this.runtime().renameSheet(sheetName, name);\n this.renderTabs();\n this.render();\n await this.emitChange();\n }\n\n async copySheet(sheetName: string, newName: string): Promise<void> {\n await this.runtime().copySheet(sheetName, newName);\n this.scroll = { x: 0, y: 0 };\n this.selectionState = createSelection(1, 1);\n this.renderTabs();\n this.render();\n await this.emitChange();\n }\n\n async deleteSheet(sheetName: string): Promise<void> {\n await this.runtime().deleteSheet(sheetName);\n this.scroll = { x: 0, y: 0 };\n this.selectionState = createSelection(1, 1);\n this.renderTabs();\n this.render();\n await this.emitChange();\n }\n\n async moveSheet(sheetName: string, toIndex: number): Promise<void> {\n await this.runtime().moveSheet(sheetName, toIndex);\n this.renderTabs();\n this.render();\n await this.emitChange();\n }\n\n async setCellValue(address: string, value: ExcelCellValue): Promise<void> {\n await this.runtime().setCellValue(address, value, { mergeUndo: true });\n this.render();\n await this.emitChange();\n }\n\n async setCellFormula(address: string, formula: string): Promise<void> {\n await this.runtime().setCellFormula(address, formula, { mergeUndo: true });\n this.render();\n await this.emitChange();\n }\n\n async formatSelection(kind: 'bold' | 'italic' | 'underline'): Promise<void> {\n await this.applyFormat(kind);\n }\n\n async setSelectionFontColor(color: ExcelColorModel | undefined): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n await this.runtime().setRangeFontColor(\n range.startRow,\n range.startColumn,\n range.endRow - range.startRow + 1,\n range.endColumn - range.startColumn + 1,\n color,\n );\n this.render();\n await this.emitChange();\n }\n\n async setSelectionFillColor(color: ExcelColorModel | undefined): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n await this.runtime().setRangeFillColor(\n range.startRow,\n range.startColumn,\n range.endRow - range.startRow + 1,\n range.endColumn - range.startColumn + 1,\n color,\n );\n this.render();\n await this.emitChange();\n }\n\n async setSelectionHorizontalAlign(alignment: 'left' | 'center' | 'right'): Promise<void> {\n await this.applyAlignment(alignment);\n }\n\n async setSelectionVerticalAlign(alignment: 'top' | 'center' | 'bottom'): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n await this.runtime().setRangeVerticalAlign(\n range.startRow,\n range.startColumn,\n range.endRow - range.startRow + 1,\n range.endColumn - range.startColumn + 1,\n alignment,\n );\n this.render();\n await this.emitChange();\n }\n\n async setSelectionNumberFormat(code: string | undefined): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n await this.runtime().setRangeNumberFormat(\n range.startRow,\n range.startColumn,\n range.endRow - range.startRow + 1,\n range.endColumn - range.startColumn + 1,\n code,\n );\n this.render();\n await this.emitChange();\n }\n\n async setSelectionBorder(mode: 'all' | 'outer' | 'inner' | 'clear'): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n await this.runtime().setRangeBorder(\n range.startRow,\n range.startColumn,\n range.endRow - range.startRow + 1,\n range.endColumn - range.startColumn + 1,\n mode,\n );\n this.render();\n await this.emitChange();\n }\n\n async loadWorkbook(bytes: Uint8Array | ArrayBuffer): Promise<void> {\n this.assertAlive();\n const previous = this.runtimeValue;\n this.runtimeValue = null;\n this.scroll = { x: 0, y: 0 };\n if (previous) await previous.dispose();\n this.runtimeValue = await SpreadsheetEditorRuntime.fromZip(bytes, {\n workbookId: this.options.workbookId,\n mode: 'inline',\n });\n this.renderTabs();\n this.render();\n }\n\n async toZip(): Promise<Uint8Array> {\n return this.runtime().toZip();\n }\n\n canUndo(): boolean { return this.runtime().canUndo(); }\n canRedo(): boolean { return this.runtime().canRedo(); }\n\n async undo(): Promise<void> {\n await this.runtime().undo();\n this.render();\n await this.emitChange();\n }\n\n async redo(): Promise<void> {\n await this.runtime().redo();\n this.render();\n await this.emitChange();\n }\n\n subscribe(listener: (event: SpreadsheetEditorChangeEvent) => void): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n subscribeState(listener: (event: SpreadsheetEditorStateEvent) => void): () => void {\n this.stateListeners.add(listener);\n return () => this.stateListeners.delete(listener);\n }\n\n async runTransaction(\n options: SpreadsheetUserTransactionOptions,\n run: (editor: SpreadsheetEditor) => Promise<void>,\n ): Promise<void> {\n this.transactionDepth += 1;\n try {\n await this.runtime().runUserTransaction(options, () => run(this));\n } finally {\n this.transactionDepth -= 1;\n if (this.transactionDepth === 0 && this.transactionChanged) {\n this.transactionChanged = false;\n this.render();\n await this.emitChange();\n }\n }\n }\n\n destroy(): void {\n if (this.disposed) return;\n this.disposed = true;\n this.resizeObserver.disconnect();\n this.host.removeEventListener('wheel', this.handleWheel);\n this.host.removeEventListener('click', this.handleClick);\n this.host.removeEventListener('dblclick', this.handleDoubleClick);\n this.host.removeEventListener('pointerdown', this.handlePointerDown);\n this.host.removeEventListener('pointermove', this.handlePointerMove);\n this.host.removeEventListener('pointerup', this.handlePointerUp);\n this.host.removeEventListener('pointerleave', this.handlePointerLeave);\n this.host.removeEventListener('keydown', this.handleKeyDown);\n this.host.removeEventListener('copy', this.handleCopy);\n this.host.removeEventListener('paste', this.handlePaste);\n this.host.removeEventListener('contextmenu', this.handleContextMenu);\n document.removeEventListener('pointerdown', this.handleDocumentPointerDown);\n this.contextMenu.remove();\n this.filterMenu.remove();\n this.unsupportedObjectLayer.remove();\n this.host.replaceChildren();\n const runtime = this.runtimeValue;\n this.runtimeValue = null;\n void runtime?.dispose();\n }\n\n private render(): void {\n const runtime = this.runtimeValue;\n const renderer = this.renderer;\n if (!runtime || !renderer || this.disposed) return;\n const rect = this.host.getBoundingClientRect();\n const width = Math.max(1, rect.width);\n const height = Math.max(1, rect.height - (this.options.showSheetTabs === false ? 0 : 40));\n const layout = new SpreadsheetLayout(runtime.activeSheet());\n const viewportSize = { width: Math.max(1, width - 12), height: Math.max(1, height - 12) };\n const viewport = new SpreadsheetViewportManager(layout, {\n viewportSize,\n scroll: this.scroll,\n freeze: freezeStateFromSheet(runtime.activeSheet().source),\n });\n this.layout = layout;\n this.viewport = viewport;\n this.scroll = viewport.scroll;\n this.scrollbarState = computeScrollbarState(\n layout,\n viewportSize,\n freezeStateFromSheet(runtime.activeSheet().source),\n this.scroll,\n );\n renderer.resize(width, height);\n renderer.setHeaderFiltersEnabled(this.options.enableHeaderFilters === true);\n renderer.setHeaderFilterColumns(this.options.enableHeaderFilters === true\n ? Array.from({ length: layout.columnCount }, (_, index) => index + 1)\n : null);\n renderer.setActiveHeaderFilterColumns(Array.from(this.columnFilters.keys()));\n renderer.render(layout, viewport);\n const selectionRange = normalizeSelectionRange(this.selectionState.range);\n renderer.renderSelection(layout, viewport, selectionRange, {\n showFillHandle: supportsSpreadsheetAutoFill(runtime.activeSheet(), selectionRange),\n });\n this.updateCellEditorPosition();\n if (this.autoFillDrag?.preview) {\n renderer.renderDashedRange(layout, viewport, this.autoFillDrag.preview, {\n stroke: '#16A34A',\n fill: 'rgba(34, 197, 94, 0.08)',\n });\n }\n for (const reference of this.formulaReferenceRanges) {\n renderer.renderDashedRange(layout, viewport, reference.range, { stroke: reference.stroke });\n }\n if (this.copiedRange) renderer.renderCopiedRange(layout, viewport, this.copiedRange);\n this.renderUnsupportedChartNotices(layout, viewport);\n this.emitStateIfChanged(runtime.activeSheetName());\n this.updateScrollbars();\n }\n\n private renderUnsupportedChartNotices(\n layout: SpreadsheetLayout,\n viewport: SpreadsheetViewportManager,\n ): void {\n this.unsupportedObjectLayer.replaceChildren();\n const sheet = this.runtimeValue?.activeSheet().source;\n if (!sheet || sheet.charts.length === 0) return;\n\n for (let chartIndex = 0; chartIndex < sheet.charts.length; chartIndex += 1) {\n const chart = sheet.charts[chartIndex];\n if (!chart) continue;\n const anchor = findChartAnchor(sheet.drawings, chart);\n const logicalRect = this.chartDrag?.chartIndex === chartIndex\n ? this.chartDrag.previewRect\n : chartLogicalRect(layout, anchor);\n if (!logicalRect) continue;\n\n for (const fragment of chartScreenFragments(logicalRect, viewport)) {\n const notice = document.createElement('div');\n notice.className = 'coco-spreadsheet-unsupported-chart';\n Object.assign(notice.style, {\n position: 'absolute',\n left: `${fragment.x}px`,\n top: `${fragment.y}px`,\n width: `${Math.max(1, fragment.width)}px`,\n height: `${Math.max(1, fragment.height)}px`,\n display: 'flex',\n flexDirection: 'column',\n alignItems: 'center',\n justifyContent: 'center',\n gap: '6px',\n padding: '12px',\n boxSizing: 'border-box',\n overflow: 'hidden',\n background: 'rgba(248, 250, 252, 0.94)',\n color: '#475569',\n textAlign: 'center',\n font: '13px Arial, sans-serif',\n lineHeight: '1.4',\n cursor: this.chartDrag?.chartIndex === chartIndex ? 'grabbing' : 'move',\n border: this.selectedChartIndex === chartIndex ? '2px solid #2563eb' : '1px dashed #94a3b8',\n boxShadow: this.selectedChartIndex === chartIndex ? '0 0 0 1px rgba(37, 99, 235, 0.18)' : 'none',\n });\n const title = document.createElement('strong');\n title.textContent = chart.title ? `图表:${chart.title}` : '图表';\n title.style.color = '#334155';\n const message = document.createElement('span');\n message.textContent = '当前编辑器暂不支持图表渲染';\n const suggestion = document.createElement('span');\n suggestion.textContent = '请使用 Excel 或 WPS 打开文件查看';\n notice.append(title, message, suggestion);\n this.unsupportedObjectLayer.appendChild(notice);\n }\n }\n }\n\n private readonly handleClick = (event: MouseEvent): void => {\n if (this.eventPathContains(event, this.contextMenu) || this.eventPathContains(event, this.filterMenu)) return;\n if (this.filterMenu.style.display === 'block') this.hideFilterMenu();\n if (this.editingCell) {\n if (this.eventPathContains(event, this.cellEditorElement)) return;\n this.cellEditor.cancel();\n }\n if (!this.viewport || !this.layout) return;\n const chartHit = this.chartAtPoint(this.eventPoint(event));\n if (chartHit) {\n this.selectedChartIndex = chartHit.chartIndex;\n this.render();\n event.preventDefault();\n return;\n }\n this.selectedChartIndex = null;\n const hit = this.viewport.hitTest(this.eventPoint(event));\n if (hit.kind !== 'cell' && hit.kind !== 'rowHeader' && hit.kind !== 'columnHeader') return;\n if (hit.kind === 'cell' && hit.row === 1 && this.isFilterIconHit(hit.column, event)) {\n this.openFilterMenu(hit.column, event.clientX, event.clientY);\n event.preventDefault();\n return;\n }\n if (hit.kind === 'cell') {\n const model = this.runtime().activeSheet();\n this.selectionState = expandSelectionForMergedRanges(\n createSelection(hit.row, hit.column),\n model,\n );\n }\n this.host.focus();\n this.render();\n };\n\n private readonly handleFilterMenuClick = (event: MouseEvent): void => {\n const target = event.target as HTMLElement;\n const action = target.closest<HTMLButtonElement>('[data-filter-action]')?.dataset.filterAction;\n if (!action || this.filterMenuColumn === null) return;\n if (action === 'cancel') {\n this.hideFilterMenu();\n return;\n }\n const column = this.filterMenuColumn;\n if (action === 'clear') {\n this.columnFilters.delete(column);\n } else if (action === 'apply') {\n const values = Array.from(this.filterMenu.querySelectorAll<HTMLInputElement>('input[data-filter-value]:checked'))\n .map((input) => input.dataset.filterValue ?? '');\n this.columnFilters.set(column, values);\n }\n this.hideFilterMenu();\n void this.applyColumnFilters();\n };\n\n private readonly handleDoubleClick = (event: MouseEvent): void => {\n if (!this.viewport || !this.layout) return;\n const hit = this.viewport.hitTest(this.eventPoint(event));\n if (hit.kind !== 'cell') return;\n this.selectionState = expandSelectionForMergedRanges(createSelection(hit.row, hit.column), this.runtime().activeSheet());\n this.openCellEditor();\n event.preventDefault();\n };\n\n private readonly handlePointerDown = (event: PointerEvent): void => {\n if (this.editingCell) {\n if (this.eventPathContains(event, this.cellEditorElement)) return;\n this.cellEditor.cancel();\n }\n if (event.button !== 0 || !this.viewport || !this.layout) return;\n const point = this.eventPoint(event);\n const chartHit = this.chartAtPoint(point);\n if (chartHit) {\n this.selectedChartIndex = chartHit.chartIndex;\n this.chartDrag = {\n chartIndex: chartHit.chartIndex,\n pointer: point,\n startRect: chartHit.logicalRect,\n previewRect: chartHit.logicalRect,\n };\n this.host.setPointerCapture(event.pointerId);\n this.render();\n event.preventDefault();\n return;\n }\n this.selectedChartIndex = null;\n const resizeHandle = hitSpreadsheetResizeHandle(this.layout, this.viewport.viewports, point);\n if (resizeHandle) {\n this.resizeDrag = startSpreadsheetResizeDrag(resizeHandle, event);\n this.host.setPointerCapture(event.pointerId);\n this.host.style.cursor = resizeHandle.kind === 'column' ? 'col-resize' : 'row-resize';\n this.updateResizeGuide(this.resizeDrag);\n event.preventDefault();\n return;\n }\n const selectionRange = normalizeSelectionRange(this.selectionState.range);\n const fillHandle = this.renderer?.fillHandleRect(this.layout, this.viewport, selectionRange);\n if (fillHandle && containsPoint(fillHandle, point) && supportsSpreadsheetAutoFill(this.runtime().activeSheet(), selectionRange)) {\n this.autoFillDrag = { source: selectionRange, preview: null };\n this.host.setPointerCapture(event.pointerId);\n event.preventDefault();\n return;\n }\n const hit = this.viewport.hitTest(point);\n if (hit.kind !== 'cell' && hit.kind !== 'rowHeader' && hit.kind !== 'columnHeader') return;\n const model = this.runtime().activeSheet();\n if (hit.kind === 'cell') {\n this.selectionState = expandSelectionForMergedRanges(createSelection(hit.row, hit.column), model);\n } else if (hit.kind === 'rowHeader') {\n this.selectionState = createRowSelection(hit.row, { columnCount: this.layout.columnCount });\n } else {\n this.selectionState = createColumnSelection(hit.column, { rowCount: this.layout.rowCount });\n }\n this.selecting = true;\n this.host.setPointerCapture(event.pointerId);\n this.render();\n event.preventDefault();\n };\n\n private readonly handlePointerMove = (event: PointerEvent): void => {\n if (!this.viewport || !this.layout) return;\n if (this.chartDrag) {\n const point = this.eventPoint(event);\n const deltaX = point.x - this.chartDrag.pointer.x;\n const deltaY = point.y - this.chartDrag.pointer.y;\n this.chartDrag.previewRect = {\n ...this.chartDrag.startRect,\n x: Math.max(0, this.chartDrag.startRect.x + deltaX),\n y: Math.max(0, this.chartDrag.startRect.y + deltaY),\n };\n this.host.style.cursor = 'grabbing';\n this.render();\n event.preventDefault();\n return;\n }\n if (!this.resizeDrag && !this.autoFillDrag && !this.selecting && !this.editingCell) {\n const resizeHandle = hitSpreadsheetResizeHandle(this.layout, this.viewport.viewports, this.eventPoint(event));\n this.host.style.cursor = resizeHandle\n ? resizeHandle.kind === 'column' ? 'col-resize' : 'row-resize'\n : '';\n }\n if (this.resizeDrag) {\n this.resizeDrag = updateSpreadsheetResizeDrag(this.resizeDrag, event);\n this.updateResizeGuide(this.resizeDrag);\n return;\n }\n if (this.autoFillDrag) {\n const hit = this.viewport.hitTest(this.eventPoint(event));\n this.autoFillDrag.preview = autoFillPreviewRangeForHit(this.autoFillDrag.source, hit);\n this.render();\n event.preventDefault();\n return;\n }\n if (!this.selecting) return;\n const hit = this.viewport.hitTest(this.eventPoint(event));\n if (hit.kind === 'none' || hit.kind === 'corner') return;\n const model = this.runtime().activeSheet();\n if (hit.kind === 'cell') {\n this.selectionState = expandSelectionForMergedRanges(\n extendSelection(this.selectionState, hit.row, hit.column, {\n rowCount: this.layout.rowCount,\n columnCount: this.layout.columnCount,\n }),\n model,\n );\n } else if (hit.kind === 'rowHeader' && this.selectionState.kind === 'row') {\n this.selectionState = extendSelection(this.selectionState, hit.row, 1, { columnCount: this.layout.columnCount, rowCount: this.layout.rowCount });\n } else if (hit.kind === 'columnHeader' && this.selectionState.kind === 'column') {\n this.selectionState = extendSelection(this.selectionState, 1, hit.column, { columnCount: this.layout.columnCount, rowCount: this.layout.rowCount });\n }\n this.render();\n event.preventDefault();\n };\n\n private readonly handlePointerUp = (event: PointerEvent): void => {\n if (this.chartDrag) {\n const completed = this.chartDrag;\n this.chartDrag = null;\n this.host.style.cursor = '';\n if (this.host.hasPointerCapture(event.pointerId)) this.host.releasePointerCapture(event.pointerId);\n if (completed.previewRect.x === completed.startRect.x && completed.previewRect.y === completed.startRect.y) {\n this.render();\n event.preventDefault();\n return;\n }\n const anchor = this.chartAnchorAtIndex(completed.chartIndex);\n if (anchor && this.layout) {\n const next = chartAnchorForLogicalRect(this.layout, completed.previewRect, anchor);\n void this.runtime().moveChart(completed.chartIndex, next).then(async () => {\n this.render();\n await this.emitChange();\n });\n } else {\n this.render();\n }\n event.preventDefault();\n return;\n }\n if (this.resizeDrag) {\n const completed = updateSpreadsheetResizeDrag(this.resizeDrag, event);\n this.resizeDrag = null;\n this.host.style.cursor = '';\n this.hideResizeGuide();\n if (this.host.hasPointerCapture(event.pointerId)) this.host.releasePointerCapture(event.pointerId);\n void this.commitResizeDrag(completed);\n event.preventDefault();\n return;\n }\n if (this.autoFillDrag) {\n const completed = this.autoFillDrag;\n this.autoFillDrag = null;\n if (this.host.hasPointerCapture(event.pointerId)) this.host.releasePointerCapture(event.pointerId);\n if (completed.preview) {\n void this.runtime().autoFillRange(completed.source, completed.preview).then(async () => {\n this.selectionState = { ...this.selectionState, range: completed.preview! };\n this.render();\n await this.emitChange();\n });\n } else {\n this.render();\n }\n event.preventDefault();\n return;\n }\n if (!this.selecting) return;\n this.selecting = false;\n if (this.host.hasPointerCapture(event.pointerId)) this.host.releasePointerCapture(event.pointerId);\n this.host.style.cursor = '';\n };\n\n private readonly handlePointerLeave = (): void => {\n if (!this.resizeDrag && !this.autoFillDrag && !this.chartDrag) this.host.style.cursor = '';\n };\n\n private chartAnchorAtIndex(chartIndex: number): ExcelDrawingAnchorModel | undefined {\n const sheet = this.runtimeValue?.activeSheet().source;\n const chart = sheet?.charts[chartIndex];\n return chart ? findChartAnchor(sheet.drawings, chart) : undefined;\n }\n\n private chartAtPoint(point: { x: number; y: number }): {\n chartIndex: number;\n logicalRect: SpreadsheetRect;\n } | null {\n const sheet = this.runtimeValue?.activeSheet().source;\n if (!sheet || !this.layout || !this.viewport) return null;\n for (let chartIndex = sheet.charts.length - 1; chartIndex >= 0; chartIndex -= 1) {\n const chart = sheet.charts[chartIndex];\n if (!chart) continue;\n const anchor = findChartAnchor(sheet.drawings, chart);\n const logicalRect = chartLogicalRect(this.layout, anchor);\n if (!logicalRect) continue;\n if (chartScreenFragments(logicalRect, this.viewport).some((fragment) => containsPoint(fragment, point))) {\n return { chartIndex, logicalRect };\n }\n }\n return null;\n }\n\n private updateResizeGuide(drag: SpreadsheetResizeDragState): void {\n if (drag.kind === 'column') {\n Object.assign(this.resizeGuide.style, {\n display: 'block',\n left: `${Math.round(drag.currentGuidePosition)}px`,\n top: '0',\n bottom: '0',\n width: '2px',\n height: '',\n });\n } else {\n Object.assign(this.resizeGuide.style, {\n display: 'block',\n left: '0',\n top: `${Math.round(drag.currentGuidePosition)}px`,\n right: '0',\n height: '2px',\n width: '',\n });\n }\n }\n\n private hideResizeGuide(): void {\n this.resizeGuide.style.display = 'none';\n }\n\n private readonly handleKeyDown = (event: KeyboardEvent): void => {\n if (this.editingCell) return;\n const { row, column } = this.selectionState.active;\n if (event.key === 'F2' || event.key === 'Enter') {\n event.preventDefault();\n this.openCellEditor();\n return;\n }\n const deltas: Record<string, [number, number]> = {\n ArrowUp: [-1, 0], ArrowDown: [1, 0], ArrowLeft: [0, -1], ArrowRight: [0, 1],\n };\n const delta = deltas[event.key];\n if (!delta) return;\n const model = this.runtime().activeSheet();\n this.selectionState = createSelection(\n Math.max(1, Math.min(model.maxRow, row + delta[0])),\n Math.max(1, Math.min(model.maxColumn, column + delta[1])),\n );\n event.preventDefault();\n this.render();\n };\n\n private readonly handleCopy = (event: ClipboardEvent): void => {\n const range = normalizeSelectionRange(this.selectionState.range);\n const payload = buildSpreadsheetClipboardPayload(this.runtime().activeSheet(), range);\n this.clipboardPayload = payload;\n this.copiedRange = range;\n event.clipboardData?.setData('text/plain', payload.text);\n event.preventDefault();\n };\n\n private readonly handlePaste = (event: ClipboardEvent): void => {\n const text = event.clipboardData?.getData('text/plain') ?? '';\n if (!text) return;\n event.preventDefault();\n const values = this.clipboardPayload?.text === text ? this.clipboardPayload.values : parseTsv(text);\n void this.runtime().pasteRange(this.selectionState.active.row, this.selectionState.active.column, values, {\n mode: 'all',\n merges: this.clipboardPayload?.text === text ? this.clipboardPayload.merges : [],\n styleIds: this.clipboardPayload?.text === text ? this.clipboardPayload.styleIds : [],\n }).then(async () => {\n const pastedSelection = expandSelectionForMergedRanges({\n kind: 'cell',\n active: this.selectionState.active,\n range: {\n startRow: this.selectionState.active.row,\n startColumn: this.selectionState.active.column,\n endRow: this.selectionState.active.row + values.length - 1,\n endColumn: this.selectionState.active.column + Math.max(1, values.reduce((max, row) => Math.max(max, row.length), 0)) - 1,\n },\n }, this.runtime().activeSheet());\n this.selectionState = pastedSelection;\n this.copiedRange = normalizeSelectionRange(pastedSelection.range);\n this.render();\n await this.emitChange();\n });\n };\n\n private readonly handleContextMenu = (event: MouseEvent): void => {\n if (!this.viewport || !this.layout) return;\n const chartHit = this.chartAtPoint(this.eventPoint(event));\n if (chartHit) {\n this.selectedChartIndex = chartHit.chartIndex;\n this.hideContextMenu();\n this.hideFilterMenu();\n this.render();\n event.preventDefault();\n return;\n }\n const hit = this.viewport.hitTest(this.eventPoint(event));\n if (hit.kind === 'cell' && !this.selectionContainsCell(hit.row, hit.column)) {\n this.selectionState = expandSelectionForMergedRanges(createSelection(hit.row, hit.column), this.runtime().activeSheet());\n this.render();\n }\n if (hit.kind !== 'cell' && hit.kind !== 'rowHeader' && hit.kind !== 'columnHeader') return;\n event.preventDefault();\n this.renderContextMenu(event.clientX, event.clientY, hit.kind === 'columnHeader' ? hit.column : undefined);\n };\n\n private readonly handleDocumentPointerDown = (event: PointerEvent): void => {\n const path = event.composedPath();\n if (path.includes(this.contextMenu) || path.includes(this.filterMenu)) return;\n this.hideContextMenu();\n this.hideFilterMenu();\n };\n\n private renderContextMenu(x: number, y: number, columnHeader?: number): void {\n const items: Array<{ label: string; disabled?: boolean; action: () => void | Promise<void> }> = [\n { label: 'Undo', disabled: !this.canUndo(), action: () => this.undo() },\n { label: 'Redo', disabled: !this.canRedo(), action: () => this.redo() },\n { label: 'Copy', action: () => this.copySelection() },\n { label: 'Paste', action: () => this.pasteFromClipboard() },\n { label: 'Clear cells', action: () => this.clearSelection() },\n { label: 'Clear format', action: () => this.clearSelectionFormat() },\n { label: 'Bold', action: () => this.applyFormat('bold') },\n { label: 'Italic', action: () => this.applyFormat('italic') },\n { label: 'Underline', action: () => this.applyFormat('underline') },\n { label: 'Align left', action: () => this.applyAlignment('left') },\n { label: 'Align center', action: () => this.applyAlignment('center') },\n { label: 'Align right', action: () => this.applyAlignment('right') },\n { label: 'Merge cells', action: () => this.mergeSelection() },\n { label: 'Unmerge cells', action: () => this.unmergeSelection() },\n { label: 'Freeze above and left', action: () => this.freezeSelection() },\n ];\n if (columnHeader !== undefined) {\n items.unshift({\n label: 'Filter column',\n action: () => this.openFilterMenu(columnHeader, x, y),\n });\n items.splice(1, 0,\n { label: 'Sort A-Z', action: () => this.sortColumn(columnHeader, 'asc') },\n { label: 'Sort Z-A', action: () => this.sortColumn(columnHeader, 'desc') },\n );\n }\n this.contextMenu.replaceChildren();\n for (const item of items) {\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = item.label;\n button.disabled = item.disabled === true;\n Object.assign(button.style, {\n display: 'block', width: '100%', padding: '6px 10px', border: '0',\n background: 'transparent', textAlign: 'left', cursor: button.disabled ? 'default' : 'pointer',\n });\n button.addEventListener('mouseenter', () => { if (!button.disabled) button.style.background = '#eff6ff'; });\n button.addEventListener('mouseleave', () => { button.style.background = 'transparent'; });\n button.addEventListener('click', () => {\n this.hideContextMenu();\n void item.action();\n });\n this.contextMenu.appendChild(button);\n }\n Object.assign(this.contextMenu.style, { left: `${x}px`, top: `${y}px`, display: 'block' });\n }\n\n private openFilterMenu(column: number, x: number, y: number): void {\n if (this.filterMenu.style.display === 'block' && this.filterMenuColumn === column) {\n this.hideFilterMenu();\n return;\n }\n const model = this.runtime().activeSheet();\n const range = { startRow: 1, startColumn: 1, endRow: model.maxRow, endColumn: model.maxColumn };\n const selected = new Set(this.columnFilters.get(column) ?? spreadsheetFilterValues(model, range, column));\n this.filterMenuColumn = column;\n this.filterMenu.replaceChildren();\n const title = document.createElement('strong');\n title.textContent = `Filter ${column}`;\n title.style.display = 'block';\n title.style.marginBottom = '6px';\n this.filterMenu.appendChild(title);\n for (const value of spreadsheetFilterValues(model, range, column)) {\n const label = document.createElement('label');\n label.style.display = 'block';\n label.style.padding = '3px 0';\n const input = document.createElement('input');\n input.type = 'checkbox';\n input.checked = selected.has(value);\n input.dataset.filterValue = value;\n input.style.marginRight = '8px';\n label.append(input, value === '' ? '(blank)' : value);\n this.filterMenu.appendChild(label);\n }\n const actions = document.createElement('div');\n actions.style.display = 'flex';\n actions.style.gap = '6px';\n actions.style.marginTop = '8px';\n for (const [label, action] of [['Apply', 'apply'], ['Clear filter', 'clear'], ['Cancel', 'cancel']] as const) {\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = label;\n button.dataset.filterAction = action;\n actions.appendChild(button);\n }\n this.filterMenu.appendChild(actions);\n Object.assign(this.filterMenu.style, { left: `${x}px`, top: `${y}px`, display: 'block' });\n }\n\n private hideFilterMenu(): void {\n this.filterMenu.style.display = 'none';\n this.filterMenuColumn = null;\n }\n\n private isFilterIconHit(column: number, event: MouseEvent): boolean {\n if (!this.layout || !this.viewport) return false;\n const point = this.eventPoint(event);\n const viewport = this.viewport.findViewport(point);\n if (!viewport) return false;\n const rect = this.viewport.cellScreenRect(1, column, viewport);\n return rect.width >= 28 && point.x >= rect.x + rect.width - 22 && point.x <= rect.x + rect.width;\n }\n\n private async applyColumnFilters(): Promise<void> {\n const model = this.runtime().activeSheet();\n const filters: SpreadsheetColumnFilter[] = Array.from(this.columnFilters.entries())\n .filter(([, values]) => values.length > 0)\n .map(([column, values]) => ({ column, values }));\n await this.runtime().filterRowsByColumns(1, model.maxRow, filters);\n this.render();\n await this.emitChange();\n }\n\n private async sortColumn(column: number, direction: 'asc' | 'desc'): Promise<void> {\n const model = this.runtime().activeSheet();\n await this.runtime().sortRows(1, model.maxRow, column, direction);\n this.render();\n await this.emitChange();\n }\n\n async sortActiveColumn(direction: 'asc' | 'desc'): Promise<void> {\n await this.sortColumn(this.selectionState.active.column, direction);\n }\n\n async filterColumn(column: number, values: readonly string[] | null): Promise<void> {\n if (values === null) this.columnFilters.delete(column);\n else this.columnFilters.set(column, [...values]);\n await this.applyColumnFilters();\n }\n\n private hideContextMenu(): void {\n this.contextMenu.style.display = 'none';\n }\n\n private selectionContainsCell(row: number, column: number): boolean {\n const range = normalizeSelectionRange(this.selectionState.range);\n return row >= range.startRow && row <= range.endRow && column >= range.startColumn && column <= range.endColumn;\n }\n\n private async copySelection(): Promise<void> {\n const payload = buildSpreadsheetClipboardPayload(this.runtime().activeSheet(), normalizeSelectionRange(this.selectionState.range));\n this.clipboardPayload = payload;\n try { await navigator.clipboard.writeText(payload.text); } catch { /* Clipboard events still support internal copy. */ }\n }\n\n private async pasteFromClipboard(): Promise<void> {\n let text = '';\n try { text = await navigator.clipboard.readText(); } catch { return; }\n if (!text) return;\n const event = new ClipboardEvent('paste', { clipboardData: new DataTransfer() });\n event.clipboardData?.setData('text/plain', text);\n this.handlePaste(event);\n }\n\n async clearSelection(): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n await this.runtime().clearRange(range.startRow, range.startColumn, range.endRow - range.startRow + 1, range.endColumn - range.startColumn + 1);\n this.render();\n await this.emitChange();\n }\n\n async clearSelectionFormat(): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n await this.runtime().clearRangeFormat(range.startRow, range.startColumn, range.endRow - range.startRow + 1, range.endColumn - range.startColumn + 1);\n this.render();\n await this.emitChange();\n }\n\n private async applyFormat(kind: 'bold' | 'italic' | 'underline'): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n const rows = range.endRow - range.startRow + 1;\n const columns = range.endColumn - range.startColumn + 1;\n if (kind === 'bold') await this.runtime().setRangeBold(range.startRow, range.startColumn, rows, columns, true);\n if (kind === 'italic') await this.runtime().setRangeItalic(range.startRow, range.startColumn, rows, columns, true);\n if (kind === 'underline') await this.runtime().setRangeUnderline(range.startRow, range.startColumn, rows, columns, true);\n this.render();\n await this.emitChange();\n }\n\n private async applyAlignment(alignment: 'left' | 'center' | 'right'): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n await this.runtime().setRangeHorizontalAlign(\n range.startRow,\n range.startColumn,\n range.endRow - range.startRow + 1,\n range.endColumn - range.startColumn + 1,\n alignment,\n );\n this.render();\n await this.emitChange();\n }\n\n async mergeSelection(): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n if (range.startRow === range.endRow && range.startColumn === range.endColumn) return;\n await this.runtime().mergeRange(\n range.startRow,\n range.startColumn,\n range.endRow - range.startRow + 1,\n range.endColumn - range.startColumn + 1,\n );\n this.selectionState = expandSelectionForMergedRanges(this.selectionState, this.runtime().activeSheet());\n this.render();\n await this.emitChange();\n }\n\n async unmergeSelection(): Promise<void> {\n const range = normalizeSelectionRange(this.selectionState.range);\n const addresses = [...this.runtime().activeSheet().mergeMasterByAddress.values()]\n .filter((merge) => rangesIntersect(range, merge.range))\n .map((merge) => merge.address);\n if (addresses.length === 0) return;\n await this.runtime().unmergeRanges(addresses);\n this.render();\n await this.emitChange();\n }\n\n async freezeSelection(): Promise<void> {\n const active = this.selectionState.active;\n await this.runtime().setFreezePanes(Math.max(0, active.row - 1), Math.max(0, active.column - 1));\n this.render();\n await this.emitChange();\n }\n\n private async commitResizeDrag(drag: SpreadsheetResizeDragState): Promise<void> {\n if (drag.currentSize === drag.startSize) {\n this.render();\n return;\n }\n if (drag.kind === 'column') await this.runtime().setColumnWidth(drag.index, drag.currentSize);\n else await this.runtime().setRowHeight(drag.index, drag.currentSize * 72 / 96);\n this.render();\n await this.emitChange();\n }\n\n private openCellEditor(): void {\n if (!this.layout || !this.viewport) return;\n const cell = this.selectionState.active;\n const viewport = this.viewport.findViewport({\n x: this.layout.rowHeaderWidth + 1,\n y: this.layout.columnHeaderHeight + 1,\n });\n const renderCell = getRenderCell(this.runtime().activeSheet(), cell.row, cell.column);\n const cellStyle = resolveSpreadsheetCellStyle(this.runtime().activeSheet().styles, renderCell?.styleId, renderCell);\n Object.assign(this.cellEditorElement.style, {\n font: cellStyle.font,\n color: cellStyle.fontColor,\n textDecoration: cellStyle.underline ? 'underline' : 'none',\n textAlign: cellStyle.horizontalAlign,\n });\n const targetViewport = this.viewport.viewports.find((item) => item.kind === 'main') ?? viewport;\n if (!targetViewport) return;\n const editRange = normalizeSelectionRange(this.selectionState.range);\n const startRect = this.viewport.cellScreenRect(editRange.startRow, editRange.startColumn, targetViewport);\n const endRect = this.viewport.cellScreenRect(editRange.endRow, editRange.endColumn, targetViewport);\n const rect = {\n x: startRect.x,\n y: startRect.y,\n width: endRect.x + endRect.width - startRect.x,\n height: endRect.y + endRect.height - startRect.y,\n };\n this.editingCell = cell;\n this.editingCellStyle = cellStyle;\n const value = renderCell?.formula ? `=${renderCell.formula}` : renderCell?.displayText ?? '';\n this.formulaReferenceRanges = formulaReferenceRangesFromText(value);\n this.cellEditor.open(rect, value);\n this.alignCellEditor(rect, cellStyle);\n this.render();\n }\n\n private async commitCellEdit(value: string): Promise<void> {\n const cell = this.editingCell;\n this.editingCell = null;\n this.editingCellStyle = null;\n this.formulaReferenceRanges = [];\n if (!cell) return;\n const address = formatCellAddress(cell.row, cell.column);\n if (value.startsWith('=')) await this.runtime().setCellFormula(address, value.slice(1), { mergeUndo: true });\n else await this.runtime().setCellValue(address, coerceEditorValue(value), { mergeUndo: true });\n this.render();\n await this.emitChange();\n }\n\n private eventPoint(event: MouseEvent): { x: number; y: number } {\n const rect = this.host.getBoundingClientRect();\n return { x: event.clientX - rect.left, y: event.clientY - rect.top };\n }\n\n private eventPathContains(event: Event, node: EventTarget): boolean {\n return event.composedPath().includes(node);\n }\n\n private updateCellEditorPosition(): void {\n const cell = this.editingCell;\n const layout = this.layout;\n const viewportManager = this.viewport;\n if (!cell || !layout || !viewportManager) return;\n const targetViewport = viewportManager.viewports.find((viewport) =>\n viewport.kind !== 'columnHeaderFrozen' &&\n viewport.kind !== 'columnHeaderScrollable' &&\n viewport.kind !== 'rowHeaderFrozen' &&\n viewport.kind !== 'rowHeaderScrollable' &&\n cell.row >= viewport.rows.start && cell.row <= viewport.rows.end &&\n cell.column >= viewport.columns.start && cell.column <= viewport.columns.end,\n );\n if (!targetViewport) {\n this.cellEditorElement.style.display = 'none';\n return;\n }\n const editRange = normalizeSelectionRange(this.selectionState.range);\n const startRect = viewportManager.cellScreenRect(editRange.startRow, editRange.startColumn, targetViewport);\n const endRect = viewportManager.cellScreenRect(editRange.endRow, editRange.endColumn, targetViewport);\n const rect = {\n x: startRect.x,\n y: startRect.y,\n width: endRect.x + endRect.width - startRect.x,\n height: endRect.y + endRect.height - startRect.y,\n };\n this.cellEditorElement.style.left = `${rect.x}px`;\n this.cellEditorElement.style.top = `${rect.y}px`;\n this.cellEditorElement.style.width = `${Math.max(1, rect.width)}px`;\n this.cellEditorElement.style.height = `${Math.max(1, rect.height)}px`;\n this.cellEditorElement.style.display = 'block';\n if (this.editingCellStyle) this.alignCellEditor(rect, this.editingCellStyle);\n }\n\n private alignCellEditor(rect: { height: number }, style: SpreadsheetResolvedCellStyle): void {\n const textarea = this.cellEditorElement;\n const paddingX = 4;\n const paddingY = 2;\n textarea.style.padding = `${paddingY}px ${paddingX}px`;\n const extraHeight = Math.max(0, rect.height - textarea.scrollHeight);\n const topPadding =\n style.verticalAlign === 'bottom'\n ? paddingY + extraHeight\n : style.verticalAlign === 'middle'\n ? paddingY + extraHeight / 2\n : paddingY;\n textarea.style.paddingTop = `${topPadding}px`;\n }\n\n private async emitChange(): Promise<void> {\n if (this.transactionDepth > 0) {\n this.transactionChanged = true;\n return;\n }\n const event = { kind: 'workbookChange' as const, bytes: await this.toZip() };\n for (const listener of this.listeners) listener(event);\n await this.options.onChange?.(event);\n }\n\n private emitStateIfChanged(activeSheetName: string): void {\n const selection = this.selectionState;\n const selectionKey = `${selection.kind}:${selection.active.row}:${selection.active.column}:${selection.range.startRow}:${selection.range.startColumn}:${selection.range.endRow}:${selection.range.endColumn}:${this.editingCell?.row ?? 0}:${this.editingCell?.column ?? 0}`;\n const stateKey = `${activeSheetName}|${selectionKey}`;\n if (stateKey === this.lastStateKey) return;\n this.lastStateKey = stateKey;\n const event: SpreadsheetEditorStateEvent = {\n kind: 'stateChange',\n activeSheetName,\n selection,\n editingCell: this.editingCell,\n };\n for (const listener of this.stateListeners) listener(event);\n }\n\n private renderTabs(): void {\n if (this.options.showSheetTabs === false || !this.runtimeValue) return;\n this.sheetTabs.replaceChildren();\n Object.assign(this.sheetTabs.style, {\n position: 'absolute',\n left: '0',\n right: '0',\n bottom: '0',\n height: '40px',\n display: 'flex',\n alignItems: 'center',\n gap: '8px',\n padding: '0 12px',\n background: '#eef1f5',\n borderTop: '1px solid #e2e8f0',\n boxSizing: 'border-box',\n overflowX: 'auto',\n overflowY: 'hidden',\n });\n for (const sheet of this.runtimeValue.model().sheets) {\n const button = document.createElement('button');\n button.type = 'button';\n button.textContent = sheet.name;\n button.dataset.active = String(sheet.name === this.runtimeValue.activeSheetName());\n Object.assign(button.style, {\n height: '32px',\n minWidth: '64px',\n padding: '0 14px',\n border: '0',\n borderTop: sheet.name === this.runtimeValue.activeSheetName() ? '2px solid #2563eb' : '2px solid transparent',\n borderRadius: '3px 3px 0 0',\n background: sheet.name === this.runtimeValue.activeSheetName() ? '#ffffff' : 'transparent',\n color: sheet.name === this.runtimeValue.activeSheetName() ? '#1d4ed8' : '#475569',\n font: '13px Arial, sans-serif',\n fontWeight: sheet.name === this.runtimeValue.activeSheetName() ? '600' : '400',\n cursor: 'pointer',\n whiteSpace: 'nowrap',\n });\n button.addEventListener('mouseenter', () => {\n if (button.dataset.active !== 'true') button.style.background = '#e2e8f0';\n });\n button.addEventListener('mouseleave', () => {\n if (button.dataset.active !== 'true') button.style.background = 'transparent';\n });\n button.addEventListener('click', () => void this.setActiveSheet(sheet.name));\n this.sheetTabs.appendChild(button);\n }\n }\n\n private configureScrollbar(track: HTMLDivElement, thumb: HTMLDivElement, horizontal: boolean): void {\n track.className = 'coco-spreadsheet-editor-scrollbar';\n Object.assign(track.style, {\n position: 'absolute',\n zIndex: '10',\n background: '#f1f5f9',\n border: '1px solid #cbd5e1',\n cursor: 'pointer',\n ...(horizontal ? { left: '48px', bottom: '40px', height: '12px' } : { top: '24px', right: '0', bottom: '52px', width: '12px' }),\n });\n thumb.className = 'coco-spreadsheet-editor-scrollbar-thumb';\n Object.assign(thumb.style, { position: 'absolute', background: '#94a3b8', borderRadius: '999px' });\n track.appendChild(thumb);\n track.addEventListener('pointerdown', (event) => {\n const geometry = this.scrollbarState?.[horizontal ? 'horizontal' : 'vertical'];\n if (!geometry || geometry.maxScroll <= 0) return;\n const rect = track.getBoundingClientRect();\n const pointer = horizontal ? event.clientX - rect.left : event.clientY - rect.top;\n this.drag = { axis: horizontal ? 'horizontal' : 'vertical', pointer, thumb: geometry.thumbStart };\n track.setPointerCapture(event.pointerId);\n this.setScroll(horizontal ? scrollFromThumbPosition(geometry, pointer - geometry.thumbLength / 2) : this.scroll.x, horizontal ? this.scroll.y : scrollFromThumbPosition(geometry, pointer - geometry.thumbLength / 2));\n });\n track.addEventListener('pointermove', (event) => {\n const drag = this.drag;\n const geometry = this.scrollbarState?.[horizontal ? 'horizontal' : 'vertical'];\n if (!drag || !geometry || drag.axis !== (horizontal ? 'horizontal' : 'vertical')) return;\n const rect = track.getBoundingClientRect();\n const pointer = horizontal ? event.clientX - rect.left : event.clientY - rect.top;\n const next = scrollFromThumbPosition(geometry, drag.thumb + pointer - drag.pointer);\n this.setScroll(horizontal ? next : this.scroll.x, horizontal ? this.scroll.y : next);\n });\n track.addEventListener('pointerup', () => { this.drag = null; });\n }\n\n private updateScrollbars(): void {\n const state = this.scrollbarState;\n const layout = this.layout;\n const viewport = this.viewport;\n if (!state || !layout || !viewport) return;\n const horizontal = state.horizontal;\n const vertical = state.vertical;\n this.horizontalScrollbar.style.display = horizontal.maxScroll > 0 ? 'block' : 'none';\n this.verticalScrollbar.style.display = vertical.maxScroll > 0 ? 'block' : 'none';\n Object.assign(this.horizontalScrollbar.style, { left: `${layout.rowHeaderWidth + layout.getColumnX(viewport.freeze.frozenColumns + 1)}px`, width: `${horizontal.trackLength}px` });\n Object.assign(this.horizontalThumb.style, { left: `${horizontal.thumbStart}px`, width: `${horizontal.thumbLength}px`, top: '1px', bottom: '1px' });\n Object.assign(this.verticalScrollbar.style, { top: `${layout.columnHeaderHeight + layout.getRowY(viewport.freeze.frozenRows + 1)}px`, height: `${vertical.trackLength}px` });\n Object.assign(this.verticalThumb.style, { top: `${vertical.thumbStart}px`, height: `${vertical.thumbLength}px`, left: '1px', right: '1px' });\n }\n\n private setScroll(x: number, y: number): void {\n this.scroll = { x, y };\n this.render();\n }\n\n private readonly handleWheel = (event: WheelEvent): void => {\n if (!this.runtimeValue) return;\n event.preventDefault();\n const next = applyWheelDelta(this.scroll, event.deltaX, event.deltaY);\n this.setScroll(next.x, next.y);\n };\n\n private assertAlive(): void {\n if (this.disposed) throw new Error('SpreadsheetEditor: editor has been destroyed');\n }\n}\n\nfunction coerceEditorValue(value: string): ExcelCellValue {\n if (value === '') return null;\n if (value === 'TRUE') return true;\n if (value === 'FALSE') return false;\n const number = Number(value);\n return Number.isFinite(number) && value.trim() !== '' ? number : value;\n}\n\nfunction containsPoint(\n rect: { x: number; y: number; width: number; height: number },\n point: { x: number; y: number },\n): boolean {\n return point.x >= rect.x && point.y >= rect.y && point.x <= rect.x + rect.width && point.y <= rect.y + rect.height;\n}\n\nfunction findChartAnchor(\n drawings: ExcelDrawingModel[],\n chart: ExcelChartModel,\n): ExcelDrawingAnchorModel | undefined {\n const drawing = drawings.find((item) => item.path === chart.drawingPath);\n const anchors = drawing?.anchors ?? drawings.flatMap((item) => item.anchors);\n return anchors.find((anchor) =>\n anchor.object?.kind === 'chart' &&\n (!chart.relationshipId || anchor.object.relationshipId === chart.relationshipId),\n );\n}\n\nfunction chartLogicalRect(\n layout: SpreadsheetLayout,\n anchor: ExcelDrawingAnchorModel | undefined,\n): SpreadsheetRect | null {\n if (!anchor || anchor.kind === 'absolute' || !anchor.from) return null;\n const startColumn = markerIndex(anchor.from.column);\n const startRow = markerIndex(anchor.from.row);\n const endColumn = anchor.to ? markerIndex(anchor.to.column) : startColumn + 5;\n const endRow = anchor.to ? markerIndex(anchor.to.row) : startRow + 12;\n const startX = layout.getColumnX(startColumn) + markerOffset(anchor.from.columnOffset);\n const startY = layout.getRowY(startRow) + markerOffset(anchor.from.rowOffset);\n const endX = layout.getColumnX(endColumn) + markerOffset(anchor.to?.columnOffset);\n const endY = layout.getRowY(endRow) + markerOffset(anchor.to?.rowOffset);\n return {\n x: startX,\n y: startY,\n width: Math.max(1, endX - startX),\n height: Math.max(1, endY - startY),\n };\n}\n\nfunction chartScreenFragments(\n logicalRect: SpreadsheetRect,\n viewport: SpreadsheetViewportManager,\n): SpreadsheetRect[] {\n const fragments: SpreadsheetRect[] = [];\n for (const item of viewport.viewports) {\n if (!isBodyViewport(item)) continue;\n const visibleLeft = item.originX;\n const visibleTop = item.originY;\n const visibleRight = item.originX + item.screenRect.width;\n const visibleBottom = item.originY + item.screenRect.height;\n const left = Math.max(logicalRect.x, visibleLeft);\n const top = Math.max(logicalRect.y, visibleTop);\n const right = Math.min(logicalRect.x + logicalRect.width, visibleRight);\n const bottom = Math.min(logicalRect.y + logicalRect.height, visibleBottom);\n if (right <= left || bottom <= top) continue;\n fragments.push({\n x: item.screenRect.x + left - item.originX,\n y: item.screenRect.y + top - item.originY,\n width: right - left,\n height: bottom - top,\n });\n }\n return fragments;\n}\n\nfunction chartAnchorForLogicalRect(\n layout: SpreadsheetLayout,\n rect: SpreadsheetRect,\n original: ExcelDrawingAnchorModel,\n): {\n from: { row: number; column: number; rowOffset?: number; columnOffset?: number };\n to?: { row: number; column: number; rowOffset?: number; columnOffset?: number };\n} {\n const marker = (x: number, y: number) => {\n const column = layout.columnAt(Math.max(0, x));\n const row = layout.rowAt(Math.max(0, y));\n return {\n column: column - 1,\n row: row - 1,\n columnOffset: Math.round((x - layout.getColumnX(column)) * 9525),\n rowOffset: Math.round((y - layout.getRowY(row)) * 9525),\n };\n };\n const from = marker(rect.x, rect.y);\n const to = original.to ? marker(rect.x + rect.width, rect.y + rect.height) : undefined;\n return { from, to };\n}\n\nfunction isBodyViewport(viewport: SpreadsheetViewport): boolean {\n return viewport.kind === 'main' || viewport.kind === 'frozenTop' ||\n viewport.kind === 'frozenLeft' || viewport.kind === 'frozenTopLeft';\n}\n\nfunction markerIndex(value: number | undefined): number {\n return Math.max(1, Math.floor(value ?? 0) + 1);\n}\n\nfunction markerOffset(value: number | undefined): number {\n // OOXML drawing offsets are EMUs; 9,525 EMUs equal one CSS pixel at 96 DPI.\n return Number.isFinite(value) ? (value ?? 0) / 9525 : 0;\n}\n\nfunction columnNumberFromLetters(letters: string): number {\n let value = 0;\n for (const character of letters.toUpperCase()) {\n value = value * 26 + character.charCodeAt(0) - 64;\n }\n return value;\n}\n\nfunction autoFillPreviewRangeForHit(\n source: SpreadsheetRange,\n hit: ReturnType<SpreadsheetViewportManager['hitTest']>,\n): SpreadsheetRange | null {\n if (hit.kind !== 'cell') return null;\n const down = Math.max(0, hit.row - source.endRow);\n const right = Math.max(0, hit.column - source.endColumn);\n if (!down && !right) return null;\n if (down >= right) return { ...source, endRow: source.endRow + down };\n return { ...source, endColumn: source.endColumn + right };\n}\n\nfunction rangesIntersect(\n left: { startRow: number; startColumn: number; endRow: number; endColumn: number },\n right: { startRow: number; startColumn: number; endRow: number; endColumn: number },\n): boolean {\n return !(\n left.endRow < right.startRow ||\n left.startRow > right.endRow ||\n left.endColumn < right.startColumn ||\n left.startColumn > right.endColumn\n );\n}\n\nfunction formulaReferenceRangesFromText(\n text: string,\n): Array<{ range: ReturnType<typeof normalizeSelectionRange>; stroke: string }> {\n if (!text.startsWith('=')) return [];\n const references = text.match(/(?:\\$?[A-Z]{1,3}\\$?\\d+)(?::(?:\\$?[A-Z]{1,3}\\$?\\d+))?/g) ?? [];\n const colors = ['#DC2626', '#16A34A', '#7C3AED', '#EA580C', '#0891B2'];\n return references.flatMap((reference, index) => {\n const parts = reference.split(':');\n const start = parts[0] ?? '';\n const end = parts[1] ?? start;\n const first = formulaReferenceCell(start);\n const last = formulaReferenceCell(end);\n if (!first || !last) return [];\n return [{\n range: normalizeSelectionRange({\n startRow: first.row,\n startColumn: first.column,\n endRow: last.row,\n endColumn: last.column,\n }),\n stroke: colors[index % colors.length] ?? '#DC2626',\n }];\n });\n}\n\nfunction formulaReferenceCell(value: string): { row: number; column: number } | null {\n const match = value.replace(/\\$/g, '').match(/^([A-Z]{1,3})(\\d+)$/);\n if (!match) return null;\n let column = 0;\n for (const character of match[1] ?? '') column = column * 26 + character.charCodeAt(0) - 64;\n const row = Number(match[2] ?? '');\n return Number.isFinite(row) && row > 0 && column > 0 ? { row, column } : null;\n}\n"]}
|